From bdf69b0d0c7aafb021c64140bc619d276a5f83d4 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 19 Dec 2013 11:38:05 -0800 Subject: [PATCH 001/846] Initial commit --- .gitignore | 17 + AspNetAbstractions.sln | 52 +++ Sakefile.shade | 66 +++ build.cmd | 12 + build.sh | 6 + .../HttpContextBase.cs | 10 + .../HttpRequestBase.cs | 18 + .../HttpResponseBase.cs | 13 + src/Microsoft.AspNet.Abstractions/IBuilder.cs | 15 + .../Microsoft.AspNet.Abstractions.csproj | 57 +++ .../Microsoft.AspNet.Abstractions.nuspec | 22 + .../PathString.cs | 232 +++++++++++ .../Properties/AssemblyInfo.cs | 36 ++ .../QueryString.cs | 142 +++++++ .../RequestDelegate.cs | 6 + .../FeatureContainer.cs | 86 ++++ .../IFeatureContainer.cs | 13 + .../Implementation/Converter.cs | 384 ++++++++++++++++++ .../Microsoft.AspNet.FeatureModel.csproj | 54 +++ .../Microsoft.AspNet.FeatureModel.nuspec | 22 + .../ObjectFeatureContainer.cs | 50 +++ .../Properties/AssemblyInfo.cs | 36 ++ .../HttpEnvironmentBase.cs | 8 + .../HttpEnvironmentExtensions.cs | 10 + .../IHttpEnvironment.cs | 8 + .../Microsoft.AspNet.HttpEnvironment.csproj | 59 +++ .../Microsoft.AspNet.HttpEnvironment.nuspec | 22 + .../Properties/AssemblyInfo.cs | 36 ++ .../IHttpApplicationInformation.cs | 14 + .../IHttpBuffering.cs | 8 + .../IHttpConnection.cs | 13 + .../IHttpRequest.cs | 19 + .../IHttpResponse.cs | 15 + .../IHttpSendFile.cs | 10 + .../IHttpTransportLayerSecurity.cs | 11 + .../IHttpWebSocketAccept.cs | 11 + .../Microsoft.AspNet.HttpFeature.csproj | 64 +++ .../Microsoft.AspNet.HttpFeature.nuspec | 22 + .../Properties/AssemblyInfo.cs | 36 ++ .../Security/IAuthenticationChallenge.cs | 10 + .../Security/IAuthenticationDescription.cs | 9 + .../Security/IAuthenticationResult.cs | 12 + .../Security/IAuthenticationSignIn.cs | 11 + .../Security/IAuthenticationSignOut.cs | 9 + .../Security/IHttpAuthentication.cs | 18 + .../BuilderTests.cs | 24 ++ ...Microsoft.AspNet.PipelineCore.Tests.csproj | 79 ++++ .../Properties/AssemblyInfo.cs | 36 ++ .../packages.config | 6 + src/Microsoft.AspNet.PipelineCore/Builder.cs | 93 +++++ .../HttpContext.cs | 44 ++ .../HttpRequest.cs | 74 ++++ .../HttpResponse.cs | 43 ++ .../Microsoft.AspNet.PipelineCore.csproj | 75 ++++ .../Microsoft.AspNet.PipelineCore.nuspec | 22 + .../Owin/OwinConstants.cs | 174 ++++++++ .../Owin/OwinHttpEnvironment.cs | 167 ++++++++ .../Properties/AssemblyInfo.cs | 36 ++ 58 files changed, 2657 insertions(+) create mode 100644 .gitignore create mode 100644 AspNetAbstractions.sln create mode 100644 Sakefile.shade create mode 100644 build.cmd create mode 100644 build.sh create mode 100644 src/Microsoft.AspNet.Abstractions/HttpContextBase.cs create mode 100644 src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs create mode 100644 src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IBuilder.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec create mode 100644 src/Microsoft.AspNet.Abstractions/PathString.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Abstractions/QueryString.cs create mode 100644 src/Microsoft.AspNet.Abstractions/RequestDelegate.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec create mode 100644 src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec create mode 100644 src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/packages.config create mode 100644 src/Microsoft.AspNet.PipelineCore/Builder.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/HttpContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/HttpRequest.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/HttpResponse.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec create mode 100644 src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..5dc98f5c69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +bin +obj +*.suo +*.user +_ReSharper.* +*.DS_Store +*.userprefs +*.pidb +*.vspx +*.psess +packages +target +artifacts +StyleCop.Cache +node_modules +*.snk +.nuget/NuGet.exe diff --git a/AspNetAbstractions.sln b/AspNetAbstractions.sln new file mode 100644 index 0000000000..2e07b4f2cb --- /dev/null +++ b/AspNetAbstractions.sln @@ -0,0 +1,52 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.csproj", "{4E1520B1-01F4-481B-96A2-24067EAA52FA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.csproj", "{A780873E-09F9-4E44-AE06-AF00C4E88E1E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpEnvironment", "src\Microsoft.AspNet.HttpEnvironment\Microsoft.AspNet.HttpEnvironment.csproj", "{46D69EC9-7096-49D8-A184-A9BB5B2419A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.csproj", "{42309978-0661-41D8-8654-39453265C5F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.csproj", "{A4D3E280-8838-4614-9B99-4874C3CBDF82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "src\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.Build.0 = Release|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.Build.0 = Release|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.Build.0 = Release|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.Build.0 = Release|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.Build.0 = Release|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sakefile.shade b/Sakefile.shade new file mode 100644 index 0000000000..56c6a45839 --- /dev/null +++ b/Sakefile.shade @@ -0,0 +1,66 @@ + +var PROJECT='AspNetAbstractions' +var VERSION='0.1.0' +var FULL_VERSION='${VERSION}' +var AUTHORS='${PROJECT} contributors' + +var BASE_DIR='${Directory.GetCurrentDirectory()}' +var TARGET_DIR='${Path.Combine(BASE_DIR, "target")}' +var BUILD_DIR='${Path.Combine(TARGET_DIR, "build")}' +var TEST_DIR='${Path.Combine(TARGET_DIR, "test")}' + +default SRC='.' +default BUILD_PROJECTS='${Files.Include(SRC+"/**/*.csproj")}' +default TEST_PROJECTS='${Files.Include(SRC+"/**/*.Tests.csproj")}' + +use namespace='System.Xml.Linq' + +-// include range of standard general targets. run "sake targets" to display +use-standard-lifecycle + +-// include sets of standard work targets. features include 'nuget,xunit,nunit' +use-standard-goals features='nuget,xunit' + +-// additional work targets are defined below + +#nuget-prepare target='package-prepare' description='Compile primary project' + for each='var projectFile in BUILD_PROJECTS.Except(TEST_PROJECTS)' + var outputDirName='${Path.GetFileNameWithoutExtension(projectFile)}' + + var outputDir='${Path.Combine(BUILD_DIR, outputDirName)}' + + copy sourceDir='${Path.GetDirectoryName(projectFile)}' include='*.nuspec' overwrite='${true}' + + var doc='${XDocument.Load(projectFile)}' + var ns='http://schemas.microsoft.com/developer/msbuild/2003' + var itemGroups='${doc.Elements(XName.Get("Project", ns)).Elements(XName.Get("ItemGroup", ns))}' + var compileItems='${itemGroups.Elements(XName.Get("Compile", ns))}' + var contentItems='${itemGroups.Elements(XName.Get("Content", ns))}' + var noneItems='${itemGroups.Elements(XName.Get("None", ns))}' + var razorItems='${contentItems.Union(noneItems).Where(x=>x.Attribute("Include").Value.EndsWith(".cshtml"))}' + + for each='var compileElt in compileItems.Union(razorItems)' + var linkElt='${compileElt.Elements(XName.Get("Link", ns)).SingleOrDefault()}' + + var sourceFile='${compileElt.Attribute("Include").Value}' + var targetFile='${linkElt == null ? sourceFile : linkElt.Value}' + + var sourceFull='${Path.Combine(Path.GetDirectoryName(projectFile), sourceFile)}' + var targetFull='${Path.Combine(outputDir, "src", targetFile)}' + directory create='${Path.GetDirectoryName(targetFull)}' + -File.Copy(sourceFull, targetFull, true); + +#nuget-package target='package' description='Create NuGet packages' + for each='var file in Files.Include(BUILD_DIR + "/**/*.nuspec")' + var baseName='${Path.GetFileNameWithoutExtension(file)}' + var nugetProperties='${new Dictionary { + {"id", baseName}, + {"authors", AUTHORS}, + {"title", baseName}, + {"description", baseName}, + {"licenseUrl", "about:blank"}, + {"projectUrl", "about:blank"}, + {"tags", "Katana"}, + }}' + var props='${string.Join(";", nugetProperties.Select(kv=>kv.Key+"="+kv.Value).ToArray())}' + nuget-pack nuspecFile='${file}' packageVersion='${FULL_VERSION}' outputDir='${TARGET_DIR}' extra='-NoPackageAnalysis -Properties "${props}"' diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000000..65dfe408fd --- /dev/null +++ b/build.cmd @@ -0,0 +1,12 @@ +@echo off +cd %~dp0 + +IF EXIST .nuget\NuGet.exe goto part2 +echo Downloading latest version of NuGet.exe... +mkdir .nuget +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "((new-object net.webclient).DownloadFile('https://nuget.org/nuget.exe', '.nuget\NuGet.exe'))" + +:part2 +set EnableNuGetPackageRestore=true +.nuget\NuGet.exe install Sake -version 0.2 -o packages +packages\Sake.0.2\tools\Sake.exe -I build -f Sakefile.shade %* diff --git a/build.sh b/build.sh new file mode 100644 index 0000000000..8a58a5e2a9 --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +export EnableNuGetPackageRestore=true +mono --runtime=v4.0 ".nuget/NuGet.exe" install Sake -pre -o packages +mono $(find packages/Sake.*/tools/Sake.exe|sort -r|head -n1) -f Sakefile.shade -I src/build "$@" + diff --git a/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs b/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs new file mode 100644 index 0000000000..e1ceb30048 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs @@ -0,0 +1,10 @@ +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpContextBase + { + // TODO - review IOwinContext for properties + + public abstract HttpRequestBase Request { get; } + public abstract HttpResponseBase Response { get; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs b/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs new file mode 100644 index 0000000000..face559bdb --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs @@ -0,0 +1,18 @@ +using System; +using System.IO; + +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpRequestBase + { + // TODO - review IOwinRequest for properties + + public abstract HttpContextBase HttpContext { get; } + + public abstract Uri Uri { get; } + public abstract PathString PathBase { get; set; } + public abstract PathString Path { get; set; } + public abstract QueryString QueryString { get; set; } + public abstract Stream Body { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs b/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs new file mode 100644 index 0000000000..518ea0355c --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs @@ -0,0 +1,13 @@ +using System.IO; + +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpResponseBase + { + // TODO - review IOwinResponse for completeness + + public abstract HttpContextBase HttpContext { get; } + public abstract int StatusCode { get; set; } + public abstract Stream Body { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs new file mode 100644 index 0000000000..9016434cc3 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -0,0 +1,15 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + public interface IBuilder + { + IBuilder Use(object middleware, params object[] args); + + IBuilder New(); + RequestDelegate Build(); + + object GetFeature(Type type); + void SetFeature(Type type, object feature); + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj new file mode 100644 index 0000000000..4f5b7f0b33 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA} + Library + Properties + Microsoft.AspNet.Abstractions + Microsoft.AspNet.Abstractions + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.Abstractions.XML + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs new file mode 100644 index 0000000000..8cfab5912d --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -0,0 +1,232 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Linq; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string + /// + public struct PathString : IEquatable + { + /// + /// Represents the empty path. This field is read-only. + /// + public static readonly PathString Empty = new PathString(String.Empty); + + private readonly string _value; + + /// + /// Initalize the path string with a given value. This value must be in unescaped format. Use + /// PathString.FromUriComponent(value) if you have a path value which is in an escaped format. + /// + /// The unescaped path to be assigned to the Value property. + public PathString(string value) + { + if (!String.IsNullOrEmpty(value) && value[0] != '/') + { + throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, "value"); + } + _value = value; + } + + /// + /// The unescaped path value + /// + public string Value + { + get { return _value; } + } + + /// + /// True if the path is not empty + /// + public bool HasValue + { + get { return !String.IsNullOrEmpty(_value); } + } + + /// + /// Provides the path string escaped in a way which is correct for combining into the URI representation. + /// + /// The escaped path value + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Provides the path string escaped in a way which is correct for combining into the URI representation. + /// + /// The escaped path value + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] + public string ToUriComponent() + { + // TODO: Measure the cost of this escaping and consider optimizing. + return HasValue ? String.Join("/", _value.Split('/').Select(Uri.EscapeDataString)) : String.Empty; + } + + /// + /// Returns an PathString given the path as it is escaped in the URI format. The string MUST NOT contain any + /// value that is not a path. + /// + /// The escaped path as it appears in the URI format. + /// The resulting PathString + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with Uri processing")] + public static PathString FromUriComponent(string uriComponent) + { + // REVIEW: what is the exactly correct thing to do? + return new PathString(Uri.UnescapeDataString(uriComponent)); + } + + /// + /// Returns an PathString given the path as from a Uri object. Relative Uri objects are not supported. + /// + /// The Uri object + /// The resulting PathString + public static PathString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + // REVIEW: what is the exactly correct thing to do? + return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); + } + + public bool StartsWithSegments(PathString other) + { + string value1 = Value ?? String.Empty; + string value2 = other.Value ?? String.Empty; + if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + { + return value1.Length == value2.Length || value1[value2.Length] == '/'; + } + return false; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] + public bool StartsWithSegments(PathString other, out PathString remaining) + { + string value1 = Value ?? String.Empty; + string value2 = other.Value ?? String.Empty; + if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + { + if (value1.Length == value2.Length || value1[value2.Length] == '/') + { + remaining = new PathString(value1.Substring(value2.Length)); + return true; + } + } + remaining = Empty; + return false; + } + + /// + /// Adds two PathString instances into a combined PathString value. + /// + /// The combined PathString value + public PathString Add(PathString other) + { + return new PathString(Value + other.Value); + } + + /// + /// Combines a PathString and QueryString into the joined URI formatted string value. + /// + /// The joined URI formatted string value + public string Add(QueryString other) + { + return ToUriComponent() + other.ToUriComponent(); + } + + /// + /// Compares this PathString value to another value. The default comparison is StringComparison.OrdinalIgnoreCase. + /// + /// The second PathString for comparison. + /// True if both PathString values are equal + public bool Equals(PathString other) + { + return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Compares this PathString value to another value using a specific StringComparison type + /// + /// The second PathString for comparison + /// The StringComparison type to use + /// True if both PathString values are equal + public bool Equals(PathString other, StringComparison comparisonType) + { + return string.Equals(_value, other._value, comparisonType); + } + + /// + /// Compares this PathString value to another value. The default comparison is StringComparison.OrdinalIgnoreCase. + /// + /// The second PathString for comparison. + /// True if both PathString values are equal + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is PathString && Equals((PathString)obj, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Returns the hash code for the PathString value. The hash code is provided by the OrdinalIgnoreCase implementation. + /// + /// The hash code + public override int GetHashCode() + { + return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); + } + + /// + /// Operator call through to Equals + /// + /// The left parameter + /// The right parameter + /// True if both PathString values are equal + public static bool operator ==(PathString left, PathString right) + { + return left.Equals(right, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Operator call through to Equals + /// + /// The left parameter + /// The right parameter + /// True if both PathString values are not equal + public static bool operator !=(PathString left, PathString right) + { + return !left.Equals(right, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Operator call through to Add + /// + /// The left parameter + /// The right parameter + /// The PathString combination of both values + public static PathString operator +(PathString left, PathString right) + { + return left.Add(right); + } + + /// + /// Operator call through to Add + /// + /// The left parameter + /// The right parameter + /// The PathString combination of both values + public static string operator +(PathString left, QueryString right) + { + return left.Add(right); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..906de25b7f --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("Microsoft.AspNet.Abstractions")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f67dab3e-89ef-4d28-a57e-230af874bbe8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs new file mode 100644 index 0000000000..e80f5eedcf --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -0,0 +1,142 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Provides correct handling for QueryString value when needed to reconstruct a request or redirect URI string + /// + public struct QueryString : IEquatable + { + /// + /// Represents the empty query string. This field is read-only. + /// + public static readonly QueryString Empty = new QueryString(String.Empty); + + private readonly string _value; + + /// + /// Initalize the query string with a given value. This value must be in escaped and delimited format without + /// a leading '?' character. + /// + /// The query string to be assigned to the Value property. + public QueryString(string value) + { + _value = value; + } + + /// + /// Initialize a query string with a single given parameter name and value. The value is + /// + /// The unencoded parameter name + /// The unencoded parameter value + public QueryString(string name, string value) + { + _value = Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); + } + + /// + /// The unescaped query string without the leading '?' character + /// + public string Value + { + get { return _value; } + } + + /// + /// True if the query string is not empty + /// + public bool HasValue + { + get { return !String.IsNullOrWhiteSpace(_value); } + } + + /// + /// Provides the query string escaped in a way which is correct for combining into the URI representation. + /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentally + /// dangerous are escaped. + /// + /// The query string value + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Provides the query string escaped in a way which is correct for combining into the URI representation. + /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentially + /// dangerous are escaped. + /// + /// The query string value + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] + public string ToUriComponent() + { + // Escape things properly so System.Uri doesn't mis-interpret the data. + return HasValue ? "?" + _value.Replace("#", "%23") : String.Empty; + } + + /// + /// Returns an QueryString given the query as it is escaped in the URI format. The string MUST NOT contain any + /// value that is not a query. + /// + /// The escaped query as it appears in the URI format. + /// The resulting QueryString + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Delimiter characters ? and # must be escaped by this method instead of truncating the value")] + public static QueryString FromUriComponent(string uriComponent) + { + if (String.IsNullOrEmpty(uriComponent)) + { + return new QueryString(string.Empty); + } + if (uriComponent[0] != '?') + { + throw new ArgumentException(""/*Resources.Exception_QueryStringMustStartWithDelimiter*/, "uriComponent"); + } + return new QueryString(uriComponent.Substring(1)); + } + + /// + /// Returns an QueryString given the query as from a Uri object. Relative Uri objects are not supported. + /// + /// The Uri object + /// The resulting QueryString + public static QueryString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + return new QueryString(uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped)); + } + + public bool Equals(QueryString other) + { + return string.Equals(_value, other._value); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is QueryString && Equals((QueryString)obj); + } + + public override int GetHashCode() + { + return (_value != null ? _value.GetHashCode() : 0); + } + + public static bool operator ==(QueryString left, QueryString right) + { + return left.Equals(right); + } + + public static bool operator !=(QueryString left, QueryString right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs new file mode 100644 index 0000000000..98b48bcf94 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs @@ -0,0 +1,6 @@ +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions +{ + public delegate Task RequestDelegate(HttpContextBase context); +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs new file mode 100644 index 0000000000..1b7949658a --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class FeatureContainer : IFeatureContainer + { + private readonly IFeatureContainer _defaultFeatures; + private readonly IDictionary _featureByFeatureType = new Dictionary(); + private readonly IDictionary _featureTypeByName = new Dictionary(); + private readonly object _containerSync = new Object(); + private int _containerRevision; + + public FeatureContainer() + { + } + + public FeatureContainer(IFeatureContainer defaultFeatures) + { + _defaultFeatures = defaultFeatures; + } + + public virtual object GetFeature(Type type) + { + object feature; + if (_featureByFeatureType.TryGetValue(type, out feature)) + { + return feature; + } + + Type actualType; + if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) + { + if (_featureByFeatureType.TryGetValue(actualType, out feature)) + { + return Converter.Convert(type, actualType, feature); + } + } + + return _defaultFeatures != null ? _defaultFeatures.GetFeature(type) : null; + } + + public virtual object GetDefaultFeature(Type type) + { + return null; + } + + public virtual void SetFeature(Type type, object feature) + { + lock (_containerSync) + { + Type priorFeatureType; + if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) + { + if (priorFeatureType == type) + { + _featureByFeatureType[type] = feature; + } + else + { + _featureTypeByName[type.FullName] = type; + _featureByFeatureType.Remove(priorFeatureType); + _featureByFeatureType.Add(type, feature); + } + } + else + { + _featureTypeByName.Add(type.FullName, type); + _featureByFeatureType.Add(type, feature); + } + Interlocked.Increment(ref _containerRevision); + } + } + + public virtual int Revision + { + get { return _containerRevision; } + } + + public void Dispose() + { + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs new file mode 100644 index 0000000000..52529983d0 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.FeatureModel +{ + public interface IFeatureContainer : IDisposable + { + object GetFeature(Type type); + void SetFeature(Type type, object feature); + //IEnumerable GetFeatureTypes(); + int Revision { get; } + } +} diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs new file mode 100644 index 0000000000..7f080ab884 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -0,0 +1,384 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; + +namespace Microsoft.AspNet.FeatureModel.Implementation +{ + public abstract class NonGenericProxyBase + { + public readonly Type WrappedType; + protected NonGenericProxyBase(Type wrappedType) + { + this.WrappedType = wrappedType; + } + public abstract object UnderlyingInstanceAsObject + { + get; + } + } + + public class BaseType : NonGenericProxyBase where T : class + { + protected T instance; + public BaseType(T inst) + : base(typeof(T)) + { + if (inst == null) throw new InvalidOperationException("should never construct proxy over null"); + this.instance = inst; + } + public T UnderlyingInstance + { + get + { + return instance; + } + } + public override object UnderlyingInstanceAsObject + { + get + { + return instance; + } + } + } + + public class Converter + { + public static object Convert(Type outputType, Type inputType, object input) + { + if (inputType == outputType) return input; + + if (!inputType.IsInterface || !outputType.IsInterface) throw new InvalidOperationException("Both types must be interfaces"); + + if (inputType.GetInterfaces().Contains(outputType)) return input; + + if (input == null) return null; + + Type t = EnsureConverter(outputType, inputType); + + return Activator.CreateInstance(t, input); + } + + public static TOut Convert(Type inputType, object input) + where TOut : class + { + return (TOut)Convert(typeof (TOut), inputType, input); + } + + public static TOut Convert(TIn input) + where TIn : class + where TOut : class + { + return Convert(typeof(TIn), input); + } + + public static TOut Convert(object input) + where TOut : class + { + if (input == null) return null; + var interfaceName = typeof(TOut).FullName; + foreach (var inputType in input.GetType().GetInterfaces()) + { + if (inputType.FullName == interfaceName) + { + return Convert(inputType, input); + } + } + return null; + } + + + public static Type EnsureConverter(Type tout, Type tin) + { + CacheResult result; + if (!ConverterTypeCache.TryGetValue(new Tuple(tin, tout), out result)) + { + EnsureCastPossible(tout, tin); + return EnsureConverter(tout, tin); + } + else + { + if (result is ErrorResult) + { + throw new InvalidCastException((result as ErrorResult).error); + } + else if (result is CurrentlyVerifyingResult) + { + throw new InvalidOperationException("Type cannot be obtained in verification phase"); + } + else if (result is TypeBuilderResult) + { + return (result as TypeBuilderResult).result; + } + else if (result is VerificationSucceededResult) + { + return CreateWrapperType(tout, tin, result as VerificationSucceededResult); + } + else + { + throw new InvalidOperationException("Invalid cache state"); + } + } + } + + class CacheResult + { + } + + class TypeBuilderResult : CacheResult + { + internal TypeBuilderResult(Type result) + { + this.result = result; + } + internal readonly Type result; + } + class ErrorResult : CacheResult + { + internal ErrorResult(string error) + { + this.error = error; + } + internal readonly string error; + } + class CurrentlyVerifyingResult : CacheResult + { + } + enum SuccessKind + { + Identity, + SubInterface, + Wrapper, + } + class VerificationSucceededResult : CacheResult + { + internal VerificationSucceededResult(SuccessKind kind) + { + this.kind = kind; + } + internal VerificationSucceededResult(Dictionary mappings) + { + this.kind = SuccessKind.Wrapper; + this.methodMappings = mappings; + } + internal readonly SuccessKind kind; + internal readonly Dictionary methodMappings; + } + + static Dictionary, CacheResult> ConverterTypeCache = new Dictionary, CacheResult>(); + static ConditionalWeakTable ConverterInstanceCache = new ConditionalWeakTable(); + static AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("ProxyHolderAssembly"), AssemblyBuilderAccess.Run); + static ModuleBuilder modb = ab.DefineDynamicModule("Main Module"); + + class EqComparer : IEqualityComparer + { + + bool IEqualityComparer.Equals(ParameterInfo x, ParameterInfo y) + { + return EqualTypes(x.ParameterType, y.ParameterType); + } + + int IEqualityComparer.GetHashCode(ParameterInfo obj) + { + return obj.GetHashCode(); + } + } + + static bool EqualTypes(Type sourceType, Type targetType) + { + return EnsureCastPossible(targetType, sourceType); + } + + + + static MethodInfo FindCorrespondingMethod(Type targetType, Type sourceType, MethodInfo miTarget) + { + MethodInfo[] sms = sourceType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where((MethodInfo mi) => mi.Name == miTarget.Name).ToArray(); + if (sms != null && sms.Length != 0) + { + MethodInfo[] sm = null; + try + { + sm = sms.Where((mi) => (mi.GetParameters().SequenceEqual(miTarget.GetParameters(), new EqComparer()))).ToArray(); + } + catch + { + } + if (sm != null && sm.Length != 0) + { + if (sm.Length > 1) return null; + if (EqualTypes(sm[0].ReturnType, miTarget.ReturnType)) + { + return sm[0]; + } + } + } + MethodInfo[] rval = sourceType.GetInterfaces().Select((inheritedItf) => FindCorrespondingMethod(targetType, inheritedItf, miTarget)).ToArray(); + if (rval == null || rval.Length == 0) return null; + if (rval.Length > 1) return null; + return rval[0]; + + } + + + static void AddMethod(Type targetType, Type sourceType, TypeBuilder tb, MethodInfo miTarget, MethodInfo miSource) + { + ParameterInfo[] pisTarget = miTarget.GetParameters(); + ParameterInfo[] pisSource = miSource.GetParameters(); + MethodBuilder metb; + Type[] typesTarget; + if (pisTarget == null || pisTarget.Length == 0) + { + metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null); + pisTarget = new ParameterInfo[0]; + typesTarget = new Type[0]; + } + else + { + typesTarget = pisTarget.Select((pi) => pi.ParameterType).ToArray(); + Type[][] requiredCustomMods = pisTarget.Select((pi) => pi.GetRequiredCustomModifiers()).ToArray(); + Type[][] optionalCustomMods = pisTarget.Select((pi) => pi.GetOptionalCustomModifiers()).ToArray(); + + metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null, null, typesTarget, requiredCustomMods, optionalCustomMods); + } + + ILGenerator il = metb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldfld, tb.BaseType.GetField("instance", BindingFlags.NonPublic | BindingFlags.Instance)); + for (int pi = 0; pi < pisTarget.Length; pi++) + { + il.Emit(OpCodes.Ldarg, pi + 1); + EmitParamConversion(il, typesTarget[pi], pisSource[pi].ParameterType); + } + il.EmitCall(OpCodes.Callvirt, miSource, null); + + EmitParamConversion(il, miSource.ReturnType, miTarget.ReturnType); + il.Emit(OpCodes.Ret); + + tb.DefineMethodOverride(metb, miTarget); + } + + static void EmitParamConversion(ILGenerator il, Type typeOnStack, Type typeRequiredInSignature) + { + if (typeOnStack != typeRequiredInSignature) + { + if (typeOnStack.GetInterfaces().Contains(typeRequiredInSignature)) + { + il.Emit(OpCodes.Castclass, typeRequiredInSignature); + } + else + { + Label lEnd = il.DefineLabel(); + Label lCreateProxy = il.DefineLabel(); + il.Emit(OpCodes.Dup); // o o + il.Emit(OpCodes.Brfalse_S, lEnd); // o + il.Emit(OpCodes.Dup); // o o + il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // o [p/n] + il.Emit(OpCodes.Brfalse_S, lCreateProxy); // o + il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // p + il.EmitCall(OpCodes.Callvirt, typeof(NonGenericProxyBase).GetMethod("get_UnderlyingInstanceAsObject"), null); // uo + il.Emit(OpCodes.Dup); // uo uo + il.Emit(OpCodes.Isinst, typeRequiredInSignature); // uo [ro/n] + il.Emit(OpCodes.Brtrue_S, lEnd); // uo + il.MarkLabel(lCreateProxy); // uo + Type paramProxyType = EnsureConverter(typeRequiredInSignature, typeOnStack); + il.Emit(OpCodes.Newobj, paramProxyType.GetConstructors()[0]); + il.MarkLabel(lEnd); // ro + } + } + } + + + + static bool EnsureCastPossible(Type targetType, Type sourceType) + { + var key = new Tuple(sourceType, targetType); + CacheResult cr = null; + if (ConverterTypeCache.TryGetValue(key, out cr)) + { + if (cr is CurrentlyVerifyingResult || cr is VerificationSucceededResult || cr is TypeBuilderResult) return true; + if (cr is ErrorResult) return false; + } + if (targetType == sourceType) + { + ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.Identity); + return true; + } + if (targetType.GetInterfaces().Contains(sourceType)) + { + ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.SubInterface); + return true; + } + if (!targetType.IsInterface || !sourceType.IsInterface) + { + ConverterTypeCache[key] = new ErrorResult("Cannot cast " + sourceType + " to " + targetType); + return false; + } + bool success = false; + ConverterTypeCache[key] = new CurrentlyVerifyingResult(); + try + { + Dictionary mappings = new Dictionary(); + foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) + { + MethodInfo mapping = FindCorrespondingMethod(targetType, sourceType, mi); + if (mapping == null) + { + ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType + " because of missing method: " + mi.Name); + return false; + } + mappings[mi] = mapping; + } + ConverterTypeCache[key] = new VerificationSucceededResult(mappings); + success = true; + return true; + } + finally + { + if (!success) + { + if (!(ConverterTypeCache[key] is ErrorResult)) + { + ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType); + } + } + } + } + + static int counter = 0; + static Type CreateWrapperType(Type targetType, Type sourceType, VerificationSucceededResult result) + { + Dictionary mappings = result.methodMappings; + Type baseType = Assembly.GetExecutingAssembly().GetType("InterfaceMapper.BaseType`1").MakeGenericType(sourceType); + TypeBuilder tb = modb.DefineType("ProxyType" + counter++ + " wrapping:" + sourceType.Name + " to look like:" + targetType.Name, TypeAttributes.Class, baseType, new Type[] { targetType }); + ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { sourceType }); + ILGenerator il = cb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Castclass, sourceType); + il.Emit(OpCodes.Call, baseType.GetConstructor(new Type[] { sourceType })); + il.Emit(OpCodes.Ret); + var tuple = new Tuple(sourceType, targetType); + try + { + ConverterTypeCache[tuple] = new TypeBuilderResult(tb); + foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) + { + AddMethod(targetType, sourceType, tb, mi, mappings[mi]); + } + Type t = tb.CreateType(); + ConverterTypeCache[tuple] = new TypeBuilderResult(t); + return t; + } + catch (Exception e) + { + ConverterTypeCache[tuple] = new ErrorResult(e.Message); + throw; + } + } + + } +} diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj new file mode 100644 index 0000000000..a3db9ed3d3 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Library + Properties + Microsoft.AspNet.FeatureModel + Microsoft.AspNet.FeatureModel + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.FeatureModel.XML + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs new file mode 100644 index 0000000000..48bcb98b75 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class ObjectFeatureContainer : IFeatureContainer + { + private readonly object _instance; + + public ObjectFeatureContainer(object instance) + { + _instance = instance; + } + + public void Dispose() + { + var disposable = _instance as IDisposable; + if (disposable != null) + { + disposable.Dispose(); + } + } + + public object GetFeature(Type type) + { + if (type.IsInstanceOfType(_instance)) + { + return _instance; + } + foreach (var interfaceType in _instance.GetType().GetInterfaces()) + { + if (interfaceType.FullName == type.FullName) + { + return Converter.Convert(interfaceType, type, _instance); + } + } + return null; + } + + public void SetFeature(Type type, object feature) + { + throw new NotImplementedException(); + } + + public int Revision + { + get { return 0; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..264c8db996 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("Microsoft.AspNet.FeatureModel")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cf678d83-e6f7-4433-9bf2-c0efa68e399b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs new file mode 100644 index 0000000000..4d1036d835 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.HttpEnvironment +{ + public abstract class HttpEnvironmentBase : FeatureContainer, IHttpEnvironment + { + } +} diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs new file mode 100644 index 0000000000..ab296451d5 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs @@ -0,0 +1,10 @@ +namespace Microsoft.AspNet.HttpEnvironment +{ + public static class HttpEnvironmentExtensions + { + public static TFeature GetFeature(this IHttpEnvironment environment) where TFeature : class + { + return (TFeature)environment.GetFeature(typeof(TFeature)); + } + } +} diff --git a/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs new file mode 100644 index 0000000000..ab0bb92bc9 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.HttpEnvironment +{ + public interface IHttpEnvironment : IFeatureContainer + { + } +} diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj new file mode 100644 index 0000000000..b1db630e6e --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1} + Library + Properties + Microsoft.AspNet.HttpEnvironment + Microsoft.AspNet.HttpEnvironment + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.HttpEnvironment.XML + + + + + + + + + + + + + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Microsoft.AspNet.FeatureModel + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..d68b8666f2 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("Microsoft.AspNet.Environments")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Environments")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1b326e9f-7c7a-42cd-9861-cdbef8353aed")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs new file mode 100644 index 0000000000..497bff550b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpApplicationInformation + { + string AppName { get; set; } + string AppMode { get; set; } + CancellationToken OnAppDisposing { get; set; } + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs new file mode 100644 index 0000000000..2936208463 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -0,0 +1,8 @@ +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpBuffering + { + void DisableRequestBuffering(); + void DisableResponseBuffering(); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs new file mode 100644 index 0000000000..a375e3358b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -0,0 +1,13 @@ +using System.Net; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpConnection + { + IPAddress RemoteIpAddress { get; set; } + int RemotePort { get; set; } + IPAddress LocalIpAddress { get; set; } + int LocalPort { get; set; } + bool IsLocal { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs new file mode 100644 index 0000000000..f125863ee2 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpRequest + { + string Protocol { get; set; } + string Scheme { get; set; } + string Method { get; set; } + string PathBase { get; set; } + string Path { get; set; } + string QueryString { get; set; } + IDictionary Headers { get; set; } + Stream Body { get; set; } + Uri Uri { get; } + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs new file mode 100644 index 0000000000..85921559eb --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpResponse + { + int StatusCode { get; set; } + string ReasonPhrase { get; set; } + IDictionary Headers { get; set; } + Stream Body { get; set; } + void OnSendingHeaders(Action callback, object state); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs new file mode 100644 index 0000000000..5d10d36c32 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -0,0 +1,10 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpSendFile + { + Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs new file mode 100644 index 0000000000..0d4555284e --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -0,0 +1,11 @@ +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpTransportLayerSecurity + { + X509Certificate ClientCertificate { get; set; } + Task LoadAsync(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs new file mode 100644 index 0000000000..f5dbfb8c21 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -0,0 +1,11 @@ +using System.Net.WebSockets; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpWebSocketAccept + { + bool IsWebSocketRequest { get; set; } + Task AcceptAsync(); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj new file mode 100644 index 0000000000..f881a5f0c9 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {42309978-0661-41D8-8654-39453265C5F9} + Library + Properties + Microsoft.AspNet.HttpFeature + Microsoft.AspNet.HttpFeature + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.HttpFeature.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..80a1326d0b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("Microsoft.AspNet.Interfaces")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Interfaces")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fbcea83c-9fdd-445d-a2d4-93e9062754f3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs new file mode 100644 index 0000000000..cb336ef6c6 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IAuthenticationChallenge + { + IEnumerable AuthenticationTypes { get; } + IDictionary Properties { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs new file mode 100644 index 0000000000..590addffc4 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationDescription + { + IDictionary Properties { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs new file mode 100644 index 0000000000..93c9e9a08d --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Security.Claims; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationResult + { + ClaimsIdentity Identity { get; } + IDictionary Properties { get; } + IAuthenticationDescription Description { get; } + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs new file mode 100644 index 0000000000..663f19a9a3 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Security.Claims; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationSignIn + { + ClaimsPrincipal User { get; } + IDictionary Properties { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs new file mode 100644 index 0000000000..763bcaed7f --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationSignOut + { + IEnumerable AuthenticationTypes { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs new file mode 100644 index 0000000000..ed955970ac --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Security.Principal; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IHttpAuthentication + { + IPrincipal User { get; set; } + + IEnumerable Authenticate(string[] authenticationTypes); + Task> AuthenticateAsync(string[] authenticationTypes); + + IAuthenticationChallenge ChallengeDetails { get; set; } + IAuthenticationSignIn SignInDetails { get; set; } + IAuthenticationSignOut SignOutDetails { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs new file mode 100644 index 0000000000..d4f89b64c4 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNet.Abstractions; +using Shouldly; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class BuilderTests + { + [Fact] + public void BuildReturnsCallableDelegate() + { + var builder = new Builder(); + var app = builder.Build(); + + var mockHttpContext = new Moq.Mock(); + var mockHttpResponse = new Moq.Mock(); + mockHttpContext.SetupGet(x => x.Response).Returns(mockHttpResponse.Object); + mockHttpResponse.SetupProperty(x => x.StatusCode); + + app.Invoke(mockHttpContext.Object); + mockHttpContext.Object.Response.StatusCode.ShouldBe(404); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj b/src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj new file mode 100644 index 0000000000..143f0ac203 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj @@ -0,0 +1,79 @@ + + + + + Debug + AnyCPU + {86942914-0334-4352-87ED-B971281C74E2} + Library + Properties + Microsoft.AspNet.PipelineCore.Tests + Microsoft.AspNet.PipelineCore.Tests + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.PipelineCore.Tests.XML + + + + False + ..\..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll + + + False + ..\..\packages\Shouldly.1.1.1.1\lib\35\Shouldly.dll + + + + + + + + + + False + ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll + + + + + + + + + + + + {A4D3E280-8838-4614-9B99-4874C3CBDF82} + Microsoft.AspNet.PipelineCore + + + {4E1520B1-01F4-481B-96A2-24067EAA52FA} + Microsoft.AspNet.Abstractions + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..ca7eab6695 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("Microsoft.AspNet.PipelineCore.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.PipelineCore.Tests")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7c564547-b037-4054-a1ec-18e62717be47")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/packages.config b/src/Microsoft.AspNet.PipelineCore.Tests/packages.config new file mode 100644 index 0000000000..2190a4eebc --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs new file mode 100644 index 0000000000..1e350b305d --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; +using Microsoft.AspNet.PipelineCore.Owin; + +namespace Microsoft.AspNet.PipelineCore +{ + public class Builder : IBuilder + { + private readonly IFeatureContainer _features; + private readonly IList _components = new List(); + + public Builder() + { + _features = new FeatureModel.FeatureContainer(); + } + + public Builder(IFeatureContainer features) + { + _features = features; + } + + public void Dispose() + { + _features.Dispose(); + } + + public virtual object GetFeature(Type type) + { + return _features.GetFeature(type); + } + + public virtual void SetFeature(Type type, object feature) + { + _features.SetFeature(type, feature); + } + + public virtual int Revision + { + get { return _features.Revision; } + } + + public IBuilder Use(object middleware, params object[] args) + { + _components.Add(new Entry(middleware, args)); + return this; + } + + class Entry + { + private readonly object _middleware; + private readonly object[] _args; + + public Entry(object middleware, object[] args) + { + _middleware = middleware; + _args = args; + } + } + + public IBuilder New() + { + return new Builder(_features); + } + + public RequestDelegate Build() + { + RequestDelegate app = async context => context.Response.StatusCode = 404; + + foreach (var component in _components.Reverse()) + { + app = Activate(component, app); + } + + return app; + } + + private RequestDelegate Activate(Entry component, RequestDelegate app) + { + return app; + } + + public Func Adapt(object app) + { + return null; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/HttpContext.cs b/src/Microsoft.AspNet.PipelineCore/HttpContext.cs new file mode 100644 index 0000000000..a75c522b56 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/HttpContext.cs @@ -0,0 +1,44 @@ +using System; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpEnvironment; + +namespace Microsoft.AspNet.PipelineCore +{ + public class HttpContext : HttpContextBase, IHttpEnvironment + { + private readonly IFeatureContainer _features; + private readonly HttpRequestBase _request; + private readonly HttpResponseBase _response; + + public HttpContext(IHttpEnvironment environment) + { + _features = environment; + _request = new HttpRequest(this); + _response = new HttpResponse(this); + } + + public override HttpRequestBase Request { get { return _request; } } + public override HttpResponseBase Response { get { return _response; } } + + public void Dispose() + { + _features.Dispose(); + } + + public object GetFeature(Type type) + { + return _features.GetFeature(type); + } + + public void SetFeature(Type type, object feature) + { + _features.SetFeature(type, feature); + } + + public int Revision + { + get { return _features.Revision; } + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs new file mode 100644 index 0000000000..2a7385d81a --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs @@ -0,0 +1,74 @@ +using System; +using System.IO; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; + +namespace Microsoft.AspNet.PipelineCore +{ + public class HttpRequest : HttpRequestBase + { + private readonly HttpContext _context; + private int _revision; + private IHttpRequest _request; + private IHttpConnection _connection; + + public HttpRequest(HttpContext context) + { + _context = context; + } + + private IHttpRequest IHttpRequest + { + get { return EnsureCurrent(_request) ?? (_request = _context.GetFeature()); } + } + + private IHttpConnection IHttpConnection + { + get { return EnsureCurrent(_connection) ?? (_connection = _context.GetFeature()); } + } + + private T EnsureCurrent(T feature) where T : class + { + if (_revision == _context.Revision) return feature; + + _request = null; + _connection = null; + _revision = _context.Revision; + return null; + } + + public override HttpContextBase HttpContext { get { return _context; } } + + public override Uri Uri + { + get { return IHttpRequest.Uri; } + } + + //public override Uri Uri { get { _request} } + + public override PathString PathBase + { + get { return new PathString(IHttpRequest.PathBase); } + set { IHttpRequest.PathBase = value.Value; } + } + + public override PathString Path + { + get { return new PathString(IHttpRequest.Path); } + set { IHttpRequest.Path = value.Value; } + } + + public override QueryString QueryString + { + get { return new QueryString(IHttpRequest.QueryString); } + set { IHttpRequest.QueryString = value.Value; } + } + + public override Stream Body + { + get { return IHttpRequest.Body; } + set { IHttpRequest.Body = value; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs new file mode 100644 index 0000000000..bb467e8691 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs @@ -0,0 +1,43 @@ +using System.IO; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; + +namespace Microsoft.AspNet.PipelineCore +{ + public class HttpResponse : HttpResponseBase + { + private readonly HttpContext _context; + private IHttpResponse _response; + private int _revision; + + public HttpResponse(HttpContext context) + { + _context = context; + } + + private IHttpResponse IHttpResponse + { + get { return EnsureCurrent(_response) ?? (_response = _context.GetFeature()); } + } + + private T EnsureCurrent(T feature) where T : class + { + if (_revision == _context.Revision) return feature; + + _response = null; + _revision = _context.Revision; + return null; + } + + public override HttpContextBase HttpContext { get { return _context; } } + + public override int StatusCode + { + get { return IHttpResponse.StatusCode; } + set { IHttpResponse.StatusCode = value; } + } + + public override Stream Body { get { return _response.Body; } set { _response.Body = value; } } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj new file mode 100644 index 0000000000..1cd72c4c66 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.PipelineCore.XML + + + + + + + + + + + + + + + + + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Microsoft.AspNet.FeatureModel + + + {4e1520b1-01f4-481b-96a2-24067eaa52fa} + Microsoft.AspNet.Abstractions + + + {46D69EC9-7096-49D8-A184-A9BB5B2419A1} + Microsoft.AspNet.HttpEnvironment + + + {42309978-0661-41d8-8654-39453265c5f9} + Microsoft.AspNet.HttpFeature + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs new file mode 100644 index 0000000000..c7eafe6019 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs @@ -0,0 +1,174 @@ +namespace Microsoft.AspNet.PipelineCore.Owin +{ + internal static class OwinConstants + { + #region OWIN v1.0.0 - 3.2.1. Request Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string RequestScheme = "owin.RequestScheme"; + public const string RequestMethod = "owin.RequestMethod"; + public const string RequestPathBase = "owin.RequestPathBase"; + public const string RequestPath = "owin.RequestPath"; + public const string RequestQueryString = "owin.RequestQueryString"; + public const string RequestProtocol = "owin.RequestProtocol"; + public const string RequestHeaders = "owin.RequestHeaders"; + public const string RequestBody = "owin.RequestBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.2. Response Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string ResponseStatusCode = "owin.ResponseStatusCode"; + public const string ResponseReasonPhrase = "owin.ResponseReasonPhrase"; + public const string ResponseProtocol = "owin.ResponseProtocol"; + public const string ResponseHeaders = "owin.ResponseHeaders"; + public const string ResponseBody = "owin.ResponseBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.3. Other Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string CallCancelled = "owin.CallCancelled"; + + public const string OwinVersion = "owin.Version"; + + #endregion + + #region OWIN Keys for IAppBuilder.Properties + + internal static class Builder + { + public const string AddSignatureConversion = "builder.AddSignatureConversion"; + public const string DefaultApp = "builder.DefaultApp"; + } + + #endregion + + #region OWIN Key Guidelines and Common Keys - 6. Common keys + + // http://owin.org/spec/CommonKeys.html + + internal static class CommonKeys + { + public const string ClientCertificate = "ssl.ClientCertificate"; + public const string RemoteIpAddress = "server.RemoteIpAddress"; + public const string RemotePort = "server.RemotePort"; + public const string LocalIpAddress = "server.LocalIpAddress"; + public const string LocalPort = "server.LocalPort"; + public const string IsLocal = "server.IsLocal"; + public const string TraceOutput = "host.TraceOutput"; + public const string Addresses = "host.Addresses"; + public const string AppName = "host.AppName"; + public const string Capabilities = "server.Capabilities"; + public const string OnSendingHeaders = "server.OnSendingHeaders"; + public const string OnAppDisposing = "host.OnAppDisposing"; + public const string Scheme = "scheme"; + public const string Host = "host"; + public const string Port = "port"; + public const string Path = "path"; + } + + #endregion + + #region SendFiles v0.3.0 + + // http://owin.org/extensions/owin-SendFile-Extension-v0.3.0.htm + + internal static class SendFiles + { + // 3.1. Startup + + public const string Version = "sendfile.Version"; + public const string Support = "sendfile.Support"; + public const string Concurrency = "sendfile.Concurrency"; + + // 3.2. Per Request + + public const string SendAsync = "sendfile.SendAsync"; + } + + #endregion + + #region Opaque v0.3.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class OpaqueConstants + { + // 3.1. Startup + + public const string Version = "opaque.Version"; + + // 3.2. Per Request + + public const string Upgrade = "opaque.Upgrade"; + + // 5. Consumption + + public const string Stream = "opaque.Stream"; + // public const string Version = "opaque.Version"; // redundant, declared above + public const string CallCancelled = "opaque.CallCancelled"; + } + + #endregion + + #region WebSocket v0.4.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class WebSocket + { + // 3.1. Startup + + public const string Version = "websocket.Version"; + + // 3.2. Per Request + + public const string Accept = "websocket.Accept"; + + // 4. Accept + + public const string SubProtocol = "websocket.SubProtocol"; + + // 5. Consumption + + public const string SendAsync = "websocket.SendAsync"; + public const string ReceiveAsync = "websocket.ReceiveAsync"; + public const string CloseAsync = "websocket.CloseAsync"; + // public const string Version = "websocket.Version"; // redundant, declared above + public const string CallCancelled = "websocket.CallCancelled"; + public const string ClientCloseStatus = "websocket.ClientCloseStatus"; + public const string ClientCloseDescription = "websocket.ClientCloseDescription"; + } + + #endregion + + #region Security v0.1.0 + + // http://owin.org/extensions/owin-Security-Extension-v0.1.0.htm + + internal static class Security + { + // 3.2. Per Request + + public const string User = "server.User"; + + public const string Authenticate = "security.Authenticate"; + + // 3.3. Response + + public const string SignIn = "security.SignIn"; + + public const string SignOut = "security.SignOut"; + + public const string Challenge = "security.Challenge"; + } + + #endregion + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs new file mode 100644 index 0000000000..8f8a948434 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; + +namespace Microsoft.AspNet.PipelineCore.Owin +{ + public class OwinHttpEnvironment : + IHttpRequest, IHttpResponse, IHttpConnection, IHttpSendFile, IHttpTransportLayerSecurity + { + public IDictionary Environment { get; set; } + + public OwinHttpEnvironment(IDictionary environment) + { + Environment = environment; + } + + T Prop(string key) + { + object value; + if (Environment.TryGetValue(key, out value) && value is T) + { + return (T)value; + } + return default(T); + } + + void Prop(string key, object value) + { + Environment[key] = value; + } + + string IHttpRequest.Protocol + { + get { return Prop("owin.RequestProtocol"); } + set { Prop("owin.RequestProtocol", value); } + } + + Uri IHttpRequest.Uri + { + get { throw new NotImplementedException(); } + } + + string IHttpRequest.Scheme + { + get { return Prop("owin.RequestScheme"); } + set { Prop("owin.RequestScheme", value); } + } + + string IHttpRequest.Method + { + get { return Prop("owin.RequestMethod"); } + set { Prop("owin.RequestMethod", value); } + } + + string IHttpRequest.PathBase + { + get { return Prop("owin.RequestPathBase"); } + set { Prop("owin.RequestPathBase", value); } + } + + string IHttpRequest.Path + { + get { return Prop("owin.RequestPath"); } + set { Prop("owin.RequestPath", value); } + } + + string IHttpRequest.QueryString + { + get { return Prop("owin.RequestQueryString"); } + set { Prop("owin.RequestQueryString", value); } + } + + IDictionary IHttpRequest.Headers + { + get { return Prop>("owin.RequestHeaders"); } + set { Prop("owin.RequestHeaders", value); } + } + + Stream IHttpRequest.Body + { + get { return Prop("owin.RequestBody"); } + set { Prop("owin.RequestBody", value); } + } + + int IHttpResponse.StatusCode + { + get { return Prop("owin.ResponseStatusCode"); } + set { Prop("owin.ResponseStatusCode", value); } + } + + string IHttpResponse.ReasonPhrase + { + get { return Prop("owin.ResponseReasonPhrase"); } + set { Prop("owin.ResponseReasonPhrase", value); } + } + + IDictionary IHttpResponse.Headers + { + get { return Prop>("owin.ResponseHeaders"); } + set { Prop("owin.ResponseHeaders", value); } + } + + Stream IHttpResponse.Body + { + get { return Prop("owin.ResponseBody"); } + set { Prop("owin.ResponseBody", value); } + } + + void IHttpResponse.OnSendingHeaders(Action callback, object state) + { + // TODO: + } + + IPAddress IHttpConnection.RemoteIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } + set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } + } + + int IHttpConnection.RemotePort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } + set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } + } + + IPAddress IHttpConnection.LocalIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } + set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } + } + + int IHttpConnection.LocalPort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } + } + + bool IHttpConnection.IsLocal + { + get { return Prop(OwinConstants.CommonKeys.IsLocal); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value); } + } + + Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + { + throw new NotImplementedException(); + } + + X509Certificate IHttpTransportLayerSecurity.ClientCertificate + { + get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } + set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } + } + + Task IHttpTransportLayerSecurity.LoadAsync() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..05cb3146e3 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("Microsoft.AspNet.Abstractions.Implementation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions.Implementation")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5886f89f-de4d-4e44-81c2-7a32b2c89cfd")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] From 27ff7762e917c1e98b8e4df50d94b947af656f64 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 23 Jan 2014 14:53:22 -0800 Subject: [PATCH 002/846] Updating with work in progress --- AspNetAbstractions.sln | 12 +- .../HttpContext.cs | 28 +++ .../HttpContextBase.cs | 10 - .../{HttpRequestBase.cs => HttpRequest.cs} | 4 +- .../{HttpResponseBase.cs => HttpResponse.cs} | 4 +- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 4 +- .../Microsoft.AspNet.Abstractions.csproj | 6 +- .../RequestDelegate.cs | 2 +- .../FeatureContainer.cs | 86 -------- .../IFeatureContainer.cs | 13 -- .../IInterfaceDictionary.cs | 10 + .../Implementation/Converter.cs | 2 +- .../InterfaceDictionary.cs | 188 ++++++++++++++++++ .../InterfaceObject.cs | 133 +++++++++++++ .../Microsoft.AspNet.FeatureModel.csproj | 6 +- .../ObjectFeatureContainer.cs | 50 ----- ...pEnvironmentBase.cs => HttpEnvironment.cs} | 2 +- .../HttpEnvironmentExtensions.cs | 10 - .../IHttpEnvironment.cs | 2 +- .../Microsoft.AspNet.HttpEnvironment.csproj | 3 +- .../IHttpApplicationInformation.cs | 5 +- .../IHttpBuffering.cs | 2 +- .../IHttpConnection.cs | 2 +- ...pRequest.cs => IHttpRequestInformation.cs} | 4 +- ...esponse.cs => IHttpResponseInformation.cs} | 4 +- .../IHttpSendFile.cs | 2 +- .../IHttpTransportLayerSecurity.cs | 2 +- .../IHttpWebSocketAccept.cs | 2 +- .../Microsoft.AspNet.HttpFeature.csproj | 4 +- .../Security/IAuthenticationChallenge.cs | 2 +- .../Security/IAuthenticationDescription.cs | 2 +- .../Security/IAuthenticationResult.cs | 2 + .../Security/IAuthenticationSignIn.cs | 2 +- .../Security/IAuthenticationSignOut.cs | 2 +- .../Security/IHttpAuthentication.cs | 3 +- .../BuilderTests.cs | 4 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 37 ++-- .../DefaultHttpContext.cs | 42 ++++ .../{HttpRequest.cs => DefaultHttpRequest.cs} | 18 +- ...HttpResponse.cs => DefaultHttpResponse.cs} | 18 +- .../HttpContext.cs | 44 ---- .../Microsoft.AspNet.PipelineCore.csproj | 10 +- .../Owin/OwinHttpEnvironment.cs | 32 +-- .../Class1.cs | 63 ++++++ ...Microsoft.AspNet.FeatureModel.Tests.csproj | 63 ++++++ .../Properties/AssemblyInfo.cs | 36 ++++ .../packages.config | 5 + 47 files changed, 672 insertions(+), 315 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/HttpContext.cs delete mode 100644 src/Microsoft.AspNet.Abstractions/HttpContextBase.cs rename src/Microsoft.AspNet.Abstractions/{HttpRequestBase.cs => HttpRequest.cs} (80%) rename src/Microsoft.AspNet.Abstractions/{HttpResponseBase.cs => HttpResponse.cs} (69%) delete mode 100644 src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs rename src/Microsoft.AspNet.HttpEnvironment/{HttpEnvironmentBase.cs => HttpEnvironment.cs} (54%) delete mode 100644 src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs rename src/Microsoft.AspNet.HttpFeature/{IHttpRequest.cs => IHttpRequestInformation.cs} (83%) rename src/Microsoft.AspNet.HttpFeature/{IHttpResponse.cs => IHttpResponseInformation.cs} (79%) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs rename src/Microsoft.AspNet.PipelineCore/{HttpRequest.cs => DefaultHttpRequest.cs} (77%) rename src/Microsoft.AspNet.PipelineCore/{HttpResponse.cs => DefaultHttpResponse.cs} (61%) delete mode 100644 src/Microsoft.AspNet.PipelineCore/HttpContext.cs create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/packages.config diff --git a/AspNetAbstractions.sln b/AspNetAbstractions.sln index 2e07b4f2cb..82b860829b 100644 --- a/AspNetAbstractions.sln +++ b/AspNetAbstractions.sln @@ -7,14 +7,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractio EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.csproj", "{A780873E-09F9-4E44-AE06-AF00C4E88E1E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpEnvironment", "src\Microsoft.AspNet.HttpEnvironment\Microsoft.AspNet.HttpEnvironment.csproj", "{46D69EC9-7096-49D8-A184-A9BB5B2419A1}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.csproj", "{42309978-0661-41D8-8654-39453265C5F9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.csproj", "{A4D3E280-8838-4614-9B99-4874C3CBDF82}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "src\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -29,10 +29,6 @@ Global {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.Build.0 = Release|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.Build.0 = Release|Any CPU {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -45,6 +41,10 @@ Global {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs new file mode 100644 index 0000000000..241c1d17e2 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -0,0 +1,28 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpContext : IDisposable + { + // TODO - review IOwinContext for properties + + public abstract HttpRequest Request { get; } + public abstract HttpResponse Response { get; } + + public abstract void Dispose(); + + public abstract object GetInterface(Type type); + + public abstract void SetInterface(Type type, object instance); + + public virtual T GetInterface() + { + return (T)GetInterface(typeof(T)); + } + + public virtual void SetInterface(T instance) + { + SetInterface(typeof(T), instance); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs b/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs deleted file mode 100644 index e1ceb30048..0000000000 --- a/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Microsoft.AspNet.Abstractions -{ - public abstract class HttpContextBase - { - // TODO - review IOwinContext for properties - - public abstract HttpRequestBase Request { get; } - public abstract HttpResponseBase Response { get; } - } -} diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs similarity index 80% rename from src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs rename to src/Microsoft.AspNet.Abstractions/HttpRequest.cs index face559bdb..7277195cc7 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -3,11 +3,11 @@ using System.IO; namespace Microsoft.AspNet.Abstractions { - public abstract class HttpRequestBase + public abstract class HttpRequest { // TODO - review IOwinRequest for properties - public abstract HttpContextBase HttpContext { get; } + public abstract HttpContext HttpContext { get; } public abstract Uri Uri { get; } public abstract PathString PathBase { get; set; } diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs similarity index 69% rename from src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs rename to src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 518ea0355c..caf5dcb09e 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -2,11 +2,11 @@ namespace Microsoft.AspNet.Abstractions { - public abstract class HttpResponseBase + public abstract class HttpResponse { // TODO - review IOwinResponse for completeness - public abstract HttpContextBase HttpContext { get; } + public abstract HttpContext HttpContext { get; } public abstract int StatusCode { get; set; } public abstract Stream Body { get; set; } } diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 9016434cc3..c82f759739 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.Abstractions IBuilder New(); RequestDelegate Build(); - object GetFeature(Type type); - void SetFeature(Type type, object feature); + object GetItem(Type type); + void SetItem(Type type, object feature); } } diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj index 4f5b7f0b33..56b8af40c3 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj @@ -36,9 +36,9 @@ - - - + + + diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs index 98b48bcf94..235b430713 100644 --- a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs @@ -2,5 +2,5 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions { - public delegate Task RequestDelegate(HttpContextBase context); + public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs deleted file mode 100644 index 1b7949658a..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using Microsoft.AspNet.FeatureModel.Implementation; - -namespace Microsoft.AspNet.FeatureModel -{ - public class FeatureContainer : IFeatureContainer - { - private readonly IFeatureContainer _defaultFeatures; - private readonly IDictionary _featureByFeatureType = new Dictionary(); - private readonly IDictionary _featureTypeByName = new Dictionary(); - private readonly object _containerSync = new Object(); - private int _containerRevision; - - public FeatureContainer() - { - } - - public FeatureContainer(IFeatureContainer defaultFeatures) - { - _defaultFeatures = defaultFeatures; - } - - public virtual object GetFeature(Type type) - { - object feature; - if (_featureByFeatureType.TryGetValue(type, out feature)) - { - return feature; - } - - Type actualType; - if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) - { - if (_featureByFeatureType.TryGetValue(actualType, out feature)) - { - return Converter.Convert(type, actualType, feature); - } - } - - return _defaultFeatures != null ? _defaultFeatures.GetFeature(type) : null; - } - - public virtual object GetDefaultFeature(Type type) - { - return null; - } - - public virtual void SetFeature(Type type, object feature) - { - lock (_containerSync) - { - Type priorFeatureType; - if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) - { - if (priorFeatureType == type) - { - _featureByFeatureType[type] = feature; - } - else - { - _featureTypeByName[type.FullName] = type; - _featureByFeatureType.Remove(priorFeatureType); - _featureByFeatureType.Add(type, feature); - } - } - else - { - _featureTypeByName.Add(type.FullName, type); - _featureByFeatureType.Add(type, feature); - } - Interlocked.Increment(ref _containerRevision); - } - } - - public virtual int Revision - { - get { return _containerRevision; } - } - - public void Dispose() - { - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs deleted file mode 100644 index 52529983d0..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNet.FeatureModel -{ - public interface IFeatureContainer : IDisposable - { - object GetFeature(Type type); - void SetFeature(Type type, object feature); - //IEnumerable GetFeatureTypes(); - int Revision { get; } - } -} diff --git a/src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs b/src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs new file mode 100644 index 0000000000..18d07e7937 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.FeatureModel +{ + public interface IInterfaceDictionary : IDictionary, IDisposable + { + int Revision { get; } + } +} diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs index 7f080ab884..918d9f2b8f 100644 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -352,7 +352,7 @@ namespace Microsoft.AspNet.FeatureModel.Implementation static Type CreateWrapperType(Type targetType, Type sourceType, VerificationSucceededResult result) { Dictionary mappings = result.methodMappings; - Type baseType = Assembly.GetExecutingAssembly().GetType("InterfaceMapper.BaseType`1").MakeGenericType(sourceType); + Type baseType = typeof(BaseType<>).MakeGenericType(sourceType); TypeBuilder tb = modb.DefineType("ProxyType" + counter++ + " wrapping:" + sourceType.Name + " to look like:" + targetType.Name, TypeAttributes.Class, baseType, new Type[] { targetType }); ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { sourceType }); ILGenerator il = cb.GetILGenerator(); diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs new file mode 100644 index 0000000000..2181f686f8 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class InterfaceDictionary : IInterfaceDictionary + { + private readonly IInterfaceDictionary _defaults; + private readonly IDictionary _featureByFeatureType = new Dictionary(); + private readonly IDictionary _featureTypeByName = new Dictionary(); + private readonly object _containerSync = new Object(); + private int _containerRevision; + + public InterfaceDictionary() + { + } + + public InterfaceDictionary(IInterfaceDictionary defaults) + { + _defaults = defaults; + } + + public object GetInterface() + { + return GetInterface(null); + } + + public object GetInterface(Type type) + { + if (type == null) throw new ArgumentNullException("type"); + object feature; + if (_featureByFeatureType.TryGetValue(type, out feature)) + { + return feature; + } + + Type actualType; + if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) + { + if (_featureByFeatureType.TryGetValue(actualType, out feature)) + { + if (type.IsInstanceOfType(feature)) + { + return feature; + } + return Converter.Convert(type, actualType, feature); + } + } + + if (_defaults != null && _defaults.TryGetValue(type, out feature)) + { + return feature; + } + return null; + } + + void SetInterface(Type type, object feature) + { + if (type == null) throw new ArgumentNullException("type"); + if (feature == null) throw new ArgumentNullException("feature"); + + lock (_containerSync) + { + Type priorFeatureType; + if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) + { + if (priorFeatureType == type) + { + _featureByFeatureType[type] = feature; + } + else + { + _featureTypeByName[type.FullName] = type; + _featureByFeatureType.Remove(priorFeatureType); + _featureByFeatureType.Add(type, feature); + } + } + else + { + _featureTypeByName.Add(type.FullName, type); + _featureByFeatureType.Add(type, feature); + } + Interlocked.Increment(ref _containerRevision); + } + } + + public virtual int Revision + { + get { return _containerRevision; } + } + + public void Dispose() + { + } + + public IEnumerator> GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(KeyValuePair item) + { + SetInterface(item.Key, item.Value); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + object value; + return TryGetValue(item.Key, out value) && Equals(item.Value, value); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public bool Remove(KeyValuePair item) + { + return Contains(item) && Remove(item.Key); + } + + public int Count + { + get { throw new NotImplementedException(); } + } + + public bool IsReadOnly + { + get { return false; } + } + + public bool ContainsKey(Type key) + { + if (key == null) throw new ArgumentNullException("key"); + return GetInterface(key) != null; + } + + public void Add(Type key, object value) + { + if (key == null) throw new ArgumentNullException("key"); + if (value == null) throw new ArgumentNullException("value"); + if (ContainsKey(key)) + { + throw new ArgumentException(); + } + SetInterface(key, value); + } + + public bool Remove(Type key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(Type key, out object value) + { + throw new NotImplementedException(); + } + + public object this[Type key] + { + get { return GetInterface(key); } + set { SetInterface(key, value); } + } + + public ICollection Keys + { + get { throw new NotImplementedException(); } + } + + public ICollection Values + { + get { throw new NotImplementedException(); } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs new file mode 100644 index 0000000000..6f81904e03 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class InterfaceObject : IInterfaceDictionary + { + private readonly object _instance; + + public InterfaceObject(object instance) + { + _instance = instance; + } + + public void Dispose() + { + var disposable = _instance as IDisposable; + if (disposable != null) + { + disposable.Dispose(); + } + } + + public object GetInterface(Type type) + { + if (type.IsInstanceOfType(_instance)) + { + return _instance; + } + foreach (var interfaceType in _instance.GetType().GetInterfaces()) + { + if (interfaceType.FullName == type.FullName) + { + return Converter.Convert(interfaceType, type, _instance); + } + } + return null; + } + + public void SetInterface(Type type, object feature) + { + throw new NotImplementedException(); + } + + public int Revision + { + get { return 0; } + } + + public IEnumerator> GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public bool Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public int Count + { + get { throw new NotImplementedException(); } + } + + public bool IsReadOnly + { + get { throw new NotImplementedException(); } + } + + public bool ContainsKey(Type key) + { + throw new NotImplementedException(); + } + + public void Add(Type key, object value) + { + throw new NotImplementedException(); + } + + public bool Remove(Type key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(Type key, out object value) + { + throw new NotImplementedException(); + } + + public object this[Type key] + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public ICollection Keys + { + get { throw new NotImplementedException(); } + } + + public ICollection Values + { + get { throw new NotImplementedException(); } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj index a3db9ed3d3..5109def60a 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj @@ -34,10 +34,10 @@ - - + + - + diff --git a/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs deleted file mode 100644 index 48bcb98b75..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using Microsoft.AspNet.FeatureModel.Implementation; - -namespace Microsoft.AspNet.FeatureModel -{ - public class ObjectFeatureContainer : IFeatureContainer - { - private readonly object _instance; - - public ObjectFeatureContainer(object instance) - { - _instance = instance; - } - - public void Dispose() - { - var disposable = _instance as IDisposable; - if (disposable != null) - { - disposable.Dispose(); - } - } - - public object GetFeature(Type type) - { - if (type.IsInstanceOfType(_instance)) - { - return _instance; - } - foreach (var interfaceType in _instance.GetType().GetInterfaces()) - { - if (interfaceType.FullName == type.FullName) - { - return Converter.Convert(interfaceType, type, _instance); - } - } - return null; - } - - public void SetFeature(Type type, object feature) - { - throw new NotImplementedException(); - } - - public int Revision - { - get { return 0; } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironment.cs similarity index 54% rename from src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs rename to src/Microsoft.AspNet.HttpEnvironment/HttpEnvironment.cs index 4d1036d835..5836b621e9 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs +++ b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironment.cs @@ -2,7 +2,7 @@ namespace Microsoft.AspNet.HttpEnvironment { - public abstract class HttpEnvironmentBase : FeatureContainer, IHttpEnvironment + public abstract class HttpEnvironment : InterfaceDictionary, IHttpEnvironment { } } diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs deleted file mode 100644 index ab296451d5..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Microsoft.AspNet.HttpEnvironment -{ - public static class HttpEnvironmentExtensions - { - public static TFeature GetFeature(this IHttpEnvironment environment) where TFeature : class - { - return (TFeature)environment.GetFeature(typeof(TFeature)); - } - } -} diff --git a/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs index ab0bb92bc9..8c4b99eda5 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs +++ b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs @@ -2,7 +2,7 @@ namespace Microsoft.AspNet.HttpEnvironment { - public interface IHttpEnvironment : IFeatureContainer + public interface IHttpEnvironment : IInterfaceDictionary { } } diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj index b1db630e6e..048afaa76f 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj @@ -34,8 +34,7 @@ - - + diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs index 497bff550b..37dea109ab 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; using System.Threading; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpApplicationInformation { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs index 2936208463..e13fde6988 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -1,4 +1,4 @@ -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpBuffering { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index a375e3358b..d659efd69c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,6 +1,6 @@ using System.Net; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpConnection { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs similarity index 83% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs index f125863ee2..424c06f940 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { - public interface IHttpRequest + public interface IHttpRequestInformation { string Protocol { get; set; } string Scheme { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs similarity index 79% rename from src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs index 85921559eb..ce0185c88e 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { - public interface IHttpResponse + public interface IHttpResponseInformation { int StatusCode { get; set; } string ReasonPhrase { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs index 5d10d36c32..f64ea29264 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpSendFile { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index 0d4555284e..596462e28c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,7 +1,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpTransportLayerSecurity { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index f5dbfb8c21..ad0374c7f9 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,7 +1,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpWebSocketAccept { diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj index f881a5f0c9..7b6ab541d0 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj @@ -46,8 +46,8 @@ - - + + diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs index cb336ef6c6..4f8324d45e 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationChallenge { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs index 590addffc4..f7cca258f5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationDescription { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs index 93c9e9a08d..b047bae8bd 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Security.Claims; +using Microsoft.AspNet.HttpFeature.Security; +// ReSharper disable once CheckNamespace namespace Microsoft.AspNet.Interfaces.Security { public interface IAuthenticationResult diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs index 663f19a9a3..6033b173c5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationSignIn { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs index 763bcaed7f..bab55a23e1 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationSignOut { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index ed955970ac..477df94a12 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; using System.Security.Principal; using System.Threading.Tasks; +using Microsoft.AspNet.Interfaces.Security; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IHttpAuthentication { diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index d4f89b64c4..c38e8bbd9a 100644 --- a/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -12,8 +12,8 @@ namespace Microsoft.AspNet.PipelineCore.Tests var builder = new Builder(); var app = builder.Build(); - var mockHttpContext = new Moq.Mock(); - var mockHttpResponse = new Moq.Mock(); + var mockHttpContext = new Moq.Mock(); + var mockHttpResponse = new Moq.Mock(); mockHttpContext.SetupGet(x => x.Response).Returns(mockHttpResponse.Object); mockHttpResponse.SetupProperty(x => x.StatusCode); diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 1e350b305d..26068cf03e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -4,45 +4,52 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpEnvironment; -using Microsoft.AspNet.Interfaces; -using Microsoft.AspNet.PipelineCore.Owin; namespace Microsoft.AspNet.PipelineCore { public class Builder : IBuilder { - private readonly IFeatureContainer _features; + private readonly IInterfaceDictionary _interfaces; + private readonly IDictionary _properties; private readonly IList _components = new List(); public Builder() { - _features = new FeatureModel.FeatureContainer(); + _interfaces = new InterfaceDictionary(); + _properties = new Dictionary(); } - public Builder(IFeatureContainer features) + public Builder(IInterfaceDictionary interfaces, IDictionary properties) { - _features = features; + _interfaces = interfaces; + _properties = properties; } public void Dispose() { - _features.Dispose(); + _interfaces.Dispose(); } - public virtual object GetFeature(Type type) + public virtual object GetItem(Type key) { - return _features.GetFeature(type); + object value; + return _interfaces.TryGetValue(key, out value); } - public virtual void SetFeature(Type type, object feature) + public virtual void SetItem(Type key, object value) { - _features.SetFeature(type, feature); + _interfaces[key] = value; } - public virtual int Revision + public virtual object GetItem(string key) { - get { return _features.Revision; } + object value; + return _properties.TryGetValue(key, out value); + } + + public virtual void SetItem(string key, object value) + { + _properties[key] = value; } public IBuilder Use(object middleware, params object[] args) @@ -65,7 +72,7 @@ namespace Microsoft.AspNet.PipelineCore public IBuilder New() { - return new Builder(_features); + return new Builder(_interfaces, _properties); } public RequestDelegate Build() diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs new file mode 100644 index 0000000000..bbd69ef0f8 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -0,0 +1,42 @@ +using System; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultHttpContext : HttpContext + { + private readonly IInterfaceDictionary _environment; + private readonly HttpRequest _request; + private readonly HttpResponse _response; + + public DefaultHttpContext(IInterfaceDictionary environment) + { + _environment = environment; + _request = new DefaultHttpRequest(this); + _response = new DefaultHttpResponse(this); + } + + public override HttpRequest Request { get { return _request; } } + public override HttpResponse Response { get { return _response; } } + + public int Revision { get { return _environment.Revision; } } + + public override void Dispose() + { + // REVIEW: is this necessary? is the environment "owned" by the context? + _environment.Dispose(); + } + + public override object GetInterface(Type type) + { + object value; + return _environment.TryGetValue(type, out value) ? value : null; + } + + public override void SetInterface(Type type, object instance) + { + _environment[type] = instance; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs similarity index 77% rename from src/Microsoft.AspNet.PipelineCore/HttpRequest.cs rename to src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 2a7385d81a..73860a9f32 100644 --- a/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,31 +1,31 @@ using System; using System.IO; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.Interfaces; namespace Microsoft.AspNet.PipelineCore { - public class HttpRequest : HttpRequestBase + public class DefaultHttpRequest : HttpRequest { - private readonly HttpContext _context; + private readonly DefaultHttpContext _context; private int _revision; - private IHttpRequest _request; + private IHttpRequestInformation _request; private IHttpConnection _connection; - public HttpRequest(HttpContext context) + public DefaultHttpRequest(DefaultHttpContext context) { _context = context; } - private IHttpRequest IHttpRequest + private IHttpRequestInformation IHttpRequest { - get { return EnsureCurrent(_request) ?? (_request = _context.GetFeature()); } + get { return EnsureCurrent(_request) ?? (_request = _context.GetInterface()); } } private IHttpConnection IHttpConnection { - get { return EnsureCurrent(_connection) ?? (_connection = _context.GetFeature()); } + get { return EnsureCurrent(_connection) ?? (_connection = _context.GetInterface()); } } private T EnsureCurrent(T feature) where T : class @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.PipelineCore return null; } - public override HttpContextBase HttpContext { get { return _context; } } + public override HttpContext HttpContext { get { return _context; } } public override Uri Uri { diff --git a/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs similarity index 61% rename from src/Microsoft.AspNet.PipelineCore/HttpResponse.cs rename to src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index bb467e8691..27ed56f4e5 100644 --- a/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,24 +1,24 @@ using System.IO; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.HttpEnvironment; -using Microsoft.AspNet.Interfaces; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore { - public class HttpResponse : HttpResponseBase + public class DefaultHttpResponse : HttpResponse { - private readonly HttpContext _context; - private IHttpResponse _response; + private readonly DefaultHttpContext _context; + private IHttpResponseInformation _response; private int _revision; - public HttpResponse(HttpContext context) + public DefaultHttpResponse(DefaultHttpContext context) { _context = context; } - private IHttpResponse IHttpResponse + private IHttpResponseInformation IHttpResponse { - get { return EnsureCurrent(_response) ?? (_response = _context.GetFeature()); } + get { return EnsureCurrent(_response) ?? (_response = _context.GetInterface()); } } private T EnsureCurrent(T feature) where T : class @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.PipelineCore return null; } - public override HttpContextBase HttpContext { get { return _context; } } + public override HttpContext HttpContext { get { return _context; } } public override int StatusCode { diff --git a/src/Microsoft.AspNet.PipelineCore/HttpContext.cs b/src/Microsoft.AspNet.PipelineCore/HttpContext.cs deleted file mode 100644 index a75c522b56..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/HttpContext.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpEnvironment; - -namespace Microsoft.AspNet.PipelineCore -{ - public class HttpContext : HttpContextBase, IHttpEnvironment - { - private readonly IFeatureContainer _features; - private readonly HttpRequestBase _request; - private readonly HttpResponseBase _response; - - public HttpContext(IHttpEnvironment environment) - { - _features = environment; - _request = new HttpRequest(this); - _response = new HttpResponse(this); - } - - public override HttpRequestBase Request { get { return _request; } } - public override HttpResponseBase Response { get { return _response; } } - - public void Dispose() - { - _features.Dispose(); - } - - public object GetFeature(Type type) - { - return _features.GetFeature(type); - } - - public void SetFeature(Type type, object feature) - { - _features.SetFeature(type, feature); - } - - public int Revision - { - get { return _features.Revision; } - } - } -} diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj index 1cd72c4c66..27cd7e01f4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj @@ -36,9 +36,9 @@ - - - + + + @@ -52,10 +52,6 @@ {4e1520b1-01f4-481b-96a2-24067eaa52fa} Microsoft.AspNet.Abstractions - - {46D69EC9-7096-49D8-A184-A9BB5B2419A1} - Microsoft.AspNet.HttpEnvironment - {42309978-0661-41d8-8654-39453265c5f9} Microsoft.AspNet.HttpFeature diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs index 8f8a948434..124f49e471 100644 --- a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs @@ -6,13 +6,13 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.Interfaces; namespace Microsoft.AspNet.PipelineCore.Owin { public class OwinHttpEnvironment : - IHttpRequest, IHttpResponse, IHttpConnection, IHttpSendFile, IHttpTransportLayerSecurity + IHttpRequestInformation, IHttpResponseInformation, IHttpConnection, IHttpSendFile, IHttpTransportLayerSecurity { public IDictionary Environment { get; set; } @@ -36,84 +36,84 @@ namespace Microsoft.AspNet.PipelineCore.Owin Environment[key] = value; } - string IHttpRequest.Protocol + string IHttpRequestInformation.Protocol { get { return Prop("owin.RequestProtocol"); } set { Prop("owin.RequestProtocol", value); } } - Uri IHttpRequest.Uri + Uri IHttpRequestInformation.Uri { get { throw new NotImplementedException(); } } - string IHttpRequest.Scheme + string IHttpRequestInformation.Scheme { get { return Prop("owin.RequestScheme"); } set { Prop("owin.RequestScheme", value); } } - string IHttpRequest.Method + string IHttpRequestInformation.Method { get { return Prop("owin.RequestMethod"); } set { Prop("owin.RequestMethod", value); } } - string IHttpRequest.PathBase + string IHttpRequestInformation.PathBase { get { return Prop("owin.RequestPathBase"); } set { Prop("owin.RequestPathBase", value); } } - string IHttpRequest.Path + string IHttpRequestInformation.Path { get { return Prop("owin.RequestPath"); } set { Prop("owin.RequestPath", value); } } - string IHttpRequest.QueryString + string IHttpRequestInformation.QueryString { get { return Prop("owin.RequestQueryString"); } set { Prop("owin.RequestQueryString", value); } } - IDictionary IHttpRequest.Headers + IDictionary IHttpRequestInformation.Headers { get { return Prop>("owin.RequestHeaders"); } set { Prop("owin.RequestHeaders", value); } } - Stream IHttpRequest.Body + Stream IHttpRequestInformation.Body { get { return Prop("owin.RequestBody"); } set { Prop("owin.RequestBody", value); } } - int IHttpResponse.StatusCode + int IHttpResponseInformation.StatusCode { get { return Prop("owin.ResponseStatusCode"); } set { Prop("owin.ResponseStatusCode", value); } } - string IHttpResponse.ReasonPhrase + string IHttpResponseInformation.ReasonPhrase { get { return Prop("owin.ResponseReasonPhrase"); } set { Prop("owin.ResponseReasonPhrase", value); } } - IDictionary IHttpResponse.Headers + IDictionary IHttpResponseInformation.Headers { get { return Prop>("owin.ResponseHeaders"); } set { Prop("owin.ResponseHeaders", value); } } - Stream IHttpResponse.Body + Stream IHttpResponseInformation.Body { get { return Prop("owin.ResponseBody"); } set { Prop("owin.ResponseBody", value); } } - void IHttpResponse.OnSendingHeaders(Action callback, object state) + void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) { // TODO: } diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs new file mode 100644 index 0000000000..7527e07ffc --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs @@ -0,0 +1,63 @@ +using System; +using Shouldly; +using Xunit; + +namespace Microsoft.AspNet.FeatureModel.Tests +{ + public interface IThing + { + string Hello(); + } + + public class Thing : IThing + { + public string Hello() + { + return "World"; + } + } + + public class InterfaceDictionaryTests + { + [Fact] + public void AddedInterfaceIsReturned() + { + var interfaces = new InterfaceDictionary(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + + interfaces[typeof(IThing)].ShouldBe(thing); + + object thing2; + interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); + thing2.ShouldBe(thing); + } + + [Fact] + public void IndexerAlsoAddsItems() + { + var interfaces = new InterfaceDictionary(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + + interfaces[typeof(IThing)].ShouldBe(thing); + + object thing2; + interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); + thing2.ShouldBe(thing); + } + + [Fact] + public void SecondCallToAddThrowsException() + { + var interfaces = new InterfaceDictionary(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + + Should.Throw(() => interfaces.Add(typeof(IThing), thing)); + } + } +} diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj new file mode 100644 index 0000000000..98d1189ee4 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj @@ -0,0 +1,63 @@ + + + + + Debug + AnyCPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE} + Library + Properties + Microsoft.AspNet.FeatureModel.Tests + Microsoft.AspNet.FeatureModel.Tests + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\Shouldly.1.1.1.1\lib\35\Shouldly.dll + + + + + ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll + + + + + + + + + + + + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Microsoft.AspNet.FeatureModel + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..da65ff9698 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a780740b-8831-40e0-a084-489d738dfef5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/packages.config b/test/Microsoft.AspNet.FeatureModel.Tests/packages.config new file mode 100644 index 0000000000..5500407987 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 3ef8197d181e07c1f9e777cdc848baba3b6fd5d6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 23 Jan 2014 23:52:20 -0800 Subject: [PATCH 003/846] Updated projects and the build. - Things compile with ifdefs for coreclr now. --- AspNetAbstractions.sln | 88 +++-- Sakefile.shade | 66 ---- build.cmd | 2 +- build.sh | 6 - build/_git-clone.shade | 9 + build/_git-pull.shade | 8 + build/_git.shade | 5 + build/_k-build.shade | 17 + build/_k-clean.shade | 13 + build/_k-generate-projects.shade | 330 ++++++++++++++++++ build/_k-restore.shade | 7 + build/_k-standard-goals.shade | 47 +++ build/_k.shade | 31 ++ build/k10.txt | 50 +++ .../net45.txt | 31 +- makefile.shade | 7 + ... Microsoft.AspNet.Abstractions.k10.csproj} | 40 +-- ...Microsoft.AspNet.Abstractions.net45.csproj | 64 ++++ .../Microsoft.AspNet.Abstractions.nuspec | 22 -- .../project.json | 7 + .../Implementation/Converter.cs | 4 +- .../InterfaceDictionary.cs | 10 +- .../InterfaceObject.cs | 4 + .../Microsoft.AspNet.FeatureModel.k10.csproj | 54 +++ ...Microsoft.AspNet.FeatureModel.net45.csproj | 61 ++++ .../Microsoft.AspNet.FeatureModel.nuspec | 22 -- .../project.json | 7 + ...crosoft.AspNet.HttpEnvironment.k10.csproj} | 39 +-- ...rosoft.AspNet.HttpEnvironment.net45.csproj | 62 ++++ .../Microsoft.AspNet.HttpEnvironment.nuspec | 22 -- .../project.json | 9 + .../IHttpConnection.cs | 4 +- .../IHttpTransportLayerSecurity.cs | 4 + .../IHttpWebSocketAccept.cs | 2 + .../Microsoft.AspNet.HttpFeature.k10.csproj | 64 ++++ ...Microsoft.AspNet.HttpFeature.net45.csproj} | 57 +-- .../Microsoft.AspNet.HttpFeature.nuspec | 22 -- .../Security/IAuthenticationResult.cs | 6 + .../Security/IAuthenticationSignIn.cs | 4 + src/Microsoft.AspNet.HttpFeature/project.json | 6 + .../BuilderTests.cs | 2 +- ...Microsoft.AspNet.PipelineCore.Tests.csproj | 15 +- .../Microsoft.AspNet.PipelineCore.csproj | 71 ---- .../Microsoft.AspNet.PipelineCore.k10.csproj | 65 ++++ ...Microsoft.AspNet.PipelineCore.net45.csproj | 72 ++++ .../Microsoft.AspNet.PipelineCore.nuspec | 22 -- .../Owin/OwinHttpEnvironment.cs | 20 +- .../project.json | 11 + ...Microsoft.AspNet.FeatureModel.Tests.csproj | 9 +- 49 files changed, 1220 insertions(+), 380 deletions(-) delete mode 100644 Sakefile.shade delete mode 100644 build.sh create mode 100644 build/_git-clone.shade create mode 100644 build/_git-pull.shade create mode 100644 build/_git.shade create mode 100644 build/_k-build.shade create mode 100644 build/_k-clean.shade create mode 100644 build/_k-generate-projects.shade create mode 100644 build/_k-restore.shade create mode 100644 build/_k-standard-goals.shade create mode 100644 build/_k.shade create mode 100644 build/k10.txt rename src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj => build/net45.txt (68%) create mode 100644 makefile.shade rename src/Microsoft.AspNet.Abstractions/{Microsoft.AspNet.Abstractions.csproj => Microsoft.AspNet.Abstractions.k10.csproj} (63%) create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj delete mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec create mode 100644 src/Microsoft.AspNet.Abstractions/project.json create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj delete mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec create mode 100644 src/Microsoft.AspNet.FeatureModel/project.json rename src/Microsoft.AspNet.HttpEnvironment/{Microsoft.AspNet.HttpEnvironment.csproj => Microsoft.AspNet.HttpEnvironment.k10.csproj} (61%) create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj delete mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec create mode 100644 src/Microsoft.AspNet.HttpEnvironment/project.json create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj rename src/Microsoft.AspNet.HttpFeature/{Microsoft.AspNet.HttpFeature.csproj => Microsoft.AspNet.HttpFeature.net45.csproj} (54%) delete mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec create mode 100644 src/Microsoft.AspNet.HttpFeature/project.json delete mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj delete mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec create mode 100644 src/Microsoft.AspNet.PipelineCore/project.json diff --git a/AspNetAbstractions.sln b/AspNetAbstractions.sln index 82b860829b..b3df2a2bfa 100644 --- a/AspNetAbstractions.sln +++ b/AspNetAbstractions.sln @@ -3,40 +3,36 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.csproj", "{4E1520B1-01F4-481B-96A2-24067EAA52FA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.csproj", "{A780873E-09F9-4E44-AE06-AF00C4E88E1E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.csproj", "{42309978-0661-41D8-8654-39453265C5F9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.csproj", "{A4D3E280-8838-4614-9B99-4874C3CBDF82}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "src\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{D36288AF-8A0E-48DD-8AF8-15B72F91C70A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{95AEE59D-BF51-47CB-A957-C03D909CC148}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{E9AF7046-E24C-4071-B7AF-7981F2D1A613}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{A6DEB0D3-982E-4A07-8EE7-39269F192AF7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{9295515C-6603-46BB-92EB-1C5F6B0E84C9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{68A538BA-D542-49CB-9615-B4F5A4E78C87}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D38DDB2B-1138-4F45-8A6A-9499E880F620}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1D737C82-F2F1-40B6-AE95-A3D878612E91}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.Build.0 = Release|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.Build.0 = Release|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.Build.0 = Release|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.Build.0 = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -45,8 +41,52 @@ Global {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.Build.0 = Release|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.Build.0 = Release|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.Build.0 = Release|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.Build.0 = Release|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.Build.0 = Release|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.Build.0 = Release|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.Build.0 = Release|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.Build.0 = Release|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {95AEE59D-BF51-47CB-A957-C03D909CC148} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {9295515C-6603-46BB-92EB-1C5F6B0E84C9} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {68A538BA-D542-49CB-9615-B4F5A4E78C87} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {86942914-0334-4352-87ED-B971281C74E2} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} + {8C671AE3-1188-499F-A2A2-3A0B117B33CE} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} + EndGlobalSection EndGlobal diff --git a/Sakefile.shade b/Sakefile.shade deleted file mode 100644 index 56c6a45839..0000000000 --- a/Sakefile.shade +++ /dev/null @@ -1,66 +0,0 @@ - -var PROJECT='AspNetAbstractions' -var VERSION='0.1.0' -var FULL_VERSION='${VERSION}' -var AUTHORS='${PROJECT} contributors' - -var BASE_DIR='${Directory.GetCurrentDirectory()}' -var TARGET_DIR='${Path.Combine(BASE_DIR, "target")}' -var BUILD_DIR='${Path.Combine(TARGET_DIR, "build")}' -var TEST_DIR='${Path.Combine(TARGET_DIR, "test")}' - -default SRC='.' -default BUILD_PROJECTS='${Files.Include(SRC+"/**/*.csproj")}' -default TEST_PROJECTS='${Files.Include(SRC+"/**/*.Tests.csproj")}' - -use namespace='System.Xml.Linq' - --// include range of standard general targets. run "sake targets" to display -use-standard-lifecycle - --// include sets of standard work targets. features include 'nuget,xunit,nunit' -use-standard-goals features='nuget,xunit' - --// additional work targets are defined below - -#nuget-prepare target='package-prepare' description='Compile primary project' - for each='var projectFile in BUILD_PROJECTS.Except(TEST_PROJECTS)' - var outputDirName='${Path.GetFileNameWithoutExtension(projectFile)}' - - var outputDir='${Path.Combine(BUILD_DIR, outputDirName)}' - - copy sourceDir='${Path.GetDirectoryName(projectFile)}' include='*.nuspec' overwrite='${true}' - - var doc='${XDocument.Load(projectFile)}' - var ns='http://schemas.microsoft.com/developer/msbuild/2003' - var itemGroups='${doc.Elements(XName.Get("Project", ns)).Elements(XName.Get("ItemGroup", ns))}' - var compileItems='${itemGroups.Elements(XName.Get("Compile", ns))}' - var contentItems='${itemGroups.Elements(XName.Get("Content", ns))}' - var noneItems='${itemGroups.Elements(XName.Get("None", ns))}' - var razorItems='${contentItems.Union(noneItems).Where(x=>x.Attribute("Include").Value.EndsWith(".cshtml"))}' - - for each='var compileElt in compileItems.Union(razorItems)' - var linkElt='${compileElt.Elements(XName.Get("Link", ns)).SingleOrDefault()}' - - var sourceFile='${compileElt.Attribute("Include").Value}' - var targetFile='${linkElt == null ? sourceFile : linkElt.Value}' - - var sourceFull='${Path.Combine(Path.GetDirectoryName(projectFile), sourceFile)}' - var targetFull='${Path.Combine(outputDir, "src", targetFile)}' - directory create='${Path.GetDirectoryName(targetFull)}' - -File.Copy(sourceFull, targetFull, true); - -#nuget-package target='package' description='Create NuGet packages' - for each='var file in Files.Include(BUILD_DIR + "/**/*.nuspec")' - var baseName='${Path.GetFileNameWithoutExtension(file)}' - var nugetProperties='${new Dictionary { - {"id", baseName}, - {"authors", AUTHORS}, - {"title", baseName}, - {"description", baseName}, - {"licenseUrl", "about:blank"}, - {"projectUrl", "about:blank"}, - {"tags", "Katana"}, - }}' - var props='${string.Join(";", nugetProperties.Select(kv=>kv.Key+"="+kv.Value).ToArray())}' - nuget-pack nuspecFile='${file}' packageVersion='${FULL_VERSION}' outputDir='${TARGET_DIR}' extra='-NoPackageAnalysis -Properties "${props}"' diff --git a/build.cmd b/build.cmd index 65dfe408fd..e2ce3f1317 100644 --- a/build.cmd +++ b/build.cmd @@ -9,4 +9,4 @@ mkdir .nuget :part2 set EnableNuGetPackageRestore=true .nuget\NuGet.exe install Sake -version 0.2 -o packages -packages\Sake.0.2\tools\Sake.exe -I build -f Sakefile.shade %* +packages\Sake.0.2\tools\Sake.exe -I build -f makefile.shade %* diff --git a/build.sh b/build.sh deleted file mode 100644 index 8a58a5e2a9..0000000000 --- a/build.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -export EnableNuGetPackageRestore=true -mono --runtime=v4.0 ".nuget/NuGet.exe" install Sake -pre -o packages -mono $(find packages/Sake.*/tools/Sake.exe|sort -r|head -n1) -f Sakefile.shade -I src/build "$@" - diff --git a/build/_git-clone.shade b/build/_git-clone.shade new file mode 100644 index 0000000000..32355ab5a3 --- /dev/null +++ b/build/_git-clone.shade @@ -0,0 +1,9 @@ + + + +default gitBranch='' + +var gitCommand='clone ${gitUri}' +set gitCommand='${gitCommand} --branch ${gitBranch}' if='!string.IsNullOrEmpty(gitBranch)' + +git diff --git a/build/_git-pull.shade b/build/_git-pull.shade new file mode 100644 index 0000000000..1e7971020f --- /dev/null +++ b/build/_git-pull.shade @@ -0,0 +1,8 @@ + + +default gitBranch='' + +var gitCommand='pull ${gitUri}' +set gitCommand='${gitCommand} ${gitBranch}' if='!string.IsNullOrEmpty(gitBranch)' + +git diff --git a/build/_git.shade b/build/_git.shade new file mode 100644 index 0000000000..7495a598bb --- /dev/null +++ b/build/_git.shade @@ -0,0 +1,5 @@ + +default gitFolder='' + +exec program='git' commandline='${gitCommand}' workingdir='${gitFolder}' + diff --git a/build/_k-build.shade b/build/_k-build.shade new file mode 100644 index 0000000000..435bdca74a --- /dev/null +++ b/build/_k-build.shade @@ -0,0 +1,17 @@ +@{/* + +k-build + Builds project. Downloads and executes k sdk tools. + +projectFile='' + Required. Path to the project.json to build. + +*/} + +var projectFolder='${Path.GetDirectoryName(projectFile)}' +var projectName='${Path.GetFileName(projectFolder)}' +var projectBin='${Path.Combine(projectFolder, "bin")}' + +directory delete="${projectBin}" +k command='build ${projectFolder}' +copy sourceDir='${projectBin}' outputDir='${Path.Combine(BUILD_DIR, projectName)}' diff --git a/build/_k-clean.shade b/build/_k-clean.shade new file mode 100644 index 0000000000..7f8b643682 --- /dev/null +++ b/build/_k-clean.shade @@ -0,0 +1,13 @@ +@{/* + +k-clean + Cleans project. Downloads and executes k sdk tools. + +projectFile='' + Required. Path to the project.json to build. + +*/} + +var projectFolder='${Path.GetDirectoryName(projectFile)}' + +k command='clean ${projectFolder}' diff --git a/build/_k-generate-projects.shade b/build/_k-generate-projects.shade new file mode 100644 index 0000000000..01af0cd018 --- /dev/null +++ b/build/_k-generate-projects.shade @@ -0,0 +1,330 @@ +use namespace="System" +use namespace="System.Collections.Generic" +use namespace="System.IO" +use namespace="System.Linq" +use namespace="System.Reflection" +use namespace="System.Text" +use namespace="System.Web.Script.Serialization" +use namespace="System.Xml.Linq" + +use assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" + +@{/* + +k-generate-projects + Generate csproj files from project.json + +solutionPath='' + Required. Path to the solution directory + +*/} + +content var='net45' include href='net45.txt' +content var='k10' include href='k10.txt' + +@{ + ProjectGenerator.Logger = Log; + + var templates = new Dictionary { + { "net45", net45 }, + { "k10", k10 } + }; + + ProjectGenerator.MakeProjects(solutionPath, templates); +} + +functions + @{ + class ProjectGenerator + { + public static Sake.Engine.Logging.ILog Logger { get; set; } + + static void Log(string message, params object[] args) + { + Logger.Info(String.Format(message, args)); + } + + static void Warn(string message, params object[] args) + { + Logger.Warn(String.Format(message, args)); + } + + public static void MakeProjects(string solutionPath, IDictionary templates) + { + var jsonFiles = GetJsonFiles(solutionPath); + var projectMapping = GetProjectMapping(solutionPath, jsonFiles); + + Log("Found {0} projects", jsonFiles.Length); + + foreach (var p in jsonFiles) + { + Log(p); + } + + foreach (var path in jsonFiles) + { + ProduceProjectFilesForProject(path, projectMapping, templates); + } + } + + private static string[] GetJsonFiles(string solutionPath) + { + Func getFiles = dir => + { + string path = Path.Combine(solutionPath, dir); + + if (!Directory.Exists(path)) + { + return new string[0]; + } + + return Directory.GetFiles(path, "project.json", SearchOption.AllDirectories); + }; + + return getFiles("src").Concat(getFiles("samples")) + .Concat(getFiles("test")) + .ToArray(); + } + + private static IDictionary GetProjectMapping(string solutionPath, string[] jsonFiles) + { + var dict = new Dictionary(); + + foreach (var path in jsonFiles) + { + string projectDir = Path.GetDirectoryName(path); + string projectName = projectDir.Substring(Path.GetDirectoryName(projectDir).Length).Trim(Path.DirectorySeparatorChar); + + // { + // "p1" : { "net45" : "id", "k10" : "pid1", path: "src\p1" }, + // "p2" : { "net45" : "id", "k10" : "pid2", path: "src\p2" } + // } + // + + string net45Project = Path.Combine(projectDir, GetProjectFileName(projectName, "net45")); + string k10Project = Path.Combine(projectDir, GetProjectFileName(projectName, "k10")); + + var configs = new Dictionary(); + configs["net45"] = GetProjectGuidFromFileOrCreateNew(net45Project); + configs["k10"] = GetProjectGuidFromFileOrCreateNew(k10Project); + configs["path"] = Path.GetDirectoryName(path.Substring(solutionPath.Length).TrimStart(Path.DirectorySeparatorChar)); + + dict[projectName] = configs; + } + + return dict; + } + + private static string GetProjectGuidFromFileOrCreateNew(string projectPath) + { + if (!File.Exists(projectPath)) + { + return Guid.NewGuid().ToString().ToUpper(); + } + + var projectGuid = XDocument.Parse(File.ReadAllText(projectPath)) + .Descendants() + .FirstOrDefault(e => e.Name.LocalName.Equals("ProjectGuid")); + + if (projectGuid == null) + { + return Guid.NewGuid().ToString(); + } + + return projectGuid.Value.Trim((char)'{', (char)'}'); + } + + private static void ProduceProjectFilesForProject(string jsonPath, + IDictionary projectMapping, + IDictionary templates) + { + var serializer = new JavaScriptSerializer(); + + string projectDir = Path.GetDirectoryName(jsonPath); + string projectName = projectDir.Substring(Path.GetDirectoryName(projectDir).Length).Trim(Path.DirectorySeparatorChar); + + Log("Generated projects for {0}", projectName); + + var jsonText = File.ReadAllText(jsonPath); + + var d = serializer.DeserializeObject(jsonText) as IDictionary; + var configs = GetObject(d, "configurations"); + var references = GetObject(d, "dependencies") ?? new Dictionary(); + + // Get the list of files + var filesString = String.Join(Environment.NewLine, + Directory.GetFiles(projectDir, "*.cs", SearchOption.AllDirectories) + .Select(p => p.Substring(projectDir.Length).Trim(Path.DirectorySeparatorChar)) + .Where(p => !p.StartsWith("obj")) + .Select(p => String.Format( + @"", p))); + + // Add the config file if it's there + if (File.Exists(Path.Combine(projectDir, "packages.config"))) + { + filesString += ""; + } + + var packageReferences = references.Where(r => !String.IsNullOrEmpty((string)r.Value)) + .ToDictionary(k => k.Key, k => (string)k.Value); + + var projectReferences = references.Where(r => String.IsNullOrEmpty((string)r.Value)) + .Select(r => r.Key) + .ToArray(); + + + // HACK: Assume the packages folder is 2 up from the projectDir + string packagesDir = Path.GetFullPath(Path.Combine(projectDir, "..", "..", "packages")); + + foreach (var targetFramework in configs.Keys) + { + string id = (string)GetObject(projectMapping, projectName)[targetFramework]; + + var template = templates[targetFramework] + .Replace("{ProjectGuid}", id) + .Replace("{Name}", projectName) + .Replace("{Files}", filesString) + .Replace("{ProjectReferences}", BuildProjectReferences(projectReferences, targetFramework, projectMapping)) + .Replace("{References}", BuildReferences(packageReferences, packagesDir, targetFramework, GetCandidates(targetFramework))); + + if (targetFramework.StartsWith("k")) + { + template = template.Replace("{CSharpTargetsPath}", GetProjectKTargets(packagesDir)); + } + + string output = Path.Combine(projectDir, GetProjectFileName(projectName, targetFramework)); + + Log("Generated {0}", output); + + File.WriteAllText(output, template); + } + } + + private static string GetProjectKTargets(string packagesDir) + { + var projectK = Directory.GetDirectories(packagesDir, "ProjectK*") + .Select(p => new { Path = p, Build = Int32.Parse(p.Substring(p.LastIndexOf('-') + 1)) }) + .OrderByDescending(p => p.Build) + .FirstOrDefault(); + + if (projectK == null) + { + Warn("Project K targets aren't installed"); + return ""; + } + + return Path.Combine("..", "..", projectK.Path.Substring(projectK.Path.IndexOf("packages")), "Framework\\K\\v1.0\\ProjectK.CSharp.targets"); + } + + private static string GetProjectFileName(string projectName, string config) + { + return projectName + "." + config + ".csproj"; + } + + private static string BuildProjectReferences(string[] projectReferences, string config, IDictionary projectMapping) + { + if (projectReferences.Length == 0) + { + return ""; + } + + var sb = new StringBuilder(); + + foreach (var reference in projectReferences) + { + var info = GetObject(projectMapping, reference); + + if (info == null) + { + Warn("No project reference found for {0}", reference); + continue; + } + + string projectFileName = GetProjectFileName(reference, config); + string path = Path.Combine((string)info["path"], projectFileName); + + sb.AppendFormat(@" + {{{1}}} + {2} + ", path, info[config], reference); + } + + return sb.ToString(); + } + + private static string[] GetCandidates(string config) + { + if (config == "net45") + { + return new[] { "net45", "net40", "net35", "net20" }; + } + + return new[] { config }; + } + + private static string BuildReferences(IDictionary references, string packagesDir, string configName, string[] candidates) + { + if (references.Count == 0) + { + return ""; + } + + Log("Building package references for {0}", configName); + + var sb = new StringBuilder(); + + foreach (var reference in references) + { + var version = (string)reference.Value; + + string pattern = version.IndexOf("*") != -1 ? reference.Key + "*" : reference.Key + "." + reference.Value; + + var packageDir = Directory.GetDirectories(packagesDir, pattern).FirstOrDefault(); + + if (packageDir == null) + { + Warn(reference.Key + " = " + version + " ==> UNRESOLVED"); + continue; + } + + Log(reference.Key + " = " + version + " ==> " + packageDir); + + var candidate = candidates.Select(c => Path.Combine(packageDir, "lib", c)) + .FirstOrDefault(Directory.Exists); + + if (candidate == null) + { + Warn("Unable to find package reference for {0}, target framework = {1}", reference.Key, configName); + continue; + } + + var dlls = Directory.EnumerateFiles(candidate, "*.dll") + .Distinct() + .Where(File.Exists) + .ToList(); + + foreach (var dllPath in dlls) + { + sb.AppendFormat(@" + + False + ..\..\{1} + ", AssemblyName.GetAssemblyName(dllPath).FullName, dllPath.Substring(dllPath.IndexOf("packages"))); + } + } + + return sb.ToString(); + } + + private static IDictionary GetObject(IDictionary obj, string key) + { + object value; + if (obj.TryGetValue(key, out value)) + { + return value as IDictionary; + } + + return null; + } + } + } diff --git a/build/_k-restore.shade b/build/_k-restore.shade new file mode 100644 index 0000000000..0f20db0fc0 --- /dev/null +++ b/build/_k-restore.shade @@ -0,0 +1,7 @@ +@{/* + +k-restore + Restores nuget packages required for k projects. Downloads and executes k sdk tools. +*/} + +k command='restore' diff --git a/build/_k-standard-goals.shade b/build/_k-standard-goals.shade new file mode 100644 index 0000000000..b6a38ff7dd --- /dev/null +++ b/build/_k-standard-goals.shade @@ -0,0 +1,47 @@ +use namespace="System" +use namespace="System.IO" +use import="Files" + +default BASE_DIR='${Directory.GetCurrentDirectory()}' +default TARGET_DIR='${Path.Combine(BASE_DIR, "artifacts")}' +default BUILD_DIR='${Path.Combine(TARGET_DIR, "build")}' +default TEST_DIR='${Path.Combine(TARGET_DIR, "test")}' + +@{ + E("K_BUILD_VERSION", "t" + DateTime.UtcNow.ToString("yyMMddHHmmss")); +} + +#target-default target='default' + k-restore + k-generate-projects solutionPath='${BASE_DIR}' + +#target-dir-clean target='clean' + directory delete="${TARGET_DIR}" + +#build-clean target='clean' + k-clean each='var projectFile in Files.Include("src/**/project.json")' + +#build-compile target='compile' + k-build each='var projectFile in Files.Include("src/**/project.json")' + @{ + foreach (var nupkg in Files.Include(Path.Combine(BUILD_DIR, "*/*.nupkg"))) + { + File.Copy(nupkg, Path.Combine(BUILD_DIR, Path.GetFileName(nupkg)), true); + } + } + +#nuget-install target='install' description='Copy NuGet packages to local repo' + @{ + var HOME_DIR = E("HOME"); + if (string.IsNullOrEmpty(HOME_DIR)) + { + HOME_DIR = E("HOMEDRIVE") + E("HOMEPATH"); + } + } + copy sourceDir='${BUILD_DIR}' include='*.nupkg' outputDir='${Path.Combine(HOME_DIR, ".nuget")}' overwrite='${true}' + + +functions @{ + string E(string key) { return Environment.GetEnvironmentVariable(key); } + void E(string key, string value) { Environment.SetEnvironmentVariable(key, value); } +} diff --git a/build/_k.shade b/build/_k.shade new file mode 100644 index 0000000000..c0e216dcae --- /dev/null +++ b/build/_k.shade @@ -0,0 +1,31 @@ +@{/* + +k + Run klr commands in your project. Downloads and executes k sdk. + +kVersion='0.0.1-pre-30109-087' + May be passed to override the nuget package version holding xunit console runner. + +kProgram='...' + May be passed to override the path to the xunit program that will be executed + +command='' + +*/} + +default kLatestSuccessful='\\wsr-teamcity\Drops\ProjectK.Main\latest-successful\sdk' +default kVersion='' + +test if='string.IsNullOrEmpty(kVersion)' + for each='var file in System.IO.Directory.EnumerateFiles(kLatestSuccessful).Select(System.IO.Path.GetFileName)' + test if='file.StartsWith("ProjectK.") && file.EndsWith(".nupkg")' + - kVersion = file.Substring("ProjectK.".Length, file.Length - "ProjectK.".Length - ".nupkg".Length); + +default kProgram='packages/ProjectK.${kVersion}/tools/k.cmd' + +-// Download xunit from nuget sources if not already present +test if='!File.Exists(kProgram)' + log info='Installing ProjectK ${kVersion} from ${kLatestSuccessful}' + nuget-install package='ProjectK' packageVersion='${kVersion}' outputDir='packages' extra='-Source ${kLatestSuccessful}' + +exec program='${Path.GetFullPath(kProgram)}' commandline='${command}' diff --git a/build/k10.txt b/build/k10.txt new file mode 100644 index 0000000000..60c669f855 --- /dev/null +++ b/build/k10.txt @@ -0,0 +1,50 @@ + + + + + Debug + AnyCPU + {{ProjectGuid}} + Library + Properties + {Name} + {Name} + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + {Files} + + + + {ProjectReferences} + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj b/build/net45.txt similarity index 68% rename from src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj rename to build/net45.txt index 5109def60a..8d2e271f7b 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj +++ b/build/net45.txt @@ -4,44 +4,47 @@ Debug AnyCPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + {{ProjectGuid}} Library Properties - Microsoft.AspNet.FeatureModel - Microsoft.AspNet.FeatureModel + {Name} + {Name} v4.5 512 + obj/net45 + AnyCPU true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug\net45 + DEBUG;TRACE;NET45 prompt 4 + AnyCPU pdbonly true - bin\Release\ - TRACE + bin\Release\net45 + TRACE;NET45 prompt 4 - bin\Release\Microsoft.AspNet.FeatureModel.XML + + + + {References} - - - - - + {Files} + - + {ProjectReferences} + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json new file mode 100644 index 0000000000..d2bb6fd770 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -0,0 +1,7 @@ +{ + "dependencies": {}, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs index 918d9f2b8f..32f3943634 100644 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -7,6 +7,7 @@ using System.Runtime.CompilerServices; namespace Microsoft.AspNet.FeatureModel.Implementation { + #if NET45 public abstract class NonGenericProxyBase { public readonly Type WrappedType; @@ -381,4 +382,5 @@ namespace Microsoft.AspNet.FeatureModel.Implementation } } -} + #endif +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs index 2181f686f8..a0f31a2306 100644 --- a/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs @@ -42,11 +42,19 @@ namespace Microsoft.AspNet.FeatureModel { if (_featureByFeatureType.TryGetValue(actualType, out feature)) { - if (type.IsInstanceOfType(feature)) +#if NET45 + var isInstanceOfType = type.IsInstanceOfType(feature); +#else + var isInstanceOfType = feature != null && type == feature.GetType(); +#endif + + if (isInstanceOfType) { return feature; } +#if NET45 return Converter.Convert(type, actualType, feature); +#endif } } diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs index 6f81904e03..4673cd9c44 100644 --- a/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.FeatureModel.Implementation; @@ -25,10 +26,12 @@ namespace Microsoft.AspNet.FeatureModel public object GetInterface(Type type) { +#if NET45 if (type.IsInstanceOfType(_instance)) { return _instance; } + foreach (var interfaceType in _instance.GetType().GetInterfaces()) { if (interfaceType.FullName == type.FullName) @@ -36,6 +39,7 @@ namespace Microsoft.AspNet.FeatureModel return Converter.Convert(interfaceType, type, _instance); } } +#endif return null; } diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj new file mode 100644 index 0000000000..776ade7f7e --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} + Library + Properties + Microsoft.AspNet.FeatureModel + Microsoft.AspNet.FeatureModel + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj new file mode 100644 index 0000000000..a9c22f4ba0 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {95AEE59D-BF51-47CB-A957-C03D909CC148} + Library + Properties + Microsoft.AspNet.FeatureModel + Microsoft.AspNet.FeatureModel + v4.5 + 512 + obj/net45 + + + AnyCPU + true + full + false + bin\Debug\net45 + DEBUG;TRACE;NET45 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\net45 + TRACE;NET45 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json new file mode 100644 index 0000000000..d2bb6fd770 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -0,0 +1,7 @@ +{ + "dependencies": {}, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj similarity index 61% rename from src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj rename to src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj index 048afaa76f..91f02062eb 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj @@ -1,53 +1,50 @@ - + - + Debug AnyCPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1} + {F677AA06-54DB-43E0-B193-CC04D1095A2B} Library Properties Microsoft.AspNet.HttpEnvironment Microsoft.AspNet.HttpEnvironment v4.5 512 + obj/K + AnyCPU true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug\K + DEBUG;TRACE;K10 prompt 4 + AnyCPU pdbonly true - bin\Release\ - TRACE + bin\Release\K + TRACE;K10 prompt 4 - bin\Release\Microsoft.AspNet.HttpEnvironment.XML - - - - - + + + - - {A780873E-09F9-4E44-AE06-AF00C4E88E1E} - Microsoft.AspNet.FeatureModel - + + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} + Microsoft.AspNet.FeatureModel + - - - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.HttpEnvironment/project.json b/src/Microsoft.AspNet.HttpEnvironment/project.json new file mode 100644 index 0000000000..bea3db51c3 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/project.json @@ -0,0 +1,9 @@ +{ + "dependencies": { + "Microsoft.AspNet.FeatureModel" : "" + }, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index d659efd69c..fcb2318f3d 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -4,9 +4,11 @@ namespace Microsoft.AspNet.HttpFeature { public interface IHttpConnection { +#if NET45 IPAddress RemoteIpAddress { get; set; } - int RemotePort { get; set; } IPAddress LocalIpAddress { get; set; } +#endif + int RemotePort { get; set; } int LocalPort { get; set; } bool IsLocal { get; set; } } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index 596462e28c..a08136b6aa 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,11 +1,15 @@ +#if NET45 using System.Security.Cryptography.X509Certificates; +#endif using System.Threading.Tasks; namespace Microsoft.AspNet.HttpFeature { public interface IHttpTransportLayerSecurity { +#if NET45 X509Certificate ClientCertificate { get; set; } +#endif Task LoadAsync(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index ad0374c7f9..d7b230df24 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,3 +1,4 @@ +#if NET45 using System.Net.WebSockets; using System.Threading.Tasks; @@ -9,3 +10,4 @@ namespace Microsoft.AspNet.HttpFeature Task AcceptAsync(); } } +#endif \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj new file mode 100644 index 0000000000..5bbb67dd94 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9} + Library + Properties + Microsoft.AspNet.HttpFeature + Microsoft.AspNet.HttpFeature + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj similarity index 54% rename from src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj rename to src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj index 7b6ab541d0..dea0824cd3 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj @@ -1,59 +1,66 @@ - + - + Debug AnyCPU - {42309978-0661-41D8-8654-39453265C5F9} + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} Library Properties Microsoft.AspNet.HttpFeature Microsoft.AspNet.HttpFeature v4.5 512 + obj/net45 + AnyCPU true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug\net45 + DEBUG;TRACE;NET45 prompt 4 + AnyCPU pdbonly true - bin\Release\ - TRACE + bin\Release\net45 + TRACE;NET45 prompt 4 - bin\Release\Microsoft.AspNet.HttpFeature.xml - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - + - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj new file mode 100644 index 0000000000..969ff37c3e --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + + + + + + + + + + + + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} + Microsoft.AspNet.FeatureModel + + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} + Microsoft.AspNet.Abstractions + + {9295515C-6603-46BB-92EB-1C5F6B0E84C9} + Microsoft.AspNet.HttpFeature + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj new file mode 100644 index 0000000000..ff38272dce --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + obj/net45 + + + AnyCPU + true + full + false + bin\Debug\net45 + DEBUG;TRACE;NET45 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\net45 + TRACE;NET45 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + {95AEE59D-BF51-47CB-A957-C03D909CC148} + Microsoft.AspNet.FeatureModel + + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} + Microsoft.AspNet.Abstractions + + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} + Microsoft.AspNet.HttpFeature + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs index 124f49e471..c8013ed522 100644 --- a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs @@ -3,7 +3,9 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; +#if NET45 using System.Security.Cryptography.X509Certificates; +#endif using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature; @@ -117,24 +119,24 @@ namespace Microsoft.AspNet.PipelineCore.Owin { // TODO: } - +#if NET45 IPAddress IHttpConnection.RemoteIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } } - int IHttpConnection.RemotePort - { - get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } - set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } - } - IPAddress IHttpConnection.LocalIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } } +#endif + int IHttpConnection.RemotePort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } + set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } + } int IHttpConnection.LocalPort { @@ -152,13 +154,13 @@ namespace Microsoft.AspNet.PipelineCore.Owin { throw new NotImplementedException(); } - +#if NET45 X509Certificate IHttpTransportLayerSecurity.ClientCertificate { get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - +#endif Task IHttpTransportLayerSecurity.LoadAsync() { throw new NotImplementedException(); diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json new file mode 100644 index 0000000000..062ab51708 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -0,0 +1,11 @@ +{ + "dependencies": { + "Microsoft.AspNet.FeatureModel" : "", + "Microsoft.AspNet.Abstractions" : "", + "Microsoft.AspNet.HttpFeature" : "" + }, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj index 98d1189ee4..5f11f27e55 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj @@ -47,11 +47,14 @@ - - {A780873E-09F9-4E44-AE06-AF00C4E88E1E} - Microsoft.AspNet.FeatureModel + + {95aee59d-bf51-47cb-a957-c03d909cc148} + Microsoft.AspNet.FeatureModel.net45 + + + - \ No newline at end of file diff --git a/build/net45.txt b/build/net45.txt deleted file mode 100644 index 8d2e271f7b..0000000000 --- a/build/net45.txt +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Debug - AnyCPU - {{ProjectGuid}} - Library - Properties - {Name} - {Name} - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - {References} - - - {Files} - - - - {ProjectReferences} - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj index 3b3c436ff8..3c2308ba77 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj @@ -46,7 +46,10 @@ - + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs new file mode 100644 index 0000000000..885b7952d1 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs @@ -0,0 +1,19 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions.Owin; + +namespace Owin +{ + public static class OwinExtensions + { + public static void RunHttpContext(this IAppBuilder app, Func handler) + { + app.Run(context => + { + var httpContext = new OwinHttpContext(context); + + return handler(httpContext); + }); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs new file mode 100644 index 0000000000..2762319fcd --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs @@ -0,0 +1,175 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.Owin; + +namespace Microsoft.AspNet.Abstractions.Owin +{ + public class OwinHttpContext : HttpContext + { + private readonly IOwinContext _context; + private readonly HttpRequest _request; + private readonly HttpResponse _response; + + public OwinHttpContext(IOwinContext context) + { + _context = context; + _request = new OwinHttpRequest(this, context.Request); + _response = new OwinHttpResponse(this, context.Response); + } + + public override void Dispose() + { + + } + + public override object GetInterface(Type type) + { + return null; + } + + public override HttpRequest Request + { + get { return _request; } + } + + public override HttpResponse Response + { + get { return _response; } + } + + public override void SetInterface(Type type, object instance) + { + + } + + private class OwinHttpRequest : HttpRequest + { + private HttpContext _context; + private IOwinRequest _request; + + public OwinHttpRequest(HttpContext context, IOwinRequest request) + { + _context = context; + _request = request; + } + + public override Stream Body + { + get + { + return _request.Body; + } + set + { + _request.Body = value; + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override Microsoft.AspNet.Abstractions.PathString Path + { + get + { + return new Microsoft.AspNet.Abstractions.PathString(_request.Path.Value); + } + set + { + _request.Path = new Microsoft.Owin.PathString(value.Value); + } + } + + public override Microsoft.AspNet.Abstractions.PathString PathBase + { + get + { + return new Microsoft.AspNet.Abstractions.PathString(_request.PathBase.Value); + } + set + { + _request.PathBase = new Microsoft.Owin.PathString(value.Value); + } + } + + public override Microsoft.AspNet.Abstractions.QueryString QueryString + { + get + { + return new Microsoft.AspNet.Abstractions.QueryString(_request.QueryString.Value); + } + set + { + _request.QueryString = new Microsoft.Owin.QueryString(value.Value); + } + } + + public override Uri Uri + { + get { return _request.Uri; } + } + } + + private class OwinHttpResponse : HttpResponse + { + private readonly HttpContext _context; + private readonly IOwinResponse _response; + + public OwinHttpResponse(HttpContext context, IOwinResponse response) + { + _context = context; + _response = response; + } + + public override Stream Body + { + get + { + return _response.Body; + } + set + { + _response.Body = value; + } + } + + public override string ContentType + { + get + { + return _response.ContentType; + } + set + { + _response.ContentType = value; + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override int StatusCode + { + get + { + return _response.StatusCode; + } + set + { + _response.StatusCode = value; + } + } + + public override Task WriteAsync(string data) + { + return _response.WriteAsync(data); + } + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions.Owin/project.json b/src/Microsoft.AspNet.Abstractions.Owin/project.json new file mode 100644 index 0000000000..b2b9a4babd --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/project.json @@ -0,0 +1,11 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.AspNet.Abstractions": "" + }, + "configurations": { + "net45": { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj index 3c2308ba77..1b1196a9e7 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj @@ -49,7 +49,7 @@ - + - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj deleted file mode 100644 index 1b1196a9e7..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Debug - AnyCPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} - Library - Properties - Microsoft.AspNet.Abstractions - Microsoft.AspNet.Abstractions - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj deleted file mode 100644 index d33c822788..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - - Debug - AnyCPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} - Library - Properties - Microsoft.AspNet.Abstractions - Microsoft.AspNet.Abstractions - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj deleted file mode 100644 index db4da7a2e6..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Debug - AnyCPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} - Library - Properties - Microsoft.AspNet.FeatureModel - Microsoft.AspNet.FeatureModel - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj deleted file mode 100644 index a9c22f4ba0..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Library - Properties - Microsoft.AspNet.FeatureModel - Microsoft.AspNet.FeatureModel - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj deleted file mode 100644 index 89b30af727..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - AnyCPU - {F677AA06-54DB-43E0-B193-CC04D1095A2B} - Library - Properties - Microsoft.AspNet.HttpEnvironment - Microsoft.AspNet.HttpEnvironment - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} - Microsoft.AspNet.FeatureModel - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj deleted file mode 100644 index 67cf5e091b..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Debug - AnyCPU - {619C3A71-2D70-4387-8026-F414CAC8022B} - Library - Properties - Microsoft.AspNet.HttpEnvironment - Microsoft.AspNet.HttpEnvironment - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Microsoft.AspNet.FeatureModel - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj deleted file mode 100644 index f77d44a98f..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Debug - AnyCPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9} - Library - Properties - Microsoft.AspNet.HttpFeature - Microsoft.AspNet.HttpFeature - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj deleted file mode 100644 index dea0824cd3..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} - Library - Properties - Microsoft.AspNet.HttpFeature - Microsoft.AspNet.HttpFeature - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj deleted file mode 100644 index 3759126b6a..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Debug - AnyCPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} - Library - Properties - Microsoft.AspNet.PipelineCore - Microsoft.AspNet.PipelineCore - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} - Microsoft.AspNet.FeatureModel - - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} - Microsoft.AspNet.Abstractions - - {9295515C-6603-46BB-92EB-1C5F6B0E84C9} - Microsoft.AspNet.HttpFeature - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj deleted file mode 100644 index ff38272dce..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - - Debug - AnyCPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87} - Library - Properties - Microsoft.AspNet.PipelineCore - Microsoft.AspNet.PipelineCore - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Microsoft.AspNet.FeatureModel - - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} - Microsoft.AspNet.Abstractions - - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} - Microsoft.AspNet.HttpFeature - - - - - \ No newline at end of file From 6b3cd344398df1712553638be9e960eda9d7d2fa Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 26 Jan 2014 01:29:01 -0800 Subject: [PATCH 014/846] Skip the cache for KoreBuild --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index c38178cce8..683a09d87c 100644 --- a/build.cmd +++ b/build.cmd @@ -8,7 +8,7 @@ md .nuget :restore IF EXIST build goto run -.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages +.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache xcopy packages\KoreBuild\build build\ /Y .nuget\NuGet.exe install Sake -version 0.2 -o packages From 44de53593087795bd4cb609033d0fafdd3065b06 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 26 Jan 2014 01:30:58 -0800 Subject: [PATCH 015/846] Updated solution file. --- HttpAbstractions.sln | 108 +++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 9db8314362..d5bb318867 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -5,21 +5,21 @@ VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{D36288AF-8A0E-48DD-8AF8-15B72F91C70A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{659F2FD7-D44F-4953-A69D-94AF3D41BA21}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7A5C31E4-97FD-479F-8938-D818436ADFDD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{95AEE59D-BF51-47CB-A957-C03D909CC148}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{70095525-BD99-45F9-8A6A-3BD3503FC3EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{E9AF7046-E24C-4071-B7AF-7981F2D1A613}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{D3242B56-EA73-4F41-86A4-DF6C70271592}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{A6DEB0D3-982E-4A07-8EE7-39269F192AF7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{9295515C-6603-46BB-92EB-1C5F6B0E84C9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{3A586BF4-08D4-46E3-B74D-5D514A3B84CC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{68A538BA-D542-49CB-9615-B4F5A4E78C87}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{A195DDE4-CFB0-4A6C-9798-10658236C97B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D38DDB2B-1138-4F45-8A6A-9499E880F620}" EndProject @@ -27,7 +27,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1D737C82-F EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,46 +39,46 @@ Global {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.Build.0 = Release|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.Build.0 = Release|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.Build.0 = Release|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.ActiveCfg = Release|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.Build.0 = Release|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.Build.0 = Release|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.Build.0 = Release|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.Build.0 = Release|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.Build.0 = Release|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.Build.0 = Release|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.Build.0 = Release|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.Build.0 = Release|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.Build.0 = Release|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.Build.0 = Release|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.Build.0 = Release|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.Build.0 = Release|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.Build.0 = Release|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.Build.0 = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Release|Any CPU.Build.0 = Release|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -86,14 +86,14 @@ Global GlobalSection(NestedProjects) = preSolution {8C671AE3-1188-499F-A2A2-3A0B117B33CE} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} {86942914-0334-4352-87ED-B971281C74E2} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {95AEE59D-BF51-47CB-A957-C03D909CC148} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {9295515C-6603-46BB-92EB-1C5F6B0E84C9} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {68A538BA-D542-49CB-9615-B4F5A4E78C87} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {D3242B56-EA73-4F41-86A4-DF6C70271592} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} EndGlobalSection EndGlobal From 724897d0ebd5bbf81886b2f47034adfe5c94ee9a Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 26 Jan 2014 03:44:21 -0800 Subject: [PATCH 016/846] Added super hacky RawOwinHttpContext for K profile. --- HttpAbstractions.sln | 7 + ...Context.cs => MicrosoftOwinHttpContext.cs} | 8 +- .../OwinExtensions.cs | 6 +- .../RawOwinHttpContext.cs | 199 ++++++++++++++++++ .../project.json | 10 +- 5 files changed, 222 insertions(+), 8 deletions(-) rename src/Microsoft.AspNet.Abstractions.Owin/{OwinHttpContext.cs => MicrosoftOwinHttpContext.cs} (96%) create mode 100644 src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index d5bb318867..a2737cba10 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -29,6 +29,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.k10", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.k10.csproj", "{C5C104A4-EE38-4D77-AC77-DF599FD5443A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -79,6 +81,10 @@ Global {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.Build.0 = Debug|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.Build.0 = Release|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -95,5 +101,6 @@ Global {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {C5C104A4-EE38-4D77-AC77-DF599FD5443A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs b/src/Microsoft.AspNet.Abstractions.Owin/MicrosoftOwinHttpContext.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs rename to src/Microsoft.AspNet.Abstractions.Owin/MicrosoftOwinHttpContext.cs index 2762319fcd..c648b66a55 100644 --- a/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions.Owin/MicrosoftOwinHttpContext.cs @@ -1,4 +1,5 @@ -using System; +#if NET45 +using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; @@ -6,13 +7,13 @@ using Microsoft.Owin; namespace Microsoft.AspNet.Abstractions.Owin { - public class OwinHttpContext : HttpContext + public class MicrosoftOwinHttpContext : HttpContext { private readonly IOwinContext _context; private readonly HttpRequest _request; private readonly HttpResponse _response; - public OwinHttpContext(IOwinContext context) + public MicrosoftOwinHttpContext(IOwinContext context) { _context = context; _request = new OwinHttpRequest(this, context.Request); @@ -173,3 +174,4 @@ namespace Microsoft.AspNet.Abstractions.Owin } } } +#endif \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs index e203fdd00e..87788e5f93 100644 --- a/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs @@ -1,4 +1,5 @@ -using System; +#if NET45 +using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Owin; @@ -11,10 +12,11 @@ namespace Owin { app.Run(context => { - var httpContext = new OwinHttpContext(context); + var httpContext = new MicrosoftOwinHttpContext(context); return handler(httpContext); }); } } } +#endif \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs b/src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs new file mode 100644 index 0000000000..69ea2e695b --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Owin +{ + public class RawOwinHttpContext : HttpContext + { + private readonly HttpRequest _request; + private readonly HttpResponse _response; + + public RawOwinHttpContext(IDictionary env) + { + _request = new RawOwinHttpRequest(this, env); + _response = new RawOwinHttpResponse(this, env); + } + + public override void Dispose() + { + + } + + public override object GetInterface(Type type) + { + return null; + } + + public override HttpRequest Request + { + get { return _request; } + } + + public override HttpResponse Response + { + get { return _response; } + } + + public override void SetInterface(Type type, object instance) + { + + } + + private class RawOwinHttpRequest : HttpRequest + { + private HttpContext _context; + private readonly IDictionary _env; + + public RawOwinHttpRequest(HttpContext context, IDictionary env) + { + _context = context; + _env = env; + } + + public override Stream Body + { + get + { + return (Stream)_env["owin.ResponseBody"]; + } + set + { + _env["owin.ResponseBody"] = value; + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override PathString Path + { + get + { + return new PathString((string)_env["owin.RequestPath"]); + } + set + { + _env["owin.RequestPath"] = value.Value; + } + } + + public override PathString PathBase + { + get + { + return new PathString((string)_env["owin.RequestPathBase"]); + } + set + { + _env["owin.RequestPathBase"] = value.Value; + } + } + + public override QueryString QueryString + { + get + { + return new QueryString((string)_env["owin.RequestQueryString"]); + } + set + { + _env["owin.RequestQueryString"] = value.Value; + } + } + + public override Uri Uri + { + get + { + // TODO: Implement this sometime + throw new NotImplementedException(); + } + } + } + + private class RawOwinHttpResponse : HttpResponse + { + private readonly HttpContext _context; + private readonly IDictionary _env; + + public RawOwinHttpResponse(HttpContext context, IDictionary env) + { + _context = context; + _env = env; + } + + public override Stream Body + { + get + { + return (Stream)_env["owin.ResponseBody"]; + } + set + { + _env["owin.ResponseBody"] = value; + } + } + + public override string ContentType + { + get + { + return GetHeader("Content-Type"); + } + set + { + SetHeader("Content-Type", value); + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override int StatusCode + { + get + { + return (int)_env["owin.ResponseStatusCode"]; + } + set + { + _env["owin.ResponseStatusCode"] = value; + } + } + + public override Task WriteAsync(string data) + { + var bytes = Encoding.UTF8.GetBytes(data); + + return Body.WriteAsync(bytes, 0, bytes.Length); + } + + private void SetHeader(string name, string value) + { + var headers = (IDictionary)_env["owin.ResponseHeaders"]; + + headers[name] = new[] { value }; + } + + private string GetHeader(string name) + { + var headers = (IDictionary)_env["owin.ResponseHeaders"]; + + string[] values; + if (headers.TryGetValue(name, out values) && values.Length > 0) + { + return values[0]; + } + + return null; + } + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions.Owin/project.json b/src/Microsoft.AspNet.Abstractions.Owin/project.json index b2b9a4babd..991e11d3d8 100644 --- a/src/Microsoft.AspNet.Abstractions.Owin/project.json +++ b/src/Microsoft.AspNet.Abstractions.Owin/project.json @@ -1,11 +1,15 @@ { "version": "0.1-alpha-*", "dependencies": { - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", "Microsoft.AspNet.Abstractions": "" }, "configurations": { - "net45": { } + "net45": { + "dependencies": { + "Owin": "1.0", + "Microsoft.Owin": "2.1.0" + } + }, + "k10": {} } } \ No newline at end of file From f7a4db4ae10f3bc888fbd1bbf34ad082df4fa4ab Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 24 Jan 2014 12:37:47 -0800 Subject: [PATCH 017/846] Roughing out more abstractions --- HttpAbstractions.sln | 6 +- .../CookieOptions.cs | 48 + .../HostString.cs | 197 ++++ .../HttpRequest.cs | 106 ++- .../IFormCollection.cs | 9 + .../IHeaderDictionary.cs | 69 ++ .../IReadableStringCollection.cs | 42 + .../PathString.cs | 4 +- .../QueryString.cs | 4 +- .../Collections/FormCollection.cs | 20 + .../Collections/HeaderDictionary.cs | 287 ++++++ .../Collections/ReadableStringCollection.cs | 84 ++ .../Collections/RequestCookieCollection.cs | 60 ++ .../Collections/ResponseCookieCollection.cs | 140 +++ .../DefaultHttpRequest.cs | 80 ++ .../Infrastructure/Constants.cs | 25 + .../Infrastructure/ParsingHelpers.cs | 862 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 8 +- ...Microsoft.AspNet.PipelineCore.Tests.csproj | 13 + 19 files changed, 2048 insertions(+), 16 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/CookieOptions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/HostString.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IFormCollection.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index a2737cba10..d0bb133101 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -21,11 +21,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D38DDB2B-1138-4F45-8A6A-9499E880F620}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1D737C82-F2F1-40B6-AE95-A3D878612E91}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject diff --git a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs new file mode 100644 index 0000000000..c8505cae1b --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs @@ -0,0 +1,48 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Options used to create a new cookie. + /// + public class CookieOptions + { + /// + /// Creates a default cookie with a path of '/'. + /// + public CookieOptions() + { + Path = "/"; + } + + /// + /// Gets or sets the domain to associate the cookie with. + /// + /// The domain to associate the cookie with. + public string Domain { get; set; } + + /// + /// Gets or sets the cookie path. + /// + /// The cookie path. + public string Path { get; set; } + + /// + /// Gets or sets the expiration date and time for the cookie. + /// + /// The expiration date and time for the cookie. + public DateTime? Expires { get; set; } + + /// + /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)that is, over HTTPS only. + /// + /// true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. + public bool Secure { get; set; } + + /// + /// Gets or sets a value that indicates whether a cookie is accessible by client-side script. + /// + /// true if a cookie is accessible by client-side script; otherwise, false. + public bool HttpOnly { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Abstractions/HostString.cs new file mode 100644 index 0000000000..0847c7421e --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HostString.cs @@ -0,0 +1,197 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Represents the host portion of a Uri can be used to construct Uri's properly formatted and encoded for use in + /// HTTP headers. + /// + public struct HostString : IEquatable + { + private readonly string _value; + + /// + /// Creates a new HostString without modification. The value should be Unicode rather than punycode, and may have a port. + /// IPv4 and IPv6 addresses are also allowed, and also may have ports. + /// + /// + public HostString(string value) + { + _value = value; + } + + /// + /// Returns the original value from the constructor. + /// + public string Value + { + get { return _value; } + } + + /// + /// Returns the value as normalized by ToUriComponent(). + /// + /// + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Returns the value properly formatted and encoded for use in a URI in a HTTP header. + /// Any Unicode is converted to punycode. IPv6 addresses will have brackets added if they are missing. + /// + /// + [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a uri is returned.")] + public string ToUriComponent() + { + int index; + if (string.IsNullOrEmpty(_value)) + { + return string.Empty; + } + else if (_value.IndexOf('[') >= 0) + { + // IPv6 in brackets [::1], maybe with port + return _value; + } + else if ((index = _value.IndexOf(':')) >= 0 + && index < _value.Length - 1 + && _value.IndexOf(':', index + 1) >= 0) + { + // IPv6 without brackets ::1 is the only type of host with 2 or more colons + return "[" + _value + "]"; + } + else if (index >= 0) + { + // Has a port + string port = _value.Substring(index); + IdnMapping mapping = new IdnMapping(); + return mapping.GetAscii(_value, 0, index) + port; + } + else + { + IdnMapping mapping = new IdnMapping(); + return mapping.GetAscii(_value); + } + } + + /// + /// Creates a new HostString from the given uri component. + /// Any punycode will be converted to Unicode. + /// + /// + /// + [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a uri is provided.")] + public static HostString FromUriComponent(string uriComponent) + { + if (!string.IsNullOrEmpty(uriComponent)) + { + int index; + if (uriComponent.IndexOf('[') >= 0) + { + // IPv6 in brackets [::1], maybe with port + } + else if ((index = uriComponent.IndexOf(':')) >= 0 + && index < uriComponent.Length - 1 + && uriComponent.IndexOf(':', index + 1) >= 0) + { + // IPv6 without brackets ::1 is the only type of host with 2 or more colons + } + else if (uriComponent.IndexOf("xn--", StringComparison.Ordinal) >= 0) + { + // Contains punycode + if (index >= 0) + { + // Has a port + string port = uriComponent.Substring(index); + IdnMapping mapping = new IdnMapping(); + uriComponent = mapping.GetUnicode(uriComponent, 0, index) + port; + } + else + { + IdnMapping mapping = new IdnMapping(); + uriComponent = mapping.GetUnicode(uriComponent); + } + } + } + return new HostString(uriComponent); + } + + /// + /// Creates a new HostString from the host and port of the give Uri instance. + /// Punycode will be converted to Unicode. + /// + /// + /// + public static HostString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + return new HostString(uri.GetComponents( +#if !NET40 + UriComponents.NormalizedHost | // Always convert punycode to Unicode. +#endif + UriComponents.HostAndPort, UriFormat.Unescaped)); + } + + /// + /// Compares the equality of the Value property, ignoring case. + /// + /// + /// + public bool Equals(HostString other) + { + return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Compares against the given object only if it is a HostString. + /// + /// + /// + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is HostString && Equals((HostString)obj); + } + + /// + /// Gets a hash code for the value. + /// + /// + public override int GetHashCode() + { + return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); + } + + /// + /// Compares the two instances for equality. + /// + /// + /// + /// + public static bool operator ==(HostString left, HostString right) + { + return left.Equals(right); + } + + /// + /// Compares the two instances for inequality. + /// + /// + /// + /// + public static bool operator !=(HostString left, HostString right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index 7277195cc7..40a7860af5 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading; namespace Microsoft.AspNet.Abstractions { @@ -9,10 +10,113 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpContext HttpContext { get; } - public abstract Uri Uri { get; } + /// + /// Gets or set the HTTP method. + /// + /// The HTTP method. + public abstract string Method { get; set; } + + /// + /// Gets or set the HTTP request scheme from owin.RequestScheme. + /// + /// The HTTP request scheme from owin.RequestScheme. + public abstract string Scheme { get; set; } + + /// + /// Returns true if the owin.RequestScheme is https. + /// + /// true if this request is using https; otherwise, false. + public abstract bool IsSecure { get; } + + /// + /// Gets or set the Host header. May include the port. + /// + /// The Host header. + public abstract HostString Host { get; set; } + + /// + /// Gets or set the owin.RequestPathBase. + /// + /// The owin.RequestPathBase. public abstract PathString PathBase { get; set; } + + /// + /// Gets or set the request path from owin.RequestPath. + /// + /// The request path from owin.RequestPath. public abstract PathString Path { get; set; } + + /// + /// Gets or set the query string from owin.RequestQueryString. + /// + /// The query string from owin.RequestQueryString. public abstract QueryString QueryString { get; set; } + + /// + /// Gets the query value collection parsed from owin.RequestQueryString. + /// + /// The query value collection parsed from owin.RequestQueryString. + public abstract IReadableStringCollection Query { get; } + + /// + /// Gets the uniform resource identifier (URI) associated with the request. + /// + /// The uniform resource identifier (URI) associated with the request. + public abstract Uri Uri { get; } + + /// + /// Gets or set the owin.RequestProtocol. + /// + /// The owin.RequestProtocol. + public abstract string Protocol { get; set; } + + /// + /// Gets the request headers. + /// + /// The request headers. + public abstract IHeaderDictionary Headers { get; } + + /// + /// Gets the collection of Cookies for this request. + /// + /// The collection of Cookies for this request. + public abstract IReadableStringCollection Cookies { get; } + + /// + /// Gets or sets the Content-Type header. + /// + /// The Content-Type header. + // (TODO header conventions?) public abstract string ContentType { get; set; } + + /// + /// Gets or sets the Cache-Control header. + /// + /// The Cache-Control header. + // (TODO header conventions?) public abstract string CacheControl { get; set; } + + /// + /// Gets or sets the Media-Type header. + /// + /// The Media-Type header. + // (TODO header conventions?) public abstract string MediaType { get; set; } + + /// + /// Gets or set the Accept header. + /// + /// The Accept header. + // (TODO header conventions?) public abstract string Accept { get; set; } + + /// + /// Gets or set the owin.RequestBody Stream. + /// + /// The owin.RequestBody Stream. public abstract Stream Body { get; set; } + + /// + /// Gets or sets the cancellation token for the request. + /// + /// The cancellation token for the request. + public abstract CancellationToken CallCanceled { get; set; } + } } diff --git a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs new file mode 100644 index 0000000000..56862e6be6 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs @@ -0,0 +1,9 @@ +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Contains the parsed form values. + /// + public interface IFormCollection : IReadableStringCollection + { + } +} diff --git a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs new file mode 100644 index 0000000000..7039b8b87e --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Represents request and response headers + /// + public interface IHeaderDictionary : IReadableStringCollection, IDictionary + { + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a single string or null if the key is not present. + new string this[string key] { get; set; } + + /// + /// Get the associated values from the collection separated into individual values. + /// Quoted values will not be split, and the quotes will be removed. + /// + /// The header name. + /// the associated values from the collection separated into individual values, or null if the key is not present. + IList GetCommaSeparatedValues(string key); + + /// + /// Add a new value. Appends to the header if already present + /// + /// The header name. + /// The header value. + void Append(string key, string value); + + /// + /// Add new values. Each item remains a separate array entry. + /// + /// The header name. + /// The header values. + void AppendValues(string key, params string[] values); + + /// + /// Quotes any values containing comas, and then coma joins all of the values with any existing values. + /// + /// The header name. + /// The header values. + void AppendCommaSeparatedValues(string key, params string[] values); + + /// + /// Sets a specific header value. + /// + /// The header name. + /// The header value. + [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Set", Justification = "Re-evaluate later.")] + void Set(string key, string value); + + /// + /// Sets the specified header values without modification. + /// + /// The header name. + /// The header values. + void SetValues(string key, params string[] values); + + /// + /// Quotes any values containing comas, and then coma joins all of the values. + /// + /// The header name. + /// The header values. + void SetCommaSeparatedValues(string key, params string[] values); + } +} diff --git a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs new file mode 100644 index 0000000000..dc3f72c769 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Accessors for headers, query, forms, etc. + /// + public interface IReadableStringCollection : IEnumerable> + { + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + string this[string key] { get; } + + // Joined + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "Re-evaluate later.")] + string Get(string key); + + // Joined + + /// + /// Get the associated values from the collection in their original format. + /// Returns null if the key is not present. + /// + /// + /// + IList GetValues(string key); + + // Raw + } +} diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs index 8cfab5912d..c497d40bf3 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -1,6 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; +using System; using System.Linq; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index e80f5eedcf..9d96419788 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -1,6 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; +using System; namespace Microsoft.AspNet.Abstractions { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs new file mode 100644 index 0000000000..7054d36350 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNet.Abstractions; +using System.Collections.Generic; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// Contains the parsed form values. + /// + public class FormCollection : ReadableStringCollection, IFormCollection + { + /// + /// Initializes a new instance of the class. + /// + /// The store for the form. + public FormCollection(IDictionary store) + : base(store) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs new file mode 100644 index 0000000000..8847fa66fc --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -0,0 +1,287 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. + /// + public class HeaderDictionary : IHeaderDictionary + { + /// + /// Initializes a new instance of the class. + /// + /// The underlying data store. + public HeaderDictionary(IDictionary store) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + + Store = store; + } + + private IDictionary Store { get; set; } + + /// + /// Gets an that contains the keys in the ;. + /// + /// An that contains the keys in the . + public ICollection Keys + { + get { return Store.Keys; } + } + + /// + /// + /// + public ICollection Values + { + get { return Store.Values; } + } + + /// + /// Gets the number of elements contained in the ;. + /// + /// The number of elements contained in the . + public int Count + { + get { return Store.Count; } + } + + /// + /// Gets a value that indicates whether the is in read-only mode. + /// + /// true if the is in read-only mode; otherwise, false. + public bool IsReadOnly + { + get { return Store.IsReadOnly; } + } + + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a single string or null if the key is not present. + public string this[string key] + { + get { return Get(key); } + set { Set(key, value); } + } + + /// + /// Throws KeyNotFoundException if the key is not present. + /// + /// The header name. + /// + string[] IDictionary.this[string key] + { + get { return Store[key]; } + set { Store[key] = value; } + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + public IEnumerator> GetEnumerator() + { + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Get the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a single string or null if the key is not present. + public string Get(string key) + { + return ParsingHelpers.GetHeader(Store, key); + } + + /// + /// Get the associated values from the collection without modification. + /// + /// The header name. + /// the associated value from the collection without modification, or null if the key is not present. + public IList GetValues(string key) + { + return ParsingHelpers.GetHeaderUnmodified(Store, key); + } + + /// + /// Get the associated values from the collection separated into individual values. + /// Quoted values will not be split, and the quotes will be removed. + /// + /// The header name. + /// the associated values from the collection separated into individual values, or null if the key is not present. + public IList GetCommaSeparatedValues(string key) + { + IEnumerable values = ParsingHelpers.GetHeaderSplit(Store, key); + return values == null ? null : values.ToList(); + } + + /// + /// Add a new value. Appends to the header if already present + /// + /// The header name. + /// The header value. + public void Append(string key, string value) + { + ParsingHelpers.AppendHeader(Store, key, value); + } + + /// + /// Add new values. Each item remains a separate array entry. + /// + /// The header name. + /// The header values. + public void AppendValues(string key, params string[] values) + { + ParsingHelpers.AppendHeaderUnmodified(Store, key, values); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values with any existing values. + /// + /// The header name. + /// The header values. + public void AppendCommaSeparatedValues(string key, params string[] values) + { + ParsingHelpers.AppendHeaderJoined(Store, key, values); + } + + /// + /// Sets a specific header value. + /// + /// The header name. + /// The header value. + public void Set(string key, string value) + { + ParsingHelpers.SetHeader(Store, key, value); + } + + /// + /// Sets the specified header values without modification. + /// + /// The header name. + /// The header values. + public void SetValues(string key, params string[] values) + { + ParsingHelpers.SetHeaderUnmodified(Store, key, values); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values. + /// + /// The header name. + /// The header values. + public void SetCommaSeparatedValues(string key, params string[] values) + { + ParsingHelpers.SetHeaderJoined(Store, key, values); + } + + /// + /// Adds the given header and values to the collection. + /// + /// The header name. + /// The header values. + public void Add(string key, string[] value) + { + Store.Add(key, value); + } + + /// + /// Determines whether the contains a specific key. + /// + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + return Store.ContainsKey(key); + } + + /// + /// Removes the given header from the collection. + /// + /// The header name. + /// true if the specified object was removed from the collection; otherwise, false. + public bool Remove(string key) + { + return Store.Remove(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out string[] value) + { + return Store.TryGetValue(key, out value); + } + + /// + /// Adds a new list of items to the collection. + /// + /// The item to add. + public void Add(KeyValuePair item) + { + Store.Add(item); + } + + /// + /// Clears the entire list of objects. + /// + public void Clear() + { + Store.Clear(); + } + + /// + /// Returns a value indicating whether the specified object occurs within this collection. + /// + /// The item. + /// true if the specified object occurs within this collection; otherwise, false. + public bool Contains(KeyValuePair item) + { + return Store.Contains(item); + } + + /// + /// Copies the elements to a one-dimensional Array instance at the specified index. + /// + /// The one-dimensional Array that is the destination of the specified objects copied from the . + /// The zero-based index in at which copying begins. + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + Store.CopyTo(array, arrayIndex); + } + + /// + /// Removes the given item from the the collection. + /// + /// The item. + /// true if the specified object was removed from the collection; otherwise, false. + public bool Remove(KeyValuePair item) + { + return Store.Remove(item); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs new file mode 100644 index 0000000000..f06a8aa5a0 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// Accessors for query, forms, etc. + /// + public class ReadableStringCollection : IReadableStringCollection + { + /// + /// Create a new wrapper + /// + /// + public ReadableStringCollection(IDictionary store) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + + Store = store; + } + + private IDictionary Store { get; set; } + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + public string this[string key] + { + get { return Get(key); } + } + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + public string Get(string key) + { + return ParsingHelpers.GetJoinedValue(Store, key); + } + + /// + /// Get the associated values from the collection in their original format. + /// Returns null if the key is not present. + /// + /// + /// + public IList GetValues(string key) + { + string[] values; + Store.TryGetValue(key, out values); + return values; + } + + /// + /// + /// + /// + public IEnumerator> GetEnumerator() + { + return Store.GetEnumerator(); + } + + /// + /// + /// + /// + IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs new file mode 100644 index 0000000000..91b1577f28 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// A wrapper for the request Cookie header + /// + public class RequestCookieCollection : IEnumerable> + { + /// + /// Create a new wrapper + /// + /// + public RequestCookieCollection(IDictionary store) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + + Store = store; + } + + private IDictionary Store { get; set; } + + /// + /// Returns null rather than throwing KeyNotFoundException + /// + /// + /// + public string this[string key] + { + get + { + string value; + Store.TryGetValue(key, out value); + return value; + } + } + + /// + /// + /// + /// + public IEnumerator> GetEnumerator() + { + return Store.GetEnumerator(); + } + + /// + /// + /// + /// + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs new file mode 100644 index 0000000000..78703285cf --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// A wrapper for the response Set-Cookie header + /// + public class ResponseCookieCollection + { + /// + /// Create a new wrapper + /// + /// + public ResponseCookieCollection(IHeaderDictionary headers) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + + Headers = headers; + } + + private IHeaderDictionary Headers { get; set; } + + /// + /// Add a new cookie and value + /// + /// + /// + public void Append(string key, string value) + { + Headers.AppendValues(Constants.Headers.SetCookie, Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(value) + "; path=/"); + } + + /// + /// Add a new cookie + /// + /// + /// + /// + public void Append(string key, string value, CookieOptions options) + { + if (options == null) + { + throw new ArgumentNullException("options"); + } + + bool domainHasValue = !string.IsNullOrEmpty(options.Domain); + bool pathHasValue = !string.IsNullOrEmpty(options.Path); + bool expiresHasValue = options.Expires.HasValue; + + string setCookieValue = string.Concat( + Uri.EscapeDataString(key), + "=", + Uri.EscapeDataString(value ?? string.Empty), + !domainHasValue ? null : "; domain=", + !domainHasValue ? null : options.Domain, + !pathHasValue ? null : "; path=", + !pathHasValue ? null : options.Path, + !expiresHasValue ? null : "; expires=", + !expiresHasValue ? null : options.Expires.Value.ToString("ddd, dd-MMM-yyyy HH:mm:ss ", CultureInfo.InvariantCulture) + "GMT", + !options.Secure ? null : "; secure", + !options.HttpOnly ? null : "; HttpOnly"); + Headers.AppendValues("Set-Cookie", setCookieValue); + } + + /// + /// Sets an expired cookie + /// + /// + public void Delete(string key) + { + Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + + var deleteCookies = new[] { Uri.EscapeDataString(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; + IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + if (existingValues == null || existingValues.Count == 0) + { + Headers.SetValues(Constants.Headers.SetCookie, deleteCookies); + } + else + { + Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); + } + } + + /// + /// Sets an expired cookie + /// + /// + /// + public void Delete(string key, CookieOptions options) + { + if (options == null) + { + throw new ArgumentNullException("options"); + } + + bool domainHasValue = !string.IsNullOrEmpty(options.Domain); + bool pathHasValue = !string.IsNullOrEmpty(options.Path); + + Func rejectPredicate; + if (domainHasValue) + { + rejectPredicate = value => + value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.IndexOf("domain=" + options.Domain, StringComparison.OrdinalIgnoreCase) != -1; + } + else if (pathHasValue) + { + rejectPredicate = value => + value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.IndexOf("path=" + options.Path, StringComparison.OrdinalIgnoreCase) != -1; + } + else + { + rejectPredicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + } + + IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + if (existingValues != null) + { + Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); + } + + Append(key, string.Empty, new CookieOptions + { + Path = options.Path, + Domain = options.Domain, + Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), + }); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 73860a9f32..4a5be161e2 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -70,5 +70,85 @@ namespace Microsoft.AspNet.PipelineCore get { return IHttpRequest.Body; } set { IHttpRequest.Body = value; } } + + public override string Method + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override string Scheme + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override bool IsSecure + { + get { throw new NotImplementedException(); } + } + + public override HostString Host + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override IReadableStringCollection Query + { + get { throw new NotImplementedException(); } + } + + public override string Protocol + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override IHeaderDictionary Headers + { + get { throw new NotImplementedException(); } + } + + public override IReadableStringCollection Cookies + { + get { throw new NotImplementedException(); } + } + + public override System.Threading.CancellationToken CallCanceled + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs new file mode 100644 index 0000000000..114ae660e3 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Abstractions.Infrastructure +{ + internal static class Constants + { + internal const string Https = "HTTPS"; + + internal const string HttpDateFormat = "r"; + + internal static class Headers + { + internal const string ContentType = "Content-Type"; + internal const string CacheControl = "Cache-Control"; + internal const string MediaType = "Media-Type"; + internal const string Accept = "Accept"; + internal const string Host = "Host"; + internal const string ETag = "ETag"; + internal const string Location = "Location"; + internal const string ContentLength = "Content-Length"; + internal const string SetCookie = "Set-Cookie"; + internal const string Expires = "Expires"; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs new file mode 100644 index 0000000000..204b3cda0e --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -0,0 +1,862 @@ +using Microsoft.AspNet.Abstractions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.AspNet.PipelineCore.Infrastructure +{ + internal struct HeaderSegment : IEquatable + { + private readonly StringSegment _formatting; + private readonly StringSegment _data; + + // + // Initializes a new instance of the class. + // + public HeaderSegment(StringSegment formatting, StringSegment data) + { + _formatting = formatting; + _data = data; + } + + public StringSegment Formatting + { + get { return _formatting; } + } + + public StringSegment Data + { + get { return _data; } + } + + #region Equality members + + public bool Equals(HeaderSegment other) + { + return _formatting.Equals(other._formatting) && _data.Equals(other._data); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegment && Equals((HeaderSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); + } + } + + public static bool operator ==(HeaderSegment left, HeaderSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegment left, HeaderSegment right) + { + return !left.Equals(right); + } + + #endregion + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct HeaderSegmentCollection : IEnumerable, IEquatable + { + private readonly string[] _headers; + + public HeaderSegmentCollection(string[] headers) + { + _headers = headers; + } + + #region Equality members + + public bool Equals(HeaderSegmentCollection other) + { + return Equals(_headers, other._headers); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegmentCollection && Equals((HeaderSegmentCollection)obj); + } + + public override int GetHashCode() + { + return (_headers != null ? _headers.GetHashCode() : 0); + } + + public static bool operator ==(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return !left.Equals(right); + } + + #endregion + + public Enumerator GetEnumerator() + { + return new Enumerator(_headers); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + internal struct Enumerator : IEnumerator + { + private readonly string[] _headers; + private int _index; + + private string _header; + private int _headerLength; + private int _offset; + + private int _leadingStart; + private int _leadingEnd; + private int _valueStart; + private int _valueEnd; + private int _trailingStart; + + private Mode _mode; + + private static readonly string[] NoHeaders = new string[0]; + + public Enumerator(string[] headers) + { + _headers = headers ?? NoHeaders; + _header = string.Empty; + _headerLength = -1; + _index = -1; + _offset = -1; + _leadingStart = -1; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + _mode = Mode.Leading; + } + + private enum Mode + { + Leading, + Value, + ValueQuoted, + Trailing, + Produce, + } + + private enum Attr + { + Value, + Quote, + Delimiter, + Whitespace + } + + public HeaderSegment Current + { + get + { + return new HeaderSegment( + new StringSegment(_header, _leadingStart, _leadingEnd - _leadingStart), + new StringSegment(_header, _valueStart, _valueEnd - _valueStart)); + } + } + + object IEnumerator.Current + { + get { return Current; } + } + + public void Dispose() + { + } + + public bool MoveNext() + { + while (true) + { + if (_mode == Mode.Produce) + { + _leadingStart = _trailingStart; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + if (_offset == _headerLength && + _leadingStart != -1 && + _leadingStart != _offset) + { + // Also produce trailing whitespace + _leadingEnd = _offset; + return true; + } + _mode = Mode.Leading; + } + + // if end of a string + if (_offset == _headerLength) + { + ++_index; + _offset = -1; + _leadingStart = 0; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + // if that was the last string + if (_index == _headers.Length) + { + // no more move nexts + return false; + } + + // grab the next string + _header = _headers[_index] ?? string.Empty; + _headerLength = _header.Length; + } + while (true) + { + ++_offset; + char ch = _offset == _headerLength ? (char)0 : _header[_offset]; + // todo - array of attrs + Attr attr = char.IsWhiteSpace(ch) ? Attr.Whitespace : ch == '\"' ? Attr.Quote : (ch == ',' || ch == (char)0) ? Attr.Delimiter : Attr.Value; + + switch (_mode) + { + case Mode.Leading: + switch (attr) + { + case Attr.Delimiter: + _leadingEnd = _offset; + _mode = Mode.Produce; + break; + case Attr.Quote: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Value: + switch (attr) + { + case Attr.Quote: + _mode = Mode.ValueQuoted; + break; + case Attr.Delimiter: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + break; + case Attr.Value: + // more + break; + case Attr.Whitespace: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Trailing; + break; + } + break; + case Mode.ValueQuoted: + switch (attr) + { + case Attr.Quote: + _mode = Mode.Value; + break; + case Attr.Delimiter: + if (ch == (char)0) + { + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + } + break; + case Attr.Value: + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Trailing: + switch (attr) + { + case Attr.Delimiter: + _mode = Mode.Produce; + break; + case Attr.Quote: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + } + if (_mode == Mode.Produce) + { + return true; + } + } + } + } + + public void Reset() + { + _index = 0; + _offset = 0; + _leadingStart = 0; + _leadingEnd = 0; + _valueStart = 0; + _valueEnd = 0; + } + } + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct StringSegment : IEquatable + { + private readonly string _buffer; + private readonly int _offset; + private readonly int _count; + + // + // Initializes a new instance of the class. + // + public StringSegment(string buffer, int offset, int count) + { + _buffer = buffer; + _offset = offset; + _count = count; + } + + public string Buffer + { + get { return _buffer; } + } + + public int Offset + { + get { return _offset; } + } + + public int Count + { + get { return _count; } + } + + public string Value + { + get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } + } + + public bool HasValue + { + get { return _offset != -1 && _count != 0 && _buffer != null; } + } + + #region Equality members + + public bool Equals(StringSegment other) + { + return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is StringSegment && Equals((StringSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ _offset; + hashCode = (hashCode * 397) ^ _count; + return hashCode; + } + } + + public static bool operator ==(StringSegment left, StringSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(StringSegment left, StringSegment right) + { + return !left.Equals(right); + } + + #endregion + + public bool StartsWith(string text, StringComparison comparisonType) + { + if (text == null) + { + throw new ArgumentNullException("text"); + } + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public bool EndsWith(string text, StringComparison comparisonType) + { + if (text == null) + { + throw new ArgumentNullException("text"); + } + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; + } + + public bool Equals(string text, StringComparison comparisonType) + { + if (text == null) + { + throw new ArgumentNullException("text"); + } + int textLength = text.Length; + if (!HasValue || _count != textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public string Substring(int offset, int length) + { + return _buffer.Substring(_offset + offset, length); + } + + public StringSegment Subsegment(int offset, int length) + { + return new StringSegment(_buffer, _offset + offset, length); + } + + public override string ToString() + { + return Value ?? string.Empty; + } + } + + internal static partial class ParsingHelpers + { + private static readonly Action AddCookieCallback = (name, value, state) => + { + var dictionary = (IDictionary)state; + if (!dictionary.ContainsKey(name)) + { + dictionary.Add(name, value); + } + }; + + private static readonly char[] SemicolonAndComma = new[] { ';', ',' }; + + internal static IDictionary GetCookies(HttpRequest request) + { + var cookies = request.Get>("Microsoft.Owin.Cookies#dictionary"); + if (cookies == null) + { + cookies = new Dictionary(StringComparer.Ordinal); + request.Set("Microsoft.Owin.Cookies#dictionary", cookies); + } + + string text = GetHeader(request.Headers, "Cookie"); + if (request.Get("Microsoft.Owin.Cookies#text") != text) + { + cookies.Clear(); + ParseDelimited(text, SemicolonAndComma, AddCookieCallback, cookies); + request.Set("Microsoft.Owin.Cookies#text", text); + } + return cookies; + } + + internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) + { + int textLength = text.Length; + int equalIndex = text.IndexOf('='); + if (equalIndex == -1) + { + equalIndex = textLength; + } + int scanIndex = 0; + while (scanIndex < textLength) + { + int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); + if (delimiterIndex == -1) + { + delimiterIndex = textLength; + } + if (equalIndex < delimiterIndex) + { + while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) + { + ++scanIndex; + } + string name = text.Substring(scanIndex, equalIndex - scanIndex); + string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); + callback( + Uri.UnescapeDataString(name.Replace('+', ' ')), + Uri.UnescapeDataString(value.Replace('+', ' ')), + state); + equalIndex = text.IndexOf('=', delimiterIndex); + if (equalIndex == -1) + { + equalIndex = textLength; + } + } + scanIndex = delimiterIndex + 1; + } + } + + internal static string GetJoinedValue(IDictionary Store, string key) + { + throw new NotImplementedException(); + } + } + + internal static partial class OwinHelpers + { + public static string GetHeader(IDictionary headers, string key) + { + string[] values = GetHeaderUnmodified(headers, key); + return values == null ? null : string.Join(",", values); + } + + public static IEnumerable GetHeaderSplit(IDictionary headers, string key) + { + string[] values = GetHeaderUnmodified(headers, key); + return values == null ? null : GetHeaderSplitImplementation(values); + } + + private static IEnumerable GetHeaderSplitImplementation(string[] values) + { + foreach (var segment in new HeaderSegmentCollection(values)) + { + if (segment.Data.HasValue) + { + yield return DeQuote(segment.Data.Value); + } + } + } + + public static string[] GetHeaderUnmodified(IDictionary headers, string key) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + string[] values; + return headers.TryGetValue(key, out values) ? values : null; + } + + public static void SetHeader(IDictionary headers, string key, string value) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException("key"); + } + if (string.IsNullOrWhiteSpace(value)) + { + headers.Remove(key); + } + else + { + headers[key] = new[] { value }; + } + } + + public static void SetHeaderJoined(IDictionary headers, string key, params string[] values) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException("key"); + } + if (values == null || values.Length == 0) + { + headers.Remove(key); + } + else + { + headers[key] = new[] { string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + } + } + + // Quote items that contain comas and are not already quoted. + private static string QuoteIfNeeded(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Contains(',')) + { + if (value[0] != '"' || value[value.Length - 1] != '"') + { + value = '"' + value + '"'; + } + } + + return value; + } + + private static string DeQuote(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + { + value = value.Substring(1, value.Length - 2); + } + + return value; + } + + public static void SetHeaderUnmodified(IDictionary headers, string key, params string[] values) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException("key"); + } + if (values == null || values.Length == 0) + { + headers.Remove(key); + } + else + { + headers[key] = values; + } + } + + public static void SetHeaderUnmodified(IDictionary headers, string key, IEnumerable values) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + headers[key] = values.ToArray(); + } + + public static void AppendHeader(IDictionary headers, string key, string values) + { + if (string.IsNullOrWhiteSpace(values)) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeader(headers, key, values); + } + else + { + headers[key] = new[] { existing + "," + values }; + } + } + + public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeaderJoined(headers, key, values); + } + else + { + headers[key] = new[] { existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + } + } + + public static void AppendHeaderUnmodified(IDictionary headers, string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string[] existing = GetHeaderUnmodified(headers, key); + if (existing == null) + { + SetHeaderUnmodified(headers, key, values); + } + else + { + SetHeaderUnmodified(headers, key, existing.Concat(values)); + } + } + } + + internal static partial class OwinHelpers + { + private static readonly Action AppendItemCallback = (name, value, state) => + { + var dictionary = (IDictionary>)state; + + List existing; + if (!dictionary.TryGetValue(name, out existing)) + { + dictionary.Add(name, new List(1) { value }); + } + else + { + existing.Add(value); + } + }; + + private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; + + internal static IDictionary GetQuery(HttpRequest request) + { + var query = request.Get>("Microsoft.Owin.Query#dictionary"); + if (query == null) + { + query = new Dictionary(StringComparer.OrdinalIgnoreCase); + request.Set("Microsoft.Owin.Query#dictionary", query); + } + + string text = request.QueryString.Value; + if (request.Get("Microsoft.Owin.Query#text") != text) + { + query.Clear(); + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(text, AmpersandAndSemicolon, AppendItemCallback, accumulator); + foreach (var kv in accumulator) + { + query.Add(kv.Key, kv.Value.ToArray()); + } + request.Set("Microsoft.Owin.Query#text", text); + } + return query; + } + +#if !NET40 + internal static IFormCollection GetForm(string text) + { + IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); + foreach (var kv in accumulator) + { + form.Add(kv.Key, kv.Value.ToArray()); + } + return new FormCollection(form); + } +#endif + + internal static string GetJoinedValue(IDictionary store, string key) + { + string[] values = GetUnmodifiedValues(store, key); + return values == null ? null : string.Join(",", values); + } + + internal static string[] GetUnmodifiedValues(IDictionary store, string key) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + string[] values; + return store.TryGetValue(key, out values) ? values : null; + } + } + + internal static partial class OwinHelpers + { + internal static string GetHost(HttpRequest request) + { + IHeaderDictionary headers = request.Headers; + + string host = GetHeader(headers, "Host"); + if (!string.IsNullOrWhiteSpace(host)) + { + return host; + } + + string localIpAddress = request.LocalIpAddress ?? "localhost"; + var localPort = request.Get(OwinConstants.CommonKeys.LocalPort); + return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); + } + } +} diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index da65ff9698..8beefe2634 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -31,6 +31,6 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +// [assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj index 9ef35f3c8d..d68b62764a 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj @@ -53,6 +53,19 @@ + + + + + + + + + + + + + From d6cd02d1211c66cc9acb05227b6e5cc23195db00 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 27 Jan 2014 11:40:30 -0800 Subject: [PATCH 018/846] Updating abstractions --- HttpAbstractions.sln | 1 + .../HttpContext.cs | 6 +- .../DefaultHttpContext.cs | 1 + .../Infrastructure/ParsingHelpers.cs | 39 +++++---- ...Microsoft.AspNet.PipelineCore.net45.csproj | 80 +++++++++++++++++++ 5 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index d0bb133101..48380ad6d4 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -26,6 +26,7 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.k10", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.k10.csproj", "{C5C104A4-EE38-4D77-AC77-DF599FD5443A}" + EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 241c1d17e2..ab1193bd44 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,13 +1,15 @@ using System; +using System.Collections.Generic; namespace Microsoft.AspNet.Abstractions { public abstract class HttpContext : IDisposable { - // TODO - review IOwinContext for properties - public abstract HttpRequest Request { get; } + public abstract HttpResponse Response { get; } + + public abstract IDictionary Items { get; } public abstract void Dispose(); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index bbd69ef0f8..f5a85826d7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -18,6 +18,7 @@ namespace Microsoft.AspNet.PipelineCore } public override HttpRequest Request { get { return _request; } } + public override HttpResponse Response { get { return _response; } } public int Revision { get { return _environment.Revision; } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 204b3cda0e..0a9a581ec2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,4 +1,5 @@ using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Collections; using System; using System.Collections; using System.Collections.Generic; @@ -514,21 +515,32 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure private static readonly char[] SemicolonAndComma = new[] { ';', ',' }; + internal static T GetItem(HttpRequest request, string key) + { + object value; + return request.HttpContext.Items.TryGetValue(key, out value) ? (T)value : default(T); + } + + internal static void SetItem(HttpRequest request, string key, T value) + { + request.HttpContext.Items[key] = value; + } + internal static IDictionary GetCookies(HttpRequest request) { - var cookies = request.Get>("Microsoft.Owin.Cookies#dictionary"); + var cookies = GetItem>(request, "Microsoft.Owin.Cookies#dictionary"); if (cookies == null) { cookies = new Dictionary(StringComparer.Ordinal); - request.Set("Microsoft.Owin.Cookies#dictionary", cookies); + SetItem(request, "Microsoft.Owin.Cookies#dictionary", cookies); } string text = GetHeader(request.Headers, "Cookie"); - if (request.Get("Microsoft.Owin.Cookies#text") != text) + if (GetItem(request, "Microsoft.Owin.Cookies#text") != text) { cookies.Clear(); ParseDelimited(text, SemicolonAndComma, AddCookieCallback, cookies); - request.Set("Microsoft.Owin.Cookies#text", text); + SetItem(request, "Microsoft.Owin.Cookies#text", text); } return cookies; } @@ -570,14 +582,9 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure scanIndex = delimiterIndex + 1; } } - - internal static string GetJoinedValue(IDictionary Store, string key) - { - throw new NotImplementedException(); - } } - internal static partial class OwinHelpers + internal static partial class ParsingHelpers { public static string GetHeader(IDictionary headers, string key) { @@ -768,7 +775,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - internal static partial class OwinHelpers + internal static partial class ParsingHelpers { private static readonly Action AppendItemCallback = (name, value, state) => { @@ -789,15 +796,15 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure internal static IDictionary GetQuery(HttpRequest request) { - var query = request.Get>("Microsoft.Owin.Query#dictionary"); + var query = GetItem>(request, "Microsoft.Owin.Query#dictionary"); if (query == null) { query = new Dictionary(StringComparer.OrdinalIgnoreCase); - request.Set("Microsoft.Owin.Query#dictionary", query); + SetItem(request, "Microsoft.Owin.Query#dictionary", query); } string text = request.QueryString.Value; - if (request.Get("Microsoft.Owin.Query#text") != text) + if (GetItem(request, "Microsoft.Owin.Query#text") != text) { query.Clear(); var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); @@ -806,7 +813,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure { query.Add(kv.Key, kv.Value.ToArray()); } - request.Set("Microsoft.Owin.Query#text", text); + SetItem(request, "Microsoft.Owin.Query#text", text); } return query; } @@ -842,7 +849,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - internal static partial class OwinHelpers + internal static partial class ParsingHelpers { internal static string GetHost(HttpRequest request) { diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj new file mode 100644 index 0000000000..b4d658e9fb --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -0,0 +1,80 @@ + + + + + Debug + AnyCPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + obj/net45 + + + AnyCPU + true + full + false + bin\Debug\net45 + DEBUG;TRACE;NET45 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\net45 + TRACE;NET45 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + {95AEE59D-BF51-47CB-A957-C03D909CC148} + Microsoft.AspNet.FeatureModel + + + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} + Microsoft.AspNet.Abstractions + + + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} + Microsoft.AspNet.HttpFeature + + + + + \ No newline at end of file From fd9f392ec920e7e3dcd74a515f5f787c60d19b15 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 27 Jan 2014 12:47:14 -0800 Subject: [PATCH 019/846] Fixing merge conflicts (?) --- HttpAbstractions.sln | 37 +++++----- ...Microsoft.AspNet.PipelineCore.net45.csproj | 71 +++++++++---------- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 48380ad6d4..c223d6618e 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -21,12 +21,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.k10", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.k10.csproj", "{C5C104A4-EE38-4D77-AC77-DF599FD5443A}" - +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{ADDAE1B2-094E-4DA8-86DE-13E8708072D8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{4B39A6DA-68BD-4F50-BE76-0399EB82DCBF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -70,10 +73,6 @@ Global {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.Build.0 = Debug|Any CPU {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.ActiveCfg = Release|Any CPU {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.Build.0 = Release|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.Build.0 = Debug|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -87,17 +86,17 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {8C671AE3-1188-499F-A2A2-3A0B117B33CE} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} - {86942914-0334-4352-87ED-B971281C74E2} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} - {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {D3242B56-EA73-4F41-86A4-DF6C70271592} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {C5C104A4-EE38-4D77-AC77-DF599FD5443A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {C5C104A4-EE38-4D77-AC77-DF599FD5443A} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj index b4d658e9fb..9c9e6c6f47 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -1,10 +1,10 @@ - + - + Debug AnyCPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} Library Properties Microsoft.AspNet.PipelineCore @@ -19,7 +19,7 @@ full false bin\Debug\net45 - DEBUG;TRACE;NET45 + DEBUG;TRACE;NET45; prompt 4 @@ -28,48 +28,47 @@ pdbonly true bin\Release\net45 - TRACE;NET45 + TRACE;NET45; prompt 4 - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Microsoft.AspNet.FeatureModel - - - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} - Microsoft.AspNet.Abstractions - - - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} - Microsoft.AspNet.HttpFeature - + + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} + Microsoft.AspNet.FeatureModel + + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} + Microsoft.AspNet.Abstractions + + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} + Microsoft.AspNet.HttpFeature + - + - \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs new file mode 100644 index 0000000000..c99a8b1909 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -0,0 +1,10 @@ +namespace Microsoft.AspNet.FeatureModel.Tests +{ + public class Thing : IThing + { + public string Hello() + { + return "World"; + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json new file mode 100644 index 0000000000..e52db7c2c2 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -0,0 +1,17 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.AppBuilderSupport": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "" + }, + "configurations": { + "net45": { + "dependencies": { + "Shouldly": "1.1.1.1", + "xunit": "1.9.2" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json new file mode 100644 index 0000000000..0a90b7ac74 --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -0,0 +1,23 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.AppBuilderSupport": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "" + }, + "configurations": { + "net45": { + "dependencies": { + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.Owin.Hosting": "2.1.0", + "Microsoft.Owin.Testing": "2.1.0", + "Moq": "4.2.1312.1622", + "xunit": "1.9.2", + "Microsoft.Net.Http": "2.2.13", + "System.Net.Http": "" + } + } + } +} \ No newline at end of file From 003718c564326d3e31311728f4b92bfed4cf827b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 31 Jan 2014 13:35:26 -0800 Subject: [PATCH 026/846] Fixing build errors --- .../Microsoft.AspNet.PipelineCore.net45.csproj | 1 + .../InterfaceDictionaryTests.cs | 15 +++++++-------- .../BuilderTests.cs | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj index 9844b7f087..08b14e00ac 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -60,6 +60,7 @@ + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index c42f4b37d1..a8f005ee07 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,5 +1,4 @@ using System; -using Shouldly; using Xunit; namespace Microsoft.AspNet.FeatureModel.Tests @@ -14,11 +13,11 @@ namespace Microsoft.AspNet.FeatureModel.Tests interfaces.Add(typeof(IThing), thing); - interfaces[typeof(IThing)].ShouldBe(thing); + Assert.Equal(interfaces[typeof(IThing)], thing); object thing2; - interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); - thing2.ShouldBe(thing); + Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); + Assert.Equal(thing2, thing); } [Fact] @@ -29,11 +28,11 @@ namespace Microsoft.AspNet.FeatureModel.Tests interfaces[typeof(IThing)] = thing; - interfaces[typeof(IThing)].ShouldBe(thing); + Assert.Equal(interfaces[typeof(IThing)], thing); object thing2; - interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); - thing2.ShouldBe(thing); + Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); + Assert.Equal(thing2, thing); } [Fact] @@ -44,7 +43,7 @@ namespace Microsoft.AspNet.FeatureModel.Tests interfaces.Add(typeof(IThing), thing); - Should.Throw(() => interfaces.Add(typeof(IThing), thing)); + Assert.Throws(() => interfaces.Add(typeof(IThing), thing)); } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 7455439ed7..3dfc4278d8 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -1,5 +1,4 @@ using Microsoft.AspNet.Abstractions; -using Shouldly; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests @@ -18,7 +17,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests mockHttpResponse.SetupProperty(x => x.StatusCode); app.Invoke(mockHttpContext.Object); - mockHttpContext.Object.Response.StatusCode.ShouldBe(404); + Assert.Equal(mockHttpContext.Object.Response.StatusCode, 404); } } } \ No newline at end of file From 4ce1423b1c0bb56bcc0be33947c4710045b17810 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 1 Feb 2014 02:32:46 -0800 Subject: [PATCH 027/846] Made small changes to prevent null refs when getting HttpRequestInformation - Use FeatureReference.Default instead of new when constructing - Fixed project.json in tests --- .../DefaultCanHasQuery.cs | 2 +- .../DefaultCanHasRequestCookies.cs | 2 +- .../DefaultHttpContext.cs | 2 +- .../DefaultHttpRequest.cs | 10 +++++----- .../Infrastructure/FeatureReference.cs | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 5 +++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs index 7e97670db1..fa3069d427 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasQuery : ICanHasQuery { private readonly IFeatureCollection _features; - private FeatureReference _request = new FeatureReference(); + private FeatureReference _request = FeatureReference.Default; private string _queryString; private IReadableStringCollection _query; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index f4d23e029e..df33085763 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasRequestCookies : ICanHasRequestCookies { private readonly IFeatureCollection _features; - private FeatureReference _request = new FeatureReference(); + private FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; private static readonly string[] ZeroHeaders = new string[0]; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 4dc7adf253..778611eee0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.PipelineCore _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _canHasItems = new FeatureReference(); + _canHasItems = FeatureReference.Default; } ICanHasItems CanHasItems diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 055af55c49..2e96c4eca7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -12,11 +12,11 @@ namespace Microsoft.AspNet.PipelineCore private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _request = new FeatureReference(); - private FeatureReference _connection = new FeatureReference(); - private FeatureReference _transportLayerSecurity = new FeatureReference(); - private FeatureReference _canHasQuery = new FeatureReference(); - private FeatureReference _canHasCookies = new FeatureReference(); + private FeatureReference _request = FeatureReference.Default; + private FeatureReference _connection = FeatureReference.Default; + private FeatureReference _transportLayerSecurity = FeatureReference.Default; + private FeatureReference _canHasQuery = FeatureReference.Default; + private FeatureReference _canHasCookies = FeatureReference.Default; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index 70aba473a5..ed76942784 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } public static readonly FeatureReference Default = new FeatureReference(default(T), -1); - + public T Fetch(IFeatureCollection features) { if (_revision == features.Revision) return _feature; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 0a90b7ac74..e4bb833e89 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -4,7 +4,8 @@ "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "" + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.PipelineCore": "" }, "configurations": { "net45": { @@ -13,7 +14,7 @@ "Microsoft.Owin": "2.1.0", "Microsoft.Owin.Hosting": "2.1.0", "Microsoft.Owin.Testing": "2.1.0", - "Moq": "4.2.1312.1622", + "Moq": "4.2.1312.1622", "xunit": "1.9.2", "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" From 370a6b7ba3967962124eaaad434ae1a5ae221aac Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 1 Feb 2014 03:09:04 -0800 Subject: [PATCH 028/846] Added code for the k10 case in FeatureObject. --- src/Microsoft.AspNet.FeatureModel/FeatureObject.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 7b662285b9..fbc69b814f 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -40,6 +40,11 @@ namespace Microsoft.AspNet.FeatureModel return Converter.Convert(interfaceType, type, _instance); } } +#else + if (_instance != null && type == _instance.GetType()) + { + return _instance; + } #endif return null; } From 15eb51163d48d04fb72d9ae41004fa681b90af68 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 2 Feb 2014 08:20:45 -0800 Subject: [PATCH 029/846] Updating build.cmd to cache NuGet.exe --- build.cmd | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index d54931bc8f..7045ee1f84 100644 --- a/build.cmd +++ b/build.cmd @@ -1,10 +1,18 @@ @echo off cd %~dp0 -IF EXIST .nuget\NuGet.exe goto restore +SETLOCAL +SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe + +IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... +IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '%CACHED_NUGET%'" + +:copynuget +IF EXIST .nuget\nuget.exe goto restore md .nuget -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '.nuget\NuGet.exe'" +copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run From f9d29fd8aab79ae38f1b9dbdac0681893550bebf Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 7 Feb 2014 10:07:02 -0800 Subject: [PATCH 030/846] Workaround for myget being down --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index ab583b0ff7..a059188b09 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From e2f45c59eab74d14a70b09e4f2cce19028060e45 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sat, 8 Feb 2014 16:03:59 -0800 Subject: [PATCH 031/846] Placing IServiceProvider on IBuilder Replaces concept of features/items on builder instance for now --- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 5 +-- src/Microsoft.AspNet.PipelineCore/Builder.cs | 44 ++----------------- 2 files changed, 6 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 778e98d404..5699bed1b4 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -4,13 +4,12 @@ namespace Microsoft.AspNet.Abstractions { public interface IBuilder { + IServiceProvider ServiceProvider { get; set; } + IBuilder Use(Func middleware); IBuilder Run(RequestDelegate handler); IBuilder New(); RequestDelegate Build(); - - object GetItem(Type type); - void SetItem(Type type, object feature); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 8e4d2f0ac0..48edba1ce2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,56 +1,20 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.PipelineCore { public class Builder : IBuilder { - private readonly IFeatureCollection _interfaces; - private readonly IDictionary _properties; private readonly IList> _components = new List>(); - public Builder() + public Builder(IServiceProvider serviceProvider) { - _interfaces = new FeatureCollection(); - _properties = new Dictionary(); + ServiceProvider = serviceProvider; } - public Builder(IFeatureCollection interfaces, IDictionary properties) - { - _interfaces = interfaces; - _properties = properties; - } - - public void Dispose() - { - _interfaces.Dispose(); - } - - public virtual object GetItem(Type key) - { - object value; - return _interfaces.TryGetValue(key, out value); - } - - public virtual void SetItem(Type key, object value) - { - _interfaces[key] = value; - } - - public virtual object GetItem(string key) - { - object value; - return _properties.TryGetValue(key, out value); - } - - public virtual void SetItem(string key, object value) - { - _properties[key] = value; - } + public IServiceProvider ServiceProvider { get; set; } public IBuilder Use(Func middleware) { @@ -65,7 +29,7 @@ namespace Microsoft.AspNet.PipelineCore public IBuilder New() { - return new Builder(_interfaces, _properties); + return new Builder(ServiceProvider); } public RequestDelegate Build() From 86025a3ec43d5120da71d6fed589022c2c420890 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sun, 9 Feb 2014 18:24:16 -0800 Subject: [PATCH 032/846] Updated Builder constructors --- .../AppBuilderSupportExtensions.cs | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs index d434c85b97..dfb66eb492 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs @@ -16,7 +16,7 @@ namespace Owin { public static IAppBuilder UseBuilder(this IAppBuilder appBuilder, Action configuration) { - IBuilder builder = new Builder(); + IBuilder builder = new Builder(null); configuration(builder); Func middleware1 = next1 => { Func middleware2 = next2 => { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 3dfc4278d8..4541585c1d 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests [Fact] public void BuildReturnsCallableDelegate() { - var builder = new Builder(); + var builder = new Builder(null); var app = builder.Build(); var mockHttpContext = new Moq.Mock(); From 850128dc396fc59fc5111cbf89f95fd9dcaa9368 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 6 Feb 2014 14:43:32 -0800 Subject: [PATCH 033/846] Implement request and response properties: Headers, ContentLength. --- .../HttpResponse.cs | 2 + .../DefaultHttpRequest.cs | 7 ++- .../DefaultHttpResponse.cs | 50 +++++++++++++++++-- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 6402033422..de84899fda 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -9,8 +9,10 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpContext HttpContext { get; } public abstract int StatusCode { get; set; } + public abstract IHeaderDictionary Headers { get; } public abstract Stream Body { get; set; } + public abstract long? ContentLength { get; set; } public abstract string ContentType { get; set; } public abstract Task WriteAsync(string data); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 2e96c4eca7..ac5e3d7572 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,8 +1,10 @@ using System; using System.IO; +using System.Threading; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore @@ -118,7 +120,7 @@ namespace Microsoft.AspNet.PipelineCore public override IHeaderDictionary Headers { - get { throw new NotImplementedException(); } + get { return new HeaderDictionary(HttpRequestInformation.Headers); } } public override IReadableStringCollection Cookies @@ -130,7 +132,8 @@ namespace Microsoft.AspNet.PipelineCore { get { - throw new NotImplementedException(); + return CancellationToken.None; + // throw new NotImplementedException(); } set { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 614005692a..5431315cb7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,9 +1,12 @@ -using System.IO; +using System.Globalization; +using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore @@ -33,22 +36,63 @@ namespace Microsoft.AspNet.PipelineCore set { HttpResponseInformation.StatusCode = value; } } + public override IHeaderDictionary Headers + { + get { return new HeaderDictionary(HttpResponseInformation.Headers); } + } + public override Stream Body { get { return HttpResponseInformation.Body; } set { HttpResponseInformation.Body = value; } } + public override long? ContentLength + { + get + { + string[] values; + long value; + if (HttpResponseInformation.Headers.TryGetValue(Constants.Headers.ContentLength, out values) + && values != null && values.Length > 0 && !string.IsNullOrWhiteSpace(values[0]) + && long.TryParse(values[0], out value)) + { + return value; + } + + return null; + } + set + { + if (value.HasValue) + { + HttpResponseInformation.Headers[Constants.Headers.ContentLength] = + new[] { value.Value.ToString(CultureInfo.InvariantCulture) }; + } + else + { + HttpResponseInformation.Headers.Remove(Constants.Headers.ContentLength); + } + } + } + public override string ContentType { get { - var contentTypeValues = HttpResponseInformation.Headers["Content-Type"]; + var contentTypeValues = HttpResponseInformation.Headers[Constants.Headers.ContentType]; return contentTypeValues.Length == 0 ? null : contentTypeValues[0]; } set { - HttpResponseInformation.Headers["Content-Type"] = new[] { value }; + if (string.IsNullOrWhiteSpace(value)) + { + HttpResponseInformation.Headers.Remove(Constants.Headers.ContentType); + } + else + { + HttpResponseInformation.Headers[Constants.Headers.ContentType] = new[] { value }; + } } } From 40a7181ff07e3f793d33add9656b0be875d10e38 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 7 Feb 2014 12:12:11 -0800 Subject: [PATCH 034/846] Lazy translate conditional Owin keys to Features. --- .../AppBuilderSupportExtensions.cs | 3 +- .../OwinConstants.cs | 1 + .../OwinHttpEnvironment.cs | 180 +++++++++++++++++- 3 files changed, 181 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs index dfb66eb492..215afb8bcf 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs @@ -31,8 +31,7 @@ namespace Owin return app.Invoke( new DefaultHttpContext( new FeatureCollection( - new FeatureObject( - new OwinHttpEnvironment(env))))); + new OwinHttpEnvironment(env)))); }; }; return appBuilder.Use(middleware1); diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs index c7eafe6019..45aabf2913 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs @@ -56,6 +56,7 @@ internal static class CommonKeys { public const string ClientCertificate = "ssl.ClientCertificate"; + public const string LoadClientCertAsync = "ssl.LoadClientCertAsync"; public const string RemoteIpAddress = "server.RemoteIpAddress"; public const string RemotePort = "server.RemotePort"; public const string LocalIpAddress = "server.LocalIpAddress"; diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs index 0fb7a5ea01..b03c9bd7fe 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs @@ -2,17 +2,23 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Linq; using System.Net; +using System.Reflection; #if NET45 using System.Security.Cryptography.X509Certificates; #endif using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.PipelineCore.Owin { + using SendFileFunc = Func; + public class OwinHttpEnvironment : + IFeatureCollection, IHttpRequestInformation, IHttpResponseInformation, IHttpConnection, @@ -149,9 +155,40 @@ namespace Microsoft.AspNet.PipelineCore.Owin set { Prop(OwinConstants.CommonKeys.LocalPort, value); } } + private bool SupportsSendFile + { + get + { + object obj; + return Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj) && obj != null; + } + } + Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) { - throw new NotImplementedException(); + object obj; + if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) + { + SendFileFunc func = (SendFileFunc)obj; + return func(path, offset, length, cancellation); + } + throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); + } + + private bool SupportsClientCerts + { + get + { + object obj; + if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) + && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) + || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) + && obj != null) + { + return true; + } + return false; + } } #if NET45 X509Certificate IHttpTransportLayerSecurity.ClientCertificate @@ -164,5 +201,146 @@ namespace Microsoft.AspNet.PipelineCore.Owin { throw new NotImplementedException(); } + + public int Revision + { + get { return 0; } // Not modifiable + } + + public void Add(Type key, object value) + { + throw new NotSupportedException(); + } + + public bool ContainsKey(Type key) + { + // Does this type implement the requested interface? + if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) + { + // Check for conditional features + if (key == typeof(IHttpSendFile)) + { + return SupportsSendFile; + } + else if (key == typeof(IHttpTransportLayerSecurity)) + { + return SupportsClientCerts; + } + + // The rest of the features are always supported. + return true; + } + return false; + } + + public ICollection Keys + { + get + { + IList keys = new List() + { + typeof(IHttpRequestInformation), + typeof(IHttpResponseInformation), + typeof(IHttpConnection), + typeof(ICanHasOwinEnvironment), + }; + if (SupportsSendFile) + { + keys.Add(typeof(IHttpSendFile)); + } + if (SupportsClientCerts) + { + keys.Add(typeof(IHttpTransportLayerSecurity)); + } + return keys; + } + } + + public bool Remove(Type key) + { + throw new NotSupportedException(); + } + + public bool TryGetValue(Type key, out object value) + { + if (ContainsKey(key)) + { + value = this; + return true; + } + value = null; + return false; + } + + public ICollection Values + { + get { throw new NotSupportedException(); } + } + + public object this[Type key] + { + get + { + object value; + if (TryGetValue(key, out value)) + { + return value; + } + throw new KeyNotFoundException(key.FullName); + } + set + { + throw new NotSupportedException(); + } + } + + public void Add(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public void Clear() + { + throw new NotSupportedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return Keys.Count; } + } + + public bool IsReadOnly + { + get { return true; } + } + + public bool Remove(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public IEnumerator> GetEnumerator() + { + return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Dispose() + { + } } } \ No newline at end of file From fe1011e50713732a608a3be1e766986b0115684c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 10 Feb 2014 10:52:19 -0800 Subject: [PATCH 035/846] Code review cleanup. --- .../OwinHttpEnvironment.cs | 26 ++++++++++++++++--- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 6 ++--- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs index b03c9bd7fe..02be7db4a5 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.PipelineCore.Owin object obj; if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) { - SendFileFunc func = (SendFileFunc)obj; + var func = (SendFileFunc)obj; return func(path, offset, length, cancellation); } throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); @@ -237,7 +237,7 @@ namespace Microsoft.AspNet.PipelineCore.Owin { get { - IList keys = new List() + var keys = new List() { typeof(IHttpRequestInformation), typeof(IHttpResponseInformation), @@ -306,12 +306,30 @@ namespace Microsoft.AspNet.PipelineCore.Owin public bool Contains(KeyValuePair item) { - throw new NotImplementedException(); + object result; + return TryGetValue(item.Key, out result) && result.Equals(item.Value); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { - throw new NotImplementedException(); + if (array == null) + { + throw new ArgumentNullException("array"); + } + if (arrayIndex < 0 || arrayIndex > array.Length) + { + throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); + } + var keys = Keys; + if (keys.Count > array.Length - arrayIndex) + { + throw new ArgumentException(); + } + + foreach (var key in keys) + { + array[arrayIndex++] = new KeyValuePair(key, this[key]); + } } public int Count diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index ac5e3d7572..0f98a561f1 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -132,8 +132,8 @@ namespace Microsoft.AspNet.PipelineCore { get { + // TODO: Which feature exposes this? return CancellationToken.None; - // throw new NotImplementedException(); } set { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 5431315cb7..5fec0bc498 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -51,11 +51,9 @@ namespace Microsoft.AspNet.PipelineCore { get { - string[] values; long value; - if (HttpResponseInformation.Headers.TryGetValue(Constants.Headers.ContentLength, out values) - && values != null && values.Length > 0 && !string.IsNullOrWhiteSpace(values[0]) - && long.TryParse(values[0], out value)) + string rawValue = Headers.Get(Constants.Headers.ContentLength); + if (!string.IsNullOrWhiteSpace(rawValue) && long.TryParse(rawValue, out value)) { return value; } From a34826d90b21b9c5af7e2507e1a99302a7888279 Mon Sep 17 00:00:00 2001 From: Yishai Galatzer Date: Wed, 12 Feb 2014 12:43:13 -0800 Subject: [PATCH 036/846] Use the right collection, so accessing a non existent ContentType on a response doesn't throw and return null instead --- src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 5fec0bc498..9ff8135d63 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -78,8 +78,8 @@ namespace Microsoft.AspNet.PipelineCore { get { - var contentTypeValues = HttpResponseInformation.Headers[Constants.Headers.ContentType]; - return contentTypeValues.Length == 0 ? null : contentTypeValues[0]; + var contentType = Headers[Constants.Headers.ContentType]; + return contentType; } set { From 69addcac863da0d2179a82dadb2cf137ef52a0ca Mon Sep 17 00:00:00 2001 From: GrabYourPitchforks Date: Fri, 14 Feb 2014 16:26:13 -0800 Subject: [PATCH 037/846] FeatureModel should use Type.IsInstanceOf rather than direct type equality. --- src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs | 7 +++---- src/Microsoft.AspNet.FeatureModel/FeatureObject.cs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 028a1c9477..d3aaff33cf 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Reflection; using System.Threading; using Microsoft.AspNet.FeatureModel.Implementation; @@ -42,11 +43,7 @@ namespace Microsoft.AspNet.FeatureModel { if (_featureByFeatureType.TryGetValue(actualType, out feature)) { -#if NET45 var isInstanceOfType = type.IsInstanceOfType(feature); -#else - var isInstanceOfType = feature != null && type == feature.GetType(); -#endif if (isInstanceOfType) { @@ -54,6 +51,8 @@ namespace Microsoft.AspNet.FeatureModel } #if NET45 return Converter.Convert(type, actualType, feature); +#else + return null; #endif } } diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index fbc69b814f..42d2bf8e79 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -27,12 +27,12 @@ namespace Microsoft.AspNet.FeatureModel public object GetInterface(Type type) { -#if NET45 if (type.IsInstanceOfType(_instance)) { return _instance; } +#if NET45 foreach (var interfaceType in _instance.GetType().GetInterfaces()) { if (interfaceType.FullName == type.FullName) From ad5a77ca4c0bec8bd25c13aae141c1acc1b3d650 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 14 Feb 2014 19:56:27 -0800 Subject: [PATCH 038/846] Removing csproj files that are not meant to be commited --- ...Microsoft.AspNet.PipelineCore.net45.csproj | 86 ----------------- ...Microsoft.AspNet.PipelineCore.Tests.csproj | 95 ------------------- 2 files changed, 181 deletions(-) delete mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj delete mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj deleted file mode 100644 index 08b14e00ac..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ /dev/null @@ -1,86 +0,0 @@ - - - - - Debug - AnyCPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B} - Library - Properties - Microsoft.AspNet.PipelineCore - Microsoft.AspNet.PipelineCore - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45; - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45; - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} - Microsoft.AspNet.FeatureModel - - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} - Microsoft.AspNet.Abstractions - - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} - Microsoft.AspNet.HttpFeature - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj deleted file mode 100644 index d68b62764a..0000000000 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Debug - AnyCPU - {86942914-0334-4352-87ED-B971281C74E2} - Library - Properties - Microsoft.AspNet.PipelineCore.Tests - Microsoft.AspNet.PipelineCore.Tests - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - bin\Release\Microsoft.AspNet.PipelineCore.Tests.XML - - - - False - ..\..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll - - - False - ..\..\packages\Shouldly.1.1.1.1\lib\35\Shouldly.dll - - - - - - - - - - False - ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll - - - - - - - - - - - - - - - - - - - - - - - - - {d36288af-8a0e-48dd-8af8-15b72f91c70a} - Microsoft.AspNet.Abstractions.net45 - - - {68a538ba-d542-49cb-9615-b4f5a4e78c87} - Microsoft.AspNet.PipelineCore.net45 - - - - - - - - \ No newline at end of file From fe15f4a84976d9110c8a3ce3877712a70c3c6a6e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 17 Feb 2014 15:27:32 -0800 Subject: [PATCH 039/846] Ensure HttpResponse.Query is populated with query string values --- .../DefaultCanHasQuery.cs | 3 +- .../Infrastructure/ParsingHelpers.cs | 32 ++++++------------- .../DefaultCanHasQueryTests.cs | 31 ++++++++++++++++++ 3 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs index fa3069d427..9a3e45e5fb 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs @@ -27,8 +27,7 @@ namespace Microsoft.AspNet.PipelineCore if (_query == null || _queryString != queryString) { _queryString = queryString; - // TODO - _query = new ReadableStringCollection(new Dictionary()); + _query = new ReadableStringCollection(ParsingHelpers.GetQuery(queryString)); } return _query; } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 91254955f7..18153db162 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,9 +1,9 @@ -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.PipelineCore.Collections; using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure { @@ -799,28 +799,14 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; - internal static IDictionary GetQuery(HttpRequest request) + internal static IDictionary GetQuery(string queryString) { - var query = GetItem>(request, "Microsoft.Owin.Query#dictionary"); - if (query == null) - { - query = new Dictionary(StringComparer.OrdinalIgnoreCase); - SetItem(request, "Microsoft.Owin.Query#dictionary", query); - } - - string text = request.QueryString.Value; - if (GetItem(request, "Microsoft.Owin.Query#text") != text) - { - query.Clear(); - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, AmpersandAndSemicolon, AppendItemCallback, accumulator); - foreach (var kv in accumulator) - { - query.Add(kv.Key, kv.Value.ToArray()); - } - SetItem(request, "Microsoft.Owin.Query#text", text); - } - return query; + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); + return accumulator.ToDictionary( + item => item.Key, + item => item.Value.ToArray(), + StringComparer.OrdinalIgnoreCase); } #if !NET40 diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs new file mode 100644 index 0000000000..5bef67e18d --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Moq; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultCanHasQueryTests + { + [Fact] + public void QueryReturnsParsedQueryCollection() + { + // Arrange + var features = new Mock(); + var request = new Mock(); + request.SetupGet(r => r.QueryString).Returns("foo=bar"); + + object value = request.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + .Returns(true); + + var provider = new DefaultCanHasQuery(features.Object); + + // Act + var queryCollection = provider.Query; + + // Assert + Assert.Equal("bar", queryCollection["foo"]); + } + } +} From 09cc1964e7d24bc9ff3ad49af5282efff167006b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 25 Feb 2014 12:52:00 -0800 Subject: [PATCH 040/846] Adding GetFormAsync on HttpRequest to read form data --- .../HttpRequest.cs | 7 ++ .../DefaultCanHasForm.cs | 42 ++++++++++++ .../DefaultHttpRequest.cs | 12 ++++ .../ICanHasForm.cs | 10 +++ .../DefaultCanHasFormTests.cs | 68 +++++++++++++++++++ 5 files changed, 139 insertions(+) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index f7b85de29d..9e8f53a110 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Threading; +using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions { @@ -58,6 +59,12 @@ namespace Microsoft.AspNet.Abstractions /// The query value collection parsed from owin.RequestQueryString. public abstract IReadableStringCollection Query { get; } + /// + /// Gets the query value collection form collection. + /// + /// The form collection parsed from the request body. + public abstract Task GetFormAsync(); + /// /// Gets or set the owin.RequestProtocol. /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs new file mode 100644 index 0000000000..d7547eab2a --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs @@ -0,0 +1,42 @@ +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultCanHasForm : ICanHasForm + { + private readonly IFeatureCollection _features; + private readonly FeatureReference _request = FeatureReference.Default; + private Stream _bodyStream; + private IReadableStringCollection _form; + + public DefaultCanHasForm(IFeatureCollection features) + { + _features = features; + } + + public async Task GetFormAsync() + { + var body = _request.Fetch(_features).Body; + + if (_bodyStream == null || _bodyStream != body) + { + _bodyStream = body; + using (var streamReader = new StreamReader(body, Encoding.UTF8, + detectEncodingFromByteOrderMarks: true, + bufferSize: 1024, leaveOpen: true)) + { + string formQuery = await streamReader.ReadToEndAsync(); + _form = new ReadableStringCollection(ParsingHelpers.GetQuery(formQuery)); + } + } + return _form; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 0f98a561f1..7afd73181d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Threading; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; @@ -18,6 +19,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _connection = FeatureReference.Default; private FeatureReference _transportLayerSecurity = FeatureReference.Default; private FeatureReference _canHasQuery = FeatureReference.Default; + private FeatureReference _canHasForm = FeatureReference.Default; private FeatureReference _canHasCookies = FeatureReference.Default; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) @@ -46,6 +48,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasQuery.Fetch(_features) ?? _canHasQuery.Update(_features, new DefaultCanHasQuery(_features)); } } + private ICanHasForm CanHasForm + { + get { return _canHasForm.Fetch(_features) ?? _canHasForm.Update(_features, new DefaultCanHasForm(_features)); } + } + private ICanHasRequestCookies CanHasRequestCookies { get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasRequestCookies(_features)); } @@ -112,6 +119,11 @@ namespace Microsoft.AspNet.PipelineCore get { return CanHasQuery.Query; } } + public override Task GetFormAsync() + { + return CanHasForm.GetFormAsync(); + } + public override string Protocol { get { return HttpRequestInformation.Protocol; } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs new file mode 100644 index 0000000000..aba500a592 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.PipelineCore +{ + public interface ICanHasForm + { + Task GetFormAsync(); + } +} diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs new file mode 100644 index 0000000000..967839793d --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs @@ -0,0 +1,68 @@ +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Moq; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultCanHasFormTests + { + [Fact] + public async Task GetFormAsync_ReturnsParsedFormCollection() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("foo=bar&baz=2"); + var features = new Mock(); + var request = new Mock(); + request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent)); + + object value = request.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + .Returns(true); + + var provider = new DefaultCanHasForm(features.Object); + + // Act + var formCollection = await provider.GetFormAsync(); + + // Assert + Assert.Equal("bar", formCollection["foo"]); + Assert.Equal("2", formCollection["baz"]); + } + + [Fact] + public async Task GetFormAsync_CachesFormCollectionPerBodyStream() + { + // Arrange + var formContent1 = Encoding.UTF8.GetBytes("foo=bar&baz=2"); + var formContent2 = Encoding.UTF8.GetBytes("collection2=value"); + var features = new Mock(); + var request = new Mock(); + request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent1)); + + object value = request.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + .Returns(true); + + var provider = new DefaultCanHasForm(features.Object); + + // Act - 1 + var formCollection = await provider.GetFormAsync(); + + // Assert - 1 + Assert.Equal("bar", formCollection["foo"]); + Assert.Equal("2", formCollection["baz"]); + Assert.Same(formCollection, await provider.GetFormAsync()); + + // Act - 2 + request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent2)); + formCollection = await provider.GetFormAsync(); + + // Assert - 2 + Assert.Equal("value", formCollection["collection2"]); + } + } +} From 2dfdfafaa6b7223edd6fc1d3a95f570c38b905ea Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 7 Mar 2014 02:17:04 -0800 Subject: [PATCH 041/846] Added required packages for K --- .../project.json | 15 +++++++++-- .../Implementation/Converter.cs | 2 ++ .../project.json | 14 +++++++++-- .../IHttpConnection.cs | 2 ++ src/Microsoft.AspNet.HttpFeature/project.json | 12 +++++++-- .../project.json | 25 +++++++++++++++---- 6 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 5f23498788..669ddaed1c 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -2,7 +2,18 @@ "version": "0.1-alpha-*", "dependencies": {}, "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.IO": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Threading.Tasks": "4.0.0.0" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs index 32f3943634..0102dea38a 100644 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +#if NET45 using System.Reflection.Emit; +#endif using System.Runtime.CompilerServices; namespace Microsoft.AspNet.FeatureModel.Implementation diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 5f23498788..33f8ba15f7 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,17 @@ "version": "0.1-alpha-*", "dependencies": {}, "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Reflection.Compatibility": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Threading": "4.0.0.0" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index fcb2318f3d..9af5df12e8 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,4 +1,6 @@ +#if NET45 using System.Net; +#endif namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 17465c3576..4660c1d1cd 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,7 +1,15 @@ { "version": "0.1-alpha-*", "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.IO": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Security.Principal": "4.0.0.0", + "System.Threading.Tasks": "4.0.0.0" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index c55207d3f0..82b021a735 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,12 +1,27 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.FeatureModel" : "", - "Microsoft.AspNet.Abstractions" : "", - "Microsoft.AspNet.HttpFeature" : "" + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.HttpFeature": "" }, "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Debug": "4.0.10.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.IO": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Text.Encoding": "4.0.10.0", + "System.Threading.Tasks": "4.0.0.0" + } + } } } \ No newline at end of file From 9ac0a8c70333cd96fc6922e8aefd4f916e4dc288 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 10 Mar 2014 18:00:54 -0700 Subject: [PATCH 042/846] Adding ContentLength to HttpRequest Partially addresses #15 --- .../HttpRequest.cs | 5 ++ .../DefaultHttpRequest.cs | 15 +++- .../DefaultHttpResponse.cs | 19 +---- .../Infrastructure/ParsingHelpers.cs | 32 ++++++++- .../DefaultHttpRequestTests.cs | 70 +++++++++++++++++++ .../project.json | 1 + 6 files changed, 122 insertions(+), 20 deletions(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index 9e8f53a110..b4f563464b 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -83,6 +83,11 @@ namespace Microsoft.AspNet.Abstractions /// The collection of Cookies for this request. public abstract IReadableStringCollection Cookies { get; } + /// + /// Gets or sets the Content-Length header + /// + public abstract long? ContentLength { get; set; } + /// /// Gets or sets the Content-Type header. /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 7afd73181d..9579b7c814 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,8 +1,10 @@ using System; +using System.Globalization; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; @@ -58,7 +60,6 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasRequestCookies(_features)); } } - public override HttpContext HttpContext { get { return _context; } } public override PathString PathBase @@ -79,6 +80,18 @@ namespace Microsoft.AspNet.PipelineCore set { HttpRequestInformation.QueryString = value.Value; } } + public override long? ContentLength + { + get + { + return ParsingHelpers.GetContentLength(Headers); + } + set + { + ParsingHelpers.SetContentLength(Headers, value); + } + } + public override Stream Body { get { return HttpRequestInformation.Body; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 9ff8135d63..c1ec42c5d0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -51,26 +51,11 @@ namespace Microsoft.AspNet.PipelineCore { get { - long value; - string rawValue = Headers.Get(Constants.Headers.ContentLength); - if (!string.IsNullOrWhiteSpace(rawValue) && long.TryParse(rawValue, out value)) - { - return value; - } - - return null; + return ParsingHelpers.GetContentLength(Headers); } set { - if (value.HasValue) - { - HttpResponseInformation.Headers[Constants.Headers.ContentLength] = - new[] { value.Value.ToString(CultureInfo.InvariantCulture) }; - } - else - { - HttpResponseInformation.Headers.Remove(Constants.Headers.ContentLength); - } + ParsingHelpers.SetContentLength(Headers, value); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 18153db162..7ab6b1c817 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,8 +1,10 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure @@ -804,8 +806,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); return accumulator.ToDictionary( - item => item.Key, - item => item.Value.ToArray(), + item => item.Key, + item => item.Value.ToArray(), StringComparer.OrdinalIgnoreCase); } @@ -856,5 +858,31 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure // var localPort = request.Get(OwinConstants.CommonKeys.LocalPort); // return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); //} + + public static long? GetContentLength(IHeaderDictionary headers) + { + const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; + long value; + string rawValue = headers.Get(Constants.Headers.ContentLength); + if (!string.IsNullOrWhiteSpace(rawValue) && + long.TryParse(rawValue, styles, CultureInfo.InvariantCulture, out value)) + { + return value; + } + + return null; + } + + public static void SetContentLength(IHeaderDictionary headers, long? value) + { + if (value.HasValue) + { + headers[Constants.Headers.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); + } + else + { + headers.Remove(Constants.Headers.ContentLength); + } + } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs new file mode 100644 index 0000000000..f56039abf9 --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using System.Globalization; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Moq; +using Xunit; +using Xunit.Extensions; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultHttpRequestTests + { + [Theory] + [InlineData(0)] + [InlineData(9001)] + [InlineData(65535)] + public void GetContentLength_ReturnsParsedHeader(long value) + { + // Arrange + var request = GetRequest(value.ToString(CultureInfo.InvariantCulture)); + + // Act and Assert + Assert.Equal(value, request.ContentLength); + } + + [Fact] + public void GetContentLength_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequest(contentLength: null); + + // Act and Assert + Assert.Null(request.ContentLength); + } + + [Theory] + [InlineData("cant-parse-this")] + [InlineData("-1000")] + [InlineData("1000.00")] + [InlineData("100/5")] + public void GetContentLength_ReturnsNullIfHeaderCannotBeParsed(string contentLength) + { + // Arrange + var request = GetRequest(contentLength); + + // Act and Assert + Assert.Null(request.ContentLength); + } + + private static DefaultHttpRequest GetRequest(string contentLength = null) + { + var features = new Mock(); + var mockRequestInfo = new Mock(); + var headers = new Dictionary(); + if (contentLength != null) + { + headers.Add("Content-Length", new[] { contentLength }); + + } + mockRequestInfo.SetupGet(r => r.Headers) + .Returns(headers); + object requestInfo = mockRequestInfo.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out requestInfo)) + .Returns(true); + var context = new DefaultHttpContext(features.Object); + var request = new DefaultHttpRequest(context, features.Object); + return request; + } + } +} diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index e4bb833e89..5d77e10d07 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -16,6 +16,7 @@ "Microsoft.Owin.Testing": "2.1.0", "Moq": "4.2.1312.1622", "xunit": "1.9.2", + "xunit.extensions": "1.9.2", "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" } From 543e818acda8a28198e078c5e2adbab738edceb0 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 10 Mar 2014 17:12:16 -0700 Subject: [PATCH 043/846] Add support for host based on Host header --- .../DefaultHttpRequest.cs | 10 +- .../DefaultHttpRequestTests.cs | 95 +++++++++++++++---- 2 files changed, 81 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 9579b7c814..188cf06102 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -117,14 +117,8 @@ namespace Microsoft.AspNet.PipelineCore public override HostString Host { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } + get { return HostString.FromUriComponent(Headers["Host"]); } + set { Headers["Host"] = value.ToUriComponent(); } } public override IReadableStringCollection Query diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index f56039abf9..652edf2927 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; @@ -17,7 +19,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsParsedHeader(long value) { // Arrange - var request = GetRequest(value.ToString(CultureInfo.InvariantCulture)); + var request = GetRequestWithContentLength(value.ToString(CultureInfo.InvariantCulture)); // Act and Assert Assert.Equal(value, request.ContentLength); @@ -27,7 +29,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsNullIfHeaderDoesNotExist() { // Arrange - var request = GetRequest(contentLength: null); + var request = GetRequestWithContentLength(contentLength: null); // Act and Assert Assert.Null(request.ContentLength); @@ -41,30 +43,91 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsNullIfHeaderCannotBeParsed(string contentLength) { // Arrange - var request = GetRequest(contentLength); + var request = GetRequestWithContentLength(contentLength); // Act and Assert Assert.Null(request.ContentLength); } - private static DefaultHttpRequest GetRequest(string contentLength = null) + [Fact] + public void Host_GetsHostFromHeaders() { - var features = new Mock(); - var mockRequestInfo = new Mock(); - var headers = new Dictionary(); + // Arrange + const string expected = "localhost:9001"; + + var headers = new Dictionary(StringComparer.Ordinal) + { + { "Host", new string[]{ expected } }, + }; + + var request = CreateRequest(headers); + + // Act + var host = request.Host; + + // Assert + Assert.Equal(expected, host.Value); + } + + [Fact] + public void Host_DecodesPunyCode() + { + // Arrange + const string expected = "löcalhöst"; + + var headers = new Dictionary(StringComparer.Ordinal) + { + { "Host", new string[]{ "xn--lcalhst-90ae" } }, + }; + + var request = CreateRequest(headers); + + // Act + var host = request.Host; + + // Assert + Assert.Equal(expected, host.Value); + } + + [Fact] + public void Host_EncodesPunyCode() + { + // Arrange + const string expected = "xn--lcalhst-90ae"; + + var headers = new Dictionary(StringComparer.Ordinal); + + var request = CreateRequest(headers); + + // Act + request.Host = new HostString("löcalhöst"); + + // Assert + Assert.Equal(expected, headers["Host"][0]); + } + + private static DefaultHttpRequest CreateRequest(IDictionary headers) + { + var requestInfo = new Mock(); + requestInfo.SetupGet(r => r.Headers).Returns(headers); + + var features = new FeatureCollection(); + features.Add(typeof(IHttpRequestInformation), requestInfo.Object); + + var context = new DefaultHttpContext(features); + return new DefaultHttpRequest(context, features); + } + + private static DefaultHttpRequest GetRequestWithContentLength(string contentLength = null) + { + var headers = new Dictionary(StringComparer.Ordinal); if (contentLength != null) { headers.Add("Content-Length", new[] { contentLength }); } - mockRequestInfo.SetupGet(r => r.Headers) - .Returns(headers); - object requestInfo = mockRequestInfo.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out requestInfo)) - .Returns(true); - var context = new DefaultHttpContext(features.Object); - var request = new DefaultHttpRequest(context, features.Object); - return request; + + return CreateRequest(headers); } } } From ca2ef860f5cdfe3b4e6740a1f409638af8aa75cc Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 17 Mar 2014 21:42:35 -0700 Subject: [PATCH 044/846] Adding IServiceProvider interfaces to HttpContext --- .../HttpContext.cs | 4 ++++ .../DefaultCanHasServiceProviders.cs | 10 ++++++++++ .../DefaultHttpContext.cs | 19 +++++++++++++++++++ .../ICanHasServiceProviders.cs | 10 ++++++++++ 4 files changed, 43 insertions(+) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 03d8c7ec2e..9f2eac3614 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -11,6 +11,10 @@ namespace Microsoft.AspNet.Abstractions public abstract IDictionary Items { get; } + public abstract IServiceProvider ApplicationServices { get; set; } + + public abstract IServiceProvider RequestServices { get; set; } + public abstract void Dispose(); public abstract object GetFeature(Type type); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs new file mode 100644 index 0000000000..58ccd6565d --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs @@ -0,0 +1,10 @@ +using System; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultCanHasServiceProviders : ICanHasServiceProviders + { + public IServiceProvider ApplicationServices { get; set; } + public IServiceProvider RequestServices { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 778611eee0..da5e692686 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -12,6 +12,7 @@ namespace Microsoft.AspNet.PipelineCore private readonly HttpResponse _response; private FeatureReference _canHasItems; + private FeatureReference _canHasServiceProviders; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -21,6 +22,7 @@ namespace Microsoft.AspNet.PipelineCore _response = new DefaultHttpResponse(this, features); _canHasItems = FeatureReference.Default; + _canHasServiceProviders = FeatureReference.Default; } ICanHasItems CanHasItems @@ -28,6 +30,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasItems.Fetch(_features) ?? _canHasItems.Update(_features, new DefaultCanHasItems()); } } + ICanHasServiceProviders CanHasServiceProviders + { + get { return _canHasServiceProviders.Fetch(_features) ?? _canHasServiceProviders.Update(_features, new DefaultCanHasServiceProviders()); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -37,6 +44,18 @@ namespace Microsoft.AspNet.PipelineCore get { return CanHasItems.Items; } } + public override IServiceProvider ApplicationServices + { + get { return CanHasServiceProviders.ApplicationServices; } + set { CanHasServiceProviders.ApplicationServices = value; } + } + + public override IServiceProvider RequestServices + { + get { return CanHasServiceProviders.RequestServices; } + set { CanHasServiceProviders.RequestServices = value; } + } + public int Revision { get { return _features.Revision; } } public override void Dispose() diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs new file mode 100644 index 0000000000..77befcf990 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs @@ -0,0 +1,10 @@ +using System; + +namespace Microsoft.AspNet.PipelineCore +{ + public interface ICanHasServiceProviders + { + IServiceProvider ApplicationServices { get; set; } + IServiceProvider RequestServices { get; set; } + } +} \ No newline at end of file From ae9545a124b1b0469ca9ff181ea892dfd6e676bc Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:21:12 -0700 Subject: [PATCH 045/846] Improve request and response cookie handling. --- .gitignore | 2 + .../HttpResponse.cs | 1 + .../IResponseCookiesCollection.cs | 37 ++++++++++++ .../Collections/RequestCookieCollection.cs | 60 ------------------- .../RequestCookiesCollection.cs | 2 +- ...ection.cs => ResponseCookiesCollection.cs} | 7 +-- .../DefaultCanHasRequestCookies.cs | 4 +- .../DefaultCanHasResponseCookies.cs | 35 +++++++++++ .../DefaultHttpResponse.cs | 10 ++++ .../ICanHasResponseCookies.cs | 10 ++++ .../Infrastructure/Constants.cs | 1 + 11 files changed, 103 insertions(+), 66 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs delete mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs rename src/Microsoft.AspNet.PipelineCore/{ => Collections}/RequestCookiesCollection.cs (97%) rename src/Microsoft.AspNet.PipelineCore/Collections/{ResponseCookieCollection.cs => ResponseCookiesCollection.cs} (96%) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs diff --git a/.gitignore b/.gitignore index 2554a1fc23..8bc217058d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ nuget.exe *.userprefs *DS_Store *.ncrunchsolution +*.*sdf +*.ipch \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index de84899fda..8df6277482 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.Abstractions public abstract long? ContentLength { get; set; } public abstract string ContentType { get; set; } + public abstract IResponseCookiesCollection Cookies { get; } public abstract Task WriteAsync(string data); } } diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs b/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs new file mode 100644 index 0000000000..8e38bb92dd --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs @@ -0,0 +1,37 @@ + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// A wrapper for the response Set-Cookie header + /// + public interface IResponseCookiesCollection + { + /// + /// Add a new cookie and value + /// + /// + /// + void Append(string key, string value); + + /// + /// Add a new cookie + /// + /// + /// + /// + void Append(string key, string value, CookieOptions options); + + /// + /// Sets an expired cookie + /// + /// + void Delete(string key); + + /// + /// Sets an expired cookie + /// + /// + /// + void Delete(string key, CookieOptions options); + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs deleted file mode 100644 index 91b1577f28..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNet.PipelineCore.Collections -{ - /// - /// A wrapper for the request Cookie header - /// - public class RequestCookieCollection : IEnumerable> - { - /// - /// Create a new wrapper - /// - /// - public RequestCookieCollection(IDictionary store) - { - if (store == null) - { - throw new ArgumentNullException("store"); - } - - Store = store; - } - - private IDictionary Store { get; set; } - - /// - /// Returns null rather than throwing KeyNotFoundException - /// - /// - /// - public string this[string key] - { - get - { - string value; - Store.TryGetValue(key, out value); - return value; - } - } - - /// - /// - /// - /// - public IEnumerator> GetEnumerator() - { - return Store.GetEnumerator(); - } - - /// - /// - /// - /// - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs similarity index 97% rename from src/Microsoft.AspNet.PipelineCore/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 0f84ea704f..40445bb31d 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.PipelineCore.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.PipelineCore.Collections { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs similarity index 96% rename from src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs index 78703285cf..1a11469597 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs @@ -3,20 +3,19 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Abstractions.Collections { /// /// A wrapper for the response Set-Cookie header /// - public class ResponseCookieCollection + public class ResponseCookiesCollection : IResponseCookiesCollection { /// /// Create a new wrapper /// /// - public ResponseCookieCollection(IHeaderDictionary headers) + public ResponseCookiesCollection(IHeaderDictionary headers) { if (headers == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index df33085763..b6071c4d41 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -1,7 +1,9 @@ using System; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore @@ -24,7 +26,7 @@ namespace Microsoft.AspNet.PipelineCore get { var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, "Cookies") ?? ""; + string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? ""; if (_cookiesCollection == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs new file mode 100644 index 0000000000..ee176b7af9 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Collections; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultCanHasResponseCookies : ICanHasResponseCookies + { + private readonly IFeatureCollection _features; + private FeatureReference _request = FeatureReference.Default; + private IResponseCookiesCollection _cookiesCollection; + + public DefaultCanHasResponseCookies(IFeatureCollection features) + { + _features = features; + } + + public IResponseCookiesCollection Cookies + { + get + { + var headers = _request.Fetch(_features).Headers; + if (_cookiesCollection == null) + { + _cookiesCollection = new ResponseCookiesCollection(new HeaderDictionary(headers)); + } + + return _cookiesCollection; + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index c1ec42c5d0..4351f7a18d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -16,6 +16,7 @@ namespace Microsoft.AspNet.PipelineCore private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; private FeatureReference _response = FeatureReference.Default; + private FeatureReference _canHasCookies = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -28,6 +29,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _response.Fetch(_features); } } + private ICanHasResponseCookies CanHasResponseCookies + { + get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasResponseCookies(_features)); } + } + public override HttpContext HttpContext { get { return _context; } } public override int StatusCode @@ -79,6 +85,10 @@ namespace Microsoft.AspNet.PipelineCore } } + public override IResponseCookiesCollection Cookies + { + get { return CanHasResponseCookies.Cookies; } + } public override Task WriteAsync(string data) { var bytes = Encoding.UTF8.GetBytes(data); diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs new file mode 100644 index 0000000000..23c73d4d2a --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Collections; + +namespace Microsoft.AspNet.PipelineCore +{ + public interface ICanHasResponseCookies + { + IResponseCookiesCollection Cookies { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 114ae660e3..cc92a10786 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -18,6 +18,7 @@ namespace Microsoft.AspNet.Abstractions.Infrastructure internal const string ETag = "ETag"; internal const string Location = "Location"; internal const string ContentLength = "Content-Length"; + internal const string Cookie = "Cookie"; internal const string SetCookie = "Set-Cookie"; internal const string Expires = "Expires"; } From cbd84015822d0440bc1a2c3bd4097d54f64dc904 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:22:47 -0700 Subject: [PATCH 046/846] Fill in OnSendingHeaders, Redirect, IsSecure. --- src/Microsoft.AspNet.Abstractions/HttpResponse.cs | 8 +++++++- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 15 ++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 8df6277482..add21b64b8 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions @@ -16,6 +17,11 @@ namespace Microsoft.AspNet.Abstractions public abstract string ContentType { get; set; } public abstract IResponseCookiesCollection Cookies { get; } + + public abstract void OnSendingHeaders(Action callback, object state); + + public abstract void Redirect(string location); + public abstract Task WriteAsync(string data); } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 188cf06102..b091197a70 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -112,7 +112,7 @@ namespace Microsoft.AspNet.PipelineCore public override bool IsSecure { - get { throw new NotImplementedException(); } + get { return string.Equals("https", Scheme, StringComparison.OrdinalIgnoreCase); } } public override HostString Host diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 4351f7a18d..7f1fc3229a 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,4 +1,5 @@ -using System.Globalization; +using System; +using System.Globalization; using System.IO; using System.Text; using System.Threading.Tasks; @@ -89,6 +90,18 @@ namespace Microsoft.AspNet.PipelineCore { get { return CanHasResponseCookies.Cookies; } } + + public override void OnSendingHeaders(Action callback, object state) + { + HttpResponseInformation.OnSendingHeaders(callback, state); + } + + public override void Redirect(string location) + { + HttpResponseInformation.StatusCode = 302; + Headers.Set(Constants.Headers.Location, location); + } + public override Task WriteAsync(string data) { var bytes = Encoding.UTF8.GetBytes(data); From fc8832f69fd53c220a12e4d6ef675ec12fe8cb33 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:23:25 -0700 Subject: [PATCH 047/846] Add Claims dependency. --- .../Security/IAuthenticationResult.cs | 6 ------ .../Security/IAuthenticationSignIn.cs | 4 ---- src/Microsoft.AspNet.HttpFeature/project.json | 1 + 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs index a4716b880f..b047bae8bd 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs @@ -1,7 +1,5 @@ using System.Collections.Generic; -#if NET45 using System.Security.Claims; -#endif using Microsoft.AspNet.HttpFeature.Security; // ReSharper disable once CheckNamespace @@ -9,11 +7,7 @@ namespace Microsoft.AspNet.Interfaces.Security { public interface IAuthenticationResult { -#if NET45 ClaimsIdentity Identity { get; } -#else - -#endif IDictionary Properties { get; } IAuthenticationDescription Description { get; } } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs index a86f94e132..6033b173c5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs @@ -1,15 +1,11 @@ using System.Collections.Generic; -#if NET45 using System.Security.Claims; -#endif namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationSignIn { -#if NET45 ClaimsPrincipal User { get; } -#endif IDictionary Properties { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 4660c1d1cd..fe3cbc04bc 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -7,6 +7,7 @@ "System.IO": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.10.0", + "System.Security.Claims": "0.1-alpha-*", "System.Security.Principal": "4.0.0.0", "System.Threading.Tasks": "4.0.0.0" } From bc43ccbc30b8265cf8b0efec9e7cf7892ef41622 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:51:15 -0700 Subject: [PATCH 048/846] Change QueryString to include the leading '?'. --- .../QueryString.cs | 37 +++++++++++-------- .../Infrastructure/ParsingHelpers.cs | 4 ++ 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index 9d96419788..0bca5c7262 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -15,27 +15,31 @@ namespace Microsoft.AspNet.Abstractions private readonly string _value; /// - /// Initalize the query string with a given value. This value must be in escaped and delimited format without + /// Initialize the query string with a given value. This value must be in escaped and delimited format with /// a leading '?' character. /// /// The query string to be assigned to the Value property. public QueryString(string value) { + if (!string.IsNullOrEmpty(value) && value[0] != '?') + { + throw new ArgumentException("The leading '?' must be included for a non-empty query."); + } _value = value; } /// - /// Initialize a query string with a single given parameter name and value. The value is + /// Initialize a query string with a single given parameter name and value. /// - /// The unencoded parameter name - /// The unencoded parameter value + /// The un-encoded parameter name + /// The un-encoded parameter value public QueryString(string name, string value) { - _value = Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); + _value = "?" + Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); } /// - /// The unescaped query string without the leading '?' character + /// The escaped query string with the leading '?' character /// public string Value { @@ -47,12 +51,12 @@ namespace Microsoft.AspNet.Abstractions /// public bool HasValue { - get { return !String.IsNullOrWhiteSpace(_value); } + get { return !String.IsNullOrEmpty(_value); } } /// /// Provides the query string escaped in a way which is correct for combining into the URI representation. - /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentally + /// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially /// dangerous are escaped. /// /// The query string value @@ -63,7 +67,7 @@ namespace Microsoft.AspNet.Abstractions /// /// Provides the query string escaped in a way which is correct for combining into the URI representation. - /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentially + /// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially /// dangerous are escaped. /// /// The query string value @@ -71,7 +75,7 @@ namespace Microsoft.AspNet.Abstractions public string ToUriComponent() { // Escape things properly so System.Uri doesn't mis-interpret the data. - return HasValue ? "?" + _value.Replace("#", "%23") : String.Empty; + return HasValue ? _value.Replace("#", "%23") : String.Empty; } /// @@ -87,11 +91,7 @@ namespace Microsoft.AspNet.Abstractions { return new QueryString(string.Empty); } - if (uriComponent[0] != '?') - { - throw new ArgumentException(""/*Resources.Exception_QueryStringMustStartWithDelimiter*/, "uriComponent"); - } - return new QueryString(uriComponent.Substring(1)); + return new QueryString(uriComponent); } /// @@ -105,7 +105,12 @@ namespace Microsoft.AspNet.Abstractions { throw new ArgumentNullException("uri"); } - return new QueryString(uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped)); + string queryValue = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped); + if (!string.IsNullOrEmpty(queryValue)) + { + queryValue = "?" + queryValue; + } + return new QueryString(queryValue); } public bool Equals(QueryString other) diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 7ab6b1c817..5f3f4f5bdb 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -803,6 +803,10 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure internal static IDictionary GetQuery(string queryString) { + if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + { + queryString = queryString.Substring(1); + } var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); return accumulator.ToDictionary( From b9899fc72af32839c359b191dce7b6037fb7d8d0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:55:24 -0700 Subject: [PATCH 049/846] Fix response cookies namespace. --- .../Collections/ResponseCookiesCollection.cs | 3 ++- .../DefaultCanHasResponseCookies.cs | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs index 1a11469597..7d7189ff7f 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs @@ -2,9 +2,10 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Infrastructure; -namespace Microsoft.AspNet.Abstractions.Collections +namespace Microsoft.AspNet.PipelineCore.Collections { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index ee176b7af9..c908b7fa11 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -1,5 +1,4 @@ using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Collections; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; From 732ae3d030feb425844c746b68fa651ea29ddce7 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 12:01:57 -0700 Subject: [PATCH 050/846] Code review cleanup. --- src/Microsoft.AspNet.Abstractions/QueryString.cs | 6 +++--- .../DefaultCanHasRequestCookies.cs | 2 +- .../DefaultCanHasResponseCookies.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index 0bca5c7262..5109294bb6 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Abstractions { if (!string.IsNullOrEmpty(value) && value[0] != '?') { - throw new ArgumentException("The leading '?' must be included for a non-empty query."); + throw new ArgumentException("The leading '?' must be included for a non-empty query.", "value"); } _value = value; } @@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Abstractions /// public bool HasValue { - get { return !String.IsNullOrEmpty(_value); } + get { return !string.IsNullOrEmpty(_value); } } /// @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Abstractions public string ToUriComponent() { // Escape things properly so System.Uri doesn't mis-interpret the data. - return HasValue ? _value.Replace("#", "%23") : String.Empty; + return HasValue ? _value.Replace("#", "%23") : string.Empty; } /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index b6071c4d41..5aff939af5 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasRequestCookies : ICanHasRequestCookies { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; private static readonly string[] ZeroHeaders = new string[0]; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index c908b7fa11..c0b51b27cb 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasResponseCookies : ICanHasResponseCookies { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private IResponseCookiesCollection _cookiesCollection; public DefaultCanHasResponseCookies(IFeatureCollection features) @@ -21,9 +21,9 @@ namespace Microsoft.AspNet.PipelineCore { get { - var headers = _request.Fetch(_features).Headers; if (_cookiesCollection == null) { + var headers = _request.Fetch(_features).Headers; _cookiesCollection = new ResponseCookiesCollection(new HeaderDictionary(headers)); } From f2835e71857adfa4d1def52ad4688b0ec89fa0f4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 19 Mar 2014 09:09:44 -0700 Subject: [PATCH 051/846] Rename IResponseCookiesCollection to IResponseCookies. --- src/Microsoft.AspNet.Abstractions/HttpResponse.cs | 2 +- .../{IResponseCookiesCollection.cs => IResponseCookies.cs} | 2 +- .../{ResponseCookiesCollection.cs => ResponseCookies.cs} | 4 ++-- .../DefaultCanHasResponseCookies.cs | 6 +++--- src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs | 2 +- src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) rename src/Microsoft.AspNet.Abstractions/{IResponseCookiesCollection.cs => IResponseCookies.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/Collections/{ResponseCookiesCollection.cs => ResponseCookies.cs} (97%) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index add21b64b8..6f6662e737 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Abstractions public abstract long? ContentLength { get; set; } public abstract string ContentType { get; set; } - public abstract IResponseCookiesCollection Cookies { get; } + public abstract IResponseCookies Cookies { get; } public abstract void OnSendingHeaders(Action callback, object state); diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs rename to src/Microsoft.AspNet.Abstractions/IResponseCookies.cs index 8e38bb92dd..4358ad69ce 100644 --- a/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs +++ b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs @@ -4,7 +4,7 @@ namespace Microsoft.AspNet.Abstractions /// /// A wrapper for the response Set-Cookie header /// - public interface IResponseCookiesCollection + public interface IResponseCookies { /// /// Add a new cookie and value diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs similarity index 97% rename from src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 7d7189ff7f..9963a7373f 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -10,13 +10,13 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// /// A wrapper for the response Set-Cookie header /// - public class ResponseCookiesCollection : IResponseCookiesCollection + public class ResponseCookies : IResponseCookies { /// /// Create a new wrapper /// /// - public ResponseCookiesCollection(IHeaderDictionary headers) + public ResponseCookies(IHeaderDictionary headers) { if (headers == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index c0b51b27cb..b695832694 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -10,21 +10,21 @@ namespace Microsoft.AspNet.PipelineCore { private readonly IFeatureCollection _features; private readonly FeatureReference _request = FeatureReference.Default; - private IResponseCookiesCollection _cookiesCollection; + private IResponseCookies _cookiesCollection; public DefaultCanHasResponseCookies(IFeatureCollection features) { _features = features; } - public IResponseCookiesCollection Cookies + public IResponseCookies Cookies { get { if (_cookiesCollection == null) { var headers = _request.Fetch(_features).Headers; - _cookiesCollection = new ResponseCookiesCollection(new HeaderDictionary(headers)); + _cookiesCollection = new ResponseCookies(new HeaderDictionary(headers)); } return _cookiesCollection; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 7f1fc3229a..f1f57ff4a1 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNet.PipelineCore } } - public override IResponseCookiesCollection Cookies + public override IResponseCookies Cookies { get { return CanHasResponseCookies.Cookies; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs index 23c73d4d2a..87f0ecc87e 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.PipelineCore { public interface ICanHasResponseCookies { - IResponseCookiesCollection Cookies { get; } + IResponseCookies Cookies { get; } } } \ No newline at end of file From 951dcbebb78ffec2f016b75be334d28b6ce7ce03 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 19 Mar 2014 11:35:24 -0700 Subject: [PATCH 052/846] Add IServerInformation to IBuilder. --- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 1 + src/Microsoft.AspNet.Abstractions/IServerInformation.cs | 9 +++++++++ src/Microsoft.AspNet.PipelineCore/Builder.cs | 9 ++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Abstractions/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 5699bed1b4..ce79cc7251 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -5,6 +5,7 @@ namespace Microsoft.AspNet.Abstractions public interface IBuilder { IServiceProvider ServiceProvider { get; set; } + IServerInformation Server { get; set; } IBuilder Use(Func middleware); IBuilder Run(RequestDelegate handler); diff --git a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs new file mode 100644 index 0000000000..47784e3782 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs @@ -0,0 +1,9 @@ + +namespace Microsoft.AspNet.Abstractions +{ + // TODO: [AssemblyNeutral] + public interface IServerInformation + { + string Name { get; } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 48edba1ce2..d88711a05c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -14,7 +14,14 @@ namespace Microsoft.AspNet.PipelineCore ServiceProvider = serviceProvider; } + internal Builder(Builder builder) + { + ServiceProvider = builder.ServiceProvider; + Server = builder.Server; + } + public IServiceProvider ServiceProvider { get; set; } + public IServerInformation Server { get; set; } public IBuilder Use(Func middleware) { @@ -29,7 +36,7 @@ namespace Microsoft.AspNet.PipelineCore public IBuilder New() { - return new Builder(ServiceProvider); + return new Builder(this); } public RequestDelegate Build() From 2c49d89094a46d3e9857ad5505b3c68ebb6472f8 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 20 Mar 2014 11:19:42 -0700 Subject: [PATCH 053/846] Code review cleanup. --- src/Microsoft.AspNet.PipelineCore/Builder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index d88711a05c..9c9da66547 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.PipelineCore ServiceProvider = serviceProvider; } - internal Builder(Builder builder) + private Builder(Builder builder) { ServiceProvider = builder.ServiceProvider; Server = builder.Server; From a5dbcac2b75a4ad8fdc742dd560536bc7e78b556 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 23 Mar 2014 14:25:24 -0700 Subject: [PATCH 054/846] Use new test infrastructure. --- HttpAbstractions.sln | 23 +++++++--------- global.json | 3 +++ .../project.json | 26 +++++++++++------- .../project.json | 14 +++++++--- .../DefaultHttpRequestTests.cs | 1 - .../project.json | 27 ++++++++++++------- 6 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 global.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 52bda0a4c2..be895cf892 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +VisualStudioVersion = 12.0.30313.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{659F2FD7-D44F-4953-A69D-94AF3D41BA21}" EndProject @@ -33,8 +33,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.AppBuilder EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{04077455-D4A2-43AF-ABA2-E68968856E17}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{8C87E051-8A68-439A-A6C3-B16948126606}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests.net45", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.net45.csproj", "{4C82EE1A-9B93-4374-91E0-75476AABF5CD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests.net45", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.net45.csproj", "{00A03235-B248-4079-A7EE-4F77AB3A84E4}" @@ -98,20 +96,19 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} {C2E0CB24-159D-422F-B8D1-ACA7353B5C44} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {8C87E051-8A68-439A-A6C3-B16948126606} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03} = {04077455-D4A2-43AF-ABA2-E68968856E17} + {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {4C82EE1A-9B93-4374-91E0-75476AABF5CD} = {04077455-D4A2-43AF-ABA2-E68968856E17} {00A03235-B248-4079-A7EE-4F77AB3A84E4} = {04077455-D4A2-43AF-ABA2-E68968856E17} EndGlobalSection diff --git a/global.json b/global.json new file mode 100644 index 0000000000..840c36f6ad --- /dev/null +++ b/global.json @@ -0,0 +1,3 @@ +{ + "sources": ["src"] +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json index 3ff0961905..e092fca527 100644 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json +++ b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json @@ -4,19 +4,27 @@ "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "" + "Microsoft.AspNet.FeatureModel": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" }, "configurations": { "net45": { "dependencies": { - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", - "Shouldly": "1.1.1.1", - "xunit": "1.9.2", - "Microsoft.Net.Http": "2.2.13", - "System.Net.Http": "" + "System.Runtime": "", + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.Owin.Hosting": "2.1.0", + "Microsoft.Owin.Testing": "2.1.0", + "Shouldly": "1.1.1.1", + "Microsoft.Net.Http": "2.2.13", + "System.Net.Http": "" } } } diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index e52db7c2c2..f5db7e821f 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -4,13 +4,21 @@ "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "" + "Microsoft.AspNet.FeatureModel": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" }, "configurations": { "net45": { "dependencies": { - "Shouldly": "1.1.1.1", - "xunit": "1.9.2" + "Shouldly": "1.1.1.1", + "System.Runtime": "" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 652edf2927..801f4fb3a2 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -6,7 +6,6 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; using Xunit; -using Xunit.Extensions; namespace Microsoft.AspNet.PipelineCore.Tests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 5d77e10d07..efafaacca3 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -5,20 +5,27 @@ "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.PipelineCore": "" + "Microsoft.AspNet.PipelineCore": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" }, "configurations": { "net45": { "dependencies": { - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", - "Moq": "4.2.1312.1622", - "xunit": "1.9.2", - "xunit.extensions": "1.9.2", - "Microsoft.Net.Http": "2.2.13", - "System.Net.Http": "" + "System.Runtime": "", + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.Owin.Hosting": "2.1.0", + "Microsoft.Owin.Testing": "2.1.0", + "Moq": "4.2.1312.1622", + "Microsoft.Net.Http": "2.2.13", + "System.Net.Http": "" } } } From eaddb295772edff2ebcd21f600bfbf270363eb8d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 28 Mar 2014 06:03:23 -0700 Subject: [PATCH 055/846] Updating CoreCLR package versions --- src/Microsoft.AspNet.Abstractions/project.json | 4 ++-- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 4 ++-- src/Microsoft.AspNet.PipelineCore/project.json | 7 ++++--- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 669ddaed1c..e0db39cefa 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -11,8 +11,8 @@ "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.10.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Runtime.InteropServices": "4.0.20.0", + "System.Threading.Tasks": "4.0.10.0" } } } diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 33f8ba15f7..7d3092564d 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -10,7 +10,7 @@ "System.Reflection": "4.0.10.0", "System.Reflection.Compatibility": "4.0.0.0", "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", "System.Threading": "4.0.0.0" } } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index fe3cbc04bc..35f7cd2425 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -6,10 +6,10 @@ "dependencies": { "System.IO": "4.0.0.0", "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", "System.Security.Claims": "0.1-alpha-*", "System.Security.Principal": "4.0.0.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Threading.Tasks": "4.0.10.0" } } } diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 82b021a735..58a9d9ef86 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,3 +1,4 @@ + { "version": "0.1-alpha-*", "dependencies": { @@ -18,9 +19,9 @@ "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.10.0", - "System.Text.Encoding": "4.0.10.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Runtime.InteropServices": "4.0.20.0", + "System.Text.Encoding": "4.0.20.0", + "System.Threading.Tasks": "4.0.10.0" } } } From 4347ddfd0f7b97675ee0e4e489d69e42c6e29081 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 27 Mar 2014 16:13:29 -0700 Subject: [PATCH 056/846] Security contracts. --- .../HttpContext.cs | 6 + .../Security/AuthenticateResult.cs | 56 +++++ .../Security/AuthenticationDescription.cs | 72 +++++++ .../Security/AuthenticationManager.cs | 37 ++++ .../Security/AuthenticationProperties.cs | 164 +++++++++++++++ .../project.json | 8 +- .../Security/IAuthenticateContext.cs | 14 ++ .../Security/IAuthenticationChallenge.cs | 10 - .../Security/IAuthenticationDescription.cs | 9 - .../Security/IAuthenticationHandler.cs | 19 ++ .../Security/IAuthenticationResult.cs | 14 -- .../Security/IAuthenticationSignOut.cs | 9 - .../Security/IChallengeContext .cs | 12 ++ .../Security/IHttpAuthentication.cs | 15 +- ...henticationSignIn.cs => ISignInContext.cs} | 4 +- .../Security/ISignOutContext .cs | 11 + .../DefaultHttpContext.cs | 21 ++ .../Security/AuthenticateContext.cs | 37 ++++ .../Security/ChallengeContext.cs | 30 +++ .../Security/DefaultAuthenticationManager.cs | 196 ++++++++++++++++++ .../Security/DefaultHttpAuthentication.cs | 24 +++ .../Security/SignInContext.cs | 28 +++ .../Security/SignOutContext.cs | 24 +++ .../project.json | 2 + 24 files changed, 766 insertions(+), 56 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs rename src/Microsoft.AspNet.HttpFeature/Security/{IAuthenticationSignIn.cs => ISignInContext.cs} (64%) create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 9f2eac3614..7856d02d99 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.AspNet.Abstractions.Security; namespace Microsoft.AspNet.Abstractions { @@ -8,6 +10,10 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpRequest Request { get; } public abstract HttpResponse Response { get; } + + public abstract AuthenticationManager Authentication { get; } + + public abstract ClaimsPrincipal User { get; set; } public abstract IDictionary Items { get; } diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs new file mode 100644 index 0000000000..2584f395fa --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Security.Principal; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.Abstractions.Security +{ + /// + /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. + /// + public class AuthenticationResult + { + /// + /// Create an instance of the result object + /// + /// Assigned to Identity. May be null. + /// Assigned to Properties. Contains extra information carried along with the identity. + /// Assigned to Description. Contains information describing the authentication provider. + public AuthenticationResult(IIdentity identity, AuthenticationProperties properties, AuthenticationDescription description) + { + if (properties == null) + { + throw new ArgumentNullException("properties"); + } + if (description == null) + { + throw new ArgumentNullException("description"); + } + if (identity != null) + { + Identity = identity as ClaimsIdentity ?? new ClaimsIdentity(identity); + } + Properties = properties; + Description = description; + } + + /// + /// Contains the claims that were authenticated by the given AuthenticationType. If the authentication + /// type was not successful the Identity property will be null. + /// + public ClaimsIdentity Identity { get; private set; } + + /// + /// Contains extra values that were provided with the original SignIn call. + /// + public AuthenticationProperties Properties { get; private set; } + + /// + /// Contains description properties for the middleware authentication type in general. Does not + /// vary per request. + /// + public AuthenticationDescription Description { get; private set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs new file mode 100644 index 0000000000..de627373a5 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.Abstractions.Security +{ + /// + /// Contains information describing an authentication provider. + /// + public class AuthenticationDescription + { + private const string CaptionPropertyKey = "Caption"; + private const string AuthenticationTypePropertyKey = "AuthenticationType"; + + /// + /// Initializes a new instance of the class + /// + public AuthenticationDescription() + { + Dictionary = new Dictionary(StringComparer.Ordinal); + } + + /// + /// Initializes a new instance of the class + /// + /// + public AuthenticationDescription(IDictionary properties) + { + if (properties == null) + { + throw new ArgumentNullException("properties"); + } + Dictionary = properties; + } + + /// + /// Contains metadata about the authentication provider. + /// + public IDictionary Dictionary { get; private set; } + + /// + /// Gets or sets the name used to reference the authentication middleware instance. + /// + public string AuthenticationType + { + get { return GetString(AuthenticationTypePropertyKey); } + set { Dictionary[AuthenticationTypePropertyKey] = value; } + } + + /// + /// Gets or sets the display name for the authentication provider. + /// + public string Caption + { + get { return GetString(CaptionPropertyKey); } + set { Dictionary[CaptionPropertyKey] = value; } + } + + private string GetString(string name) + { + object value; + if (Dictionary.TryGetValue(name, out value)) + { + return Convert.ToString(value, CultureInfo.InvariantCulture); + } + return null; + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs new file mode 100644 index 0000000000..36ed704cc9 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Security +{ + public abstract class AuthenticationManager + { + public abstract HttpContext HttpContext { get; } + + public abstract IEnumerable GetAuthenticationTypes(); + public abstract IEnumerable GetAuthenticationTypes(Func predicate); + + public abstract AuthenticationResult Authenticate(string authenticationType); // TODO: Is sync a good idea? + public abstract IEnumerable Authenticate(IList authenticationTypes); + + public abstract Task AuthenticateAsync(string authenticationType); + public abstract Task> AuthenticateAsync(IList authenticationTypes); + + public abstract void Challenge(); + public abstract void Challenge(AuthenticationProperties properties); + public abstract void Challenge(string authenticationType); + public abstract void Challenge(string authenticationType, AuthenticationProperties properties); + public abstract void Challenge(IList authenticationTypes); + public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); + + public abstract void SignIn(ClaimsPrincipal user); // TODO: This took multiple identities in Katana. Is that needed? + public abstract void SignIn(ClaimsPrincipal user, AuthenticationProperties properties); // TODO: ClaimsIdentity vs ClaimsPrincipal? + + public abstract void SignOut(); + public abstract void SignOut(string authenticationType); + public abstract void SignOut(IList authenticationTypes); + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs new file mode 100644 index 0000000000..9d03d42c92 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -0,0 +1,164 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.Abstractions.Security +{ + /// + /// Dictionary used to store state values about the authentication session. + /// + public class AuthenticationProperties + { + internal const string IssuedUtcKey = ".issued"; + internal const string ExpiresUtcKey = ".expires"; + internal const string IsPersistentKey = ".persistent"; + internal const string RedirectUriKey = ".redirect"; + internal const string UtcDateTimeFormat = "r"; + + /// + /// Initializes a new instance of the class + /// + public AuthenticationProperties() + : this(null) + { + } + + /// + /// Initializes a new instance of the class + /// + /// + public AuthenticationProperties(IDictionary dictionary) + { + Dictionary = dictionary ?? new Dictionary(StringComparer.Ordinal); + } + + /// + /// State values about the authentication session. + /// + public IDictionary Dictionary { get; private set; } + + /// + /// Gets or sets whether the authentication session is persisted across multiple requests. + /// + public bool IsPersistent + { + get { return Dictionary.ContainsKey(IsPersistentKey); } + set + { + if (Dictionary.ContainsKey(IsPersistentKey)) + { + if (!value) + { + Dictionary.Remove(IsPersistentKey); + } + } + else + { + if (value) + { + Dictionary.Add(IsPersistentKey, string.Empty); + } + } + } + } + + /// + /// Gets or sets the full path or absolute URI to be used as an http redirect response value. + /// + [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] + public string RedirectUri + { + get + { + string value; + return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; + } + set + { + if (value != null) + { + Dictionary[RedirectUriKey] = value; + } + else + { + if (Dictionary.ContainsKey(RedirectUriKey)) + { + Dictionary.Remove(RedirectUriKey); + } + } + } + } + + /// + /// Gets or sets the time at which the authentication ticket was issued. + /// + public DateTimeOffset? IssuedUtc + { + get + { + string value; + if (Dictionary.TryGetValue(IssuedUtcKey, out value)) + { + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + { + return dateTimeOffset; + } + } + return null; + } + set + { + if (value.HasValue) + { + Dictionary[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + } + else + { + if (Dictionary.ContainsKey(IssuedUtcKey)) + { + Dictionary.Remove(IssuedUtcKey); + } + } + } + } + + /// + /// Gets or sets the time at which the authentication ticket expires. + /// + public DateTimeOffset? ExpiresUtc + { + get + { + string value; + if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) + { + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + { + return dateTimeOffset; + } + } + return null; + } + set + { + if (value.HasValue) + { + Dictionary[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + } + else + { + if (Dictionary.ContainsKey(ExpiresUtcKey)) + { + Dictionary.Remove(ExpiresUtcKey); + } + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index e0db39cefa..4b9c817d53 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -1,17 +1,23 @@ { "version": "0.1-alpha-*", - "dependencies": {}, + "dependencies": { + "Microsoft.AspNet.HttpFeature": "" + }, "configurations": { "net45": {}, "k10": { "dependencies": { + "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", "System.IO": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "0.1-alpha-*", + "System.Security.Principal" : "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" } } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs new file mode 100644 index 0000000000..7f617e08a2 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Security.Claims; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface IAuthenticateContext + { + IList AuthenticationTypes { get; } + + void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description); + + void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs deleted file mode 100644 index 4f8324d45e..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.HttpFeature.Security -{ - public interface IAuthenticationChallenge - { - IEnumerable AuthenticationTypes { get; } - IDictionary Properties { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs deleted file mode 100644 index f7cca258f5..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.HttpFeature.Security -{ - public interface IAuthenticationDescription - { - IDictionary Properties { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs new file mode 100644 index 0000000000..66c82fccfc --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public delegate void DescriptionDelegate(IDictionary description, object state); + + public interface IAuthenticationHandler + { + void GetDescriptions(DescriptionDelegate callback, object state); + + void Authenticate(IAuthenticateContext context); // TODO: (maybe?) + Task AuthenticateAsync(IAuthenticateContext context); + + void Challenge(IChallengeContext context); + void SignIn(ISignInContext context); + void SignOut(ISignOutContext context); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs deleted file mode 100644 index b047bae8bd..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Security.Claims; -using Microsoft.AspNet.HttpFeature.Security; - -// ReSharper disable once CheckNamespace -namespace Microsoft.AspNet.Interfaces.Security -{ - public interface IAuthenticationResult - { - ClaimsIdentity Identity { get; } - IDictionary Properties { get; } - IAuthenticationDescription Description { get; } - } -} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs deleted file mode 100644 index bab55a23e1..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.HttpFeature.Security -{ - public interface IAuthenticationSignOut - { - IEnumerable AuthenticationTypes { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs new file mode 100644 index 0000000000..9b80cdd5be --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface IChallengeContext + { + IList AuthenticationTypes {get;} + IDictionary Properties {get;} + + void Ack(string authenticationType, IDictionary description); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index 477df94a12..d1a7c16596 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,19 +1,10 @@ -using System.Collections.Generic; -using System.Security.Principal; -using System.Threading.Tasks; -using Microsoft.AspNet.Interfaces.Security; +using System.Security.Claims; namespace Microsoft.AspNet.HttpFeature.Security { public interface IHttpAuthentication { - IPrincipal User { get; set; } - - IEnumerable Authenticate(string[] authenticationTypes); - Task> AuthenticateAsync(string[] authenticationTypes); - - IAuthenticationChallenge ChallengeDetails { get; set; } - IAuthenticationSignIn SignInDetails { get; set; } - IAuthenticationSignOut SignOutDetails { get; set; } + ClaimsPrincipal User { get; set; } + IAuthenticationHandler Handler { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs similarity index 64% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs rename to src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index 6033b173c5..abcfd2e6bd 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -3,9 +3,11 @@ using System.Security.Claims; namespace Microsoft.AspNet.HttpFeature.Security { - public interface IAuthenticationSignIn + public interface ISignInContext { ClaimsPrincipal User { get; } IDictionary Properties { get; } + + void Ack(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs new file mode 100644 index 0000000000..97df86501c --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface ISignOutContext + { + IList AuthenticationTypes { get; } + + void Ack(string authenticationType, IDictionary description); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index da5e692686..b4632aabb7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,8 +1,12 @@ using System; using System.Collections.Generic; +using System.Security.Claims; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.PipelineCore { @@ -10,9 +14,11 @@ namespace Microsoft.AspNet.PipelineCore { private readonly HttpRequest _request; private readonly HttpResponse _response; + private readonly AuthenticationManager _authentication; private FeatureReference _canHasItems; private FeatureReference _canHasServiceProviders; + private FeatureReference _auth; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -20,9 +26,11 @@ namespace Microsoft.AspNet.PipelineCore _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); + _authentication = new DefaultAuthenticationManager(this, features); _canHasItems = FeatureReference.Default; _canHasServiceProviders = FeatureReference.Default; + _auth = FeatureReference.Default; } ICanHasItems CanHasItems @@ -35,10 +43,23 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasServiceProviders.Fetch(_features) ?? _canHasServiceProviders.Update(_features, new DefaultCanHasServiceProviders()); } } + private IHttpAuthentication HttpAuthentication + { + get { return _auth.Fetch(_features) ?? _auth.Update(_features, new DefaultHttpAuthentication()); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } + public override AuthenticationManager Authentication { get { return _authentication; } } + + public override ClaimsPrincipal User + { + get { return HttpAuthentication.User; } + set { HttpAuthentication.User = value; } + } + public override IDictionary Items { get { return CanHasItems.Items; } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs new file mode 100644 index 0000000000..f9d6359260 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class AuthenticateContext : IAuthenticateContext + { + public AuthenticateContext(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException("authenticationType"); + } + AuthenticationTypes = authenticationTypes; + Results = new List(); + } + + public IList AuthenticationTypes { get; private set; } + + public IList Results { get; private set; } + + public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) + { + Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), new AuthenticationDescription(description))); + } + + public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs new file mode 100644 index 0000000000..7ce8d1c039 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class ChallengeContext : IChallengeContext + { + public ChallengeContext(IList authenticationTypes, IDictionary properties) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + AuthenticationTypes = authenticationTypes; + Properties = properties ?? new Dictionary(StringComparer.Ordinal); + } + + public IList AuthenticationTypes { get; private set; } + + public IDictionary Properties { get; private set; } + + public void Ack(string authenticationType, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs new file mode 100644 index 0000000000..39f47c0acf --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Security.Principal; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class DefaultAuthenticationManager : AuthenticationManager + { + private readonly DefaultHttpContext _context; + private readonly IFeatureCollection _features; + + private readonly FeatureReference _authentication = FeatureReference.Default; + private readonly FeatureReference _response = FeatureReference.Default; + + public DefaultAuthenticationManager(DefaultHttpContext context, IFeatureCollection features) + { + _context = context; + _features = features; + } + + private IHttpAuthentication HttpAuthentication + { + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + } + + public override HttpContext HttpContext { get { return _context; } } + + private IHttpResponseInformation HttpResponseInformation + { + get { return _response.Fetch(_features); } + } + + public override IEnumerable GetAuthenticationTypes() + { + return GetAuthenticationTypes(_ => true); + } + + public override IEnumerable GetAuthenticationTypes(Func predicate) + { + var descriptions = new List(); + var handler = HttpAuthentication.Handler; + if (handler != null) + { + // TODO: static delegate field + handler.GetDescriptions(GetAuthenticationTypesCallback, descriptions); + } + return descriptions; + } + + private static void GetAuthenticationTypesCallback(IDictionary description, object state) + { + var localDescriptions = (List)state; + localDescriptions.Add(new AuthenticationDescription(description)); + } + + public override AuthenticationResult Authenticate(string authenticationType) + { + return Authenticate(new[] { authenticationType }).SingleOrDefault(); + } + + public override IEnumerable Authenticate(IList authenticationTypes) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return new AuthenticationResult[0]; + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + handler.Authenticate(authenticateContext); + // TODO: Verify all types ack'd + + return authenticateContext.Results; + } + + public override async Task AuthenticateAsync(string authenticationType) + { + return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); + } + + public override async Task> AuthenticateAsync(IList authenticationTypes) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return new AuthenticationResult[0]; + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + await handler.AuthenticateAsync(authenticateContext); + // TODO: Verify all types ack'd + + return authenticateContext.Results; + } + + public override void Challenge() + { + Challenge(new string[0]); + } + + public override void Challenge(AuthenticationProperties properties) + { + Challenge(new string[0], properties); + } + + public override void Challenge(string authenticationType) + { + Challenge(new[] { authenticationType }); + } + + public override void Challenge(string authenticationType, AuthenticationProperties properties) + { + Challenge(new[] { authenticationType }, properties); + } + + public override void Challenge(IList authenticationTypes) + { + Challenge(authenticationTypes, null); + } + + public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? If authTypes.Length > 1? + return; + } + + var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); + handler.Challenge(challengeContext); + // TODO: Verify all types ack'd + } + + public override void SignIn(ClaimsPrincipal user) + { + SignIn(user, null); + } + + public override void SignIn(ClaimsPrincipal user, AuthenticationProperties properties) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return; + } + + var signInContext = new SignInContext(user, properties == null ? null : properties.Dictionary); + handler.SignIn(signInContext); + // TODO: Verify all types ack'd + } + + public override void SignOut() + { + SignOut(new string[0]); + } + + public override void SignOut(string authenticationType) + { + SignOut(new[] { authenticationType }); + } + + public override void SignOut(IList authenticationTypes) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return; + } + + var signOutContext = new SignOutContext(authenticationTypes); + handler.SignOut(signOutContext); + // TODO: Verify all types ack'd + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs new file mode 100644 index 0000000000..519b1a6c5e --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs @@ -0,0 +1,24 @@ +using System.Security.Claims; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class DefaultHttpAuthentication : IHttpAuthentication + { + public DefaultHttpAuthentication() + { + } + + public ClaimsPrincipal User + { + get; + set; + } + + public IAuthenticationHandler Handler + { + get; + set; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs new file mode 100644 index 0000000000..2f48119b88 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class SignInContext : ISignInContext + { + public SignInContext(ClaimsPrincipal user, IDictionary dictionary) + { + if (user == null) + { + throw new ArgumentNullException("user"); + } + User = user; + Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + } + + public ClaimsPrincipal User { get; private set; } + + public IDictionary Properties { get; private set; } + + public void Ack(string authenticationType, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs new file mode 100644 index 0000000000..b99950d3bc --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class SignOutContext : ISignOutContext + { + public SignOutContext(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException("authenticationTypes"); + } + AuthenticationTypes = authenticationTypes; + } + + public IList AuthenticationTypes { get; private set; } + + public void Ack(string authenticationType, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 58a9d9ef86..e8e90fdd08 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -20,6 +20,8 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "0.1-alpha-*", + "System.Security.Principal" : "4.0.0.0", "System.Text.Encoding": "4.0.20.0", "System.Threading.Tasks": "4.0.10.0" } From 097138e81380d1b603f7602a4f8aed709fe54926 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 31 Mar 2014 11:09:38 -0700 Subject: [PATCH 057/846] Auth: Validate acks. --- .../Security/AuthenticateContext.cs | 8 +- .../Security/ChallengeContext.cs | 4 + .../Security/DefaultAuthenticationManager.cs | 84 ++++++++++++++----- .../Security/SignInContext.cs | 4 + .../Security/SignOutContext.cs | 4 + 5 files changed, 82 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index f9d6359260..15f9be71b3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -19,19 +19,25 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Results = new List(); + Acked = new List(); } public IList AuthenticationTypes { get; private set; } public IList Results { get; private set; } + public IList Acked { get; private set; } + public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) { - Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), new AuthenticationDescription(description))); + var descrip = new AuthenticationDescription(description); + Acked.Add(descrip.AuthenticationType); + Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); } public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) { + Acked.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 7ce8d1c039..991ecb52a0 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -17,14 +17,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); + Acked = new List(); } public IList AuthenticationTypes { get; private set; } public IDictionary Properties { get; private set; } + + public IList Acked { get; private set; } public void Ack(string authenticationType, IDictionary description) { + Acked.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs index 39f47c0acf..4030e67d21 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs @@ -17,6 +17,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class DefaultAuthenticationManager : AuthenticationManager { + private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; + private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; @@ -52,8 +54,7 @@ namespace Microsoft.AspNet.PipelineCore.Security var handler = HttpAuthentication.Handler; if (handler != null) { - // TODO: static delegate field - handler.GetDescriptions(GetAuthenticationTypesCallback, descriptions); + handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); } return descriptions; } @@ -71,17 +72,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override IEnumerable Authenticate(IList authenticationTypes) { - HttpResponseInformation.StatusCode = 401; + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return new AuthenticationResult[0]; + throw new InvalidOperationException("No authentication handlers present."); } var authenticateContext = new AuthenticateContext(authenticationTypes); handler.Authenticate(authenticateContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } return authenticateContext.Results; } @@ -93,17 +102,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override async Task> AuthenticateAsync(IList authenticationTypes) { - HttpResponseInformation.StatusCode = 401; + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return new AuthenticationResult[0]; + throw new InvalidOperationException("No authentication handlers present."); } var authenticateContext = new AuthenticateContext(authenticationTypes); await handler.AuthenticateAsync(authenticateContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } return authenticateContext.Results; } @@ -135,17 +152,26 @@ namespace Microsoft.AspNet.PipelineCore.Security public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } HttpResponseInformation.StatusCode = 401; var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? If authTypes.Length > 1? - return; + throw new InvalidOperationException("No authentication handlers present."); } var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); handler.Challenge(challengeContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } } public override void SignIn(ClaimsPrincipal user) @@ -155,17 +181,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override void SignIn(ClaimsPrincipal user, AuthenticationProperties properties) { - HttpResponseInformation.StatusCode = 401; + if (user == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return; + throw new InvalidOperationException("No authentication handlers present."); } var signInContext = new SignInContext(user, properties == null ? null : properties.Dictionary); handler.SignIn(signInContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = user.Identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } } public override void SignOut() @@ -180,17 +214,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override void SignOut(IList authenticationTypes) { - HttpResponseInformation.StatusCode = 401; + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return; + throw new InvalidOperationException("No authentication handlers present."); } var signOutContext = new SignOutContext(authenticationTypes); handler.SignOut(signOutContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 2f48119b88..24c16de568 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -15,14 +15,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } User = user; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + Acked = new List(); } public ClaimsPrincipal User { get; private set; } public IDictionary Properties { get; private set; } + public IList Acked { get; private set; } + public void Ack(string authenticationType, IDictionary description) { + Acked.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index b99950d3bc..d81ded334d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -13,12 +13,16 @@ namespace Microsoft.AspNet.PipelineCore.Security throw new ArgumentNullException("authenticationTypes"); } AuthenticationTypes = authenticationTypes; + Acked = new List(); } public IList AuthenticationTypes { get; private set; } + public IList Acked { get; private set; } + public void Ack(string authenticationType, IDictionary description) { + Acked.Add(authenticationType); } } } From 60d892b5290be5c9ddffce2302b5eaeb9969c86e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 31 Mar 2014 11:28:27 -0700 Subject: [PATCH 058/846] Revert new project dependnecy. --- .../Security/AuthenticateResult.cs | 1 - .../Security/AuthenticationDescription.cs | 1 - .../Security/AuthenticationProperties.cs | 1 - src/Microsoft.AspNet.Abstractions/project.json | 4 +--- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs index 2584f395fa..2fdc1ae241 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs @@ -3,7 +3,6 @@ using System; using System.Security.Claims; using System.Security.Principal; -using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Abstractions.Security { diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs index de627373a5..3c6f9a7994 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Abstractions.Security { diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs index 9d03d42c92..d38722cec1 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; -using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Abstractions.Security { diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 4b9c817d53..40f2abd874 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -1,8 +1,6 @@ { "version": "0.1-alpha-*", - "dependencies": { - "Microsoft.AspNet.HttpFeature": "" - }, + "dependencies": {}, "configurations": { "net45": {}, "k10": { From 63dc9ad7196260225a6a15790174912cb2463efd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 31 Mar 2014 12:00:55 -0700 Subject: [PATCH 059/846] Auth: Remove GetAuthType predicate overload. --- .../Security/AuthenticationManager.cs | 1 - .../Security/DefaultAuthenticationManager.cs | 5 ----- 2 files changed, 6 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs index 36ed704cc9..c72e625ba8 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs @@ -12,7 +12,6 @@ namespace Microsoft.AspNet.Abstractions.Security public abstract HttpContext HttpContext { get; } public abstract IEnumerable GetAuthenticationTypes(); - public abstract IEnumerable GetAuthenticationTypes(Func predicate); public abstract AuthenticationResult Authenticate(string authenticationType); // TODO: Is sync a good idea? public abstract IEnumerable Authenticate(IList authenticationTypes); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs index 4030e67d21..025e7d243b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs @@ -44,11 +44,6 @@ namespace Microsoft.AspNet.PipelineCore.Security } public override IEnumerable GetAuthenticationTypes() - { - return GetAuthenticationTypes(_ => true); - } - - public override IEnumerable GetAuthenticationTypes(Func predicate) { var descriptions = new List(); var handler = HttpAuthentication.Handler; From c638c74bc93676974f09876d4b1581c51e75c47e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Apr 2014 16:03:54 -0700 Subject: [PATCH 060/846] Move AuthManager methods to Context and Response. --- .../HttpContext.cs | 20 +- .../HttpResponse.cs | 59 +++++ .../Security/AuthenticationManager.cs | 36 --- .../Security/AuthenticationProperties.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../DefaultHttpContext.cs | 83 ++++++- .../DefaultHttpResponse.cs | 83 ++++++- .../Security/DefaultAuthenticationManager.cs | 233 ------------------ .../Security/SignInContext.cs | 10 +- 9 files changed, 242 insertions(+), 286 deletions(-) delete mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs delete mode 100644 src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 7856d02d99..a933d34660 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions.Security; namespace Microsoft.AspNet.Abstractions @@ -11,8 +13,6 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpResponse Response { get; } - public abstract AuthenticationManager Authentication { get; } - public abstract ClaimsPrincipal User { get; set; } public abstract IDictionary Items { get; } @@ -36,5 +36,21 @@ namespace Microsoft.AspNet.Abstractions { SetFeature(typeof(T), instance); } + + public abstract IEnumerable GetAuthenticationTypes(); + + public virtual AuthenticationResult Authenticate(string authenticationType) + { + return Authenticate(new[] { authenticationType }).SingleOrDefault(); + } + + public abstract IEnumerable Authenticate(IList authenticationTypes); + + public virtual async Task AuthenticateAsync(string authenticationType) + { + return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); + } + + public abstract Task> AuthenticateAsync(IList authenticationTypes); } } diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 6f6662e737..bed5e5c8f2 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; using System.IO; +using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions.Security; namespace Microsoft.AspNet.Abstractions { @@ -23,5 +26,61 @@ namespace Microsoft.AspNet.Abstractions public abstract void Redirect(string location); public abstract Task WriteAsync(string data); + + public virtual void Challenge() + { + Challenge(new string[0]); + } + + public virtual void Challenge(AuthenticationProperties properties) + { + Challenge(new string[0], properties); + } + + public virtual void Challenge(string authenticationType) + { + Challenge(new[] { authenticationType }); + } + + public virtual void Challenge(string authenticationType, AuthenticationProperties properties) + { + Challenge(new[] { authenticationType }, properties); + } + + public virtual void Challenge(IList authenticationTypes) + { + Challenge(authenticationTypes, properties: null); + } + + public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); + + public virtual void SignIn(ClaimsIdentity identity) + { + SignIn(identity, properties: null); + } + + public virtual void SignIn(ClaimsIdentity identity, AuthenticationProperties properties) + { + SignIn(new[] { identity }, properties); + } + + public virtual void SignIn(IList identities) + { + SignIn(identities, properties: null); + } + + public abstract void SignIn(IList identities, AuthenticationProperties properties); + + public virtual void SignOut() + { + SignOut(new string[0]); + } + + public virtual void SignOut(string authenticationType) + { + SignOut(new[] { authenticationType }); + } + + public abstract void SignOut(IList authenticationTypes); } } diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs deleted file mode 100644 index c72e625ba8..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Security.Claims; -using System.Threading.Tasks; - -namespace Microsoft.AspNet.Abstractions.Security -{ - public abstract class AuthenticationManager - { - public abstract HttpContext HttpContext { get; } - - public abstract IEnumerable GetAuthenticationTypes(); - - public abstract AuthenticationResult Authenticate(string authenticationType); // TODO: Is sync a good idea? - public abstract IEnumerable Authenticate(IList authenticationTypes); - - public abstract Task AuthenticateAsync(string authenticationType); - public abstract Task> AuthenticateAsync(IList authenticationTypes); - - public abstract void Challenge(); - public abstract void Challenge(AuthenticationProperties properties); - public abstract void Challenge(string authenticationType); - public abstract void Challenge(string authenticationType, AuthenticationProperties properties); - public abstract void Challenge(IList authenticationTypes); - public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); - - public abstract void SignIn(ClaimsPrincipal user); // TODO: This took multiple identities in Katana. Is that needed? - public abstract void SignIn(ClaimsPrincipal user, AuthenticationProperties properties); // TODO: ClaimsIdentity vs ClaimsPrincipal? - - public abstract void SignOut(); - public abstract void SignOut(string authenticationType); - public abstract void SignOut(IList authenticationTypes); - } -} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs index d38722cec1..7eb707420b 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Abstractions.Security /// Initializes a new instance of the class /// public AuthenticationProperties() - : this(null) + : this(dictionary: null) { } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index abcfd2e6bd..a19fdaa86b 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -5,7 +5,7 @@ namespace Microsoft.AspNet.HttpFeature.Security { public interface ISignInContext { - ClaimsPrincipal User { get; } + IList Identities { get; } IDictionary Properties { get; } void Ack(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index b4632aabb7..ba2d7688ff 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; @@ -14,11 +16,10 @@ namespace Microsoft.AspNet.PipelineCore { private readonly HttpRequest _request; private readonly HttpResponse _response; - private readonly AuthenticationManager _authentication; private FeatureReference _canHasItems; private FeatureReference _canHasServiceProviders; - private FeatureReference _auth; + private FeatureReference _authentication; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -26,11 +27,10 @@ namespace Microsoft.AspNet.PipelineCore _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _authentication = new DefaultAuthenticationManager(this, features); _canHasItems = FeatureReference.Default; _canHasServiceProviders = FeatureReference.Default; - _auth = FeatureReference.Default; + _authentication = FeatureReference.Default; } ICanHasItems CanHasItems @@ -45,15 +45,13 @@ namespace Microsoft.AspNet.PipelineCore private IHttpAuthentication HttpAuthentication { - get { return _auth.Fetch(_features) ?? _auth.Update(_features, new DefaultHttpAuthentication()); } + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } } public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } - public override AuthenticationManager Authentication { get { return _authentication; } } - public override ClaimsPrincipal User { get { return HttpAuthentication.User; } @@ -95,5 +93,76 @@ namespace Microsoft.AspNet.PipelineCore { _features[type] = instance; } + + // TODO: Use context, not a delegate, like all the other APIs + private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; + + public override IEnumerable GetAuthenticationTypes() + { + // TODO: Use context, not a delegate, like all the other APIs + var descriptions = new List(); + var handler = HttpAuthentication.Handler; + if (handler != null) + { + handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); + } + return descriptions; + } + + private static void GetAuthenticationTypesCallback(IDictionary description, object state) + { + var localDescriptions = (List)state; + localDescriptions.Add(new AuthenticationDescription(description)); + } + + public override IEnumerable Authenticate(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + handler.Authenticate(authenticateContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + + return authenticateContext.Results; + } + + public override async Task> AuthenticateAsync(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + await handler.AuthenticateAsync(authenticateContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + + return authenticateContext.Results; + } } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index f1f57ff4a1..ec77460f58 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,14 +1,19 @@ using System; -using System.Globalization; +using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Security.Claims; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.PipelineCore { @@ -18,6 +23,7 @@ namespace Microsoft.AspNet.PipelineCore private readonly IFeatureCollection _features; private FeatureReference _response = FeatureReference.Default; private FeatureReference _canHasCookies = FeatureReference.Default; + private FeatureReference _authentication = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -35,6 +41,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasResponseCookies(_features)); } } + private IHttpAuthentication HttpAuthentication + { + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + } + public override HttpContext HttpContext { get { return _context; } } public override int StatusCode @@ -107,5 +118,75 @@ namespace Microsoft.AspNet.PipelineCore var bytes = Encoding.UTF8.GetBytes(data); return Body.WriteAsync(bytes, 0, bytes.Length); } + + public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); + handler.Challenge(challengeContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + } + + public override void SignIn(IList identities, AuthenticationProperties properties) + { + if (identities == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); + handler.SignIn(signInContext); + + // Verify all types ack'd + IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + } + + public override void SignOut(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var signOutContext = new SignOutContext(authenticationTypes); + handler.SignOut(signOutContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs deleted file mode 100644 index 025e7d243b..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Security.Principal; -using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Security; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Infrastructure; - -namespace Microsoft.AspNet.PipelineCore.Security -{ - public class DefaultAuthenticationManager : AuthenticationManager - { - private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; - - private readonly DefaultHttpContext _context; - private readonly IFeatureCollection _features; - - private readonly FeatureReference _authentication = FeatureReference.Default; - private readonly FeatureReference _response = FeatureReference.Default; - - public DefaultAuthenticationManager(DefaultHttpContext context, IFeatureCollection features) - { - _context = context; - _features = features; - } - - private IHttpAuthentication HttpAuthentication - { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } - } - - public override HttpContext HttpContext { get { return _context; } } - - private IHttpResponseInformation HttpResponseInformation - { - get { return _response.Fetch(_features); } - } - - public override IEnumerable GetAuthenticationTypes() - { - var descriptions = new List(); - var handler = HttpAuthentication.Handler; - if (handler != null) - { - handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); - } - return descriptions; - } - - private static void GetAuthenticationTypesCallback(IDictionary description, object state) - { - var localDescriptions = (List)state; - localDescriptions.Add(new AuthenticationDescription(description)); - } - - public override AuthenticationResult Authenticate(string authenticationType) - { - return Authenticate(new[] { authenticationType }).SingleOrDefault(); - } - - public override IEnumerable Authenticate(IList authenticationTypes) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var authenticateContext = new AuthenticateContext(authenticationTypes); - handler.Authenticate(authenticateContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - - return authenticateContext.Results; - } - - public override async Task AuthenticateAsync(string authenticationType) - { - return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); - } - - public override async Task> AuthenticateAsync(IList authenticationTypes) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var authenticateContext = new AuthenticateContext(authenticationTypes); - await handler.AuthenticateAsync(authenticateContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - - return authenticateContext.Results; - } - - public override void Challenge() - { - Challenge(new string[0]); - } - - public override void Challenge(AuthenticationProperties properties) - { - Challenge(new string[0], properties); - } - - public override void Challenge(string authenticationType) - { - Challenge(new[] { authenticationType }); - } - - public override void Challenge(string authenticationType, AuthenticationProperties properties) - { - Challenge(new[] { authenticationType }, properties); - } - - public override void Challenge(IList authenticationTypes) - { - Challenge(authenticationTypes, null); - } - - public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - HttpResponseInformation.StatusCode = 401; - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); - handler.Challenge(challengeContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - } - - public override void SignIn(ClaimsPrincipal user) - { - SignIn(user, null); - } - - public override void SignIn(ClaimsPrincipal user, AuthenticationProperties properties) - { - if (user == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var signInContext = new SignInContext(user, properties == null ? null : properties.Dictionary); - handler.SignIn(signInContext); - - // Verify all types ack'd - IEnumerable leftovers = user.Identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - } - - public override void SignOut() - { - SignOut(new string[0]); - } - - public override void SignOut(string authenticationType) - { - SignOut(new[] { authenticationType }); - } - - public override void SignOut(IList authenticationTypes) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var signOutContext = new SignOutContext(authenticationTypes); - handler.SignOut(signOutContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - } - } -} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 24c16de568..d7669d36e4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -7,18 +7,18 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class SignInContext : ISignInContext { - public SignInContext(ClaimsPrincipal user, IDictionary dictionary) + public SignInContext(IList identities, IDictionary dictionary) { - if (user == null) + if (identities == null) { - throw new ArgumentNullException("user"); + throw new ArgumentNullException("identities"); } - User = user; + Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); Acked = new List(); } - public ClaimsPrincipal User { get; private set; } + public IList Identities { get; private set; } public IDictionary Properties { get; private set; } From dfc0c5d323d8a83397cded64ce00a9427846074f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Apr 2014 16:29:47 -0700 Subject: [PATCH 061/846] Change GetAuthType to use a context object instead of a delegate. --- .../Security/IAuthTypeContext.cs | 9 ++++++++ .../Security/IAuthenticationHandler.cs | 6 ++--- .../DefaultHttpContext.cs | 18 +++++---------- .../Security/AuthTypeContext.cs | 22 +++++++++++++++++++ 4 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs new file mode 100644 index 0000000000..634517ad6b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface IAuthTypeContext + { + void Ack(IDictionary description); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 66c82fccfc..8a519b5de9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -3,13 +3,11 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.HttpFeature.Security { - public delegate void DescriptionDelegate(IDictionary description, object state); - public interface IAuthenticationHandler { - void GetDescriptions(DescriptionDelegate callback, object state); + void GetDescriptions(IAuthTypeContext context); - void Authenticate(IAuthenticateContext context); // TODO: (maybe?) + void Authenticate(IAuthenticateContext context); Task AuthenticateAsync(IAuthenticateContext context); void Challenge(IChallengeContext context); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index ba2d7688ff..1edb07771c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -94,25 +94,17 @@ namespace Microsoft.AspNet.PipelineCore _features[type] = instance; } - // TODO: Use context, not a delegate, like all the other APIs - private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; - public override IEnumerable GetAuthenticationTypes() { - // TODO: Use context, not a delegate, like all the other APIs - var descriptions = new List(); var handler = HttpAuthentication.Handler; - if (handler != null) + if (handler == null) { - handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); + return new AuthenticationDescription[0]; } - return descriptions; - } - private static void GetAuthenticationTypesCallback(IDictionary description, object state) - { - var localDescriptions = (List)state; - localDescriptions.Add(new AuthenticationDescription(description)); + var authTypeContext = new AuthTypeContext(); + handler.GetDescriptions(authTypeContext); + return authTypeContext.Results; } public override IEnumerable Authenticate(IList authenticationTypes) diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs new file mode 100644 index 0000000000..ccf8d40ed0 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class AuthTypeContext : IAuthTypeContext + { + public AuthTypeContext() + { + Results = new List(); + } + + public IList Results { get; private set; } + + public void Ack(IDictionary description) + { + Results.Add(new AuthenticationDescription(description)); + } + } +} From ee37c75544d71470ba56add811ebd5c3abe115d1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Apr 2014 17:08:09 -0700 Subject: [PATCH 062/846] Rename Auth Context API Ack to Accept --- .../Security/IAuthTypeContext.cs | 2 +- .../{IChallengeContext .cs => IChallengeContext.cs} | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext .cs | 2 +- .../DefaultHttpContext.cs | 8 ++++---- .../DefaultHttpResponse.cs | 12 ++++++------ .../Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 8 ++++---- .../Security/ChallengeContext.cs | 8 ++++---- .../Security/SignInContext.cs | 8 ++++---- .../Security/SignOutContext.cs | 8 ++++---- 11 files changed, 31 insertions(+), 31 deletions(-) rename src/Microsoft.AspNet.HttpFeature/Security/{IChallengeContext .cs => IChallengeContext.cs} (72%) diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index 634517ad6b..e91797ceca 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -4,6 +4,6 @@ namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthTypeContext { - void Ack(IDictionary description); + void Accept(IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs similarity index 72% rename from src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs rename to src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index 9b80cdd5be..2707c6c63d 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -7,6 +7,6 @@ namespace Microsoft.AspNet.HttpFeature.Security IList AuthenticationTypes {get;} IDictionary Properties {get;} - void Ack(string authenticationType, IDictionary description); + void Accept(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index a19fdaa86b..cb78f661b2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -8,6 +8,6 @@ namespace Microsoft.AspNet.HttpFeature.Security IList Identities { get; } IDictionary Properties { get; } - void Ack(string authenticationType, IDictionary description); + void Accept(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 97df86501c..9a1232ff3a 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -6,6 +6,6 @@ namespace Microsoft.AspNet.HttpFeature.Security { IList AuthenticationTypes { get; } - void Ack(string authenticationType, IDictionary description); + void Accept(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 1edb07771c..0525f0cd6c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -123,10 +123,10 @@ namespace Microsoft.AspNet.PipelineCore handler.Authenticate(authenticateContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; @@ -148,10 +148,10 @@ namespace Microsoft.AspNet.PipelineCore await handler.AuthenticateAsync(authenticateContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index ec77460f58..278f16b591 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -136,10 +136,10 @@ namespace Microsoft.AspNet.PipelineCore handler.Challenge(challengeContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(challengeContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } @@ -159,10 +159,10 @@ namespace Microsoft.AspNet.PipelineCore handler.SignIn(signInContext); // Verify all types ack'd - IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); + IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } @@ -182,10 +182,10 @@ namespace Microsoft.AspNet.PipelineCore handler.SignOut(signOutContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(signOutContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index ccf8d40ed0..f4632607a4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.PipelineCore.Security public IList Results { get; private set; } - public void Ack(IDictionary description) + public void Accept(IDictionary description) { Results.Add(new AuthenticationDescription(description)); } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 15f9be71b3..9fa561372a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -19,25 +19,25 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Results = new List(); - Acked = new List(); + Accepted = new List(); } public IList AuthenticationTypes { get; private set; } public IList Results { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - Acked.Add(descrip.AuthenticationType); + Accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); } public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 991ecb52a0..ed43ee31e2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -17,18 +17,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - Acked = new List(); + Accepted = new List(); } public IList AuthenticationTypes { get; private set; } public IDictionary Properties { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } - public void Ack(string authenticationType, IDictionary description) + public void Accept(string authenticationType, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index d7669d36e4..690388dcc8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -15,18 +15,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); - Acked = new List(); + Accepted = new List(); } public IList Identities { get; private set; } public IDictionary Properties { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } - public void Ack(string authenticationType, IDictionary description) + public void Accept(string authenticationType, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index d81ded334d..2d2814cd02 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -13,16 +13,16 @@ namespace Microsoft.AspNet.PipelineCore.Security throw new ArgumentNullException("authenticationTypes"); } AuthenticationTypes = authenticationTypes; - Acked = new List(); + Accepted = new List(); } public IList AuthenticationTypes { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } - public void Ack(string authenticationType, IDictionary description) + public void Accept(string authenticationType, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } From 9f3433acece40a3186df6a5fabe068f911989f97 Mon Sep 17 00:00:00 2001 From: sornaks Date: Tue, 1 Apr 2014 10:46:23 -0700 Subject: [PATCH 063/846] WebFX 156 - Introducing RedirectPermanent. Merging RedirectPermanent to Redirect. --- src/Microsoft.AspNet.Abstractions/HttpResponse.cs | 7 ++++++- .../DefaultHttpResponse.cs | 12 ++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index bed5e5c8f2..28814c747b 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -23,7 +23,12 @@ namespace Microsoft.AspNet.Abstractions public abstract void OnSendingHeaders(Action callback, object state); - public abstract void Redirect(string location); + public virtual void Redirect(string location) + { + Redirect(location, permanent: false); + } + + public abstract void Redirect(string location, bool permanent); public abstract Task WriteAsync(string data); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 278f16b591..2a24076c19 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -107,9 +107,17 @@ namespace Microsoft.AspNet.PipelineCore HttpResponseInformation.OnSendingHeaders(callback, state); } - public override void Redirect(string location) + public override void Redirect(string location, bool permanent) { - HttpResponseInformation.StatusCode = 302; + if (permanent) + { + HttpResponseInformation.StatusCode = 301; + } + else + { + HttpResponseInformation.StatusCode = 302; + } + Headers.Set(Constants.Headers.Location, location); } From f4904e18031ef9f23c63a84998a29df530f8beea Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 3 Apr 2014 12:53:34 -0700 Subject: [PATCH 064/846] Fixing PathString.Add(PathString) to handle trailing slashes correctly Fixes #31 --- HttpAbstractions.sln | 7 +++ .../PathString.cs | 9 ++++ .../PathStringTests.cs | 51 +++++++++++++++++++ .../project.json | 23 +++++++++ 4 files changed, 90 insertions(+) create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index be895cf892..81c1feee17 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -37,6 +37,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureMod EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests.net45", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.net45.csproj", "{00A03235-B248-4079-A7EE-4F77AB3A84E4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Tests.net45", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.net45.csproj", "{EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -91,6 +93,10 @@ Global {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Debug|Any CPU.Build.0 = Debug|Any CPU {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.ActiveCfg = Release|Any CPU {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.Build.0 = Release|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -111,5 +117,6 @@ Global {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {4C82EE1A-9B93-4374-91E0-75476AABF5CD} = {04077455-D4A2-43AF-ABA2-E68968856E17} {00A03235-B248-4079-A7EE-4F77AB3A84E4} = {04077455-D4A2-43AF-ABA2-E68968856E17} + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0} = {04077455-D4A2-43AF-ABA2-E68968856E17} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs index c497d40bf3..07c6de5446 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -127,6 +127,15 @@ namespace Microsoft.AspNet.Abstractions /// The combined PathString value public PathString Add(PathString other) { + if (HasValue && + other.HasValue && + Value[Value.Length - 1] == '/') + { + // If the path string has a trailing slash and the other string has a leading slash, we need + // to trim one of them. + return new PathString(Value + other.Value.Substring(1)); + } + return new PathString(Value + other.Value); } diff --git a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs new file mode 100644 index 0000000000..02ac73736d --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNet.Testing; +using Xunit; + +namespace Microsoft.AspNet.Abstractions +{ + public class PathStringTests + { + [Fact] + public void CtorThrows_IfPathDoesNotHaveLeadingSlash() + { + // Act and Assert + ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", ""); + } + + [Theory] + [InlineData(null, null)] + [InlineData("", null)] + public void AddPathString_HandlesNullAndEmptyStrings(string appString, string concatString) + { + // Arrange + var appPath = new PathString(appString); + var concatPath = new PathString(concatString); + + // Act + var result = appPath.Add(concatPath); + + // Assert + Assert.False(result.HasValue); + } + + [Theory] + [InlineData("", "/", "/")] + [InlineData("/", null, "/")] + [InlineData("/", "", "/")] + [InlineData("/", "/test", "/test")] + [InlineData("/myapp/", "/test/bar", "/myapp/test/bar")] + [InlineData("/myapp/", "/test/bar/", "/myapp/test/bar/")] + public void AddPathString_HandlesLeadingAndTrailingSlashes(string appString, string concatString, string expected) + { + // Arrange + var appPath = new PathString(appString); + var concatPath = new PathString(concatString); + + // Act + var result = appPath.Add(concatPath); + + // Assert + Assert.Equal(expected, result.Value); + } + } +} diff --git a/test/Microsoft.AspNet.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Abstractions.Tests/project.json new file mode 100644 index 0000000000..110d62bb6d --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/project.json @@ -0,0 +1,23 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Testing": "0.1-alpha-*", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "configurations": { + "net45": { + "dependencies": { + "System.Runtime": "", + "Shouldly": "1.1.1.1" + } + } + } +} \ No newline at end of file From 7e7c940c63a681c508167739257e77de725d7140 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 8 Apr 2014 01:10:29 -0700 Subject: [PATCH 065/846] Updated to use the new tooling --- HttpAbstractions.sln | 200 +++++++++--------- .../Microsoft.AspNet.Abstractions.kproj | 43 ++++ .../Microsoft.AspNet.AppBuilderSupport.kproj | 30 +++ .../Microsoft.AspNet.FeatureModel.kproj | 30 +++ .../Microsoft.AspNet.HttpFeature.kproj | 41 ++++ .../Microsoft.AspNet.PipelineCore.kproj | 56 +++++ .../Microsoft.AspNet.Abstractions.Tests.kproj | 27 +++ .../Microsoft.AspNet.FeatureModel.Tests.kproj | 30 +++ .../packages.config | 5 - .../Microsoft.AspNet.PipelineCore.Tests.kproj | 31 +++ .../packages.config | 6 - 11 files changed, 392 insertions(+), 107 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj create mode 100644 src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj delete mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/packages.config create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj delete mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/packages.config diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 81c1feee17..993a99605c 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,122 +1,130 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30313.0 +VisualStudioVersion = 12.0.30327.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{659F2FD7-D44F-4953-A69D-94AF3D41BA21}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7A5C31E4-97FD-479F-8938-D818436ADFDD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{70095525-BD99-45F9-8A6A-3BD3503FC3EE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{D3242B56-EA73-4F41-86A4-DF6C70271592}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{3A586BF4-08D4-46E3-B74D-5D514A3B84CC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{A195DDE4-CFB0-4A6C-9798-10658236C97B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{ADDAE1B2-094E-4DA8-86DE-13E8708072D8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{4B39A6DA-68BD-4F50-BE76-0399EB82DCBF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.AppBuilderSupport.net45", "src\Microsoft.AspNet.AppBuilderSupport\Microsoft.AspNet.AppBuilderSupport.net45.csproj", "{C2E0CB24-159D-422F-B8D1-ACA7353B5C44}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.AppBuilderSupport.Tests.net45", "test\Microsoft.AspNet.AppBuilderSupport.Tests\Microsoft.AspNet.AppBuilderSupport.Tests.net45.csproj", "{9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{04077455-D4A2-43AF-ABA2-E68968856E17}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests.net45", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.net45.csproj", "{4C82EE1A-9B93-4374-91E0-75476AABF5CD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests.net45", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.net45.csproj", "{00A03235-B248-4079-A7EE-4F77AB3A84E4}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Tests.net45", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.net45.csproj", "{EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport", "src\Microsoft.AspNet.AppBuilderSupport\Microsoft.AspNet.AppBuilderSupport.kproj", "{65C93D2B-CBD1-4E51-9312-10C1965A7241}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.Build.0 = Release|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.Build.0 = Release|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.Build.0 = Release|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.Build.0 = Release|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.Build.0 = Release|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.Build.0 = Release|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.Build.0 = Release|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.Build.0 = Release|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Release|Any CPU.Build.0 = Release|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Release|Any CPU.Build.0 = Release|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Release|Any CPU.Build.0 = Release|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.Build.0 = Release|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.Build.0 = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.Build.0 = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.ActiveCfg = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.Build.0 = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.Build.0 = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.Build.0 = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.ActiveCfg = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.Build.0 = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.Build.0 = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.Build.0 = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.ActiveCfg = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.Build.0 = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.Build.0 = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.Build.0 = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.Build.0 = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.ActiveCfg = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Any CPU.ActiveCfg = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.ActiveCfg = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.Build.0 = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Any CPU.ActiveCfg = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.Build.0 = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.ActiveCfg = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.Build.0 = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.Build.0 = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.ActiveCfg = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.Build.0 = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.Build.0 = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.Build.0 = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.ActiveCfg = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03} = {04077455-D4A2-43AF-ABA2-E68968856E17} - {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {4C82EE1A-9B93-4374-91E0-75476AABF5CD} = {04077455-D4A2-43AF-ABA2-E68968856E17} - {00A03235-B248-4079-A7EE-4F77AB3A84E4} = {04077455-D4A2-43AF-ABA2-E68968856E17} - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0} = {04077455-D4A2-43AF-ABA2-E68968856E17} + {BCF0F967-8753-4438-BD07-AADCA9CE509A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj new file mode 100644 index 0000000000..3d0fa73ca4 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -0,0 +1,43 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd + Library + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj new file mode 100644 index 0000000000..3457dc5557 --- /dev/null +++ b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 65c93d2b-cbd1-4e51-9312-10c1965a7241 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj new file mode 100644 index 0000000000..b665f9574f --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 32a4c918-30ee-41db-8e26-8a3bb88ed231 + Library + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj new file mode 100644 index 0000000000..57f6c9414d --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -0,0 +1,41 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + d9128247-8f97-48b8-a863-f1f21a029fce + Library + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj new file mode 100644 index 0000000000..42286a86d5 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -0,0 +1,56 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + bcf0f967-8753-4438-bd07-aadca9ce509a + Library + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj new file mode 100644 index 0000000000..e8a380615a --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj @@ -0,0 +1,27 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + f16692b8-9f38-4dca-a582-e43172b989c6 + Library + net45 + + + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj new file mode 100644 index 0000000000..eb170543e0 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + c5d2bae1-e182-48a0-aa74-1af14b782bf7 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/packages.config b/test/Microsoft.AspNet.FeatureModel.Tests/packages.config deleted file mode 100644 index 5500407987..0000000000 --- a/test/Microsoft.AspNet.FeatureModel.Tests/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj new file mode 100644 index 0000000000..efb347f4aa --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -0,0 +1,31 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + aa99af26-f7b1-4a6b-a922-5c25539f6391 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/packages.config b/test/Microsoft.AspNet.PipelineCore.Tests/packages.config deleted file mode 100644 index 2190a4eebc..0000000000 --- a/test/Microsoft.AspNet.PipelineCore.Tests/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From a8a47a048958430987af01c04f1c12ac1bab482a Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 8 Apr 2014 09:25:29 -0700 Subject: [PATCH 066/846] Removed all assembly infos. --- .../Microsoft.AspNet.Abstractions.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- .../Microsoft.AspNet.FeatureModel.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- .../Microsoft.AspNet.HttpFeature.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- .../Microsoft.AspNet.PipelineCore.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- 8 files changed, 148 deletions(-) delete mode 100644 src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj index 3d0fa73ca4..12a6a518dc 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -32,7 +32,6 @@ - diff --git a/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs deleted file mode 100644 index 906de25b7f..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("Microsoft.AspNet.Abstractions")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f67dab3e-89ef-4d28-a57e-230af874bbe8")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index b665f9574f..e0f6a454d3 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -24,7 +24,6 @@ - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs deleted file mode 100644 index 264c8db996..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("Microsoft.AspNet.FeatureModel")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("cf678d83-e6f7-4433-9bf2-c0efa68e399b")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 57f6c9414d..5f8f775ed5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -28,7 +28,6 @@ - diff --git a/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs deleted file mode 100644 index 80a1326d0b..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("Microsoft.AspNet.Interfaces")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Interfaces")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("fbcea83c-9fdd-445d-a2d4-93e9062754f3")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 42286a86d5..51c55b0566 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -44,7 +44,6 @@ - diff --git a/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs deleted file mode 100644 index 05cb3146e3..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("Microsoft.AspNet.Abstractions.Implementation")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions.Implementation")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("5886f89f-de4d-4e44-81c2-7a32b2c89cfd")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] From 165effebde94870d581eb0803bcd326b3ae596a0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 11 Apr 2014 10:52:45 -0700 Subject: [PATCH 067/846] Abstractions: Pull in k10 dependency for IdnMapping. --- .../HostString.cs | 194 ------------------ .../project.json | 1 + 2 files changed, 1 insertion(+), 194 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Abstractions/HostString.cs index f127eddaad..0847c7421e 100644 --- a/src/Microsoft.AspNet.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Abstractions/HostString.cs @@ -193,199 +193,5 @@ namespace Microsoft.AspNet.Abstractions { return !left.Equals(right); } - -#if K10 - internal class IdnMapping - { - // - // Summary: - // Encodes a string of domain name labels that consist of Unicode characters - // to a string of displayable Unicode characters in the US-ASCII character range. - // The string is formatted according to the IDNA standard. - // - // Parameters: - // unicode: - // The string to convert, which consists of one or more domain name labels delimited - // with label separators. - // - // Returns: - // The equivalent of the string specified by the unicode parameter, consisting - // of displayable Unicode characters in the US-ASCII character range (U+0020 - // to U+007E) and formatted according to the IDNA standard. - // - // Exceptions: - // System.ArgumentNullException: - // unicode is null. - // - // System.ArgumentException: - // unicode is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetAscii(string unicode) { throw new NotImplementedException(); } - - // - // Summary: - // Encodes a substring of domain name labels that include Unicode characters - // outside the US-ASCII character range. The substring is converted to a string - // of displayable Unicode characters in the US-ASCII character range and is - // formatted according to the IDNA standard. - // - // Parameters: - // unicode: - // The string to convert, which consists of one or more domain name labels delimited - // with label separators. - // - // index: - // A zero-based offset into unicode that specifies the start of the substring - // to convert. The conversion operation continues to the end of the unicode - // string. - // - // Returns: - // The equivalent of the substring specified by the unicode and index parameters, - // consisting of displayable Unicode characters in the US-ASCII character range - // (U+0020 to U+007E) and formatted according to the IDNA standard. - // - // Exceptions: - // System.ArgumentNullException: - // unicode is null. - // - // System.ArgumentOutOfRangeException: - // index is less than zero.-or-index is greater than the length of unicode. - // - // System.ArgumentException: - // unicode is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetAscii(string unicode, int index) { throw new NotImplementedException(); } - - // - // Summary: - // Encodes the specified number of characters in a substring of domain name - // labels that include Unicode characters outside the US-ASCII character range. - // The substring is converted to a string of displayable Unicode characters - // in the US-ASCII character range and is formatted according to the IDNA standard. - // - // Parameters: - // unicode: - // The string to convert, which consists of one or more domain name labels delimited - // with label separators. - // - // index: - // A zero-based offset into unicode that specifies the start of the substring. - // - // count: - // The number of characters to convert in the substring that starts at the position - // specified by index in the unicode string. - // - // Returns: - // The equivalent of the substring specified by the unicode, index, and count - // parameters, consisting of displayable Unicode characters in the US-ASCII - // character range (U+0020 to U+007E) and formatted according to the IDNA standard. - // - // Exceptions: - // System.ArgumentNullException: - // unicode is null. - // - // System.ArgumentOutOfRangeException: - // index or count is less than zero.-or-index is greater than the length of - // unicode.-or-index is greater than the length of unicode minus count. - // - // System.ArgumentException: - // unicode is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetAscii(string unicode, int index, int count) { throw new NotImplementedException(); } - - // - // Summary: - // Decodes a string of one or more domain name labels, encoded according to - // the IDNA standard, to a string of Unicode characters. - // - // Parameters: - // ascii: - // The string to decode, which consists of one or more labels in the US-ASCII - // character range (U+0020 to U+007E) encoded according to the IDNA standard. - // - // Returns: - // The Unicode equivalent of the IDNA substring specified by the ascii parameter. - // - // Exceptions: - // System.ArgumentNullException: - // ascii is null. - // - // System.ArgumentException: - // ascii is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetUnicode(string ascii) { throw new NotImplementedException(); } - - // - // Summary: - // Decodes a substring of one or more domain name labels, encoded according - // to the IDNA standard, to a string of Unicode characters. - // - // Parameters: - // ascii: - // The string to decode, which consists of one or more labels in the US-ASCII - // character range (U+0020 to U+007E) encoded according to the IDNA standard. - // - // index: - // A zero-based offset into ascii that specifies the start of the substring - // to decode. The decoding operation continues to the end of the ascii string. - // - // Returns: - // The Unicode equivalent of the IDNA substring specified by the ascii and index - // parameters. - // - // Exceptions: - // System.ArgumentNullException: - // ascii is null. - // - // System.ArgumentOutOfRangeException: - // index is less than zero.-or-index is greater than the length of ascii. - // - // System.ArgumentException: - // ascii is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetUnicode(string ascii, int index) { throw new NotImplementedException(); } - - // - // Summary: - // Decodes a substring of a specified length that contains one or more domain - // name labels, encoded according to the IDNA standard, to a string of Unicode - // characters. - // - // Parameters: - // ascii: - // The string to decode, which consists of one or more labels in the US-ASCII - // character range (U+0020 to U+007E) encoded according to the IDNA standard. - // - // index: - // A zero-based offset into ascii that specifies the start of the substring. - // - // count: - // The number of characters to convert in the substring that starts at the position - // specified by index in the ascii string. - // - // Returns: - // The Unicode equivalent of the IDNA substring specified by the ascii, index, - // and count parameters. - // - // Exceptions: - // System.ArgumentNullException: - // ascii is null. - // - // System.ArgumentOutOfRangeException: - // index or count is less than zero.-or-index is greater than the length of - // ascii.-or-index is greater than the length of ascii minus count. - // - // System.ArgumentException: - // ascii is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetUnicode(string ascii, int index, int count) { throw new NotImplementedException(); } - } -#endif } } diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 40f2abd874..f626e3463a 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -9,6 +9,7 @@ "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", + "System.Globalization.Extensions": "4.0.0.0", "System.IO": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", From a20f65627fa3e4d6ab22e5380a6b80d70fced971 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 12 Apr 2014 12:39:30 -0700 Subject: [PATCH 068/846] Removing unused Owin packages that are causing build failure --- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index efafaacca3..896deb8c1b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -19,10 +19,6 @@ "net45": { "dependencies": { "System.Runtime": "", - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", "Moq": "4.2.1312.1622", "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" From c31e0f295fd318b3c66546ffcdc053c822038cb4 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 12 Apr 2014 12:39:30 -0700 Subject: [PATCH 069/846] Removing unused Owin packages that are causing build failure * Adding Microsoft.AspNet.AppBuildSupport.Tests to sln --- HttpAbstractions.sln | 17 +++++++++-- .../Microsoft.AspNet.AppBuilderSupport.kproj | 3 ++ ...osoft.AspNet.AppBuilderSupport.Tests.kproj | 30 +++++++++++++++++++ .../project.json | 1 - .../project.json | 1 - 5 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 993a99605c..287f3868d2 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30327.0 +VisualStudioVersion = 12.0.30410.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -23,6 +23,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport.Tests", "test\Microsoft.AspNet.AppBuilderSupport.Tests\Microsoft.AspNet.AppBuilderSupport.Tests.kproj", "{83D44696-C790-4356-9187-79F89010ED4F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -113,6 +115,16 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Any CPU.ActiveCfg = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.ActiveCfg = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.Build.0 = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|Any CPU.ActiveCfg = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.Build.0 = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.ActiveCfg = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -123,8 +135,9 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {83D44696-C790-4356-9187-79F89010ED4F} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj index 3457dc5557..ad85762a01 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj +++ b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj @@ -26,5 +26,8 @@ + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj b/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj new file mode 100644 index 0000000000..3c166c3380 --- /dev/null +++ b/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 83d44696-c790-4356-9187-79f89010ed4f + Library + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json index e092fca527..a0a22125e6 100644 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json +++ b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json @@ -23,7 +23,6 @@ "Microsoft.Owin.Hosting": "2.1.0", "Microsoft.Owin.Testing": "2.1.0", "Shouldly": "1.1.1.1", - "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 896deb8c1b..8ac9b6c2fa 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -20,7 +20,6 @@ "dependencies": { "System.Runtime": "", "Moq": "4.2.1312.1622", - "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" } } From f12117fe1fdaaa22a2f9f9806b5a9b3955d1c49e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 15 Apr 2014 11:28:42 -0700 Subject: [PATCH 070/846] Remove temp IAppBuilder support. --- HttpAbstractions.sln | 15 +- .../AppBuilderSupportExtensions.cs | 40 -- .../ICanHasOwinEnvironment.cs | 9 - .../Microsoft.AspNet.AppBuilderSupport.kproj | 33 -- .../OwinConstants.cs | 175 --------- .../OwinHttpEnvironment.cs | 364 ------------------ .../project.json | 16 - .../AppBuilderSupportTests.cs | 43 --- ...osoft.AspNet.AppBuilderSupport.Tests.kproj | 30 -- .../OwinHttpEnvironmentTests.cs | 50 --- .../project.json | 30 -- 11 files changed, 1 insertion(+), 804 deletions(-) delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/project.json delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 287f3868d2..4629030603 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30410.0 +VisualStudioVersion = 12.0.30401.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -17,8 +17,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport", "src\Microsoft.AspNet.AppBuilderSupport\Microsoft.AspNet.AppBuilderSupport.kproj", "{65C93D2B-CBD1-4E51-9312-10C1965A7241}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" @@ -85,16 +83,6 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Any CPU.ActiveCfg = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.ActiveCfg = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.Build.0 = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Any CPU.ActiveCfg = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.Build.0 = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.ActiveCfg = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.Build.0 = Release|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 @@ -135,7 +123,6 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {83D44696-C790-4356-9187-79F89010ED4F} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} diff --git a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs deleted file mode 100644 index 215afb8bcf..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.PipelineCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.PipelineCore.Owin; - -namespace Owin -{ - using AppFunc = Func, Task>; - - public static class AppBuilderSupportExtensions - { - public static IAppBuilder UseBuilder(this IAppBuilder appBuilder, Action configuration) - { - IBuilder builder = new Builder(null); - configuration(builder); - Func middleware1 = next1 => { - Func middleware2 = next2 => { - return httpContext => { - return next1(httpContext.GetFeature().Environment); - }; - }; - builder.Use(middleware2); - var app = builder.Build(); - return env => - { - return app.Invoke( - new DefaultHttpContext( - new FeatureCollection( - new OwinHttpEnvironment(env)))); - }; - }; - return appBuilder.Use(middleware1); - } - } -} diff --git a/src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs deleted file mode 100644 index 37632116bd..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.PipelineCore.Owin -{ - public interface ICanHasOwinEnvironment - { - IDictionary Environment { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj deleted file mode 100644 index ad85762a01..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - 12.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 65c93d2b-cbd1-4e51-9312-10c1965a7241 - Library - net45 - - - - - - - 2.0 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs deleted file mode 100644 index 45aabf2913..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs +++ /dev/null @@ -1,175 +0,0 @@ -namespace Microsoft.AspNet.PipelineCore.Owin -{ - internal static class OwinConstants - { - #region OWIN v1.0.0 - 3.2.1. Request Data - - // http://owin.org/spec/owin-1.0.0.html - - public const string RequestScheme = "owin.RequestScheme"; - public const string RequestMethod = "owin.RequestMethod"; - public const string RequestPathBase = "owin.RequestPathBase"; - public const string RequestPath = "owin.RequestPath"; - public const string RequestQueryString = "owin.RequestQueryString"; - public const string RequestProtocol = "owin.RequestProtocol"; - public const string RequestHeaders = "owin.RequestHeaders"; - public const string RequestBody = "owin.RequestBody"; - - #endregion - - #region OWIN v1.0.0 - 3.2.2. Response Data - - // http://owin.org/spec/owin-1.0.0.html - - public const string ResponseStatusCode = "owin.ResponseStatusCode"; - public const string ResponseReasonPhrase = "owin.ResponseReasonPhrase"; - public const string ResponseProtocol = "owin.ResponseProtocol"; - public const string ResponseHeaders = "owin.ResponseHeaders"; - public const string ResponseBody = "owin.ResponseBody"; - - #endregion - - #region OWIN v1.0.0 - 3.2.3. Other Data - - // http://owin.org/spec/owin-1.0.0.html - - public const string CallCancelled = "owin.CallCancelled"; - - public const string OwinVersion = "owin.Version"; - - #endregion - - #region OWIN Keys for IAppBuilder.Properties - - internal static class Builder - { - public const string AddSignatureConversion = "builder.AddSignatureConversion"; - public const string DefaultApp = "builder.DefaultApp"; - } - - #endregion - - #region OWIN Key Guidelines and Common Keys - 6. Common keys - - // http://owin.org/spec/CommonKeys.html - - internal static class CommonKeys - { - public const string ClientCertificate = "ssl.ClientCertificate"; - public const string LoadClientCertAsync = "ssl.LoadClientCertAsync"; - public const string RemoteIpAddress = "server.RemoteIpAddress"; - public const string RemotePort = "server.RemotePort"; - public const string LocalIpAddress = "server.LocalIpAddress"; - public const string LocalPort = "server.LocalPort"; - public const string IsLocal = "server.IsLocal"; - public const string TraceOutput = "host.TraceOutput"; - public const string Addresses = "host.Addresses"; - public const string AppName = "host.AppName"; - public const string Capabilities = "server.Capabilities"; - public const string OnSendingHeaders = "server.OnSendingHeaders"; - public const string OnAppDisposing = "host.OnAppDisposing"; - public const string Scheme = "scheme"; - public const string Host = "host"; - public const string Port = "port"; - public const string Path = "path"; - } - - #endregion - - #region SendFiles v0.3.0 - - // http://owin.org/extensions/owin-SendFile-Extension-v0.3.0.htm - - internal static class SendFiles - { - // 3.1. Startup - - public const string Version = "sendfile.Version"; - public const string Support = "sendfile.Support"; - public const string Concurrency = "sendfile.Concurrency"; - - // 3.2. Per Request - - public const string SendAsync = "sendfile.SendAsync"; - } - - #endregion - - #region Opaque v0.3.0 - - // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm - - internal static class OpaqueConstants - { - // 3.1. Startup - - public const string Version = "opaque.Version"; - - // 3.2. Per Request - - public const string Upgrade = "opaque.Upgrade"; - - // 5. Consumption - - public const string Stream = "opaque.Stream"; - // public const string Version = "opaque.Version"; // redundant, declared above - public const string CallCancelled = "opaque.CallCancelled"; - } - - #endregion - - #region WebSocket v0.4.0 - - // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm - - internal static class WebSocket - { - // 3.1. Startup - - public const string Version = "websocket.Version"; - - // 3.2. Per Request - - public const string Accept = "websocket.Accept"; - - // 4. Accept - - public const string SubProtocol = "websocket.SubProtocol"; - - // 5. Consumption - - public const string SendAsync = "websocket.SendAsync"; - public const string ReceiveAsync = "websocket.ReceiveAsync"; - public const string CloseAsync = "websocket.CloseAsync"; - // public const string Version = "websocket.Version"; // redundant, declared above - public const string CallCancelled = "websocket.CallCancelled"; - public const string ClientCloseStatus = "websocket.ClientCloseStatus"; - public const string ClientCloseDescription = "websocket.ClientCloseDescription"; - } - - #endregion - - #region Security v0.1.0 - - // http://owin.org/extensions/owin-Security-Extension-v0.1.0.htm - - internal static class Security - { - // 3.2. Per Request - - public const string User = "server.User"; - - public const string Authenticate = "security.Authenticate"; - - // 3.3. Response - - public const string SignIn = "security.SignIn"; - - public const string SignOut = "security.SignOut"; - - public const string Challenge = "security.Challenge"; - } - - #endregion - } -} diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs deleted file mode 100644 index 02be7db4a5..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs +++ /dev/null @@ -1,364 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Reflection; -#if NET45 -using System.Security.Cryptography.X509Certificates; -#endif -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.FeatureModel; - -namespace Microsoft.AspNet.PipelineCore.Owin -{ - using SendFileFunc = Func; - - public class OwinHttpEnvironment : - IFeatureCollection, - IHttpRequestInformation, - IHttpResponseInformation, - IHttpConnection, - IHttpSendFile, - IHttpTransportLayerSecurity, - ICanHasOwinEnvironment - { - public IDictionary Environment { get; set; } - - public OwinHttpEnvironment(IDictionary environment) - { - Environment = environment; - } - - T Prop(string key) - { - object value; - if (Environment.TryGetValue(key, out value) && value is T) - { - return (T)value; - } - return default(T); - } - - void Prop(string key, object value) - { - Environment[key] = value; - } - - string IHttpRequestInformation.Protocol - { - get { return Prop("owin.RequestProtocol"); } - set { Prop("owin.RequestProtocol", value); } - } - - string IHttpRequestInformation.Scheme - { - get { return Prop("owin.RequestScheme"); } - set { Prop("owin.RequestScheme", value); } - } - - string IHttpRequestInformation.Method - { - get { return Prop("owin.RequestMethod"); } - set { Prop("owin.RequestMethod", value); } - } - - string IHttpRequestInformation.PathBase - { - get { return Prop("owin.RequestPathBase"); } - set { Prop("owin.RequestPathBase", value); } - } - - string IHttpRequestInformation.Path - { - get { return Prop("owin.RequestPath"); } - set { Prop("owin.RequestPath", value); } - } - - string IHttpRequestInformation.QueryString - { - get { return Prop("owin.RequestQueryString"); } - set { Prop("owin.RequestQueryString", value); } - } - - IDictionary IHttpRequestInformation.Headers - { - get { return Prop>("owin.RequestHeaders"); } - set { Prop("owin.RequestHeaders", value); } - } - - Stream IHttpRequestInformation.Body - { - get { return Prop("owin.RequestBody"); } - set { Prop("owin.RequestBody", value); } - } - - int IHttpResponseInformation.StatusCode - { - get { return Prop("owin.ResponseStatusCode"); } - set { Prop("owin.ResponseStatusCode", value); } - } - - string IHttpResponseInformation.ReasonPhrase - { - get { return Prop("owin.ResponseReasonPhrase"); } - set { Prop("owin.ResponseReasonPhrase", value); } - } - - IDictionary IHttpResponseInformation.Headers - { - get { return Prop>("owin.ResponseHeaders"); } - set { Prop("owin.ResponseHeaders", value); } - } - - Stream IHttpResponseInformation.Body - { - get { return Prop("owin.ResponseBody"); } - set { Prop("owin.ResponseBody", value); } - } - - void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) - { - // TODO: - } -#if NET45 - IPAddress IHttpConnection.RemoteIpAddress - { - get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } - set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } - } - - IPAddress IHttpConnection.LocalIpAddress - { - get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } - set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } - } -#endif - int IHttpConnection.RemotePort - { - get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } - set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } - } - - int IHttpConnection.LocalPort - { - get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } - set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } - } - - bool IHttpConnection.IsLocal - { - get { return Prop(OwinConstants.CommonKeys.IsLocal); } - set { Prop(OwinConstants.CommonKeys.LocalPort, value); } - } - - private bool SupportsSendFile - { - get - { - object obj; - return Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj) && obj != null; - } - } - - Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) - { - object obj; - if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) - { - var func = (SendFileFunc)obj; - return func(path, offset, length, cancellation); - } - throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); - } - - private bool SupportsClientCerts - { - get - { - object obj; - if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) - && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) - || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) - && obj != null) - { - return true; - } - return false; - } - } -#if NET45 - X509Certificate IHttpTransportLayerSecurity.ClientCertificate - { - get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } - set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } - } -#endif - Task IHttpTransportLayerSecurity.LoadAsync() - { - throw new NotImplementedException(); - } - - public int Revision - { - get { return 0; } // Not modifiable - } - - public void Add(Type key, object value) - { - throw new NotSupportedException(); - } - - public bool ContainsKey(Type key) - { - // Does this type implement the requested interface? - if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) - { - // Check for conditional features - if (key == typeof(IHttpSendFile)) - { - return SupportsSendFile; - } - else if (key == typeof(IHttpTransportLayerSecurity)) - { - return SupportsClientCerts; - } - - // The rest of the features are always supported. - return true; - } - return false; - } - - public ICollection Keys - { - get - { - var keys = new List() - { - typeof(IHttpRequestInformation), - typeof(IHttpResponseInformation), - typeof(IHttpConnection), - typeof(ICanHasOwinEnvironment), - }; - if (SupportsSendFile) - { - keys.Add(typeof(IHttpSendFile)); - } - if (SupportsClientCerts) - { - keys.Add(typeof(IHttpTransportLayerSecurity)); - } - return keys; - } - } - - public bool Remove(Type key) - { - throw new NotSupportedException(); - } - - public bool TryGetValue(Type key, out object value) - { - if (ContainsKey(key)) - { - value = this; - return true; - } - value = null; - return false; - } - - public ICollection Values - { - get { throw new NotSupportedException(); } - } - - public object this[Type key] - { - get - { - object value; - if (TryGetValue(key, out value)) - { - return value; - } - throw new KeyNotFoundException(key.FullName); - } - set - { - throw new NotSupportedException(); - } - } - - public void Add(KeyValuePair item) - { - throw new NotSupportedException(); - } - - public void Clear() - { - throw new NotSupportedException(); - } - - public bool Contains(KeyValuePair item) - { - object result; - return TryGetValue(item.Key, out result) && result.Equals(item.Value); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - if (array == null) - { - throw new ArgumentNullException("array"); - } - if (arrayIndex < 0 || arrayIndex > array.Length) - { - throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); - } - var keys = Keys; - if (keys.Count > array.Length - arrayIndex) - { - throw new ArgumentException(); - } - - foreach (var key in keys) - { - array[arrayIndex++] = new KeyValuePair(key, this[key]); - } - } - - public int Count - { - get { return Keys.Count; } - } - - public bool IsReadOnly - { - get { return true; } - } - - public bool Remove(KeyValuePair item) - { - throw new NotSupportedException(); - } - - public IEnumerator> GetEnumerator() - { - return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Dispose() - { - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/project.json b/src/Microsoft.AspNet.AppBuilderSupport/project.json deleted file mode 100644 index c597c1a29a..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/project.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "version": "0.1-alpha-*", - "dependencies": { - "Microsoft.AspNet.Abstractions": "0.1-alpha-*", - "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", - "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", - "Microsoft.AspNet.HttpFeature" : "" - }, - "configurations": { - "net45": { - "dependencies": { - "Owin": "1.0" - } - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs b/test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs deleted file mode 100644 index 4b2c70872d..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Net; -using System.Runtime.Remoting.Contexts; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Owin; -using Xunit; - -namespace Microsoft.AspNet.AppBuilderSupport.Tests -{ - public class AppBuilderSupportTests - { - [Fact] - public async Task BuildCanGoInsideAppBuilder() - { - var server = Microsoft.Owin.Testing.TestServer.Create( - app => app.UseBuilder(HelloWorld)); - - var result = await server.CreateRequest("/hello").GetAsync(); - var body = await result.Content.ReadAsStringAsync(); - - Assert.Equal(result.StatusCode, HttpStatusCode.Accepted); - Assert.Equal(body, "Hello world!"); - } - - private void HelloWorld(IBuilder builder) - { - builder.Use(next => async context => - { - await next(context); - }); - builder.Run(async context => - { - context.Response.StatusCode = 202; - await context.Response.WriteAsync("Hello world!"); - }); - } - } -} diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj b/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj deleted file mode 100644 index 3c166c3380..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - 12.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 83d44696-c790-4356-9187-79f89010ed4f - Library - - - - - - - 2.0 - - - - - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs b/test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs deleted file mode 100644 index 5b639a6a0c..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Owin; -using Xunit; - -namespace Microsoft.AspNet.AppBuilderSupport.Tests -{ - public class OwinHttpEnvironmentTests - { - private T Get(IFeatureCollection features) - { - object value; - return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); - } - - [Fact] - public void OwinHttpEnvironmentCanBeCreated() - { - var env = new Dictionary - { - {"owin.RequestMethod", "POST"} - }; - var features = new FeatureObject( new OwinHttpEnvironment(env)); - - Assert.Equal(Get(features).Method, "POST"); - } - - [Fact] - public void ImplementedInterfacesAreEnumerated() - { - var env = new Dictionary - { - {"owin.RequestMethod", "POST"} - }; - var features = new FeatureObject(new OwinHttpEnvironment(env)); - - var entries = features.ToArray(); - var keys = features.Keys.ToArray(); - var values = features.Values.ToArray(); - - Assert.Contains(typeof(IHttpRequestInformation), keys); - Assert.Contains(typeof(IHttpResponseInformation), keys); - } - } -} diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json deleted file mode 100644 index a0a22125e6..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": "0.1-alpha-*", - "dependencies": { - "Microsoft.AspNet.AppBuilderSupport": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "", - "Xunit.KRunner": "0.1-alpha-*", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" - }, - "commands": { - "test": "Xunit.KRunner" - }, - "configurations": { - "net45": { - "dependencies": { - "System.Runtime": "", - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", - "Shouldly": "1.1.1.1", - "System.Net.Http": "" - } - } - } -} \ No newline at end of file From 3b69e024a23c214803d44983a10f3ac207f0924e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 21:54:55 -0700 Subject: [PATCH 071/846] Updated solution --- HttpAbstractions.sln | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 4629030603..83fd260c8c 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30401.0 +VisualStudioVersion = 12.0.30327.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -21,8 +21,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport.Tests", "test\Microsoft.AspNet.AppBuilderSupport.Tests\Microsoft.AspNet.AppBuilderSupport.Tests.kproj", "{83D44696-C790-4356-9187-79F89010ED4F}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -103,16 +101,6 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Any CPU.ActiveCfg = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.ActiveCfg = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.Build.0 = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|Any CPU.ActiveCfg = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.Build.0 = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.ActiveCfg = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -125,6 +113,5 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {83D44696-C790-4356-9187-79F89010ED4F} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal From 03b089abe02add9860174f239e0d40adfa8d7c69 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 22:08:47 -0700 Subject: [PATCH 072/846] Renamed Builder.ServiceProvider to Builder.ApplicationServices - Made things consistent with HttpContext.ApplicationServices --- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 2 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index ce79cc7251..d187c75ec2 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -4,7 +4,7 @@ namespace Microsoft.AspNet.Abstractions { public interface IBuilder { - IServiceProvider ServiceProvider { get; set; } + IServiceProvider ApplicationServices { get; set; } IServerInformation Server { get; set; } IBuilder Use(Func middleware); diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 9c9da66547..e5e4696118 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -11,16 +11,16 @@ namespace Microsoft.AspNet.PipelineCore public Builder(IServiceProvider serviceProvider) { - ServiceProvider = serviceProvider; + ApplicationServices = serviceProvider; } private Builder(Builder builder) { - ServiceProvider = builder.ServiceProvider; + ApplicationServices = builder.ApplicationServices; Server = builder.Server; } - public IServiceProvider ServiceProvider { get; set; } + public IServiceProvider ApplicationServices { get; set; } public IServerInformation Server { get; set; } public IBuilder Use(Func middleware) From 28fbacc7f4a64fdfe765fce6b43f06b7262cfd9c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Apr 2014 09:17:37 -0700 Subject: [PATCH 073/846] Remove #if NET45s for IPAddress, X509Certificate. --- src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs | 4 ---- .../IHttpTransportLayerSecurity.cs | 5 +---- src/Microsoft.AspNet.HttpFeature/project.json | 2 ++ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index 9af5df12e8..3598c015f1 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,15 +1,11 @@ -#if NET45 using System.Net; -#endif namespace Microsoft.AspNet.HttpFeature { public interface IHttpConnection { -#if NET45 IPAddress RemoteIpAddress { get; set; } IPAddress LocalIpAddress { get; set; } -#endif int RemotePort { get; set; } int LocalPort { get; set; } bool IsLocal { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index 7a27df9b6c..fd08f2b076 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,15 +1,12 @@ -#if NET45 + using System.Security.Cryptography.X509Certificates; -#endif using System.Threading.Tasks; namespace Microsoft.AspNet.HttpFeature { public interface IHttpTransportLayerSecurity { -#if NET45 X509Certificate ClientCertificate { get; set; } -#endif Task LoadAsync(); } } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 35f7cd2425..7060443fce 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -5,9 +5,11 @@ "k10": { "dependencies": { "System.IO": "4.0.0.0", + "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", "System.Security.Claims": "0.1-alpha-*", + "System.Security.Cryptography.X509Certificates": "4.0.0.0", "System.Security.Principal": "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" } From e3afbae213be0f211c0562ec2e2fd1e7eed1d91e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 19 Apr 2014 02:27:17 -0700 Subject: [PATCH 074/846] Remove the converter logic --- .../FeatureCollection.cs | 6 +- .../FeatureObject.cs | 15 - .../Implementation/Converter.cs | 388 ------------------ .../Microsoft.AspNet.FeatureModel.kproj | 1 - 4 files changed, 1 insertion(+), 409 deletions(-) delete mode 100644 src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index d3aaff33cf..00d2a38e4f 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Threading; -using Microsoft.AspNet.FeatureModel.Implementation; namespace Microsoft.AspNet.FeatureModel { @@ -49,11 +48,8 @@ namespace Microsoft.AspNet.FeatureModel { return feature; } -#if NET45 - return Converter.Convert(type, actualType, feature); -#else + return null; -#endif } } diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 42d2bf8e79..d937d09dc5 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Linq; -using Microsoft.AspNet.FeatureModel.Implementation; namespace Microsoft.AspNet.FeatureModel { @@ -32,20 +31,6 @@ namespace Microsoft.AspNet.FeatureModel return _instance; } -#if NET45 - foreach (var interfaceType in _instance.GetType().GetInterfaces()) - { - if (interfaceType.FullName == type.FullName) - { - return Converter.Convert(interfaceType, type, _instance); - } - } -#else - if (_instance != null && type == _instance.GetType()) - { - return _instance; - } -#endif return null; } diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs deleted file mode 100644 index 0102dea38a..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ /dev/null @@ -1,388 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -#if NET45 -using System.Reflection.Emit; -#endif -using System.Runtime.CompilerServices; - -namespace Microsoft.AspNet.FeatureModel.Implementation -{ - #if NET45 - public abstract class NonGenericProxyBase - { - public readonly Type WrappedType; - protected NonGenericProxyBase(Type wrappedType) - { - this.WrappedType = wrappedType; - } - public abstract object UnderlyingInstanceAsObject - { - get; - } - } - - public class BaseType : NonGenericProxyBase where T : class - { - protected T instance; - public BaseType(T inst) - : base(typeof(T)) - { - if (inst == null) throw new InvalidOperationException("should never construct proxy over null"); - this.instance = inst; - } - public T UnderlyingInstance - { - get - { - return instance; - } - } - public override object UnderlyingInstanceAsObject - { - get - { - return instance; - } - } - } - - public class Converter - { - public static object Convert(Type outputType, Type inputType, object input) - { - if (inputType == outputType) return input; - - if (!inputType.IsInterface || !outputType.IsInterface) throw new InvalidOperationException("Both types must be interfaces"); - - if (inputType.GetInterfaces().Contains(outputType)) return input; - - if (input == null) return null; - - Type t = EnsureConverter(outputType, inputType); - - return Activator.CreateInstance(t, input); - } - - public static TOut Convert(Type inputType, object input) - where TOut : class - { - return (TOut)Convert(typeof (TOut), inputType, input); - } - - public static TOut Convert(TIn input) - where TIn : class - where TOut : class - { - return Convert(typeof(TIn), input); - } - - public static TOut Convert(object input) - where TOut : class - { - if (input == null) return null; - var interfaceName = typeof(TOut).FullName; - foreach (var inputType in input.GetType().GetInterfaces()) - { - if (inputType.FullName == interfaceName) - { - return Convert(inputType, input); - } - } - return null; - } - - - public static Type EnsureConverter(Type tout, Type tin) - { - CacheResult result; - if (!ConverterTypeCache.TryGetValue(new Tuple(tin, tout), out result)) - { - EnsureCastPossible(tout, tin); - return EnsureConverter(tout, tin); - } - else - { - if (result is ErrorResult) - { - throw new InvalidCastException((result as ErrorResult).error); - } - else if (result is CurrentlyVerifyingResult) - { - throw new InvalidOperationException("Type cannot be obtained in verification phase"); - } - else if (result is TypeBuilderResult) - { - return (result as TypeBuilderResult).result; - } - else if (result is VerificationSucceededResult) - { - return CreateWrapperType(tout, tin, result as VerificationSucceededResult); - } - else - { - throw new InvalidOperationException("Invalid cache state"); - } - } - } - - class CacheResult - { - } - - class TypeBuilderResult : CacheResult - { - internal TypeBuilderResult(Type result) - { - this.result = result; - } - internal readonly Type result; - } - class ErrorResult : CacheResult - { - internal ErrorResult(string error) - { - this.error = error; - } - internal readonly string error; - } - class CurrentlyVerifyingResult : CacheResult - { - } - enum SuccessKind - { - Identity, - SubInterface, - Wrapper, - } - class VerificationSucceededResult : CacheResult - { - internal VerificationSucceededResult(SuccessKind kind) - { - this.kind = kind; - } - internal VerificationSucceededResult(Dictionary mappings) - { - this.kind = SuccessKind.Wrapper; - this.methodMappings = mappings; - } - internal readonly SuccessKind kind; - internal readonly Dictionary methodMappings; - } - - static Dictionary, CacheResult> ConverterTypeCache = new Dictionary, CacheResult>(); - static ConditionalWeakTable ConverterInstanceCache = new ConditionalWeakTable(); - static AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("ProxyHolderAssembly"), AssemblyBuilderAccess.Run); - static ModuleBuilder modb = ab.DefineDynamicModule("Main Module"); - - class EqComparer : IEqualityComparer - { - - bool IEqualityComparer.Equals(ParameterInfo x, ParameterInfo y) - { - return EqualTypes(x.ParameterType, y.ParameterType); - } - - int IEqualityComparer.GetHashCode(ParameterInfo obj) - { - return obj.GetHashCode(); - } - } - - static bool EqualTypes(Type sourceType, Type targetType) - { - return EnsureCastPossible(targetType, sourceType); - } - - - - static MethodInfo FindCorrespondingMethod(Type targetType, Type sourceType, MethodInfo miTarget) - { - MethodInfo[] sms = sourceType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where((MethodInfo mi) => mi.Name == miTarget.Name).ToArray(); - if (sms != null && sms.Length != 0) - { - MethodInfo[] sm = null; - try - { - sm = sms.Where((mi) => (mi.GetParameters().SequenceEqual(miTarget.GetParameters(), new EqComparer()))).ToArray(); - } - catch - { - } - if (sm != null && sm.Length != 0) - { - if (sm.Length > 1) return null; - if (EqualTypes(sm[0].ReturnType, miTarget.ReturnType)) - { - return sm[0]; - } - } - } - MethodInfo[] rval = sourceType.GetInterfaces().Select((inheritedItf) => FindCorrespondingMethod(targetType, inheritedItf, miTarget)).ToArray(); - if (rval == null || rval.Length == 0) return null; - if (rval.Length > 1) return null; - return rval[0]; - - } - - - static void AddMethod(Type targetType, Type sourceType, TypeBuilder tb, MethodInfo miTarget, MethodInfo miSource) - { - ParameterInfo[] pisTarget = miTarget.GetParameters(); - ParameterInfo[] pisSource = miSource.GetParameters(); - MethodBuilder metb; - Type[] typesTarget; - if (pisTarget == null || pisTarget.Length == 0) - { - metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null); - pisTarget = new ParameterInfo[0]; - typesTarget = new Type[0]; - } - else - { - typesTarget = pisTarget.Select((pi) => pi.ParameterType).ToArray(); - Type[][] requiredCustomMods = pisTarget.Select((pi) => pi.GetRequiredCustomModifiers()).ToArray(); - Type[][] optionalCustomMods = pisTarget.Select((pi) => pi.GetOptionalCustomModifiers()).ToArray(); - - metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null, null, typesTarget, requiredCustomMods, optionalCustomMods); - } - - ILGenerator il = metb.GetILGenerator(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldfld, tb.BaseType.GetField("instance", BindingFlags.NonPublic | BindingFlags.Instance)); - for (int pi = 0; pi < pisTarget.Length; pi++) - { - il.Emit(OpCodes.Ldarg, pi + 1); - EmitParamConversion(il, typesTarget[pi], pisSource[pi].ParameterType); - } - il.EmitCall(OpCodes.Callvirt, miSource, null); - - EmitParamConversion(il, miSource.ReturnType, miTarget.ReturnType); - il.Emit(OpCodes.Ret); - - tb.DefineMethodOverride(metb, miTarget); - } - - static void EmitParamConversion(ILGenerator il, Type typeOnStack, Type typeRequiredInSignature) - { - if (typeOnStack != typeRequiredInSignature) - { - if (typeOnStack.GetInterfaces().Contains(typeRequiredInSignature)) - { - il.Emit(OpCodes.Castclass, typeRequiredInSignature); - } - else - { - Label lEnd = il.DefineLabel(); - Label lCreateProxy = il.DefineLabel(); - il.Emit(OpCodes.Dup); // o o - il.Emit(OpCodes.Brfalse_S, lEnd); // o - il.Emit(OpCodes.Dup); // o o - il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // o [p/n] - il.Emit(OpCodes.Brfalse_S, lCreateProxy); // o - il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // p - il.EmitCall(OpCodes.Callvirt, typeof(NonGenericProxyBase).GetMethod("get_UnderlyingInstanceAsObject"), null); // uo - il.Emit(OpCodes.Dup); // uo uo - il.Emit(OpCodes.Isinst, typeRequiredInSignature); // uo [ro/n] - il.Emit(OpCodes.Brtrue_S, lEnd); // uo - il.MarkLabel(lCreateProxy); // uo - Type paramProxyType = EnsureConverter(typeRequiredInSignature, typeOnStack); - il.Emit(OpCodes.Newobj, paramProxyType.GetConstructors()[0]); - il.MarkLabel(lEnd); // ro - } - } - } - - - - static bool EnsureCastPossible(Type targetType, Type sourceType) - { - var key = new Tuple(sourceType, targetType); - CacheResult cr = null; - if (ConverterTypeCache.TryGetValue(key, out cr)) - { - if (cr is CurrentlyVerifyingResult || cr is VerificationSucceededResult || cr is TypeBuilderResult) return true; - if (cr is ErrorResult) return false; - } - if (targetType == sourceType) - { - ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.Identity); - return true; - } - if (targetType.GetInterfaces().Contains(sourceType)) - { - ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.SubInterface); - return true; - } - if (!targetType.IsInterface || !sourceType.IsInterface) - { - ConverterTypeCache[key] = new ErrorResult("Cannot cast " + sourceType + " to " + targetType); - return false; - } - bool success = false; - ConverterTypeCache[key] = new CurrentlyVerifyingResult(); - try - { - Dictionary mappings = new Dictionary(); - foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) - { - MethodInfo mapping = FindCorrespondingMethod(targetType, sourceType, mi); - if (mapping == null) - { - ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType + " because of missing method: " + mi.Name); - return false; - } - mappings[mi] = mapping; - } - ConverterTypeCache[key] = new VerificationSucceededResult(mappings); - success = true; - return true; - } - finally - { - if (!success) - { - if (!(ConverterTypeCache[key] is ErrorResult)) - { - ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType); - } - } - } - } - - static int counter = 0; - static Type CreateWrapperType(Type targetType, Type sourceType, VerificationSucceededResult result) - { - Dictionary mappings = result.methodMappings; - Type baseType = typeof(BaseType<>).MakeGenericType(sourceType); - TypeBuilder tb = modb.DefineType("ProxyType" + counter++ + " wrapping:" + sourceType.Name + " to look like:" + targetType.Name, TypeAttributes.Class, baseType, new Type[] { targetType }); - ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { sourceType }); - ILGenerator il = cb.GetILGenerator(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Castclass, sourceType); - il.Emit(OpCodes.Call, baseType.GetConstructor(new Type[] { sourceType })); - il.Emit(OpCodes.Ret); - var tuple = new Tuple(sourceType, targetType); - try - { - ConverterTypeCache[tuple] = new TypeBuilderResult(tb); - foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) - { - AddMethod(targetType, sourceType, tb, mi, mappings[mi]); - } - Type t = tb.CreateType(); - ConverterTypeCache[tuple] = new TypeBuilderResult(t); - return t; - } - catch (Exception e) - { - ConverterTypeCache[tuple] = new ErrorResult(e.Message); - throw; - } - } - - } - #endif -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index e0f6a454d3..7a566cbcf8 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -23,7 +23,6 @@ - \ No newline at end of file From a04d592d06ddf7f7add921f19ebc01bf78165dc8 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 21 Apr 2014 16:26:15 -0700 Subject: [PATCH 075/846] OWIN->K and K->OWIN support via Func. --- HttpAbstractions.sln | 37 +- .../ICanHasOwinEnvironment.cs | 9 + .../Microsoft.AspNet.Owin.kproj | 31 ++ src/Microsoft.AspNet.Owin/OwinConstants.cs | 175 +++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 269 +++++++++++++ src/Microsoft.AspNet.Owin/OwinExtensions.cs | 30 ++ .../OwinFeatureCollection.cs | 368 ++++++++++++++++++ .../OwinMiddlewareFactory.cs | 50 +++ src/Microsoft.AspNet.Owin/Project.json | 30 ++ .../Microsoft.AspNet.Owin.Tests.kproj | 27 ++ .../OwinEnvironmentTests.cs | 226 +++++++++++ .../OwinFeatureCollectionTests.cs | 47 +++ test/Microsoft.AspNet.Owin.Tests/Project.json | 26 ++ 13 files changed, 1324 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs create mode 100644 src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj create mode 100644 src/Microsoft.AspNet.Owin/OwinConstants.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinEnvironment.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinExtensions.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs create mode 100644 src/Microsoft.AspNet.Owin/Project.json create mode 100644 test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj create mode 100644 test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs create mode 100644 test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs create mode 100644 test/Microsoft.AspNet.Owin.Tests/Project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 83fd260c8c..c7f07227ab 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30327.0 +VisualStudioVersion = 12.0.30401.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -21,6 +21,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.kproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.kproj", "{16219571-3268-4D12-8689-12B7163DBA13}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -32,6 +36,7 @@ Global EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.Build.0 = Debug|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|x86 @@ -42,6 +47,7 @@ Global {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.Build.0 = Release|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.Build.0 = Debug|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|x86 @@ -52,6 +58,7 @@ Global {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.Build.0 = Release|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.Build.0 = Debug|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|x86 @@ -62,6 +69,7 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.Build.0 = Release|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|x86 @@ -72,6 +80,7 @@ Global {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.Build.0 = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|x86 @@ -82,6 +91,7 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.Build.0 = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|x86 @@ -92,6 +102,7 @@ Global {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.Build.0 = Debug|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|x86 @@ -101,6 +112,28 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.ActiveCfg = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.Build.0 = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.ActiveCfg = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.Build.0 = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.ActiveCfg = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.Build.0 = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.ActiveCfg = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.Build.0 = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.ActiveCfg = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.Build.0 = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.ActiveCfg = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.Build.0 = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.ActiveCfg = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.Build.0 = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.ActiveCfg = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -113,5 +146,7 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {59BED991-F207-48ED-B24C-0A1D9C986C01} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {16219571-3268-4D12-8689-12B7163DBA13} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs new file mode 100644 index 0000000000..49218e1115 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Owin +{ + public interface ICanHasOwinEnvironment + { + IDictionary Environment { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj new file mode 100644 index 0000000000..fb37b90152 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -0,0 +1,31 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 59bed991-f207-48ed-b24c-0a1d9c986c01 + Library + + + + + + + 2.0 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs new file mode 100644 index 0000000000..a54f04cccf --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -0,0 +1,175 @@ +namespace Microsoft.AspNet.Owin +{ + internal static class OwinConstants + { + #region OWIN v1.0.0 - 3.2.1. Request Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string RequestScheme = "owin.RequestScheme"; + public const string RequestMethod = "owin.RequestMethod"; + public const string RequestPathBase = "owin.RequestPathBase"; + public const string RequestPath = "owin.RequestPath"; + public const string RequestQueryString = "owin.RequestQueryString"; + public const string RequestProtocol = "owin.RequestProtocol"; + public const string RequestHeaders = "owin.RequestHeaders"; + public const string RequestBody = "owin.RequestBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.2. Response Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string ResponseStatusCode = "owin.ResponseStatusCode"; + public const string ResponseReasonPhrase = "owin.ResponseReasonPhrase"; + public const string ResponseProtocol = "owin.ResponseProtocol"; + public const string ResponseHeaders = "owin.ResponseHeaders"; + public const string ResponseBody = "owin.ResponseBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.3. Other Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string CallCancelled = "owin.CallCancelled"; + + public const string OwinVersion = "owin.Version"; + + #endregion + + #region OWIN Keys for IAppBuilder.Properties + + internal static class Builder + { + public const string AddSignatureConversion = "builder.AddSignatureConversion"; + public const string DefaultApp = "builder.DefaultApp"; + } + + #endregion + + #region OWIN Key Guidelines and Common Keys - 6. Common keys + + // http://owin.org/spec/CommonKeys.html + + internal static class CommonKeys + { + public const string ClientCertificate = "ssl.ClientCertificate"; + public const string LoadClientCertAsync = "ssl.LoadClientCertAsync"; + public const string RemoteIpAddress = "server.RemoteIpAddress"; + public const string RemotePort = "server.RemotePort"; + public const string LocalIpAddress = "server.LocalIpAddress"; + public const string LocalPort = "server.LocalPort"; + public const string IsLocal = "server.IsLocal"; + public const string TraceOutput = "host.TraceOutput"; + public const string Addresses = "host.Addresses"; + public const string AppName = "host.AppName"; + public const string Capabilities = "server.Capabilities"; + public const string OnSendingHeaders = "server.OnSendingHeaders"; + public const string OnAppDisposing = "host.OnAppDisposing"; + public const string Scheme = "scheme"; + public const string Host = "host"; + public const string Port = "port"; + public const string Path = "path"; + } + + #endregion + + #region SendFiles v0.3.0 + + // http://owin.org/extensions/owin-SendFile-Extension-v0.3.0.htm + + internal static class SendFiles + { + // 3.1. Startup + + public const string Version = "sendfile.Version"; + public const string Support = "sendfile.Support"; + public const string Concurrency = "sendfile.Concurrency"; + + // 3.2. Per Request + + public const string SendAsync = "sendfile.SendAsync"; + } + + #endregion + + #region Opaque v0.3.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class OpaqueConstants + { + // 3.1. Startup + + public const string Version = "opaque.Version"; + + // 3.2. Per Request + + public const string Upgrade = "opaque.Upgrade"; + + // 5. Consumption + + public const string Stream = "opaque.Stream"; + // public const string Version = "opaque.Version"; // redundant, declared above + public const string CallCancelled = "opaque.CallCancelled"; + } + + #endregion + + #region WebSocket v0.4.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class WebSocket + { + // 3.1. Startup + + public const string Version = "websocket.Version"; + + // 3.2. Per Request + + public const string Accept = "websocket.Accept"; + + // 4. Accept + + public const string SubProtocol = "websocket.SubProtocol"; + + // 5. Consumption + + public const string SendAsync = "websocket.SendAsync"; + public const string ReceiveAsync = "websocket.ReceiveAsync"; + public const string CloseAsync = "websocket.CloseAsync"; + // public const string Version = "websocket.Version"; // redundant, declared above + public const string CallCancelled = "websocket.CallCancelled"; + public const string ClientCloseStatus = "websocket.ClientCloseStatus"; + public const string ClientCloseDescription = "websocket.ClientCloseDescription"; + } + + #endregion + + #region Security v0.1.0 + + // http://owin.org/extensions/owin-Security-Extension-v0.1.0.htm + + internal static class Security + { + // 3.2. Per Request + + public const string User = "server.User"; + + public const string Authenticate = "security.Authenticate"; + + // 3.3. Response + + public const string SignIn = "security.SignIn"; + + public const string SignOut = "security.SignOut"; + + public const string Challenge = "security.Challenge"; + } + + #endregion + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs new file mode 100644 index 0000000000..157d98ba86 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -0,0 +1,269 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + using SendFileFunc = Func; + + public class OwinEnvironment : IDictionary + { + private HttpContext _context; + private IDictionary _entries; + + public OwinEnvironment(HttpContext context) + { + _context = context; + _entries = new Dictionary() + { + { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, + { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, + { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, + { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, + { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + + { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, + { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, + + { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), + (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, + { OwinConstants.CommonKeys.RemotePort, new FeatureMap(feature => feature.RemotePort.ToString(CultureInfo.InvariantCulture), + (feature, value) => feature.RemotePort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, + + { OwinConstants.CommonKeys.LocalIpAddress, new FeatureMap(feature => feature.LocalIpAddress.ToString(), + (feature, value) => feature.LocalIpAddress = IPAddress.Parse(Convert.ToString(value))) }, + { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), + (feature, value) => feature.RemoteIpAddress = IPAddress.Parse(Convert.ToString(value))) }, + + { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, + + { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, + }; + + if (context.Request.IsSecure) + { + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + (feature, value) => feature.ClientCertificate = (X509Certificate)value)); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); + } + + _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN + } + + // Public in case there's a new/custom feature interface that needs to be added. + public IDictionary FeatureMaps + { + get { return _entries; } + } + + void IDictionary.Add(string key, object value) + { + if (_entries.ContainsKey(key)) + { + throw new InvalidOperationException("Key already present"); + } + _context.Items.Add(key, value); + } + + bool IDictionary.ContainsKey(string key) + { + return _entries.ContainsKey(key) || _context.Items.ContainsKey(key); + } + + ICollection IDictionary.Keys + { + get + { + return _entries.Keys.Concat(_context.Items.Keys.Select(key => Convert.ToString(key))).ToList(); + } + } + + bool IDictionary.Remove(string key) + { + if (_entries.Remove(key)) + { + return true; + } + return _context.Items.Remove(key); + } + + bool IDictionary.TryGetValue(string key, out object value) + { + FeatureMap entry; + if (_entries.TryGetValue(key, out entry)) + { + value = entry.Get(_context); + return true; + } + return _context.Items.TryGetValue(key, out value); + } + + ICollection IDictionary.Values + { + get { throw new NotImplementedException(); } + } + + object IDictionary.this[string key] + { + get + { + FeatureMap entry; + if (_entries.TryGetValue(key, out entry)) + { + return entry.Get(_context); + } + object value; + if (_context.Items.TryGetValue(key, out value)) + { + return value; + } + throw new KeyNotFoundException(key); + } + set + { + FeatureMap entry; + if (_entries.TryGetValue(key, out entry)) + { + if (entry.Setter == null) + { + _entries.Remove(key); + if (value != null) + { + _context.Items[key] = value; + } + } + else + { + entry.Setter(_context.GetFeature(entry.FeatureInterface), value); + } + } + else + { + if (value == null) + { + _context.Items.Remove(key); + } + else + { + _context.Items[key] = value; + } + } + } + } + + void ICollection>.Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + void ICollection>.Clear() + { + _entries.Clear(); + _context.Items.Clear(); + } + + bool ICollection>.Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + int ICollection>.Count + { + get { return _entries.Count + _context.Items.Count; } + } + + bool ICollection>.IsReadOnly + { + get { return false; } + } + + bool ICollection>.Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + IEnumerator> IEnumerable>.GetEnumerator() + { + foreach (var entryPair in _entries) + { + yield return new KeyValuePair(entryPair.Key, entryPair.Value.Get(_context)); + } + foreach (var entryPair in _context.Items) + { + yield return new KeyValuePair(Convert.ToString(entryPair.Key), entryPair.Value); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + public class FeatureMap + { + internal FeatureMap(Type featureInterface, Func getter) + : this(featureInterface, getter, null) + { + } + + internal FeatureMap(Type featureInterface, Func getter, Action setter) + { + FeatureInterface = featureInterface; + Getter = getter; + Setter = setter; + } + + internal Type FeatureInterface { get; set; } + internal Func Getter { get; set; } + internal Action Setter { get; set; } + + internal object Get(HttpContext context) + { + object featureInstance = context.GetFeature(FeatureInterface); + if (featureInstance == null) + { + return null; + } + return Getter(featureInstance); + } + + internal void Set(HttpContext context, object value) + { + Setter(context.GetFeature(FeatureInterface), value); + } + } + + public class FeatureMap : FeatureMap + { + internal FeatureMap(Func getter) + : base(typeof(T), feature => getter((T)feature)) + { + } + + internal FeatureMap(Func getter, Action setter) + : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) + { + } + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs new file mode 100644 index 0000000000..135973e654 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Owin; + +namespace Microsoft.AspNet +{ + using AppFunc = Func, Task>; + + public static class OwinExtensions + { + public static IBuilder UseOwinMiddleware(this IBuilder builder, Func middleware) + { + Func middleware1 = next1 => + { + AppFunc exitMiddlware = env => + { + return next1((HttpContext)env[typeof(HttpContext).FullName]); + }; + var app = middleware(exitMiddlware); + return httpContext => + { + return app.Invoke(new OwinEnvironment(httpContext)); + }; + }; + return builder.Use(middleware1); + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs new file mode 100644 index 0000000000..8dc7f3422f --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -0,0 +1,368 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.Owin +{ + using SendFileFunc = Func; + + public class OwinFeatureCollection : + IFeatureCollection, + IHttpRequestInformation, + IHttpResponseInformation, + IHttpConnection, + IHttpSendFile, + IHttpTransportLayerSecurity, + ICanHasOwinEnvironment + { + public IDictionary Environment { get; set; } + + public OwinFeatureCollection(IDictionary environment) + { + Environment = environment; + } + + T Prop(string key) + { + object value; + if (Environment.TryGetValue(key, out value) && value is T) + { + return (T)value; + } + return default(T); + } + + void Prop(string key, object value) + { + Environment[key] = value; + } + + string IHttpRequestInformation.Protocol + { + get { return Prop(OwinConstants.RequestProtocol); } + set { Prop(OwinConstants.RequestProtocol, value); } + } + + string IHttpRequestInformation.Scheme + { + get { return Prop(OwinConstants.RequestScheme); } + set { Prop(OwinConstants.RequestScheme, value); } + } + + string IHttpRequestInformation.Method + { + get { return Prop(OwinConstants.RequestMethod); } + set { Prop(OwinConstants.RequestMethod, value); } + } + + string IHttpRequestInformation.PathBase + { + get { return Prop(OwinConstants.RequestPathBase); } + set { Prop(OwinConstants.RequestPathBase, value); } + } + + string IHttpRequestInformation.Path + { + get { return Prop(OwinConstants.RequestPath); } + set { Prop(OwinConstants.RequestPath, value); } + } + + string IHttpRequestInformation.QueryString + { + get { return Prop(OwinConstants.RequestQueryString); } + set { Prop(OwinConstants.RequestQueryString, value); } + } + + IDictionary IHttpRequestInformation.Headers + { + get { return Prop>(OwinConstants.RequestHeaders); } + set { Prop(OwinConstants.RequestHeaders, value); } + } + + Stream IHttpRequestInformation.Body + { + get { return Prop(OwinConstants.RequestBody); } + set { Prop(OwinConstants.RequestBody, value); } + } + + int IHttpResponseInformation.StatusCode + { + get { return Prop(OwinConstants.ResponseStatusCode); } + set { Prop(OwinConstants.ResponseStatusCode, value); } + } + + string IHttpResponseInformation.ReasonPhrase + { + get { return Prop(OwinConstants.ResponseReasonPhrase); } + set { Prop(OwinConstants.ResponseReasonPhrase, value); } + } + + IDictionary IHttpResponseInformation.Headers + { + get { return Prop>(OwinConstants.ResponseHeaders); } + set { Prop(OwinConstants.ResponseHeaders, value); } + } + + Stream IHttpResponseInformation.Body + { + get { return Prop(OwinConstants.ResponseBody); } + set { Prop(OwinConstants.ResponseBody, value); } + } + + void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) + { + var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); + if (register == null) + { + throw new NotSupportedException(OwinConstants.CommonKeys.OnSendingHeaders); + } + register(callback, state); + } + + IPAddress IHttpConnection.RemoteIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } + set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } + } + + IPAddress IHttpConnection.LocalIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } + set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } + } + + int IHttpConnection.RemotePort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } + set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } + } + + int IHttpConnection.LocalPort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } + } + + bool IHttpConnection.IsLocal + { + get { return Prop(OwinConstants.CommonKeys.IsLocal); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value); } + } + + private bool SupportsSendFile + { + get + { + object obj; + return Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj) && obj != null; + } + } + + Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + { + object obj; + if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) + { + var func = (SendFileFunc)obj; + return func(path, offset, length, cancellation); + } + throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); + } + + private bool SupportsClientCerts + { + get + { + object obj; + if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) + && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) + || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) + && obj != null) + { + return true; + } + return false; + } + } + + X509Certificate IHttpTransportLayerSecurity.ClientCertificate + { + get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } + set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } + } + + Task IHttpTransportLayerSecurity.LoadAsync() + { + throw new NotImplementedException(); + } + + public int Revision + { + get { return 0; } // Not modifiable + } + + public void Add(Type key, object value) + { + throw new NotSupportedException(); + } + + public bool ContainsKey(Type key) + { + // Does this type implement the requested interface? + if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) + { + // Check for conditional features + if (key == typeof(IHttpSendFile)) + { + return SupportsSendFile; + } + else if (key == typeof(IHttpTransportLayerSecurity)) + { + return SupportsClientCerts; + } + + // The rest of the features are always supported. + return true; + } + return false; + } + + public ICollection Keys + { + get + { + var keys = new List() + { + typeof(IHttpRequestInformation), + typeof(IHttpResponseInformation), + typeof(IHttpConnection), + typeof(ICanHasOwinEnvironment), + }; + if (SupportsSendFile) + { + keys.Add(typeof(IHttpSendFile)); + } + if (SupportsClientCerts) + { + keys.Add(typeof(IHttpTransportLayerSecurity)); + } + return keys; + } + } + + public bool Remove(Type key) + { + throw new NotSupportedException(); + } + + public bool TryGetValue(Type key, out object value) + { + if (ContainsKey(key)) + { + value = this; + return true; + } + value = null; + return false; + } + + public ICollection Values + { + get { throw new NotSupportedException(); } + } + + public object this[Type key] + { + get + { + object value; + if (TryGetValue(key, out value)) + { + return value; + } + throw new KeyNotFoundException(key.FullName); + } + set + { + throw new NotSupportedException(); + } + } + + public void Add(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public void Clear() + { + throw new NotSupportedException(); + } + + public bool Contains(KeyValuePair item) + { + object result; + return TryGetValue(item.Key, out result) && result.Equals(item.Value); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (array == null) + { + throw new ArgumentNullException("array"); + } + if (arrayIndex < 0 || arrayIndex > array.Length) + { + throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); + } + var keys = Keys; + if (keys.Count > array.Length - arrayIndex) + { + throw new ArgumentException(); + } + + foreach (var key in keys) + { + array[arrayIndex++] = new KeyValuePair(key, this[key]); + } + } + + public int Count + { + get { return Keys.Count; } + } + + public bool IsReadOnly + { + get { return true; } + } + + public bool Remove(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public IEnumerator> GetEnumerator() + { + return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Dispose() + { + } + } +} + diff --git a/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs b/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs new file mode 100644 index 0000000000..96bbaa48f5 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.PipelineCore; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + + public static class OwinMiddlewareFactory + { + public static Func Create(Action configuration) + { + return Create(services: null, configuration: configuration); + } + + public static Func Create(IServiceProvider services, Action configuration) + { + var builder = new Builder(services); + configuration(builder); + + return Create(exit => + { + builder.Use(ignored => exit); + return builder.Build(); + }); + } + + public static Func Create(Func middleware) + { + return next => + { + var app = middleware(httpContext => + { + return next(httpContext.GetFeature().Environment); + }); + + return env => + { + return app.Invoke( + new DefaultHttpContext( + new FeatureCollection( + new OwinFeatureCollection(env)))); + }; + }; + } + } +} diff --git a/src/Microsoft.AspNet.Owin/Project.json b/src/Microsoft.AspNet.Owin/Project.json new file mode 100644 index 0000000000..4a7ce42ba7 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Project.json @@ -0,0 +1,30 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.HttpFeature": "" + }, + "configurations": { + "net45": { }, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.IO": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Net.Primitives": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "0.1-alpha-*", + "System.Security.Cryptography.X509Certificates": "4.0.0.0", + "System.Security.Principal" : "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj new file mode 100644 index 0000000000..23a18cf7d4 --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -0,0 +1,27 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 16219571-3268-4d12-8689-12b7163dba13 + Library + + + + + + + 2.0 + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs new file mode 100644 index 0000000000..de9fc4a4a6 --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Claims; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.HttpFeature; +using Xunit; + +namespace Microsoft.AspNet.Owin +{ + public class OwinEnvironmentTests + { + private T Get(IDictionary environment, string key) + { + object value; + return environment.TryGetValue(key, out value) ? (T)value : default(T); + } + + [Fact] + public void OwinEnvironmentCanBeCreated() + { + MoqHttpContext context = new MoqHttpContext(); + context.Request.Method = "SomeMethod"; + IDictionary env = new OwinEnvironment(context); + + Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); + env["owin.RequestMethod"] = "SomeOtherMethod"; + Assert.Equal("SomeOtherMethod", context.Request.Method); + } + + private class MoqHttpContext : HttpContext + { + private HttpRequest _request; + private IDictionary _items; + + public MoqHttpContext() + { + _request = new MoqHttpRequest(); + _items = new Dictionary(); + } + + public override HttpRequest Request + { + get { return _request; } + } + + public override HttpResponse Response + { + get { throw new NotImplementedException(); } + } + + public override ClaimsPrincipal User + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IDictionary Items + { + get { return _items; } + } + + public override IServiceProvider ApplicationServices + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IServiceProvider RequestServices + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override void Dispose() + { + throw new NotImplementedException(); + } + + public override object GetFeature(Type type) + { + return Request; + } + + public override void SetFeature(Type type, object instance) + { + throw new NotImplementedException(); + } + + public override IEnumerable GetAuthenticationTypes() + { + throw new NotImplementedException(); + } + + public override IEnumerable Authenticate(IList authenticationTypes) + { + throw new NotImplementedException(); + } + + public override Task> AuthenticateAsync(IList authenticationTypes) + { + throw new NotImplementedException(); + } + } + + private class MoqHttpRequest : HttpRequest, IHttpRequestInformation + { + public override HttpContext HttpContext + { + get { throw new NotImplementedException(); } + } + + public override string Method + { + get; + set; + } + + public override string Scheme + { + get; + set; + } + + public override bool IsSecure + { + get { return false; } + } + + public override HostString Host + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override PathString PathBase + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override PathString Path + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override QueryString QueryString + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IReadableStringCollection Query + { + get { throw new NotImplementedException(); } + } + + public override Task GetFormAsync() + { + throw new NotImplementedException(); + } + + public override string Protocol + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IHeaderDictionary Headers + { + get { throw new NotImplementedException(); } + } + + public override IReadableStringCollection Cookies + { + get { throw new NotImplementedException(); } + } + + public override long? ContentLength + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override Stream Body + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override CancellationToken CallCanceled + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + string IHttpRequestInformation.PathBase + { + get; + set; + } + + string IHttpRequestInformation.Path + { + get; + set; + } + + string IHttpRequestInformation.QueryString + { + get; + set; + } + + IDictionary IHttpRequestInformation.Headers + { + get; + set; + } + } + } +} diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs new file mode 100644 index 0000000000..d6476c0a8a --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Xunit; + +namespace Microsoft.AspNet.Owin +{ + public class OwinHttpEnvironmentTests + { + private T Get(IFeatureCollection features) + { + object value; + return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); + } + + [Fact] + public void OwinHttpEnvironmentCanBeCreated() + { + var env = new Dictionary + { + {"owin.RequestMethod", "POST"} + }; + var features = new FeatureObject(new OwinFeatureCollection(env)); + + Assert.Equal(Get(features).Method, "POST"); + } + + [Fact] + public void ImplementedInterfacesAreEnumerated() + { + var env = new Dictionary + { + {"owin.RequestMethod", "POST"} + }; + var features = new FeatureObject(new OwinFeatureCollection(env)); + + var entries = features.ToArray(); + var keys = features.Keys.ToArray(); + var values = features.Values.ToArray(); + + Assert.Contains(typeof(IHttpRequestInformation), keys); + Assert.Contains(typeof(IHttpResponseInformation), keys); + } + } +} + diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json new file mode 100644 index 0000000000..3ba09cb57f --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/Project.json @@ -0,0 +1,26 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Owin": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.PipelineCore": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "configurations": { + "net45": { + "dependencies": { + "System.Runtime": "", + "Shouldly": "1.1.1.1" + } + } + } +} \ No newline at end of file From caff1d3d68502455e7f014d0387fff45df805383 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 21 Apr 2014 22:31:46 -0700 Subject: [PATCH 076/846] Fixed unused project references --- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 1 - test/Microsoft.AspNet.PipelineCore.Tests/project.json | 1 - 2 files changed, 2 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index f5db7e821f..25bbf54fa6 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,7 +1,6 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", "Microsoft.AspNet.FeatureModel": "", diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 8ac9b6c2fa..ae27e76817 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,7 +1,6 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", "Microsoft.AspNet.FeatureModel": "", From 4a5de61cd154ae072785df3d84ab34d3c9f4edfd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 23 Apr 2014 12:01:25 -0700 Subject: [PATCH 077/846] OWIN: Change interop extension methods. --- .../Microsoft.AspNet.Owin.kproj | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 74 +++++++++++++++++-- .../OwinMiddlewareFactory.cs | 50 ------------- 3 files changed, 66 insertions(+), 59 deletions(-) delete mode 100644 src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index fb37b90152..210e9491a3 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -25,7 +25,6 @@ - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 135973e654..a98c449a25 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -3,28 +3,86 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Owin; +using Microsoft.AspNet.PipelineCore; namespace Microsoft.AspNet { using AppFunc = Func, Task>; + using CreateMiddleware = Func< + Func, Task>, + Func, Task> + >; + using AddMiddleware = Action, Task>, + Func, Task> + >>; public static class OwinExtensions { - public static IBuilder UseOwinMiddleware(this IBuilder builder, Func middleware) + public static AddMiddleware UseOwin(this IBuilder builder) { - Func middleware1 = next1 => + return middleware => { - AppFunc exitMiddlware = env => + Func middleware1 = next1 => { - return next1((HttpContext)env[typeof(HttpContext).FullName]); + AppFunc exitMiddlware = env => + { + return next1((HttpContext)env[typeof(HttpContext).FullName]); + }; + var app = middleware(exitMiddlware); + return httpContext => + { + return app.Invoke(new OwinEnvironment(httpContext)); + }; }; - var app = middleware(exitMiddlware); - return httpContext => + builder.Use(middleware1); + }; + } + + public static IBuilder UseOwin(this IBuilder builder, Action pipeline) + { + pipeline(builder.UseOwin()); + return builder; + } + + public static IBuilder UseBuilder(this AddMiddleware app) + { + var builder = new Builder(serviceProvider: null); + + CreateMiddleware middleware = CreateMiddlewareFactory(exit => + { + builder.Use(ignored => exit); + return builder.Build(); + }); + + app(middleware); + return builder; + } + + private static CreateMiddleware CreateMiddlewareFactory(Func middleware) + { + return next => + { + var app = middleware(httpContext => { - return app.Invoke(new OwinEnvironment(httpContext)); + return next(httpContext.GetFeature().Environment); + }); + + return env => + { + return app.Invoke( + new DefaultHttpContext( + new FeatureCollection( + new OwinFeatureCollection(env)))); }; }; - return builder.Use(middleware1); + } + + public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) + { + var builder = app.UseBuilder(); + pipeline(builder); + return app; } } } diff --git a/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs b/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs deleted file mode 100644 index 96bbaa48f5..0000000000 --- a/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.PipelineCore; - -namespace Microsoft.AspNet.Owin -{ - using AppFunc = Func, Task>; - - public static class OwinMiddlewareFactory - { - public static Func Create(Action configuration) - { - return Create(services: null, configuration: configuration); - } - - public static Func Create(IServiceProvider services, Action configuration) - { - var builder = new Builder(services); - configuration(builder); - - return Create(exit => - { - builder.Use(ignored => exit); - return builder.Build(); - }); - } - - public static Func Create(Func middleware) - { - return next => - { - var app = middleware(httpContext => - { - return next(httpContext.GetFeature().Environment); - }); - - return env => - { - return app.Invoke( - new DefaultHttpContext( - new FeatureCollection( - new OwinFeatureCollection(env)))); - }; - }; - } - } -} From 66495cdc5835e4e57aba49b97ff2623a55cdd100 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 23 Apr 2014 14:15:41 -0700 Subject: [PATCH 078/846] Add missing namespace. --- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index a98c449a25..f96b6300c9 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; using Microsoft.AspNet.PipelineCore; From b751cf19d0b4b573dd0bdd558879e5128675e1df Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 22 Apr 2014 09:35:49 -0700 Subject: [PATCH 079/846] #34 - Make HttpContext.User return non-null. --- .../DefaultHttpContext.cs | 11 ++++- .../DefaultHttpContextTests.cs | 43 +++++++++++++++++++ .../Microsoft.AspNet.PipelineCore.Tests.kproj | 1 + 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 0525f0cd6c..dd114e9e8b 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -54,7 +54,16 @@ namespace Microsoft.AspNet.PipelineCore public override ClaimsPrincipal User { - get { return HttpAuthentication.User; } + get + { + var user = HttpAuthentication.User; + if (user == null) + { + user = new ClaimsPrincipal(new ClaimsIdentity()); + HttpAuthentication.User = user; + } + return user; + } set { HttpAuthentication.User = value; } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs new file mode 100644 index 0000000000..4eb0b87d9e --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Security.Claims; +using System.Linq; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultHttpContextTests + { + [Fact] + public void EmptyUserIsNeverNull() + { + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.NotNull(context.User); + Assert.Equal(1, context.User.Identities.Count()); + Assert.True(object.ReferenceEquals(context.User, context.User)); + Assert.False(context.User.Identity.IsAuthenticated); + Assert.True(string.IsNullOrEmpty(context.User.Identity.AuthenticationType)); + + context.User = null; + Assert.NotNull(context.User); + Assert.Equal(1, context.User.Identities.Count()); + Assert.True(object.ReferenceEquals(context.User, context.User)); + Assert.False(context.User.Identity.IsAuthenticated); + Assert.True(string.IsNullOrEmpty(context.User.Identity.AuthenticationType)); + + context.User = new ClaimsPrincipal(); + Assert.NotNull(context.User); + Assert.Equal(0, context.User.Identities.Count()); + Assert.True(object.ReferenceEquals(context.User, context.User)); + Assert.Null(context.User.Identity); + + context.User = new ClaimsPrincipal(new ClaimsIdentity("SomeAuthType")); + Assert.Equal("SomeAuthType", context.User.Identity.AuthenticationType); + Assert.True(context.User.Identity.IsAuthenticated); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index efb347f4aa..2f35d88951 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -24,6 +24,7 @@ + From 8ad7b489e2d58726fd8d3c97fd4ac0afc9b2026f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Apr 2014 14:44:50 -0700 Subject: [PATCH 080/846] #18 - Add interfaces for request lifetime management. --- .../HttpContext.cs | 5 ++++ .../IHttpRequestLifetime.cs | 10 +++++++ .../Microsoft.AspNet.HttpFeature.kproj | 1 + .../DefaultHttpContext.cs | 30 +++++++++++++++++++ .../OwinEnvironmentTests.cs | 10 +++++++ 5 files changed, 56 insertions(+) create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index a933d34660..81e44240c2 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions.Security; @@ -21,6 +22,10 @@ namespace Microsoft.AspNet.Abstractions public abstract IServiceProvider RequestServices { get; set; } + public abstract CancellationToken OnRequestAborted { get; } + + public abstract void Abort(); + public abstract void Dispose(); public abstract object GetFeature(Type type); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs new file mode 100644 index 0000000000..3ea7a0ee34 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs @@ -0,0 +1,10 @@ +using System.Threading; + +namespace Microsoft.AspNet.HttpFeature +{ + public interface IHttpRequestLifetime + { + CancellationToken OnRequestAborted { get; } + void Abort(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 5f8f775ed5..96973626c9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -24,6 +24,7 @@ + diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index dd114e9e8b..462e5a593e 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -2,10 +2,12 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Infrastructure; using Microsoft.AspNet.PipelineCore.Security; @@ -20,6 +22,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _canHasItems; private FeatureReference _canHasServiceProviders; private FeatureReference _authentication; + private FeatureReference _lifetime; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -48,6 +51,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } } + private IHttpRequestLifetime Lifetime + { + get { return _lifetime.Fetch(_features); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -86,6 +94,28 @@ namespace Microsoft.AspNet.PipelineCore public int Revision { get { return _features.Revision; } } + public override CancellationToken OnRequestAborted + { + get + { + var lifetime = Lifetime; + if (lifetime != null) + { + return lifetime.OnRequestAborted; + } + return CancellationToken.None; + } + } + + public override void Abort() + { + var lifetime = Lifetime; + if (lifetime != null) + { + lifetime.Abort(); + } + } + public override void Dispose() { // REVIEW: is this necessary? is the environment "owned" by the context? diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index de9fc4a4a6..e84926c2f6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -104,6 +104,16 @@ namespace Microsoft.AspNet.Owin { throw new NotImplementedException(); } + + public override CancellationToken OnRequestAborted + { + get { throw new NotImplementedException(); } + } + + public override void Abort() + { + throw new NotImplementedException(); + } } private class MoqHttpRequest : HttpRequest, IHttpRequestInformation From 78bb008681224da48e34cc53adb6980f7d814f89 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Apr 2014 16:27:18 -0700 Subject: [PATCH 081/846] #38 - Provide a default dictionary for HttpContext.Items that returns null for missing values. --- .../Collections/ItemsDictionary.cs | 111 ++++++++++++++++++ .../DefaultCanHasItems.cs | 2 +- .../Microsoft.AspNet.PipelineCore.kproj | 1 + 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs new file mode 100644 index 0000000000..5f4abca7c0 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -0,0 +1,111 @@ +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.PipelineCore +{ + public class ItemsDictionary : IDictionary + { + public ItemsDictionary() + : this(new Dictionary()) + { + } + + public ItemsDictionary(IDictionary items) + { + Items = items; + } + + public IDictionary Items { get; private set; } + + // Replace the indexer with one that returns null for missing values + object IDictionary.this[object key] + { + get + { + object value; + if (Items.TryGetValue(key, out value)) + { + return value; + } + return null; + } + set { Items[key] = value; } + } + + void IDictionary.Add(object key, object value) + { + Items.Add(key, value); + } + + bool IDictionary.ContainsKey(object key) + { + return Items.ContainsKey(key); + } + + ICollection IDictionary.Keys + { + get { return Items.Keys; } + } + + bool IDictionary.Remove(object key) + { + return Items.Remove(key); + } + + bool IDictionary.TryGetValue(object key, out object value) + { + return Items.TryGetValue(key, out value); + } + + ICollection IDictionary.Values + { + get { return Items.Values; } + } + + void ICollection>.Add(KeyValuePair item) + { + Items.Add(item); + } + + void ICollection>.Clear() + { + Items.Clear(); + } + + bool ICollection>.Contains(KeyValuePair item) + { + return Items.Contains(item); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + Items.CopyTo(array, arrayIndex); + } + + int ICollection>.Count + { + get { return Items.Count; } + } + + bool ICollection>.IsReadOnly + { + get { return Items.IsReadOnly; } + } + + bool ICollection>.Remove(KeyValuePair item) + { + return Items.Remove(item); + } + + IEnumerator> IEnumerable>.GetEnumerator() + { + return Items.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return Items.GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs index 31e41440bb..13513d3653 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs @@ -6,7 +6,7 @@ namespace Microsoft.AspNet.PipelineCore { public DefaultCanHasItems() { - Items = new Dictionary(); + Items = new ItemsDictionary(); } public IDictionary Items { get; private set; } diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 51c55b0566..9cf723fe9e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -23,6 +23,7 @@ + From be5a98d38f2b9c2f113f7003e990beadbdd0ee66 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 26 Apr 2014 20:52:00 -0700 Subject: [PATCH 082/846] Added build.sh --- build.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 0000000000..db1e0c3dde --- /dev/null +++ b/build.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +if test `uname` = Darwin; then + cachedir=~/Library/Caches/KBuild +else + if x$XDG_DATA_HOME = x; then + cachedir=$HOME/.local/share + else + cachedir=$XDG_DATA_HOME; + fi +fi +mkdir -p $cachedir + +url=https://www.nuget.org/nuget.exe + +if test ! -f $cachedir/nuget.exe; then + wget -o $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null +fi + +if test ! -e .nuget; then + mkdir .nuget + cp $cachedir/nuget.exe .nuget +fi + +if test ! -d packages/KoreBuild; then + mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion +fi + +mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file From cfe76de294c0dcf62e471a5789236d0c9d7c45f5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 25 Apr 2014 11:42:17 -0700 Subject: [PATCH 083/846] #53 - Reduce auth exceptions for missing handlers. --- .../DefaultHttpContext.cs | 18 ++++++------- .../DefaultHttpResponse.cs | 27 +++++++++---------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 462e5a593e..539319b868 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -153,13 +153,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var authenticateContext = new AuthenticateContext(authenticationTypes); - handler.Authenticate(authenticateContext); + if (handler != null) + { + handler.Authenticate(authenticateContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); @@ -178,13 +177,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var authenticateContext = new AuthenticateContext(authenticationTypes); - await handler.AuthenticateAsync(authenticateContext); + if (handler != null) + { + await handler.AuthenticateAsync(authenticateContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 2a24076c19..0b6fe2c349 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -135,13 +135,12 @@ namespace Microsoft.AspNet.PipelineCore } HttpResponseInformation.StatusCode = 401; var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); - handler.Challenge(challengeContext); + if (handler != null) + { + handler.Challenge(challengeContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(challengeContext.Accepted); @@ -158,13 +157,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); - handler.SignIn(signInContext); + if (handler != null) + { + handler.SignIn(signInContext); + } // Verify all types ack'd IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Accepted); @@ -181,13 +179,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var signOutContext = new SignOutContext(authenticationTypes); - handler.SignOut(signOutContext); + if (handler != null) + { + handler.SignOut(signOutContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(signOutContext.Accepted); From 19d49b06a68491caffe962205bdbc177a8bcd25c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 25 Apr 2014 14:30:56 -0700 Subject: [PATCH 084/846] #53 - Add Auth unit tests. --- .../DefaultHttpContextTests.cs | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 4eb0b87d9e..6701e62863 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; -using System.Globalization; -using System.Security.Claims; +using System.IO; using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; @@ -39,5 +40,62 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Equal("SomeAuthType", context.User.Identity.AuthenticationType); Assert.True(context.User.Identity.IsAuthenticated); } + + [Fact] + public async Task AuthenticateWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Authenticate("Foo")); + await Assert.ThrowsAsync(async () => await context.AuthenticateAsync("Foo")); + } + + [Fact] + public void ChallengeWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Response.Challenge(); + Assert.Equal(401, context.Response.StatusCode); + + Assert.Throws(() => context.Response.Challenge("Foo")); + } + + [Fact] + public void SignInWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Response.SignIn(new ClaimsIdentity("Foo"))); + } + + [Fact] + public void SignOutWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Response.SignOut(); + + Assert.Throws(() => context.Response.SignOut("Foo")); + } + + private HttpContext CreateContext() + { + var context = new DefaultHttpContext(new FeatureCollection()); + context.SetFeature(new FakeHttpResponse()); + return context; + } + + private class FakeHttpResponse : IHttpResponseInformation + { + public int StatusCode { get; set; } + + public string ReasonPhrase { get; set; } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + public void OnSendingHeaders(Action callback, object state) + { + throw new NotImplementedException(); + } + } } } \ No newline at end of file From 5557b959c465499a9eacf5b7180316e03248edfc Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 29 Apr 2014 16:25:56 -0700 Subject: [PATCH 085/846] #20 - Port Map and MapWhen. Move Run. --- .../Extensions/MapExtensions.cs | 50 +++++ .../Extensions/MapMiddleware.cs | 38 ++++ .../Extensions/MapOptions.cs | 19 ++ .../Extensions/MapWhenExtensions.cs | 62 ++++++ .../Extensions/MapWhenMiddleware.cs | 42 ++++ .../Extensions/MapWhenOptions.cs | 26 +++ .../Extensions/RunExtensions.cs | 13 ++ src/Microsoft.AspNet.Abstractions/IBuilder.cs | 1 - .../Microsoft.AspNet.Abstractions.kproj | 8 + .../NotNullAttribute.cs | 9 + src/Microsoft.AspNet.PipelineCore/Builder.cs | 12 +- .../Fakes.cs | 32 +++ .../MapPathMiddlewareTests.cs | 196 ++++++++++++++++++ .../MapPredicateMiddlewareTests.cs | 183 ++++++++++++++++ .../Microsoft.AspNet.Abstractions.Tests.kproj | 3 + .../project.json | 2 + 16 files changed, 689 insertions(+), 7 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs new file mode 100644 index 0000000000..72aa61bc97 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Extensions; + +namespace Microsoft.AspNet +{ + public static class MapExtensions + { + /// + /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of + /// continuing to the next component in the pipeline. + /// + /// + /// The path to match + /// The branch to take for positive path matches + /// + public static IBuilder Map([NotNull] this IBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) + { + return Map(app, new PathString(pathMatch), configuration); + } + + /// + /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of + /// continuing to the next component in the pipeline. + /// + /// + /// The path to match + /// The branch to take for positive path matches + /// + public static IBuilder Map([NotNull] this IBuilder app, PathString pathMatch, [NotNull] Action configuration) + { + if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) + { + throw new ArgumentException("The path must not end with a '/'", "pathMatch"); + } + + // create branch + IBuilder branchBuilder = app.New(); + configuration(branchBuilder); + var branch = branchBuilder.Build(); + + var options = new MapOptions() + { + Branch = branch, + PathMatch = pathMatch, + }; + return app.Use(next => new MapMiddleware(next, options).Invoke); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs new file mode 100644 index 0000000000..9a2905ab1b --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs @@ -0,0 +1,38 @@ +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class MapMiddleware + { + private readonly RequestDelegate _next; + private readonly MapOptions _options; + + public MapMiddleware([NotNull] RequestDelegate next, [NotNull] MapOptions options) + { + _next = next; + _options = options; + } + + public async Task Invoke([NotNull] HttpContext context) + { + PathString path = context.Request.Path; + PathString remainingPath; + if (path.StartsWithSegments(_options.PathMatch, out remainingPath)) + { + // Update the path + PathString pathBase = context.Request.PathBase; + context.Request.PathBase = pathBase + _options.PathMatch; + context.Request.Path = remainingPath; + + await _options.Branch(context); + + context.Request.PathBase = pathBase; + context.Request.Path = path; + } + else + { + await _next(context); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs new file mode 100644 index 0000000000..43b479cbc4 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs @@ -0,0 +1,19 @@ + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + /// + /// Options for the Map middleware + /// + public class MapOptions + { + /// + /// The path to match + /// + public PathString PathMatch { get; set; } + + /// + /// The branch taken for a positive match + /// + public RequestDelegate Branch { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs new file mode 100644 index 0000000000..aaad90ae74 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Extensions; + +namespace Microsoft.AspNet +{ + using Predicate = Func; + using PredicateAsync = Func>; + + /// + /// Extension methods for the MapWhenMiddleware + /// + public static class MapWhenExtensions + { + /// + /// Branches the request pipeline based on the result of the given predicate. + /// + /// + /// Invoked with the request environment to determine if the branch should be taken + /// Configures a branch to take + /// + public static IBuilder MapWhen([NotNull] this IBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) + { + // create branch + IBuilder branchBuilder = app.New(); + configuration(branchBuilder); + var branch = branchBuilder.Build(); + + // put middleware in pipeline + var options = new MapWhenOptions + { + Predicate = predicate, + Branch = branch, + }; + return app.Use(next => new MapWhenMiddleware(next, options).Invoke); + } + + /// + /// Branches the request pipeline based on the async result of the given predicate. + /// + /// + /// Invoked asynchronously with the request environment to determine if the branch should be taken + /// Configures a branch to take + /// + public static IBuilder MapWhenAsync([NotNull] this IBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) + { + // create branch + IBuilder branchBuilder = app.New(); + configuration(branchBuilder); + var branch = branchBuilder.Build(); + + // put middleware in pipeline + var options = new MapWhenOptions + { + PredicateAsync = predicate, + Branch = branch, + }; + return app.Use(next => new MapWhenMiddleware(next, options).Invoke); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs new file mode 100644 index 0000000000..597fec36b0 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class MapWhenMiddleware + { + private readonly RequestDelegate _next; + private readonly MapWhenOptions _options; + + public MapWhenMiddleware([NotNull] RequestDelegate next, [NotNull] MapWhenOptions options) + { + _next = next; + _options = options; + } + + public async Task Invoke([NotNull] HttpContext context) + { + if (_options.Predicate != null) + { + if (_options.Predicate(context)) + { + await _options.Branch(context); + } + else + { + await _next(context); + } + } + else + { + if (await _options.PredicateAsync(context)) + { + await _options.Branch(context); + } + else + { + await _next(context); + } + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs new file mode 100644 index 0000000000..380e69ba57 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs @@ -0,0 +1,26 @@ +using System; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + /// + /// Options for the MapWhen middleware + /// + public class MapWhenOptions + { + /// + /// The user callback that determines if the branch should be taken + /// + public Func Predicate { get; set; } + + /// + /// The async user callback that determines if the branch should be taken + /// + public Func> PredicateAsync { get; set; } + + /// + /// The branch taken for a positive match + /// + public RequestDelegate Branch { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs new file mode 100644 index 0000000000..b03f4d288f --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet +{ + public static class RunExtensions + { + public static void Run([NotNull] this IBuilder app, [NotNull] RequestDelegate handler) + { + app.Use(_ => handler); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index d187c75ec2..13936e6773 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -8,7 +8,6 @@ namespace Microsoft.AspNet.Abstractions IServerInformation Server { get; set; } IBuilder Use(Func middleware); - IBuilder Run(RequestDelegate handler); IBuilder New(); RequestDelegate Build(); diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj index 12a6a518dc..83c250addc 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -21,6 +21,13 @@ + + + + + + + @@ -31,6 +38,7 @@ + diff --git a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs new file mode 100644 index 0000000000..4a342de834 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index e5e4696118..7f4093b7bc 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore @@ -29,11 +30,6 @@ namespace Microsoft.AspNet.PipelineCore return this; } - public IBuilder Run(RequestDelegate handler) - { - return Use(next => handler); - } - public IBuilder New() { return new Builder(this); @@ -41,7 +37,11 @@ namespace Microsoft.AspNet.PipelineCore public RequestDelegate Build() { - RequestDelegate app = async context => context.Response.StatusCode = 404; + RequestDelegate app = context => + { + context.Response.StatusCode = 404; + return Task.FromResult(0); + }; foreach (var component in _components.Reverse()) { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs new file mode 100644 index 0000000000..0d4553e08a --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs @@ -0,0 +1,32 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class FakeHttpRequestInfo : IHttpRequestInformation + { + public string Protocol { get; set; } + public string Scheme { get; set; } + public string Method { get; set; } + public string PathBase { get; set; } + public string Path { get; set; } + public string QueryString { get; set; } + public IDictionary Headers { get; set; } + public Stream Body { get; set; } + } + + public class FakeHttpResponseInfo : IHttpResponseInformation + { + public int StatusCode { get; set; } + public string ReasonPhrase { get; set; } + public IDictionary Headers { get; set; } + public Stream Body { get; set; } + public void OnSendingHeaders(Action callback, object state) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs new file mode 100644 index 0000000000..c6f8912747 --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Shouldly; +using Xunit; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class MapPathMiddlewareTests + { + private static readonly Action ActionNotImplemented = new Action(_ => { throw new NotImplementedException(); }); + + private static Task Success(HttpContext context) + { + context.Response.StatusCode = 200; + context.Items["test.PathBase"] = context.Request.PathBase.Value; + context.Items["test.Path"] = context.Request.Path.Value; + return Task.FromResult(null); + } + + private static void UseSuccess(IBuilder app) + { + app.Run(Success); + } + + private static Task NotImplemented(HttpContext context) + { + throw new NotImplementedException(); + } + + private static void UseNotImplemented(IBuilder app) + { + app.Run(NotImplemented); + } + + [Fact] + public void NullArguments_ArgumentNullException() + { + var builder = new Builder(serviceProvider: null); + var noMiddleware = new Builder(serviceProvider: null).Build(); + var noOptions = new MapOptions(); + // TODO: [NotNull] Assert.Throws(() => builder.Map(null, ActionNotImplemented)); + // TODO: [NotNull] Assert.Throws(() => builder.Map("/foo", (Action)null)); + // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(null, noOptions)); + // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(noMiddleware, null)); + } + + [Theory] + [InlineData("/foo", "", "/foo")] + [InlineData("/foo", "", "/foo/")] + [InlineData("/foo", "/Bar", "/foo")] + [InlineData("/foo", "/Bar", "/foo/cho")] + [InlineData("/foo", "/Bar", "/foo/cho/")] + [InlineData("/foo/cho", "/Bar", "/foo/cho")] + [InlineData("/foo/cho", "/Bar", "/foo/cho/do")] + public void PathMatchFunc_BranchTaken(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath, context.Request.PathBase.Value); + Assert.Equal(requestPath, context.Request.Path.Value); + } + + [Theory] + [InlineData("/foo", "", "/foo")] + [InlineData("/foo", "", "/foo/")] + [InlineData("/foo", "/Bar", "/foo")] + [InlineData("/foo", "/Bar", "/foo/cho")] + [InlineData("/foo", "/Bar", "/foo/cho/")] + [InlineData("/foo/cho", "/Bar", "/foo/cho")] + [InlineData("/foo/cho", "/Bar", "/foo/cho/do")] + public void PathMatchAction_BranchTaken(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath + matchPath, context.Items["test.PathBase"]); + Assert.Equal(requestPath.Substring(matchPath.Length), context.Items["test.Path"]); + } + + [Theory] + [InlineData("/")] + [InlineData("/foo/")] + [InlineData("/foo/cho/")] + public void MatchPathWithTrailingSlashThrowsException(string matchPath) + { + Should.Throw(() => new Builder(serviceProvider: null).Map(matchPath, map => { }).Build()); + } + + [Theory] + [InlineData("/foo", "", "")] + [InlineData("/foo", "/bar", "")] + [InlineData("/foo", "", "/bar")] + [InlineData("/foo", "/foo", "")] + [InlineData("/foo", "/foo", "/bar")] + [InlineData("/foo", "", "/bar/foo")] + [InlineData("/foo/bar", "/foo", "/bar")] + public void PathMismatchFunc_PassedThrough(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath, context.Request.PathBase.Value); + Assert.Equal(requestPath, context.Request.Path.Value); + } + + [Theory] + [InlineData("/foo", "", "")] + [InlineData("/foo", "/bar", "")] + [InlineData("/foo", "", "/bar")] + [InlineData("/foo", "/foo", "")] + [InlineData("/foo", "/foo", "/bar")] + [InlineData("/foo", "", "/bar/foo")] + [InlineData("/foo/bar", "/foo", "/bar")] + public void PathMismatchAction_PassedThrough(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath, context.Request.PathBase.Value); + Assert.Equal(requestPath, context.Request.Path.Value); + } + + [Fact] + public void ChainedRoutes_Success() + { + IBuilder builder = new Builder(serviceProvider: null); + builder.Map("/route1", map => + { + map.Map((string)"/subroute1", UseSuccess); + map.Run(NotImplemented); + }); + builder.Map("/route2/subroute2", UseSuccess); + var app = builder.Build(); + + HttpContext context = CreateRequest(string.Empty, "/route1"); + Assert.Throws(() => app.Invoke(context).Wait()); + + context = CreateRequest(string.Empty, "/route1/subroute1"); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route1/subroute1", context.Request.Path.Value); + + context = CreateRequest(string.Empty, "/route2"); + app.Invoke(context).Wait(); + Assert.Equal(404, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route2", context.Request.Path.Value); + + context = CreateRequest(string.Empty, "/route2/subroute2"); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route2/subroute2", context.Request.Path.Value); + + context = CreateRequest(string.Empty, "/route2/subroute2/subsub2"); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route2/subroute2/subsub2", context.Request.Path.Value); + } + + private HttpContext CreateRequest(string basePath, string requestPath) + { + HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); + context.SetFeature(new FakeHttpRequestInfo()); + context.SetFeature(new FakeHttpResponseInfo()); + context.Request.PathBase = new PathString(basePath); + context.Request.Path = new PathString(requestPath); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs new file mode 100644 index 0000000000..689d30ab76 --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -0,0 +1,183 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Xunit; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + using AppFunc = Func, Task>; + using Predicate = Func; + using PredicateAsync = Func>; + + public class MapPredicateMiddlewareTests + { + private static readonly Predicate NotImplementedPredicate = new Predicate(envionment => { throw new NotImplementedException(); }); + private static readonly PredicateAsync NotImplementedPredicateAsync = new PredicateAsync(envionment => { throw new NotImplementedException(); }); + + private static Task Success(HttpContext context) + { + context.Response.StatusCode = 200; + return Task.FromResult(null); + } + + private static void UseSuccess(IBuilder app) + { + app.Run(Success); + } + + private static Task NotImplemented(HttpContext context) + { + throw new NotImplementedException(); + } + + private static void UseNotImplemented(IBuilder app) + { + app.Run(NotImplemented); + } + + private bool TruePredicate(HttpContext context) + { + return true; + } + + private bool FalsePredicate(HttpContext context) + { + return false; + } + + private Task TruePredicateAsync(HttpContext context) + { + return Task.FromResult(true); + } + + private Task FalsePredicateAsync(HttpContext context) + { + return Task.FromResult(false); + } + + [Fact] + public void NullArguments_ArgumentNullException() + { + var builder = new Builder(serviceProvider: null); + var noMiddleware = new Builder(serviceProvider: null).Build(); + var noOptions = new MapWhenOptions(); + // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); + // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, (Action)null)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + + // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(null, UseNotImplemented)); + // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(NotImplementedPredicateAsync, (Action)null)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + } + + [Fact] + public void PredicateTrue_BranchTaken() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(TruePredicate, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateTrueAction_BranchTaken() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(TruePredicate, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateFalseAction_PassThrough() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(FalsePredicate, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateAsyncTrueAction_BranchTaken() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhenAsync(TruePredicateAsync, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateAsyncFalseAction_PassThrough() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhenAsync(FalsePredicateAsync, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void ChainedPredicates_Success() + { + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(TruePredicate, map1 => + { + map1.MapWhen((Predicate)FalsePredicate, UseNotImplemented); + map1.MapWhen((Predicate)TruePredicate, map2 => map2.MapWhen((Predicate)TruePredicate, UseSuccess)); + map1.Run(NotImplemented); + }); + var app = builder.Build(); + + HttpContext context = CreateRequest(); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void ChainedPredicatesAsync_Success() + { + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhenAsync(TruePredicateAsync, map1 => + { + map1.MapWhenAsync((PredicateAsync)FalsePredicateAsync, UseNotImplemented); + map1.MapWhenAsync((PredicateAsync)TruePredicateAsync, map2 => map2.MapWhenAsync((PredicateAsync)TruePredicateAsync, UseSuccess)); + map1.Run(NotImplemented); + }); + var app = builder.Build(); + + HttpContext context = CreateRequest(); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + } + + private HttpContext CreateRequest() + { + HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); + context.SetFeature(new FakeHttpRequestInfo()); + context.SetFeature(new FakeHttpResponseInfo()); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj index e8a380615a..8b42411360 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj +++ b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj @@ -21,6 +21,9 @@ + + + diff --git a/test/Microsoft.AspNet.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Abstractions.Tests/project.json index 110d62bb6d..5a3029b789 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Abstractions.Tests/project.json @@ -2,6 +2,8 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Testing": "0.1-alpha-*", "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", From 98f4212915fb5c6ac615b0b21fca43dba6f5127c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 30 Apr 2014 10:53:33 -0700 Subject: [PATCH 086/846] #20 - Add Use extension for inline middleware. --- .../Extensions/UseExtensions.cs | 27 +++++++++++++++++++ .../Microsoft.AspNet.Abstractions.kproj | 1 + 2 files changed, 28 insertions(+) create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs new file mode 100644 index 0000000000..698b19ca5c --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs @@ -0,0 +1,27 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet +{ + public static class UseExtensions + { + /// + /// Use middleware defined in-line. + /// + /// + /// A function that handles the request or calls the given next function. + /// + public static IBuilder Use(this IBuilder app, Func, Task> middleware) + { + return app.Use(next => + { + return context => + { + Func simpleNext = () => next(context); + return middleware(context, simpleNext); + }; + }); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj index 83c250addc..0b62b9b387 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -28,6 +28,7 @@ + From ce0e1128d59ba9b4528f90d630b7cd4b5d425fe8 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 30 Apr 2014 11:46:23 -0700 Subject: [PATCH 087/846] Make HTTP feature interfaces assembly neutral --- .../AssemblyNeutralAttribute.cs | 10 ++++++++++ .../IHttpApplicationInformation.cs | 2 ++ src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs | 5 ++++- src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs | 2 ++ .../IHttpRequestInformation.cs | 2 ++ .../IHttpRequestLifetime.cs | 2 ++ .../IHttpResponseInformation.cs | 2 ++ src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs | 2 ++ .../IHttpTransportLayerSecurity.cs | 3 ++- .../IHttpWebSocketAccept.cs | 2 ++ .../Security/IAuthTypeContext.cs | 2 ++ .../Security/IAuthenticateContext.cs | 2 ++ .../Security/IAuthenticationHandler.cs | 2 ++ .../Security/IChallengeContext.cs | 2 ++ .../Security/IHttpAuthentication.cs | 2 ++ .../Security/ISignInContext.cs | 2 ++ .../Security/ISignOutContext .cs | 2 ++ 17 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs new file mode 100644 index 0000000000..1aa358ee9f --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace Microsoft.Net.Runtime +{ + [AssemblyNeutralAttribute] + [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] + public sealed class AssemblyNeutralAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs index 37dea109ab..92100273e2 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -1,7 +1,9 @@ using System.Threading; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpApplicationInformation { string AppName { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs index e13fde6988..5a996c4299 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -1,5 +1,8 @@ -namespace Microsoft.AspNet.HttpFeature +using Microsoft.Net.Runtime; + +namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpBuffering { void DisableRequestBuffering(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index 3598c015f1..73a76ffbf0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,7 +1,9 @@ using System.Net; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpConnection { IPAddress RemoteIpAddress { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs index a293218830..b223d151e4 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpRequestInformation { string Protocol { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs index 3ea7a0ee34..41728c5869 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs @@ -1,7 +1,9 @@ using System.Threading; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpRequestLifetime { CancellationToken OnRequestAborted { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs index ce0185c88e..090c0f9107 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpResponseInformation { int StatusCode { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs index f64ea29264..faeed5f775 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -1,8 +1,10 @@ using System.Threading; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpSendFile { Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index fd08f2b076..e759aef2b9 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,9 +1,10 @@ - using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpTransportLayerSecurity { X509Certificate ClientCertificate { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index d7b230df24..772dd96f32 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,9 +1,11 @@ #if NET45 using System.Net.WebSockets; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpWebSocketAccept { bool IsWebSocketRequest { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index e91797ceca..df9e9b4aca 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IAuthTypeContext { void Accept(IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index 7f617e08a2..dc26a4eeaf 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Security.Claims; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IAuthenticateContext { IList AuthenticationTypes { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 8a519b5de9..efc3a3b344 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IAuthenticationHandler { void GetDescriptions(IAuthTypeContext context); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index 2707c6c63d..d684fe7542 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IChallengeContext { IList AuthenticationTypes {get;} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index d1a7c16596..0d24c184f7 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,7 +1,9 @@ using System.Security.Claims; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IHttpAuthentication { ClaimsPrincipal User { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index cb78f661b2..0a57985f62 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Security.Claims; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface ISignInContext { IList Identities { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 9a1232ff3a..6a27a9e5ea 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface ISignOutContext { IList AuthenticationTypes { get; } From 35f921856f29c2c8adfda4871a0f1f58afeab16d Mon Sep 17 00:00:00 2001 From: anpete Date: Thu, 1 May 2014 17:39:31 -0700 Subject: [PATCH 088/846] Update file headers --- .../CookieOptions.cs | 19 ++++++++++++++++++- .../Extensions/MapExtensions.cs | 19 ++++++++++++++++++- .../Extensions/MapMiddleware.cs | 19 ++++++++++++++++++- .../Extensions/MapOptions.cs | 18 +++++++++++++++++- .../Extensions/MapWhenExtensions.cs | 19 ++++++++++++++++++- .../Extensions/MapWhenMiddleware.cs | 19 ++++++++++++++++++- .../Extensions/MapWhenOptions.cs | 19 ++++++++++++++++++- .../Extensions/RunExtensions.cs | 19 ++++++++++++++++++- .../Extensions/UseExtensions.cs | 19 ++++++++++++++++++- .../HostString.cs | 19 ++++++++++++++++++- .../HttpContext.cs | 17 +++++++++++++++++ .../HttpRequest.cs | 19 ++++++++++++++++++- .../HttpResponse.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 17 +++++++++++++++++ .../IFormCollection.cs | 19 ++++++++++++++++++- .../IHeaderDictionary.cs | 19 ++++++++++++++++++- .../IReadableStringCollection.cs | 19 ++++++++++++++++++- .../IResponseCookies.cs | 18 +++++++++++++++++- .../IServerInformation.cs | 18 +++++++++++++++++- .../NotNullAttribute.cs | 19 ++++++++++++++++++- .../PathString.cs | 19 ++++++++++++++++++- .../QueryString.cs | 19 ++++++++++++++++++- .../RequestDelegate.cs | 17 +++++++++++++++++ .../Security/AuthenticateResult.cs | 17 ++++++++++++++++- .../Security/AuthenticationDescription.cs | 17 ++++++++++++++++- .../Security/AuthenticationProperties.cs | 17 ++++++++++++++++- .../FeatureCollection.cs | 19 ++++++++++++++++++- .../FeatureObject.cs | 19 ++++++++++++++++++- .../IFeatureCollection.cs | 19 ++++++++++++++++++- .../AssemblyNeutralAttribute.cs | 19 ++++++++++++++++++- .../IHttpApplicationInformation.cs | 17 +++++++++++++++++ .../IHttpBuffering.cs | 19 ++++++++++++++++++- .../IHttpConnection.cs | 17 +++++++++++++++++ .../IHttpRequestInformation.cs | 19 ++++++++++++++++++- .../IHttpRequestLifetime.cs | 19 ++++++++++++++++++- .../IHttpResponseInformation.cs | 19 ++++++++++++++++++- .../IHttpSendFile.cs | 17 +++++++++++++++++ .../IHttpTransportLayerSecurity.cs | 17 +++++++++++++++++ .../IHttpWebSocketAccept.cs | 17 +++++++++++++++++ .../Security/IAuthTypeContext.cs | 17 +++++++++++++++++ .../Security/IAuthenticateContext.cs | 17 +++++++++++++++++ .../Security/IAuthenticationHandler.cs | 19 ++++++++++++++++++- .../Security/IChallengeContext.cs | 17 +++++++++++++++++ .../Security/IHttpAuthentication.cs | 17 +++++++++++++++++ .../Security/ISignInContext.cs | 17 +++++++++++++++++ .../Security/ISignOutContext .cs | 17 +++++++++++++++++ .../ICanHasOwinEnvironment.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Owin/OwinConstants.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 19 ++++++++++++++++++- .../OwinFeatureCollection.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.PipelineCore/Builder.cs | 19 ++++++++++++++++++- .../Collections/FormCollection.cs | 19 ++++++++++++++++++- .../Collections/HeaderDictionary.cs | 19 ++++++++++++++++++- .../Collections/ItemsDictionary.cs | 19 ++++++++++++++++++- .../Collections/ReadableStringCollection.cs | 19 ++++++++++++++++++- .../Collections/RequestCookiesCollection.cs | 17 +++++++++++++++++ .../Collections/ResponseCookies.cs | 19 ++++++++++++++++++- .../DefaultCanHasForm.cs | 19 ++++++++++++++++++- .../DefaultCanHasItems.cs | 19 ++++++++++++++++++- .../DefaultCanHasQuery.cs | 19 ++++++++++++++++++- .../DefaultCanHasRequestCookies.cs | 19 ++++++++++++++++++- .../DefaultCanHasResponseCookies.cs | 19 ++++++++++++++++++- .../DefaultCanHasServiceProviders.cs | 19 ++++++++++++++++++- .../DefaultHttpContext.cs | 19 ++++++++++++++++++- .../DefaultHttpRequest.cs | 19 ++++++++++++++++++- .../DefaultHttpResponse.cs | 19 ++++++++++++++++++- .../ICanHasForm.cs | 19 ++++++++++++++++++- .../ICanHasItems.cs | 17 +++++++++++++++++ .../ICanHasQuery.cs | 17 +++++++++++++++++ .../ICanHasRequestCookies.cs | 19 ++++++++++++++++++- .../ICanHasResponseCookies.cs | 19 ++++++++++++++++++- .../ICanHasServiceProviders.cs | 19 ++++++++++++++++++- .../Infrastructure/Constants.cs | 17 ++++++++++++++++- .../Infrastructure/FeatureReference.cs | 19 ++++++++++++++++++- .../Infrastructure/ParsingHelpers.cs | 17 +++++++++++++++++ .../Security/AuthTypeContext.cs | 19 ++++++++++++++++++- .../Security/AuthenticateContext.cs | 19 ++++++++++++++++++- .../Security/ChallengeContext.cs | 19 ++++++++++++++++++- .../Security/DefaultHttpAuthentication.cs | 19 ++++++++++++++++++- .../Security/SignInContext.cs | 19 ++++++++++++++++++- .../Security/SignOutContext.cs | 19 ++++++++++++++++++- .../Fakes.cs | 18 +++++++++++++++++- .../MapPathMiddlewareTests.cs | 17 ++++++++++++++++- .../MapPredicateMiddlewareTests.cs | 17 ++++++++++++++++- .../PathStringTests.cs | 19 ++++++++++++++++++- .../IThing.cs | 19 ++++++++++++++++++- .../InterfaceDictionaryTests.cs | 19 ++++++++++++++++++- .../Properties/AssemblyInfo.cs | 17 +++++++++++++++++ .../Thing.cs | 19 ++++++++++++++++++- .../OwinEnvironmentTests.cs | 19 ++++++++++++++++++- .../OwinFeatureCollectionTests.cs | 19 ++++++++++++++++++- .../BuilderTests.cs | 19 ++++++++++++++++++- .../DefaultCanHasFormTests.cs | 19 ++++++++++++++++++- .../DefaultCanHasQueryTests.cs | 19 ++++++++++++++++++- .../DefaultHttpContextTests.cs | 19 ++++++++++++++++++- .../DefaultHttpRequestTests.cs | 19 ++++++++++++++++++- .../Properties/AssemblyInfo.cs | 17 +++++++++++++++++ 98 files changed, 1728 insertions(+), 78 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs index c8505cae1b..b7c0690cdd 100644 --- a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; namespace Microsoft.AspNet.Abstractions @@ -34,7 +51,7 @@ namespace Microsoft.AspNet.Abstractions public DateTime? Expires { get; set; } /// - /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)that is, over HTTPS only. + /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)�that is, over HTTPS only. /// /// true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. public bool Secure { get; set; } diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs index 72aa61bc97..2ecaa2898f 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Extensions; diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs index 9a2905ab1b..d1bd14ecbb 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs @@ -1,4 +1,21 @@ -using System.Threading.Tasks; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions.Extensions { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs index 43b479cbc4..4a9dcf1c90 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Abstractions.Extensions { /// diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs index aaad90ae74..2c088737a9 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Extensions; diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs index 597fec36b0..02ed400c42 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs @@ -1,4 +1,21 @@ -using System.Threading.Tasks; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions.Extensions { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs index 380e69ba57..56bd141044 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions.Extensions diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs index b03f4d288f..ae4082221a 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs index 698b19ca5c..ed90dc1ec7 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Abstractions/HostString.cs index 0847c7421e..246553a1d5 100644 --- a/src/Microsoft.AspNet.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Abstractions/HostString.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 81e44240c2..43690fe366 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index b4f563464b..452c4600c8 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.IO; using System.Threading; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 28814c747b..3766e872c7 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 13936e6773..7f913c4988 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs index 56862e6be6..444436049a 100644 --- a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.Abstractions +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.Abstractions { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs index 7039b8b87e..8f38346e36 100644 --- a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs index dc3f72c769..4aeb854c30 100644 --- a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs index 4358ad69ce..00a44ccaf0 100644 --- a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Abstractions { /// diff --git a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs index 47784e3782..5db85fd9cf 100644 --- a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs +++ b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Abstractions { // TODO: [AssemblyNeutral] diff --git a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs index 4a342de834..972c2e4aef 100644 --- a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.Abstractions { diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs index 07c6de5446..b722e8baee 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Linq; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index 5109294bb6..1188530052 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.Abstractions { diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs index 235b430713..951c668d9a 100644 --- a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs index 2fdc1ae241..812895a631 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs index 3c6f9a7994..8d3ad0c293 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs index 7eb707420b..cc793057d0 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 00d2a38e4f..96ce5a4a19 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Reflection; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index d937d09dc5..28028821cf 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Reflection; diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs index af70e6c2d7..220294ee88 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; namespace Microsoft.AspNet.FeatureModel diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs index 1aa358ee9f..7282be839b 100644 --- a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.Net.Runtime { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs index 92100273e2..23292385c1 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Threading; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs index 5a996c4299..815eeb7740 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -1,4 +1,21 @@ -using Microsoft.Net.Runtime; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index 73a76ffbf0..6678d7ca62 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Net; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs index b223d151e4..dbeaa70c48 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs index 41728c5869..8a242f4033 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs @@ -1,4 +1,21 @@ -using System.Threading; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading; using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs index 090c0f9107..282fed1705 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs index faeed5f775..2b59f99714 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Threading; using System.Threading.Tasks; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index e759aef2b9..ace42ab0ea 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index 772dd96f32..d13021e330 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + #if NET45 using System.Net.WebSockets; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index df9e9b4aca..13033b5f82 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index dc26a4eeaf..d230f16764 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using System.Security.Claims; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index efc3a3b344..942caa29a2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index d684fe7542..873ee856d9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index 0d24c184f7..e3eefb18a2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Security.Claims; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index 0a57985f62..d83e224bb4 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using System.Security.Claims; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 6a27a9e5ea..0a98bdbac8 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs index 49218e1115..45aa526a84 100644 --- a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index a54f04cccf..968c618000 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.Owin +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.Owin { internal static class OwinConstants { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 157d98ba86..15119e747d 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Globalization; diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index f96b6300c9..05078d6c8e 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 8dc7f3422f..be06f137d8 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Globalization; using System.IO; diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 7f4093b7bc..2b775fc4c3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index 7054d36350..7a9c41cbc3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index 8847fa66fc..620fddd26b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Linq; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index 5f4abca7c0..22e26e112c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -1,4 +1,21 @@ -using System.Collections; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index f06a8aa5a0..b8e70872df 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Abstractions.Infrastructure; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 40445bb31d..c2959cbe1d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 9963a7373f..f70ef385cf 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs index d7547eab2a..6b4a6143bc 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs @@ -1,4 +1,21 @@ -using System.IO; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs index 13513d3653..fdf10565b0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs index 9a3e45e5fb..2c53a4ceb2 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index 5aff939af5..b935db4cca 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index b695832694..99bcb5d6f9 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs index 58ccd6565d..f768aaa565 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 539319b868..1913a4fa07 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index b091197a70..f9bd84289b 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Globalization; using System.IO; using System.Threading; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 0b6fe2c349..bb125bd88e 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs index aba500a592..0003e6a773 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs @@ -1,4 +1,21 @@ -using System.Threading.Tasks; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs index d1adbf6030..59be854c23 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs index 570ef1c2d2..af2e66ce45 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs index 8bc138fbf5..976e2bdd99 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs index 87f0ecc87e..739f71a36a 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs index 77befcf990..17507634e8 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index cc92a10786..374c1af87d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. namespace Microsoft.AspNet.Abstractions.Infrastructure { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index ed76942784..cbcacc51d4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.FeatureModel; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.PipelineCore.Infrastructure { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 5f3f4f5bdb..a750fe5359 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index f4632607a4..dcefd97e6e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 9fa561372a..2ed6579ad8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index ed43ee31e2..103072565e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs index 519b1a6c5e..aef823d267 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs @@ -1,4 +1,21 @@ -using System.Security.Claims; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 690388dcc8..d211615e04 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 2d2814cd02..c24c41ac53 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using Microsoft.AspNet.HttpFeature.Security; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs index 0d4553e08a..225235c0ab 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using System.IO; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs index c6f8912747..5bc4f85ec9 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Threading.Tasks; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 689d30ab76..ad4223f9de 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs index 02ac73736d..171fa1caca 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Testing; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Testing; using Xunit; namespace Microsoft.AspNet.Abstractions diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs index 0a4a213540..1fb06e09b5 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.FeatureModel.Tests +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.FeatureModel.Tests { public interface IThing { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index a8f005ee07..97d36f5d35 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Xunit; namespace Microsoft.AspNet.FeatureModel.Tests diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index 8beefe2634..2494fa2308 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs index c99a8b1909..4144a0482c 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.FeatureModel.Tests +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.FeatureModel.Tests { public class Thing : IThing { diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index e84926c2f6..69737309a9 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index d6476c0a8a..b3bb3f68f4 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 4541585c1d..13044c0a29 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs index 967839793d..9d029071f2 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs @@ -1,4 +1,21 @@ -using System.IO; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs index 5bef67e18d..55e02e7560 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.FeatureModel; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 6701e62863..db800a6fff 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 801f4fb3a2..c78982b0df 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Abstractions; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs index ca7eab6695..1679842ad2 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; From ae3f7846f4b4dcfc9e83e503fe606e9529a6cf08 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 2 May 2014 14:45:20 -0700 Subject: [PATCH 089/846] Updating build scripts --- .gitignore | 1 + build.cmd | 3 +++ 2 files changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 8bc217058d..aba9c594d7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ PublishProfiles/ _ReSharper.* nuget.exe *net45.csproj +*net451.csproj *k10.csproj *.psess *.vsp diff --git a/build.cmd b/build.cmd index 7045ee1f84..2c32132fa3 100644 --- a/build.cmd +++ b/build.cmd @@ -18,6 +18,9 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion +CALL packages\KoreBuild\build\kvm install -svr50 -x86 +CALL packages\KoreBuild\build\kvm install -svrc50 -x86 :run +CALL packages\KoreBuild\build\kvm use default -svr50 -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From 73a8194005f5ef1fb800d8b7e953b765ce6492fa Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 2 May 2014 15:07:35 -0700 Subject: [PATCH 090/846] Updating build scripts --- build.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 2c32132fa3..903d532df3 100644 --- a/build.cmd +++ b/build.cmd @@ -18,8 +18,8 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -CALL packages\KoreBuild\build\kvm install -svr50 -x86 -CALL packages\KoreBuild\build\kvm install -svrc50 -x86 +CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 +CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 :run CALL packages\KoreBuild\build\kvm use default -svr50 -x86 From f11e62d0ef4c44a27190bc11f905de4e263816a6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 10:20:46 -0700 Subject: [PATCH 091/846] Update reflection dependency. --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 7d3092564d..8fda7d4cff 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -8,7 +8,7 @@ "System.Collections": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", - "System.Reflection.Compatibility": "4.0.0.0", + "System.Reflection.TypeExtensions": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", "System.Threading": "4.0.0.0" From 7fd80850eef4852b714eaf89a7286c066069bddd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 14:33:41 -0700 Subject: [PATCH 092/846] Rename all feature interfaces to I*Feature. --- ...ormation.cs => IHttpApplicationFeature.cs} | 2 +- ...pBuffering.cs => IHttpBufferingFeature.cs} | 2 +- ...onnection.cs => IHttpConnectionFeature.cs} | 2 +- ...tInformation.cs => IHttpRequestFeature.cs} | 8 +-- ...time.cs => IHttpRequestLifetimeFeature.cs} | 2 +- ...Information.cs => IHttpResponseFeature.cs} | 2 +- ...ttpSendFile.cs => IHttpSendFileFeature.cs} | 2 +- ... => IHttpTransportLayerSecurityFeature.cs} | 2 +- ...cketAccept.cs => IHttpWebSocketFeature.cs} | 2 +- .../Microsoft.AspNet.HttpFeature.kproj | 21 +++--- ...ation.cs => IHttpAuthenticationFeature.cs} | 2 +- ...ironment.cs => IOwinEnvironmentFeature.cs} | 2 +- .../Microsoft.AspNet.Owin.kproj | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 42 +++++------ src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- .../OwinFeatureCollection.cs | 72 +++++++++---------- .../DefaultHttpContext.cs | 54 +++++++------- .../DefaultHttpRequest.cs | 66 ++++++++--------- .../DefaultHttpResponse.cs | 46 ++++++------ .../{DefaultCanHasForm.cs => FormFeature.cs} | 6 +- .../{ICanHasForm.cs => IFormFeature.cs} | 2 +- .../{ICanHasItems.cs => IItemsFeature.cs} | 2 +- .../{ICanHasQuery.cs => IQueryFeature.cs} | 2 +- ...stCookies.cs => IRequestCookiesFeature.cs} | 2 +- ...eCookies.cs => IResponseCookiesFeature.cs} | 2 +- ...oviders.cs => IServiceProvidersFeature.cs} | 2 +- ...{DefaultCanHasItems.cs => ItemsFeature.cs} | 4 +- .../Microsoft.AspNet.PipelineCore.kproj | 26 +++---- ...{DefaultCanHasQuery.cs => QueryFeature.cs} | 6 +- ...estCookies.cs => RequestCookiesFeature.cs} | 6 +- ...seCookies.cs => ResponseCookiesFeature.cs} | 6 +- ...cation.cs => HttpAuthenticationFeature.cs} | 4 +- ...roviders.cs => ServiceProvidersFeature.cs} | 2 +- .../Fakes.cs | 4 +- .../MapPathMiddlewareTests.cs | 4 +- .../MapPredicateMiddlewareTests.cs | 4 +- .../OwinEnvironmentTests.cs | 10 +-- .../OwinFeatureCollectionTests.cs | 6 +- .../DefaultHttpContextTests.cs | 4 +- .../DefaultHttpRequestTests.cs | 4 +- ...CanHasFormTests.cs => FormFeatureTests.cs} | 14 ++-- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 4 +- ...nHasQueryTests.cs => QueryFeatureTests.cs} | 8 +-- 43 files changed, 231 insertions(+), 236 deletions(-) rename src/Microsoft.AspNet.HttpFeature/{IHttpApplicationInformation.cs => IHttpApplicationFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpBuffering.cs => IHttpBufferingFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpConnection.cs => IHttpConnectionFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpRequestInformation.cs => IHttpRequestFeature.cs} (89%) rename src/Microsoft.AspNet.HttpFeature/{IHttpRequestLifetime.cs => IHttpRequestLifetimeFeature.cs} (94%) rename src/Microsoft.AspNet.HttpFeature/{IHttpResponseInformation.cs => IHttpResponseFeature.cs} (96%) rename src/Microsoft.AspNet.HttpFeature/{IHttpSendFile.cs => IHttpSendFileFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpTransportLayerSecurity.cs => IHttpTransportLayerSecurityFeature.cs} (94%) rename src/Microsoft.AspNet.HttpFeature/{IHttpWebSocketAccept.cs => IHttpWebSocketFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/Security/{IHttpAuthentication.cs => IHttpAuthenticationFeature.cs} (95%) rename src/Microsoft.AspNet.Owin/{ICanHasOwinEnvironment.cs => IOwinEnvironmentFeature.cs} (94%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasForm.cs => FormFeature.cs} (89%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasForm.cs => IFormFeature.cs} (96%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasItems.cs => IItemsFeature.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasQuery.cs => IQueryFeature.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasRequestCookies.cs => IRequestCookiesFeature.cs} (94%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasResponseCookies.cs => IResponseCookiesFeature.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasServiceProviders.cs => IServiceProvidersFeature.cs} (94%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasItems.cs => ItemsFeature.cs} (91%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasQuery.cs => QueryFeature.cs} (87%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasRequestCookies.cs => RequestCookiesFeature.cs} (88%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasResponseCookies.cs => ResponseCookiesFeature.cs} (84%) rename src/Microsoft.AspNet.PipelineCore/Security/{DefaultHttpAuthentication.cs => HttpAuthenticationFeature.cs} (90%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasServiceProviders.cs => ServiceProvidersFeature.cs} (92%) rename test/Microsoft.AspNet.PipelineCore.Tests/{DefaultCanHasFormTests.cs => FormFeatureTests.cs} (88%) rename test/Microsoft.AspNet.PipelineCore.Tests/{DefaultCanHasQueryTests.cs => QueryFeatureTests.cs} (87%) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs index 23292385c1..218b8732f6 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpApplicationInformation + public interface IHttpApplicationFeature { string AppName { get; set; } string AppMode { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs index 815eeb7740..84c9f5b885 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs @@ -20,7 +20,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpBuffering + public interface IHttpBufferingFeature { void DisableRequestBuffering(); void DisableResponseBuffering(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs index 6678d7ca62..1cb3cc12fa 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpConnection + public interface IHttpConnectionFeature { IPAddress RemoteIpAddress { get; set; } IPAddress LocalIpAddress { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs index dbeaa70c48..cad2c7ccf0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs @@ -23,7 +23,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpRequestInformation + public interface IHttpRequestFeature { string Protocol { get; set; } string Scheme { get; set; } @@ -33,11 +33,5 @@ namespace Microsoft.AspNet.HttpFeature string QueryString { get; set; } IDictionary Headers { get; set; } Stream Body { get; set; } - // FURI: Uri Uri { get; } - } - - public interface ICanHasSession - { - } } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs similarity index 94% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index 8a242f4033..19956ea09f 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpRequestLifetime + public interface IHttpRequestLifetimeFeature { CancellationToken OnRequestAborted { get; } void Abort(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs similarity index 96% rename from src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index 282fed1705..afd1cdebca 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -23,7 +23,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpResponseInformation + public interface IHttpResponseFeature { int StatusCode { get; set; } string ReasonPhrase { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs index 2b59f99714..f53ca06c07 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs @@ -22,7 +22,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpSendFile + public interface IHttpSendFileFeature { Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs similarity index 94% rename from src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs index ace42ab0ea..8e7f9a5f1b 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs @@ -22,7 +22,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpTransportLayerSecurity + public interface IHttpTransportLayerSecurityFeature { X509Certificate ClientCertificate { get; set; } Task LoadAsync(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index d13021e330..8b2013652f 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -23,7 +23,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpWebSocketAccept + public interface IHttpWebSocketFeature { bool IsWebSocketRequest { get; set; } Task AcceptAsync(); diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 96973626c9..2fef2807ae 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -20,20 +20,21 @@ - - - - - - - - - + + + + + + + + + + - + diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs rename to src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs index e3eefb18a2..b18bd0ea3f 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { [AssemblyNeutral] - public interface IHttpAuthentication + public interface IHttpAuthenticationFeature { ClaimsPrincipal User { get; set; } IAuthenticationHandler Handler { get; set; } diff --git a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs rename to src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs index 45aa526a84..45455159e3 100644 --- a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs @@ -19,7 +19,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Owin { - public interface ICanHasOwinEnvironment + public interface IOwinEnvironmentFeature { IDictionary Environment { get; set; } } diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 210e9491a3..37d5045224 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -20,7 +20,7 @@ - + diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 15119e747d..5ad850ead3 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -42,41 +42,41 @@ namespace Microsoft.AspNet.Owin _context = context; _entries = new Dictionary() { - { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, - { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, - { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, - { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, - { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, - { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, + { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, + { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, + { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, + { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, - { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, - { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, + { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, + { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, - { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), + { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, - { OwinConstants.CommonKeys.RemotePort, new FeatureMap(feature => feature.RemotePort.ToString(CultureInfo.InvariantCulture), + { OwinConstants.CommonKeys.RemotePort, new FeatureMap(feature => feature.RemotePort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.RemotePort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, - { OwinConstants.CommonKeys.LocalIpAddress, new FeatureMap(feature => feature.LocalIpAddress.ToString(), + { OwinConstants.CommonKeys.LocalIpAddress, new FeatureMap(feature => feature.LocalIpAddress.ToString(), (feature, value) => feature.LocalIpAddress = IPAddress.Parse(Convert.ToString(value))) }, - { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), + { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), (feature, value) => feature.RemoteIpAddress = IPAddress.Parse(Convert.ToString(value))) }, - { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, + { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, - { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, + { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, }; if (context.Request.IsSecure) { - _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 05078d6c8e..4a4d80d177 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -83,7 +83,7 @@ namespace Microsoft.AspNet { var app = middleware(httpContext => { - return next(httpContext.GetFeature().Environment); + return next(httpContext.GetFeature().Environment); }); return env => diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index be06f137d8..4c6483ffcb 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -34,12 +34,12 @@ namespace Microsoft.AspNet.Owin public class OwinFeatureCollection : IFeatureCollection, - IHttpRequestInformation, - IHttpResponseInformation, - IHttpConnection, - IHttpSendFile, - IHttpTransportLayerSecurity, - ICanHasOwinEnvironment + IHttpRequestFeature, + IHttpResponseFeature, + IHttpConnectionFeature, + IHttpSendFileFeature, + IHttpTransportLayerSecurityFeature, + IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -63,79 +63,79 @@ namespace Microsoft.AspNet.Owin Environment[key] = value; } - string IHttpRequestInformation.Protocol + string IHttpRequestFeature.Protocol { get { return Prop(OwinConstants.RequestProtocol); } set { Prop(OwinConstants.RequestProtocol, value); } } - string IHttpRequestInformation.Scheme + string IHttpRequestFeature.Scheme { get { return Prop(OwinConstants.RequestScheme); } set { Prop(OwinConstants.RequestScheme, value); } } - string IHttpRequestInformation.Method + string IHttpRequestFeature.Method { get { return Prop(OwinConstants.RequestMethod); } set { Prop(OwinConstants.RequestMethod, value); } } - string IHttpRequestInformation.PathBase + string IHttpRequestFeature.PathBase { get { return Prop(OwinConstants.RequestPathBase); } set { Prop(OwinConstants.RequestPathBase, value); } } - string IHttpRequestInformation.Path + string IHttpRequestFeature.Path { get { return Prop(OwinConstants.RequestPath); } set { Prop(OwinConstants.RequestPath, value); } } - string IHttpRequestInformation.QueryString + string IHttpRequestFeature.QueryString { get { return Prop(OwinConstants.RequestQueryString); } set { Prop(OwinConstants.RequestQueryString, value); } } - IDictionary IHttpRequestInformation.Headers + IDictionary IHttpRequestFeature.Headers { get { return Prop>(OwinConstants.RequestHeaders); } set { Prop(OwinConstants.RequestHeaders, value); } } - Stream IHttpRequestInformation.Body + Stream IHttpRequestFeature.Body { get { return Prop(OwinConstants.RequestBody); } set { Prop(OwinConstants.RequestBody, value); } } - int IHttpResponseInformation.StatusCode + int IHttpResponseFeature.StatusCode { get { return Prop(OwinConstants.ResponseStatusCode); } set { Prop(OwinConstants.ResponseStatusCode, value); } } - string IHttpResponseInformation.ReasonPhrase + string IHttpResponseFeature.ReasonPhrase { get { return Prop(OwinConstants.ResponseReasonPhrase); } set { Prop(OwinConstants.ResponseReasonPhrase, value); } } - IDictionary IHttpResponseInformation.Headers + IDictionary IHttpResponseFeature.Headers { get { return Prop>(OwinConstants.ResponseHeaders); } set { Prop(OwinConstants.ResponseHeaders, value); } } - Stream IHttpResponseInformation.Body + Stream IHttpResponseFeature.Body { get { return Prop(OwinConstants.ResponseBody); } set { Prop(OwinConstants.ResponseBody, value); } } - void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) + void IHttpResponseFeature.OnSendingHeaders(Action callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); if (register == null) @@ -145,31 +145,31 @@ namespace Microsoft.AspNet.Owin register(callback, state); } - IPAddress IHttpConnection.RemoteIpAddress + IPAddress IHttpConnectionFeature.RemoteIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } } - IPAddress IHttpConnection.LocalIpAddress + IPAddress IHttpConnectionFeature.LocalIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } } - int IHttpConnection.RemotePort + int IHttpConnectionFeature.RemotePort { get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } } - int IHttpConnection.LocalPort + int IHttpConnectionFeature.LocalPort { get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } } - bool IHttpConnection.IsLocal + bool IHttpConnectionFeature.IsLocal { get { return Prop(OwinConstants.CommonKeys.IsLocal); } set { Prop(OwinConstants.CommonKeys.LocalPort, value); } @@ -184,7 +184,7 @@ namespace Microsoft.AspNet.Owin } } - Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + Task IHttpSendFileFeature.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) { object obj; if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) @@ -200,7 +200,7 @@ namespace Microsoft.AspNet.Owin get { object obj; - if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) + if (string.Equals("https", ((IHttpRequestFeature)this).Scheme, StringComparison.OrdinalIgnoreCase) && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) && obj != null) @@ -211,13 +211,13 @@ namespace Microsoft.AspNet.Owin } } - X509Certificate IHttpTransportLayerSecurity.ClientCertificate + X509Certificate IHttpTransportLayerSecurityFeature.ClientCertificate { get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpTransportLayerSecurity.LoadAsync() + Task IHttpTransportLayerSecurityFeature.LoadAsync() { throw new NotImplementedException(); } @@ -238,11 +238,11 @@ namespace Microsoft.AspNet.Owin if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) { // Check for conditional features - if (key == typeof(IHttpSendFile)) + if (key == typeof(IHttpSendFileFeature)) { return SupportsSendFile; } - else if (key == typeof(IHttpTransportLayerSecurity)) + else if (key == typeof(IHttpTransportLayerSecurityFeature)) { return SupportsClientCerts; } @@ -259,18 +259,18 @@ namespace Microsoft.AspNet.Owin { var keys = new List() { - typeof(IHttpRequestInformation), - typeof(IHttpResponseInformation), - typeof(IHttpConnection), - typeof(ICanHasOwinEnvironment), + typeof(IHttpRequestFeature), + typeof(IHttpResponseFeature), + typeof(IHttpConnectionFeature), + typeof(IOwinEnvironmentFeature), }; if (SupportsSendFile) { - keys.Add(typeof(IHttpSendFile)); + keys.Add(typeof(IHttpSendFileFeature)); } if (SupportsClientCerts) { - keys.Add(typeof(IHttpTransportLayerSecurity)); + keys.Add(typeof(IHttpTransportLayerSecurityFeature)); } return keys; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 1913a4fa07..ad4f3902a9 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -36,10 +36,10 @@ namespace Microsoft.AspNet.PipelineCore private readonly HttpRequest _request; private readonly HttpResponse _response; - private FeatureReference _canHasItems; - private FeatureReference _canHasServiceProviders; - private FeatureReference _authentication; - private FeatureReference _lifetime; + private FeatureReference _items; + private FeatureReference _serviceProviders; + private FeatureReference _authentication; + private FeatureReference _lifetime; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -48,27 +48,27 @@ namespace Microsoft.AspNet.PipelineCore _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _canHasItems = FeatureReference.Default; - _canHasServiceProviders = FeatureReference.Default; - _authentication = FeatureReference.Default; + _items = FeatureReference.Default; + _serviceProviders = FeatureReference.Default; + _authentication = FeatureReference.Default; } - ICanHasItems CanHasItems + IItemsFeature ItemsFeature { - get { return _canHasItems.Fetch(_features) ?? _canHasItems.Update(_features, new DefaultCanHasItems()); } + get { return _items.Fetch(_features) ?? _items.Update(_features, new ItemsFeature()); } } - ICanHasServiceProviders CanHasServiceProviders + IServiceProvidersFeature ServiceProvidersFeature { - get { return _canHasServiceProviders.Fetch(_features) ?? _canHasServiceProviders.Update(_features, new DefaultCanHasServiceProviders()); } + get { return _serviceProviders.Fetch(_features) ?? _serviceProviders.Update(_features, new ServiceProvidersFeature()); } } - private IHttpAuthentication HttpAuthentication + private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } } - private IHttpRequestLifetime Lifetime + private IHttpRequestLifetimeFeature LifetimeFeature { get { return _lifetime.Fetch(_features); } } @@ -81,32 +81,32 @@ namespace Microsoft.AspNet.PipelineCore { get { - var user = HttpAuthentication.User; + var user = HttpAuthenticationFeature.User; if (user == null) { user = new ClaimsPrincipal(new ClaimsIdentity()); - HttpAuthentication.User = user; + HttpAuthenticationFeature.User = user; } return user; } - set { HttpAuthentication.User = value; } + set { HttpAuthenticationFeature.User = value; } } public override IDictionary Items { - get { return CanHasItems.Items; } + get { return ItemsFeature.Items; } } public override IServiceProvider ApplicationServices { - get { return CanHasServiceProviders.ApplicationServices; } - set { CanHasServiceProviders.ApplicationServices = value; } + get { return ServiceProvidersFeature.ApplicationServices; } + set { ServiceProvidersFeature.ApplicationServices = value; } } public override IServiceProvider RequestServices { - get { return CanHasServiceProviders.RequestServices; } - set { CanHasServiceProviders.RequestServices = value; } + get { return ServiceProvidersFeature.RequestServices; } + set { ServiceProvidersFeature.RequestServices = value; } } public int Revision { get { return _features.Revision; } } @@ -115,7 +115,7 @@ namespace Microsoft.AspNet.PipelineCore { get { - var lifetime = Lifetime; + var lifetime = LifetimeFeature; if (lifetime != null) { return lifetime.OnRequestAborted; @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.PipelineCore public override void Abort() { - var lifetime = Lifetime; + var lifetime = LifetimeFeature; if (lifetime != null) { lifetime.Abort(); @@ -152,7 +152,7 @@ namespace Microsoft.AspNet.PipelineCore public override IEnumerable GetAuthenticationTypes() { - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; if (handler == null) { return new AuthenticationDescription[0]; @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); if (handler != null) @@ -193,7 +193,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); if (handler != null) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index f9bd84289b..602f6bebfb 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -34,12 +34,12 @@ namespace Microsoft.AspNet.PipelineCore private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; - private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _transportLayerSecurity = FeatureReference.Default; - private FeatureReference _canHasQuery = FeatureReference.Default; - private FeatureReference _canHasForm = FeatureReference.Default; - private FeatureReference _canHasCookies = FeatureReference.Default; + private FeatureReference _request = FeatureReference.Default; + private FeatureReference _connection = FeatureReference.Default; + private FeatureReference _transportLayerSecurity = FeatureReference.Default; + private FeatureReference _query = FeatureReference.Default; + private FeatureReference _form = FeatureReference.Default; + private FeatureReference _cookies = FeatureReference.Default; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) { @@ -47,54 +47,54 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - private IHttpRequestInformation HttpRequestInformation + private IHttpRequestFeature HttpRequestFeature { get { return _request.Fetch(_features); } } - private IHttpConnection HttpConnection + private IHttpConnectionFeature HttpConnectionFeature { get { return _connection.Fetch(_features); } } - private IHttpTransportLayerSecurity HttpTransportLayerSecurity + private IHttpTransportLayerSecurityFeature HttpTransportLayerSecurityFeature { get { return _transportLayerSecurity.Fetch(_features); } } - private ICanHasQuery CanHasQuery + private IQueryFeature QueryFeature { - get { return _canHasQuery.Fetch(_features) ?? _canHasQuery.Update(_features, new DefaultCanHasQuery(_features)); } + get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); } } - private ICanHasForm CanHasForm + private IFormFeature FormFeature { - get { return _canHasForm.Fetch(_features) ?? _canHasForm.Update(_features, new DefaultCanHasForm(_features)); } + get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(_features)); } } - private ICanHasRequestCookies CanHasRequestCookies + private IRequestCookiesFeature RequestCookiesFeature { - get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasRequestCookies(_features)); } + get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new RequestCookiesFeature(_features)); } } public override HttpContext HttpContext { get { return _context; } } public override PathString PathBase { - get { return new PathString(HttpRequestInformation.PathBase); } - set { HttpRequestInformation.PathBase = value.Value; } + get { return new PathString(HttpRequestFeature.PathBase); } + set { HttpRequestFeature.PathBase = value.Value; } } public override PathString Path { - get { return new PathString(HttpRequestInformation.Path); } - set { HttpRequestInformation.Path = value.Value; } + get { return new PathString(HttpRequestFeature.Path); } + set { HttpRequestFeature.Path = value.Value; } } public override QueryString QueryString { - get { return new QueryString(HttpRequestInformation.QueryString); } - set { HttpRequestInformation.QueryString = value.Value; } + get { return new QueryString(HttpRequestFeature.QueryString); } + set { HttpRequestFeature.QueryString = value.Value; } } public override long? ContentLength @@ -111,20 +111,20 @@ namespace Microsoft.AspNet.PipelineCore public override Stream Body { - get { return HttpRequestInformation.Body; } - set { HttpRequestInformation.Body = value; } + get { return HttpRequestFeature.Body; } + set { HttpRequestFeature.Body = value; } } public override string Method { - get { return HttpRequestInformation.Method; } - set { HttpRequestInformation.Method = value; } + get { return HttpRequestFeature.Method; } + set { HttpRequestFeature.Method = value; } } public override string Scheme { - get { return HttpRequestInformation.Scheme; } - set { HttpRequestInformation.Scheme = value; } + get { return HttpRequestFeature.Scheme; } + set { HttpRequestFeature.Scheme = value; } } public override bool IsSecure @@ -140,28 +140,28 @@ namespace Microsoft.AspNet.PipelineCore public override IReadableStringCollection Query { - get { return CanHasQuery.Query; } + get { return QueryFeature.Query; } } public override Task GetFormAsync() { - return CanHasForm.GetFormAsync(); + return FormFeature.GetFormAsync(); } public override string Protocol { - get { return HttpRequestInformation.Protocol; } - set { HttpRequestInformation.Protocol = value; } + get { return HttpRequestFeature.Protocol; } + set { HttpRequestFeature.Protocol = value; } } public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpRequestInformation.Headers); } + get { return new HeaderDictionary(HttpRequestFeature.Headers); } } public override IReadableStringCollection Cookies { - get { return CanHasRequestCookies.Cookies; } + get { return RequestCookiesFeature.Cookies; } } public override System.Threading.CancellationToken CallCanceled diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index bb125bd88e..7075b69663 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -38,9 +38,9 @@ namespace Microsoft.AspNet.PipelineCore { private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _response = FeatureReference.Default; - private FeatureReference _canHasCookies = FeatureReference.Default; - private FeatureReference _authentication = FeatureReference.Default; + private FeatureReference _response = FeatureReference.Default; + private FeatureReference _cookies = FeatureReference.Default; + private FeatureReference _authentication = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -48,38 +48,38 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - private IHttpResponseInformation HttpResponseInformation + private IHttpResponseFeature HttpResponseFeature { get { return _response.Fetch(_features); } } - private ICanHasResponseCookies CanHasResponseCookies + private IResponseCookiesFeature ResponseCookiesFeature { - get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasResponseCookies(_features)); } + get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); } } - private IHttpAuthentication HttpAuthentication + private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } } public override HttpContext HttpContext { get { return _context; } } public override int StatusCode { - get { return HttpResponseInformation.StatusCode; } - set { HttpResponseInformation.StatusCode = value; } + get { return HttpResponseFeature.StatusCode; } + set { HttpResponseFeature.StatusCode = value; } } public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpResponseInformation.Headers); } + get { return new HeaderDictionary(HttpResponseFeature.Headers); } } public override Stream Body { - get { return HttpResponseInformation.Body; } - set { HttpResponseInformation.Body = value; } + get { return HttpResponseFeature.Body; } + set { HttpResponseFeature.Body = value; } } public override long? ContentLength @@ -105,34 +105,34 @@ namespace Microsoft.AspNet.PipelineCore { if (string.IsNullOrWhiteSpace(value)) { - HttpResponseInformation.Headers.Remove(Constants.Headers.ContentType); + HttpResponseFeature.Headers.Remove(Constants.Headers.ContentType); } else { - HttpResponseInformation.Headers[Constants.Headers.ContentType] = new[] { value }; + HttpResponseFeature.Headers[Constants.Headers.ContentType] = new[] { value }; } } } public override IResponseCookies Cookies { - get { return CanHasResponseCookies.Cookies; } + get { return ResponseCookiesFeature.Cookies; } } public override void OnSendingHeaders(Action callback, object state) { - HttpResponseInformation.OnSendingHeaders(callback, state); + HttpResponseFeature.OnSendingHeaders(callback, state); } public override void Redirect(string location, bool permanent) { if (permanent) { - HttpResponseInformation.StatusCode = 301; + HttpResponseFeature.StatusCode = 301; } else { - HttpResponseInformation.StatusCode = 302; + HttpResponseFeature.StatusCode = 302; } Headers.Set(Constants.Headers.Location, location); @@ -150,8 +150,8 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - HttpResponseInformation.StatusCode = 401; - var handler = HttpAuthentication.Handler; + HttpResponseFeature.StatusCode = 401; + var handler = HttpAuthenticationFeature.Handler; var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); if (handler != null) @@ -173,7 +173,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); if (handler != null) @@ -195,7 +195,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationTypes); if (handler != null) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs similarity index 89% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs rename to src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 6b4a6143bc..9613162d6f 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -26,14 +26,14 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasForm : ICanHasForm + public class FormFeature : IFormFeature { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private Stream _bodyStream; private IReadableStringCollection _form; - public DefaultCanHasForm(IFeatureCollection features) + public FormFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs similarity index 96% rename from src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs rename to src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 0003e6a773..f80d2c2713 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -20,7 +20,7 @@ using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasForm + public interface IFormFeature { Task GetFormAsync(); } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs rename to src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs index 59be854c23..30762add7b 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs @@ -19,7 +19,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasItems + public interface IItemsFeature { IDictionary Items { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs rename to src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index af2e66ce45..6dcaa1836e 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -19,7 +19,7 @@ using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasQuery + public interface IQueryFeature { IReadableStringCollection Query { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs similarity index 94% rename from src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs rename to src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index 976e2bdd99..8cfcd2cb40 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -19,7 +19,7 @@ using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasRequestCookies + public interface IRequestCookiesFeature { IReadableStringCollection Cookies { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs rename to src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index 739f71a36a..02a10ff95a 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -20,7 +20,7 @@ using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasResponseCookies + public interface IResponseCookiesFeature { IResponseCookies Cookies { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs similarity index 94% rename from src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs rename to src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs index 17507634e8..ed6dc1d77b 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs @@ -19,7 +19,7 @@ using System; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasServiceProviders + public interface IServiceProvidersFeature { IServiceProvider ApplicationServices { get; set; } IServiceProvider RequestServices { get; set; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs similarity index 91% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs rename to src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs index fdf10565b0..c5933f1d0f 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs @@ -19,9 +19,9 @@ using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasItems : ICanHasItems + public class ItemsFeature : IItemsFeature { - public DefaultCanHasItems() + public ItemsFeature() { Items = new ItemsDictionary(); } diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 9cf723fe9e..366ffd4df5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -27,28 +27,28 @@ - - - - - - + + + + + + - - - - - - + + + + + + - + diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs similarity index 87% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs rename to src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 2c53a4ceb2..994fa4b0e8 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -24,14 +24,14 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasQuery : ICanHasQuery + public class QueryFeature : IQueryFeature { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private FeatureReference _request = FeatureReference.Default; private string _queryString; private IReadableStringCollection _query; - public DefaultCanHasQuery(IFeatureCollection features) + public QueryFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs similarity index 88% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs rename to src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index b935db4cca..6d38678bbe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -25,15 +25,15 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasRequestCookies : ICanHasRequestCookies + public class RequestCookiesFeature : IRequestCookiesFeature { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; private static readonly string[] ZeroHeaders = new string[0]; - public DefaultCanHasRequestCookies(IFeatureCollection features) + public RequestCookiesFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs similarity index 84% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs rename to src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index 99bcb5d6f9..0fa8afff85 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -23,13 +23,13 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasResponseCookies : ICanHasResponseCookies + public class ResponseCookiesFeature : IResponseCookiesFeature { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private IResponseCookies _cookiesCollection; - public DefaultCanHasResponseCookies(IFeatureCollection features) + public ResponseCookiesFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs similarity index 90% rename from src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs rename to src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs index aef823d267..e203abeec2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs @@ -20,9 +20,9 @@ using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security { - public class DefaultHttpAuthentication : IHttpAuthentication + public class HttpAuthenticationFeature : IHttpAuthenticationFeature { - public DefaultHttpAuthentication() + public HttpAuthenticationFeature() { } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs similarity index 92% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs rename to src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs index f768aaa565..bc2b654f28 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs @@ -19,7 +19,7 @@ using System; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasServiceProviders : ICanHasServiceProviders + public class ServiceProvidersFeature : IServiceProvidersFeature { public IServiceProvider ApplicationServices { get; set; } public IServiceProvider RequestServices { get; set; } diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs index 225235c0ab..8e65358410 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.Abstractions.Extensions { - public class FakeHttpRequestInfo : IHttpRequestInformation + public class FakeHttpRequestFeature : IHttpRequestFeature { public string Protocol { get; set; } public string Scheme { get; set; } @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Abstractions.Extensions public Stream Body { get; set; } } - public class FakeHttpResponseInfo : IHttpResponseInformation + public class FakeHttpResponseFeature : IHttpResponseFeature { public int StatusCode { get; set; } public string ReasonPhrase { get; set; } diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs index 5bc4f85ec9..c7faa83160 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -201,8 +201,8 @@ namespace Microsoft.AspNet.Abstractions.Extensions private HttpContext CreateRequest(string basePath, string requestPath) { HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestInfo()); - context.SetFeature(new FakeHttpResponseInfo()); + context.SetFeature(new FakeHttpRequestFeature()); + context.SetFeature(new FakeHttpResponseFeature()); context.Request.PathBase = new PathString(basePath); context.Request.Path = new PathString(requestPath); return context; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs index ad4223f9de..80fe6c0e88 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -190,8 +190,8 @@ namespace Microsoft.AspNet.Abstractions.Extensions private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestInfo()); - context.SetFeature(new FakeHttpResponseInfo()); + context.SetFeature(new FakeHttpRequestFeature()); + context.SetFeature(new FakeHttpResponseFeature()); return context; } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 69737309a9..aa1f4a59e1 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -133,7 +133,7 @@ namespace Microsoft.AspNet.Owin } } - private class MoqHttpRequest : HttpRequest, IHttpRequestInformation + private class MoqHttpRequest : HttpRequest, IHttpRequestFeature { public override HttpContext HttpContext { @@ -225,25 +225,25 @@ namespace Microsoft.AspNet.Owin set { throw new NotImplementedException(); } } - string IHttpRequestInformation.PathBase + string IHttpRequestFeature.PathBase { get; set; } - string IHttpRequestInformation.Path + string IHttpRequestFeature.Path { get; set; } - string IHttpRequestInformation.QueryString + string IHttpRequestFeature.QueryString { get; set; } - IDictionary IHttpRequestInformation.Headers + IDictionary IHttpRequestFeature.Headers { get; set; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index b3bb3f68f4..b300605afa 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Owin }; var features = new FeatureObject(new OwinFeatureCollection(env)); - Assert.Equal(Get(features).Method, "POST"); + Assert.Equal(Get(features).Method, "POST"); } [Fact] @@ -56,8 +56,8 @@ namespace Microsoft.AspNet.Owin var keys = features.Keys.ToArray(); var values = features.Values.ToArray(); - Assert.Contains(typeof(IHttpRequestInformation), keys); - Assert.Contains(typeof(IHttpResponseInformation), keys); + Assert.Contains(typeof(IHttpRequestFeature), keys); + Assert.Contains(typeof(IHttpResponseFeature), keys); } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index db800a6fff..a2d913c9f8 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -95,11 +95,11 @@ namespace Microsoft.AspNet.PipelineCore.Tests private HttpContext CreateContext() { var context = new DefaultHttpContext(new FeatureCollection()); - context.SetFeature(new FakeHttpResponse()); + context.SetFeature(new FakeHttpResponse()); return context; } - private class FakeHttpResponse : IHttpResponseInformation + private class FakeHttpResponse : IHttpResponseFeature { public int StatusCode { get; set; } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index c78982b0df..9ec72f8a89 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -124,11 +124,11 @@ namespace Microsoft.AspNet.PipelineCore.Tests private static DefaultHttpRequest CreateRequest(IDictionary headers) { - var requestInfo = new Mock(); + var requestInfo = new Mock(); requestInfo.SetupGet(r => r.Headers).Returns(headers); var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestInformation), requestInfo.Object); + features.Add(typeof(IHttpRequestFeature), requestInfo.Object); var context = new DefaultHttpContext(features); return new DefaultHttpRequest(context, features); diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs similarity index 88% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs rename to test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index 9d029071f2..31098e78cb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -25,7 +25,7 @@ using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests { - public class DefaultCanHasFormTests + public class FormFeatureTests { [Fact] public async Task GetFormAsync_ReturnsParsedFormCollection() @@ -33,14 +33,14 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange var formContent = Encoding.UTF8.GetBytes("foo=bar&baz=2"); var features = new Mock(); - var request = new Mock(); + var request = new Mock(); request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent)); object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) .Returns(true); - var provider = new DefaultCanHasForm(features.Object); + var provider = new FormFeature(features.Object); // Act var formCollection = await provider.GetFormAsync(); @@ -57,14 +57,14 @@ namespace Microsoft.AspNet.PipelineCore.Tests var formContent1 = Encoding.UTF8.GetBytes("foo=bar&baz=2"); var formContent2 = Encoding.UTF8.GetBytes("collection2=value"); var features = new Mock(); - var request = new Mock(); + var request = new Mock(); request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent1)); object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) .Returns(true); - var provider = new DefaultCanHasForm(features.Object); + var provider = new FormFeature(features.Object); // Act - 1 var formCollection = await provider.GetFormAsync(); diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 2f35d88951..073aabb443 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -22,8 +22,8 @@ - - + + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs similarity index 87% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs rename to test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs index 55e02e7560..7ddf43d57e 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs @@ -22,21 +22,21 @@ using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests { - public class DefaultCanHasQueryTests + public class QueryFeatureTests { [Fact] public void QueryReturnsParsedQueryCollection() { // Arrange var features = new Mock(); - var request = new Mock(); + var request = new Mock(); request.SetupGet(r => r.QueryString).Returns("foo=bar"); object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) .Returns(true); - var provider = new DefaultCanHasQuery(features.Object); + var provider = new QueryFeature(features.Object); // Act var queryCollection = provider.Query; From 0ecb989103489bd184f351189030fca7289403d5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 16:04:53 -0700 Subject: [PATCH 093/846] Name Microsoft.AspNet.Abstractions to Microsoft.AspNet.Http. --- HttpAbstractions.sln | 8 ++++---- .../CookieOptions.cs | 2 +- .../Extensions/MapExtensions.cs | 4 ++-- .../Extensions/MapMiddleware.cs | 2 +- .../Extensions/MapOptions.cs | 2 +- .../Extensions/MapWhenExtensions.cs | 4 ++-- .../Extensions/MapWhenMiddleware.cs | 2 +- .../Extensions/MapWhenOptions.cs | 2 +- .../Extensions/RunExtensions.cs | 2 +- .../Extensions/UseExtensions.cs | 2 +- .../HostString.cs | 2 +- .../HttpContext.cs | 4 ++-- .../HttpRequest.cs | 2 +- .../HttpResponse.cs | 4 ++-- .../IBuilder.cs | 2 +- .../IFormCollection.cs | 2 +- .../IHeaderDictionary.cs | 2 +- .../IReadableStringCollection.cs | 2 +- .../IResponseCookies.cs | 2 +- .../IServerInformation.cs | 2 +- .../Microsoft.AspNet.Http.kproj} | 0 .../NotNullAttribute.cs | 2 +- .../PathString.cs | 2 +- .../QueryString.cs | 2 +- .../RequestDelegate.cs | 2 +- .../Security/AuthenticateResult.cs | 2 +- .../Security/AuthenticationDescription.cs | 2 +- .../Security/AuthenticationProperties.cs | 2 +- .../project.json | 0 src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- src/Microsoft.AspNet.Owin/Project.json | 2 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 2 +- .../Collections/FormCollection.cs | 2 +- .../Collections/HeaderDictionary.cs | 4 ++-- .../Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 4 ++-- .../Collections/RequestCookiesCollection.cs | 2 +- .../Collections/ResponseCookies.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs | 6 +++--- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 2 +- src/Microsoft.AspNet.PipelineCore/IFormFeature.cs | 2 +- src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs | 2 +- .../IRequestCookiesFeature.cs | 2 +- .../IResponseCookiesFeature.cs | 2 +- .../Infrastructure/Constants.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/QueryFeature.cs | 2 +- .../RequestCookiesFeature.cs | 4 ++-- .../ResponseCookiesFeature.cs | 2 +- .../Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- .../Fakes.cs | 2 +- .../MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- .../Microsoft.AspNet.Http.Tests.kproj} | 0 .../PathStringTests.cs | 2 +- .../Project.json} | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 4 ++-- test/Microsoft.AspNet.Owin.Tests/Project.json | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs | 2 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- 68 files changed, 82 insertions(+), 82 deletions(-) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/CookieOptions.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapExtensions.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapMiddleware.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapOptions.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapWhenExtensions.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapWhenMiddleware.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapWhenOptions.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/RunExtensions.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/UseExtensions.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HostString.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HttpContext.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HttpRequest.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HttpResponse.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IBuilder.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IFormCollection.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IHeaderDictionary.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IReadableStringCollection.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IResponseCookies.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IServerInformation.cs (95%) rename src/{Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj => Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj} (100%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/NotNullAttribute.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/PathString.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/QueryString.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/RequestDelegate.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Security/AuthenticateResult.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Security/AuthenticationDescription.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Security/AuthenticationProperties.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/project.json (100%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/Fakes.cs (96%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/MapPathMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/MapPredicateMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj => Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj} (100%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/PathStringTests.cs (98%) rename test/{Microsoft.AspNet.Abstractions.Tests/project.json => Microsoft.AspNet.Http.Tests/Project.json} (93%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index c7f07227ab..c4043ac0a1 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30401.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.21628.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -9,7 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-3 EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject @@ -19,7 +19,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCo EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.kproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject diff --git a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Http/CookieOptions.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/CookieOptions.cs rename to src/Microsoft.AspNet.Http/CookieOptions.cs index b7c0690cdd..5a479f8967 100644 --- a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http/CookieOptions.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Options used to create a new cookie. diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index 2ecaa2898f..fa071712da 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -16,8 +16,8 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Extensions; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Extensions; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index d1bd14ecbb..b8bf99c9a8 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class MapMiddleware { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapOptions.cs index 4a9dcf1c90..d0611b9aa7 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { /// /// Options for the Map middleware diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index 2c088737a9..d6201678c5 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -17,8 +17,8 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Extensions; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Extensions; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index 02ed400c42..d9cf89dc10 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class MapWhenMiddleware { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs index 56bd141044..914d9ee56a 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs @@ -18,7 +18,7 @@ using System; using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { /// /// Options for the MapWhen middleware diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index ae4082221a..5d1b9d1a1a 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index ed90dc1ec7..95fcbb6bbe 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -17,7 +17,7 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/HostString.cs rename to src/Microsoft.AspNet.Http/HostString.cs index 246553a1d5..78483f7ce9 100644 --- a/src/Microsoft.AspNet.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -19,7 +19,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Represents the host portion of a Uri can be used to construct Uri's properly formatted and encoded for use in diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/HttpContext.cs rename to src/Microsoft.AspNet.Http/HttpContext.cs index 43690fe366..eb5a5dc12f 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -21,9 +21,9 @@ using System.Linq; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public abstract class HttpContext : IDisposable { diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/HttpRequest.cs rename to src/Microsoft.AspNet.Http/HttpRequest.cs index 452c4600c8..488f3ea85c 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -20,7 +20,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public abstract class HttpRequest { diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/HttpResponse.cs rename to src/Microsoft.AspNet.Http/HttpResponse.cs index 3766e872c7..4cbd853465 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -20,9 +20,9 @@ using System.Collections.Generic; using System.IO; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public abstract class HttpResponse { diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/IBuilder.cs rename to src/Microsoft.AspNet.Http/IBuilder.cs index 7f913c4988..8a5331e903 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public interface IBuilder { diff --git a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http/IFormCollection.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/IFormCollection.cs rename to src/Microsoft.AspNet.Http/IFormCollection.cs index 444436049a..fa27a142c0 100644 --- a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http/IFormCollection.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs rename to src/Microsoft.AspNet.Http/IHeaderDictionary.cs index 8f38346e36..58e0fd7c78 100644 --- a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -18,7 +18,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Represents request and response headers diff --git a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs rename to src/Microsoft.AspNet.Http/IReadableStringCollection.cs index 4aeb854c30..4e4e99ee75 100644 --- a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs @@ -18,7 +18,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Accessors for headers, query, forms, etc. diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNet.Http/IResponseCookies.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/IResponseCookies.cs rename to src/Microsoft.AspNet.Http/IResponseCookies.cs index 00a44ccaf0..f12023b4e8 100644 --- a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookies.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/IServerInformation.cs rename to src/Microsoft.AspNet.Http/IServerInformation.cs index 5db85fd9cf..48554d0a65 100644 --- a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { // TODO: [AssemblyNeutral] public interface IServerInformation diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj similarity index 100% rename from src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj rename to src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj diff --git a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs b/src/Microsoft.AspNet.Http/NotNullAttribute.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs rename to src/Microsoft.AspNet.Http/NotNullAttribute.cs index 972c2e4aef..eb75fc366d 100644 --- a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.Http/NotNullAttribute.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullAttribute : Attribute diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/PathString.cs rename to src/Microsoft.AspNet.Http/PathString.cs index b722e8baee..acb90717fa 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -18,7 +18,7 @@ using System; using System.Linq; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/QueryString.cs rename to src/Microsoft.AspNet.Http/QueryString.cs index 1188530052..9e88c9c025 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Provides correct handling for QueryString value when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http/RequestDelegate.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/RequestDelegate.cs rename to src/Microsoft.AspNet.Http/RequestDelegate.cs index 951c668d9a..fbfdc584b5 100644 --- a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http/RequestDelegate.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs index 812895a631..a7055c919d 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs @@ -19,7 +19,7 @@ using System; using System.Security.Claims; using System.Security.Principal; -namespace Microsoft.AspNet.Abstractions.Security +namespace Microsoft.AspNet.Http.Security { /// /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs index 8d3ad0c293..630b8a09cc 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Abstractions.Security +namespace Microsoft.AspNet.Http.Security { /// /// Contains information describing an authentication provider. diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index cc793057d0..a55f35ecd8 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; -namespace Microsoft.AspNet.Abstractions.Security +namespace Microsoft.AspNet.Http.Security { /// /// Dictionary used to store state values about the authentication session. diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Http/project.json similarity index 100% rename from src/Microsoft.AspNet.Abstractions/project.json rename to src/Microsoft.AspNet.Http/project.json diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5ad850ead3..819f288991 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -25,7 +25,7 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.Owin diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 4a4d80d177..d6790b35b1 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; using Microsoft.AspNet.PipelineCore; diff --git a/src/Microsoft.AspNet.Owin/Project.json b/src/Microsoft.AspNet.Owin/Project.json index 4a7ce42ba7..18e1116930 100644 --- a/src/Microsoft.AspNet.Owin/Project.json +++ b/src/Microsoft.AspNet.Owin/Project.json @@ -1,7 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "" diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 2b775fc4c3..df93a7a3e3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index 7a9c41cbc3..2a93e7dde0 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index 620fddd26b..ab53ba639e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -19,8 +19,8 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index 22e26e112c..2771932385 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -17,7 +17,7 @@ using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index b8e70872df..a18dcdeabb 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -18,8 +18,8 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index c2959cbe1d..056b3beda5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -18,7 +18,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index f70ef385cf..c3451dab58 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -19,8 +19,8 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index ad4f3902a9..47fadff71d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -21,8 +21,8 @@ using System.Linq; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 602f6bebfb..719a3c2362 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -20,8 +20,8 @@ using System.Globalization; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 7075b69663..2caeec3851 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -22,9 +22,9 @@ using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 9613162d6f..bcf0d46c67 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -18,7 +18,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index f80d2c2713..cef0c76d2d 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index 6dcaa1836e..c17f61973e 100644 --- a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index 8cfcd2cb40..af9a3bedec 100644 --- a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index 02a10ff95a..b6e5bbc7e6 100644 --- a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 374c1af87d..5d2c5635f1 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions.Infrastructure +namespace Microsoft.AspNet.Http.Infrastructure { internal static class Constants { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index a750fe5359..afbf7116ea 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -20,8 +20,8 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 994fa4b0e8..757a015d08 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 6d38678bbe..75ceae3ada 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -16,8 +16,8 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index 0fa8afff85..7127a87684 100644 --- a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index dcefd97e6e..476762aaee 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 2ed6579ad8..36a6ce567d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -21,7 +21,7 @@ using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index e8e90fdd08..3af3011dda 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -3,7 +3,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "" }, "configurations": { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 25bbf54fa6..dfb641df68 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Http.Tests/Fakes.cs similarity index 96% rename from test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs rename to test/Microsoft.AspNet.Http.Tests/Fakes.cs index 8e65358410..04cce33960 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Http.Tests/Fakes.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class FakeHttpRequestFeature : IHttpRequestFeature { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index c7faa83160..0096fe7b56 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.PipelineCore; using Shouldly; using Xunit; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class MapPathMiddlewareTests { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index 80fe6c0e88..d57293440b 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { using AppFunc = Func, Task>; using Predicate = Func; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj similarity index 100% rename from test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj rename to test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj diff --git a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs similarity index 98% rename from test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs rename to test/Microsoft.AspNet.Http.Tests/PathStringTests.cs index 171fa1caca..0bc9dd09e3 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs @@ -18,7 +18,7 @@ using Microsoft.AspNet.Testing; using Xunit; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public class PathStringTests { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/Project.json similarity index 93% rename from test/Microsoft.AspNet.Abstractions.Tests/project.json rename to test/Microsoft.AspNet.Http.Tests/Project.json index 5a3029b789..6d51c6c3da 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/Project.json @@ -1,7 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Testing": "0.1-alpha-*", diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index aa1f4a59e1..37a655632a 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -21,8 +21,8 @@ using System.IO; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json index 3ba09cb57f..ea8857b6ba 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Project.json +++ b/test/Microsoft.AspNet.Owin.Tests/Project.json @@ -3,7 +3,7 @@ "dependencies": { "Microsoft.AspNet.Owin": "", "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.PipelineCore": "", "Xunit.KRunner": "0.1-alpha-*", diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 13044c0a29..65a1e04edf 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index a2d913c9f8..37364386be 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -21,7 +21,7 @@ using System.IO; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Xunit; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 9ec72f8a89..5b8986bccb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index ae27e76817..54bcce5f18 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.PipelineCore": "", "Xunit.KRunner": "0.1-alpha-*", From 8b26f1d319748af89062c755bf7fd0595fa7a4a2 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 21:05:21 -0700 Subject: [PATCH 094/846] Move IBuilder and related components to the Ms.AspNet.Builder namespace. --- src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs | 4 ++-- src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs | 3 ++- src/Microsoft.AspNet.Http/Extensions/MapOptions.cs | 4 +++- src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs | 4 ++-- src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs | 3 ++- src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs | 3 ++- src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs | 2 +- src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs | 2 +- src/Microsoft.AspNet.Http/IBuilder.cs | 2 +- src/Microsoft.AspNet.Http/IServerInformation.cs | 2 +- src/Microsoft.AspNet.Http/RequestDelegate.cs | 3 ++- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 2 +- test/Microsoft.AspNet.Http.Tests/Fakes.cs | 2 +- test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs | 3 ++- .../MapPredicateMiddlewareTests.cs | 3 ++- test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs | 2 +- 17 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index fa071712da..95a6af45d1 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -17,9 +17,9 @@ using System; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNet.Builder.Extensions; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { public static class MapExtensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index b8bf99c9a8..a6238081b6 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -16,8 +16,9 @@ // permissions and limitations under the License. using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class MapMiddleware { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs index d0611b9aa7..16bd8f0df5 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs @@ -15,7 +15,9 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Http.Extensions +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.Builder.Extensions { /// /// Options for the Map middleware diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index d6201678c5..2ede36599e 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -18,9 +18,9 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNet.Builder.Extensions; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { using Predicate = Func; using PredicateAsync = Func>; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index d9cf89dc10..1aeed9f340 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -16,8 +16,9 @@ // permissions and limitations under the License. using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class MapWhenMiddleware { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs index 914d9ee56a..5d1b4ea0bf 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs @@ -17,8 +17,9 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { /// /// Options for the MapWhen middleware diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 5d1b9d1a1a..8f2de3eac1 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -18,7 +18,7 @@ using System; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { public static class RunExtensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 95fcbb6bbe..68879bb92f 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -19,7 +19,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { public static class UseExtensions { diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs index 8a5331e903..c7ea6ccc5b 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Builder { public interface IBuilder { diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs index 48554d0a65..83d11d5b7e 100644 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Builder { // TODO: [AssemblyNeutral] public interface IServerInformation diff --git a/src/Microsoft.AspNet.Http/RequestDelegate.cs b/src/Microsoft.AspNet.Http/RequestDelegate.cs index fbfdc584b5..cfa81d7242 100644 --- a/src/Microsoft.AspNet.Http/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http/RequestDelegate.cs @@ -16,8 +16,9 @@ // permissions and limitations under the License. using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Builder { public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index d6790b35b1..e33824bf75 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -23,7 +23,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; using Microsoft.AspNet.PipelineCore; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { using AppFunc = Func, Task>; using CreateMiddleware = Func< diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index df93a7a3e3..f78fcccc5a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -21,7 +21,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Builder { public class Builder : IBuilder { diff --git a/test/Microsoft.AspNet.Http.Tests/Fakes.cs b/test/Microsoft.AspNet.Http.Tests/Fakes.cs index 04cce33960..98297a0982 100644 --- a/test/Microsoft.AspNet.Http.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Http.Tests/Fakes.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class FakeHttpRequestFeature : IHttpRequestFeature { diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 0096fe7b56..9f5a09336f 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -17,12 +17,13 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Shouldly; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class MapPathMiddlewareTests { diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index d57293440b..63e83925bd 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -18,11 +18,12 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { using AppFunc = Func, Task>; using Predicate = Func; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 65a1e04edf..c41552bf79 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -18,7 +18,7 @@ using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Builder.Tests { public class BuilderTests { From 4e36207b14b0503308036b1c6b7a55db36ede00c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 6 May 2014 15:08:50 -0700 Subject: [PATCH 095/846] Owin adapter: Fix FeatureMap constructor visibility. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 819f288991..e08b8ead59 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -238,12 +238,12 @@ namespace Microsoft.AspNet.Owin public class FeatureMap { - internal FeatureMap(Type featureInterface, Func getter) + public FeatureMap(Type featureInterface, Func getter) : this(featureInterface, getter, null) { } - internal FeatureMap(Type featureInterface, Func getter, Action setter) + public FeatureMap(Type featureInterface, Func getter, Action setter) { FeatureInterface = featureInterface; Getter = getter; @@ -272,12 +272,12 @@ namespace Microsoft.AspNet.Owin public class FeatureMap : FeatureMap { - internal FeatureMap(Func getter) + public FeatureMap(Func getter) : base(typeof(T), feature => getter((T)feature)) { } - internal FeatureMap(Func getter, Action setter) + public FeatureMap(Func getter, Action setter) : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) { } From 2ba629d886cf5e2769515066d699a145cf474686 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 7 May 2014 17:05:41 -0700 Subject: [PATCH 096/846] Sort dependencies and remove duplicates in dependencies --- .../project.json | 8 ++++---- test/Microsoft.AspNet.Http.Tests/Project.json | 10 +++++----- test/Microsoft.AspNet.Owin.Tests/Project.json | 14 +++++++------- .../project.json | 12 ++++++------ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index dfb641df68..ca05fee96f 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,14 +1,14 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", - "Xunit.KRunner": "0.1-alpha-*", + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.HttpFeature": "", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.Http.Tests/Project.json b/test/Microsoft.AspNet.Http.Tests/Project.json index 6d51c6c3da..29620862ab 100644 --- a/test/Microsoft.AspNet.Http.Tests/Project.json +++ b/test/Microsoft.AspNet.Http.Tests/Project.json @@ -2,14 +2,14 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.Testing": "0.1-alpha-*", - "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" @@ -17,8 +17,8 @@ "configurations": { "net45": { "dependencies": { - "System.Runtime": "", - "Shouldly": "1.1.1.1" + "Shouldly": "1.1.1.1", + "System.Runtime": "" } } } diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json index ea8857b6ba..362d8821c4 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Project.json +++ b/test/Microsoft.AspNet.Owin.Tests/Project.json @@ -1,16 +1,16 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Owin": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Owin": "", "Microsoft.AspNet.PipelineCore": "", - "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" @@ -18,8 +18,8 @@ "configurations": { "net45": { "dependencies": { - "System.Runtime": "", - "Shouldly": "1.1.1.1" + "Shouldly": "1.1.1.1", + "System.Runtime": "" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 54bcce5f18..4efc819ed8 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,15 +1,15 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.PipelineCore": "", - "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" @@ -17,9 +17,9 @@ "configurations": { "net45": { "dependencies": { - "System.Runtime": "", "Moq": "4.2.1312.1622", - "System.Net.Http": "" + "System.Net.Http": "", + "System.Runtime": "" } } } From efc77e60e09daf95db88b8e0f03312123ef688b6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 8 May 2014 10:08:17 -0700 Subject: [PATCH 097/846] More fallout from the rename --- src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs | 2 +- .../IHttpTransportLayerSecurityFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs | 2 +- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IAuthenticationHandler.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs | 2 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs index 7282be839b..0ed7a7e8ed 100644 --- a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.Net.Runtime +namespace Microsoft.Framework.Runtime { [AssemblyNeutralAttribute] [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs index 218b8732f6..7abefe40d0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Threading; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs index 84c9f5b885..d258b60673 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs index 1cb3cc12fa..87bec2d68b 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Net; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs index cad2c7ccf0..441df31f24 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index 19956ea09f..067148392e 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Threading; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index afd1cdebca..2b3d9e9372 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs index f53ca06c07..409db09e19 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs @@ -17,7 +17,7 @@ using System.Threading; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs index 8e7f9a5f1b..76c94f0a3c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs @@ -17,7 +17,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index 8b2013652f..07c6bf4644 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -18,7 +18,7 @@ #if NET45 using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index 13033b5f82..5ee1ddbaf2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index d230f16764..06e61070c1 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -17,7 +17,7 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 942caa29a2..50f240f6b8 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -17,7 +17,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index 873ee856d9..b19caca74d 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs index b18bd0ea3f..3113a5e49a 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Security.Claims; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index d83e224bb4..3a77ad533a 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -17,7 +17,7 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 0a98bdbac8..2cffae53b9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { From 60f8c9e1252e23d7964c8cd92a37bca366590daf Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Thu, 8 May 2014 16:35:19 -0700 Subject: [PATCH 098/846] Create LICENSE.txt --- LICENSE.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000000..d85a1524ad --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,12 @@ +Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +these files except in compliance with the License. You may obtain a copy of the +License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. From 00d49bbd603364eadc5a84f18db65e7347f1fffe Mon Sep 17 00:00:00 2001 From: Andrew Peters Date: Thu, 8 May 2014 23:01:09 -0700 Subject: [PATCH 099/846] Updating copyright headers --- .../FeatureCollection.cs | 18 ++---------------- .../FeatureObject.cs | 18 ++---------------- .../IFeatureCollection.cs | 18 ++---------------- src/Microsoft.AspNet.Http/CookieOptions.cs | 18 ++---------------- .../Extensions/MapExtensions.cs | 18 ++---------------- .../Extensions/MapMiddleware.cs | 18 ++---------------- .../Extensions/MapOptions.cs | 18 ++---------------- .../Extensions/MapWhenExtensions.cs | 18 ++---------------- .../Extensions/MapWhenMiddleware.cs | 18 ++---------------- .../Extensions/MapWhenOptions.cs | 18 ++---------------- .../Extensions/RunExtensions.cs | 18 ++---------------- .../Extensions/UseExtensions.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HostString.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HttpContext.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HttpRequest.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HttpResponse.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IBuilder.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IFormCollection.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IHeaderDictionary.cs | 18 ++---------------- .../IReadableStringCollection.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IResponseCookies.cs | 18 ++---------------- .../IServerInformation.cs | 18 ++---------------- src/Microsoft.AspNet.Http/NotNullAttribute.cs | 18 ++---------------- src/Microsoft.AspNet.Http/PathString.cs | 18 ++---------------- src/Microsoft.AspNet.Http/QueryString.cs | 18 ++---------------- src/Microsoft.AspNet.Http/RequestDelegate.cs | 18 ++---------------- .../Security/AuthenticateResult.cs | 18 ++---------------- .../Security/AuthenticationDescription.cs | 18 ++---------------- .../Security/AuthenticationProperties.cs | 18 ++---------------- .../AssemblyNeutralAttribute.cs | 18 ++---------------- .../IHttpApplicationFeature.cs | 18 ++---------------- .../IHttpBufferingFeature.cs | 18 ++---------------- .../IHttpConnectionFeature.cs | 18 ++---------------- .../IHttpRequestFeature.cs | 18 ++---------------- .../IHttpRequestLifetimeFeature.cs | 18 ++---------------- .../IHttpResponseFeature.cs | 18 ++---------------- .../IHttpSendFileFeature.cs | 18 ++---------------- .../IHttpTransportLayerSecurityFeature.cs | 18 ++---------------- .../IHttpWebSocketFeature.cs | 18 ++---------------- .../Security/IAuthTypeContext.cs | 18 ++---------------- .../Security/IAuthenticateContext.cs | 18 ++---------------- .../Security/IAuthenticationHandler.cs | 18 ++---------------- .../Security/IChallengeContext.cs | 18 ++---------------- .../Security/IHttpAuthenticationFeature.cs | 18 ++---------------- .../Security/ISignInContext.cs | 18 ++---------------- .../Security/ISignOutContext .cs | 18 ++---------------- .../IOwinEnvironmentFeature.cs | 18 ++---------------- src/Microsoft.AspNet.Owin/OwinConstants.cs | 18 ++---------------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 18 ++---------------- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 18 ++---------------- .../OwinFeatureCollection.cs | 18 ++---------------- src/Microsoft.AspNet.PipelineCore/Builder.cs | 18 ++---------------- .../Collections/FormCollection.cs | 18 ++---------------- .../Collections/HeaderDictionary.cs | 18 ++---------------- .../Collections/ItemsDictionary.cs | 18 ++---------------- .../Collections/ReadableStringCollection.cs | 18 ++---------------- .../Collections/RequestCookiesCollection.cs | 18 ++---------------- .../Collections/ResponseCookies.cs | 18 ++---------------- .../DefaultHttpContext.cs | 18 ++---------------- .../DefaultHttpRequest.cs | 18 ++---------------- .../DefaultHttpResponse.cs | 18 ++---------------- .../FormFeature.cs | 18 ++---------------- .../IFormFeature.cs | 18 ++---------------- .../IItemsFeature.cs | 18 ++---------------- .../IQueryFeature.cs | 18 ++---------------- .../IRequestCookiesFeature.cs | 18 ++---------------- .../IResponseCookiesFeature.cs | 18 ++---------------- .../IServiceProvidersFeature.cs | 18 ++---------------- .../Infrastructure/Constants.cs | 18 ++---------------- .../Infrastructure/FeatureReference.cs | 18 ++---------------- .../Infrastructure/ParsingHelpers.cs | 18 ++---------------- .../ItemsFeature.cs | 18 ++---------------- .../QueryFeature.cs | 18 ++---------------- .../RequestCookiesFeature.cs | 18 ++---------------- .../ResponseCookiesFeature.cs | 18 ++---------------- .../Security/AuthTypeContext.cs | 18 ++---------------- .../Security/AuthenticateContext.cs | 18 ++---------------- .../Security/ChallengeContext.cs | 18 ++---------------- .../Security/HttpAuthenticationFeature.cs | 18 ++---------------- .../Security/SignInContext.cs | 18 ++---------------- .../Security/SignOutContext.cs | 18 ++---------------- .../ServiceProvidersFeature.cs | 18 ++---------------- .../IThing.cs | 18 ++---------------- .../InterfaceDictionaryTests.cs | 18 ++---------------- .../Properties/AssemblyInfo.cs | 18 ++---------------- .../Thing.cs | 18 ++---------------- test/Microsoft.AspNet.Http.Tests/Fakes.cs | 18 ++---------------- .../MapPathMiddlewareTests.cs | 18 ++---------------- .../MapPredicateMiddlewareTests.cs | 18 ++---------------- .../PathStringTests.cs | 18 ++---------------- .../OwinEnvironmentTests.cs | 18 ++---------------- .../OwinFeatureCollectionTests.cs | 18 ++---------------- .../BuilderTests.cs | 18 ++---------------- .../DefaultHttpContextTests.cs | 18 ++---------------- .../DefaultHttpRequestTests.cs | 18 ++---------------- .../FormFeatureTests.cs | 18 ++---------------- .../Properties/AssemblyInfo.cs | 18 ++---------------- .../QueryFeatureTests.cs | 18 ++---------------- 98 files changed, 196 insertions(+), 1568 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 96ce5a4a19..222dc181f0 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 28028821cf..40e873e2e3 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs index 220294ee88..a6c5c2da9d 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/CookieOptions.cs b/src/Microsoft.AspNet.Http/CookieOptions.cs index 5a479f8967..9dab37f844 100644 --- a/src/Microsoft.AspNet.Http/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http/CookieOptions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index 95a6af45d1..b4a44adddf 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index a6238081b6..5bf26af0b8 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs index 16bd8f0df5..f3c85a1086 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index 2ede36599e..b46bbbe0e9 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index 1aeed9f340..51606e609c 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs index 5d1b4ea0bf..c94b15f181 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 8f2de3eac1..de565c2e3d 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 68879bb92f..3f0f8f51c3 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 78483f7ce9..1786a7c338 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index eb5a5dc12f..7bad161454 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 488f3ea85c..a59ae78ab6 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.IO; diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 4cbd853465..6f0a6a44dd 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs index c7ea6ccc5b..6a2c1b3197 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/IFormCollection.cs b/src/Microsoft.AspNet.Http/IFormCollection.cs index fa27a142c0..a69162fa4d 100644 --- a/src/Microsoft.AspNet.Http/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http/IFormCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs index 58e0fd7c78..d740fe03bf 100644 --- a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; diff --git a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs index 4e4e99ee75..21a00450ea 100644 --- a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; diff --git a/src/Microsoft.AspNet.Http/IResponseCookies.cs b/src/Microsoft.AspNet.Http/IResponseCookies.cs index f12023b4e8..53b1d3da60 100644 --- a/src/Microsoft.AspNet.Http/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookies.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs index 83d11d5b7e..f7f267996c 100644 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http/NotNullAttribute.cs b/src/Microsoft.AspNet.Http/NotNullAttribute.cs index eb75fc366d..d43b93e4e4 100644 --- a/src/Microsoft.AspNet.Http/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.Http/NotNullAttribute.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index acb90717fa..a6cf0c85b3 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index 9e88c9c025..5ba16151c7 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/RequestDelegate.cs b/src/Microsoft.AspNet.Http/RequestDelegate.cs index cfa81d7242..b590996e17 100644 --- a/src/Microsoft.AspNet.Http/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http/RequestDelegate.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs index a7055c919d..5a1998f336 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs index 630b8a09cc..d6423f34fd 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index a55f35ecd8..6a6fb4fadf 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs index 0ed7a7e8ed..e1d35fbf25 100644 --- a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs index 7abefe40d0..344f87352c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs index d258b60673..53b7fd9894 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs index 87bec2d68b..7598c9ce0b 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs index 441df31f24..66b5c5fa82 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index 067148392e..dca2418de9 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index 2b3d9e9372..cf322f6747 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs index 409db09e19..be42442acc 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs index 76c94f0a3c..1eb020776f 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index 07c6bf4644..a04a584532 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #if NET45 using System.Net.WebSockets; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index 5ee1ddbaf2..bf3627a3d8 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index 06e61070c1..f44c411ffc 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 50f240f6b8..f081744b22 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index b19caca74d..c5855cb322 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs index 3113a5e49a..4ee676b095 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index 3a77ad533a..b6c1730a69 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 2cffae53b9..8346ae040b 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs index 45455159e3..53e61267e0 100644 --- a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 968c618000..1e1296b67d 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index e08b8ead59..c624e1a8c0 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index e33824bf75..d48462c16e 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 4c6483ffcb..c0f75caa46 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index f78fcccc5a..fae10cf6a2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index 2a93e7dde0..b1da4f6c3c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index ab53ba639e..22d62c5989 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index 2771932385..e9c21c835d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index a18dcdeabb..84f95d7e0e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 056b3beda5..e562487fd1 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index c3451dab58..27bfbbd38e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 47fadff71d..a5c559f112 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 719a3c2362..09106220e0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Globalization; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 2caeec3851..436517b0b9 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index bcf0d46c67..ad7598af3e 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; using System.Text; diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index cef0c76d2d..261b77d551 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs index 30762add7b..9afe1623de 100644 --- a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index c17f61973e..e1ad3146c0 100644 --- a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index af9a3bedec..ba1a0e3616 100644 --- a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index b6e5bbc7e6..6d51b7a015 100644 --- a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs index ed6dc1d77b..03dffc578d 100644 --- a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 5d2c5635f1..e0cf75c268 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http.Infrastructure { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index cbcacc51d4..0726b73b95 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index afbf7116ea..8dc89e6063 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs index c5933f1d0f..54d7d123f4 100644 --- a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 757a015d08..71e75e5031 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 75ceae3ada..6af65fa206 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index 7127a87684..f8ea2bf1b7 100644 --- a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index 476762aaee..20bc565605 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 36a6ce567d..469c38cf3c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 103072565e..b86f4cff8e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs index e203abeec2..368b888573 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index d211615e04..7f9694fd2a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index c24c41ac53..1c8049d3cb 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs index bc2b654f28..50bfab0065 100644 --- a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs index 1fb06e09b5..c82223ad06 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index 97d36f5d35..37eac34813 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Xunit; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index 2494fa2308..604b34761c 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; using System.Runtime.CompilerServices; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs index 4144a0482c..e064589fdc 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests { diff --git a/test/Microsoft.AspNet.Http.Tests/Fakes.cs b/test/Microsoft.AspNet.Http.Tests/Fakes.cs index 98297a0982..d33efeaa2b 100644 --- a/test/Microsoft.AspNet.Http.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Http.Tests/Fakes.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 9f5a09336f..3bca69be56 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index 63e83925bd..17cce7c777 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs index 0bc9dd09e3..d547c0a4ac 100644 --- a/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Testing; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 37a655632a..5cd6230df6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index b300605afa..ca21c566de 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Linq; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index c41552bf79..1fab0f3938 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using Xunit; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 37364386be..6ece4245fa 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 5b8986bccb..93d816e875 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index 31098e78cb..6566bc75eb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; using System.Text; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs index 1679842ad2..2a4dd7d85d 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; using System.Runtime.CompilerServices; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs index 7ddf43d57e..975edda5b1 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; From 025c03bfb9bd713ccaee56a5bba366e274b48a9f Mon Sep 17 00:00:00 2001 From: Glenn Date: Mon, 12 May 2014 19:21:26 -0700 Subject: [PATCH 100/846] Create README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..6ba75cfaa8 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +HttpAbstractions +================ + +Contains HTTP abstractions for ASP.NET vNext such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. + +This project is part of ASP.NET vNext. You can find samples, documentation and getting started instructions for ASP.NET vNext at the [Home](https://github.com/aspnet/home) repo. + + + From f92bc6bb69e97d4ec14161bc86041d652a6891c3 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 13 May 2014 01:02:32 -0700 Subject: [PATCH 101/846] Create CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..eac4268e4c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,4 @@ +Contributing +====== + +Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. From aa9b259da767528503af42b34b6f4fded4e610f3 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 18 May 2014 20:13:55 -0700 Subject: [PATCH 102/846] Updating kproj file to match tooling changes --- .gitignore | 3 ++- .../Microsoft.AspNet.FeatureModel.kproj | 6 +++--- src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 6 +++--- .../Microsoft.AspNet.HttpFeature.kproj | 6 +++--- src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.kproj | 6 +++--- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Http.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Owin.Tests.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 6 +++--- 10 files changed, 29 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index aba9c594d7..08e21e25bf 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ nuget.exe *DS_Store *.ncrunchsolution *.*sdf -*.ipch \ No newline at end of file +*.ipch +*.sln.ide \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 7a566cbcf8..21aae3fe0c 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 32a4c918-30ee-41db-8e26-8a3bb88ed231 Library @@ -24,5 +24,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 0b62b9b387..68f6341aeb 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd Library @@ -47,5 +47,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 2fef2807ae..37ce1da46d 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + d9128247-8f97-48b8-a863-f1f21a029fce Library @@ -38,5 +38,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 37d5045224..719dd4dcce 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 59bed991-f207-48ed-b24c-0a1d9c986c01 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 366ffd4df5..e283aadf56 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + bcf0f967-8753-4438-bd07-aadca9ce509a Library @@ -52,5 +52,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index eb170543e0..5dd7665e44 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + c5d2bae1-e182-48a0-aa74-1af14b782bf7 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 8b42411360..086e1cdc80 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + f16692b8-9f38-4dca-a582-e43172b989c6 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index 23a18cf7d4..c057512365 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 16219571-3268-4d12-8689-12b7163dba13 Library @@ -23,5 +23,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 073aabb443..052bc58358 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + aa99af26-f7b1-4a6b-a922-5c25539f6391 Library @@ -28,5 +28,5 @@ - + \ No newline at end of file From 3eb2f6c032d742f205ef6a2604c2883830ab9a67 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 23 May 2014 04:11:24 -0700 Subject: [PATCH 103/846] Updated build.sh --- build.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index db1e0c3dde..a918165425 100755 --- a/build.sh +++ b/build.sh @@ -4,9 +4,9 @@ if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else if x$XDG_DATA_HOME = x; then - cachedir=$HOME/.local/share + cachedir=$HOME/.local/share else - cachedir=$XDG_DATA_HOME; + cachedir=$XDG_DATA_HOME; fi fi mkdir -p $cachedir @@ -27,4 +27,14 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi +KRE_VERSION=$(mono .nuget/nuget.exe install KRE-mono45-x86 -pre -o ~/.kre/packages | head -1 | sed "s/.*KRE-mono45-x86 \([^']*\).*/\1/") +KRE_BIN=~/.kre/packages/KRE-mono45-x86.$KRE_VERSION/bin + +chmod +x $KRE_BIN/k +chmod +x $KRE_BIN/klr +chmod +x $KRE_BIN/kpm +chmod +x $KRE_BIN/k-build + +export PATH=$KRE_BIN:$PATH + mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file From e5724c7301916743530463706c3375c007f41778 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 25 May 2014 10:04:11 -0700 Subject: [PATCH 104/846] Renamed Project.json to Project.json2 --- src/Microsoft.AspNet.Owin/{Project.json => Project.json2} | 0 test/Microsoft.AspNet.Http.Tests/{Project.json => Project.json2} | 0 test/Microsoft.AspNet.Owin.Tests/{Project.json => Project.json2} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.Owin/{Project.json => Project.json2} (100%) rename test/Microsoft.AspNet.Http.Tests/{Project.json => Project.json2} (100%) rename test/Microsoft.AspNet.Owin.Tests/{Project.json => Project.json2} (100%) diff --git a/src/Microsoft.AspNet.Owin/Project.json b/src/Microsoft.AspNet.Owin/Project.json2 similarity index 100% rename from src/Microsoft.AspNet.Owin/Project.json rename to src/Microsoft.AspNet.Owin/Project.json2 diff --git a/test/Microsoft.AspNet.Http.Tests/Project.json b/test/Microsoft.AspNet.Http.Tests/Project.json2 similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Project.json rename to test/Microsoft.AspNet.Http.Tests/Project.json2 diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json2 similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Project.json rename to test/Microsoft.AspNet.Owin.Tests/Project.json2 From 57717dd325bc2a072677cf7211c8191d4e94e8f9 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 25 May 2014 10:04:11 -0700 Subject: [PATCH 105/846] Fixed casing of project.json --- src/Microsoft.AspNet.Owin/{Project.json2 => project.json} | 0 test/Microsoft.AspNet.Http.Tests/{Project.json2 => project.json} | 0 test/Microsoft.AspNet.Owin.Tests/{Project.json2 => project.json} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.Owin/{Project.json2 => project.json} (100%) rename test/Microsoft.AspNet.Http.Tests/{Project.json2 => project.json} (100%) rename test/Microsoft.AspNet.Owin.Tests/{Project.json2 => project.json} (100%) diff --git a/src/Microsoft.AspNet.Owin/Project.json2 b/src/Microsoft.AspNet.Owin/project.json similarity index 100% rename from src/Microsoft.AspNet.Owin/Project.json2 rename to src/Microsoft.AspNet.Owin/project.json diff --git a/test/Microsoft.AspNet.Http.Tests/Project.json2 b/test/Microsoft.AspNet.Http.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Project.json2 rename to test/Microsoft.AspNet.Http.Tests/project.json diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json2 b/test/Microsoft.AspNet.Owin.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Project.json2 rename to test/Microsoft.AspNet.Owin.Tests/project.json From 124749de2835287c02ec9b70c6ce011805449399 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 26 May 2014 02:49:34 -0700 Subject: [PATCH 106/846] Fixed project.json casing --- .../Microsoft.AspNet.FeatureModel.kproj | 6 +++--- src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 6 +++--- .../Microsoft.AspNet.HttpFeature.kproj | 6 +++--- src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.kproj | 6 +++--- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Http.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Owin.Tests.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 6 +++--- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 21aae3fe0c..1938d81a2f 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 68f6341aeb..a93ecf8e2a 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -48,4 +48,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 37ce1da46d..38f5ea72e7 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -39,4 +39,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 719dd4dcce..825f49a06f 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index e283aadf56..957d775894 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -53,4 +53,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index 5dd7665e44..dddeb54073 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 086e1cdc80..883a9d895c 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index c057512365..e0adddc849 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -21,7 +21,7 @@ - + - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 052bc58358..13a5649e18 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -29,4 +29,4 @@ - \ No newline at end of file + From 7d4345f62fd157b26ae205aed2e9b70fa8235449 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 3 Jun 2014 10:15:47 -0700 Subject: [PATCH 107/846] Adding switch to build.cmd to skip KRE install --- build.cmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.cmd b/build.cmd index 903d532df3..3aaf957583 100644 --- a/build.cmd +++ b/build.cmd @@ -18,6 +18,8 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion + +IF "%SKIP_KRE_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 From ae6004dd11a6df89fc8c1681dd307ade4f30ec3e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 10 Jun 2014 17:22:44 -0700 Subject: [PATCH 108/846] Updating build.sh based on KRuntime changes --- build.sh | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/build.sh b/build.sh index a918165425..4323aefc48 100755 --- a/build.sh +++ b/build.sh @@ -3,10 +3,10 @@ if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else - if x$XDG_DATA_HOME = x; then - cachedir=$HOME/.local/share + if [ -z $XDG_DATA_HOME ]; then + cachedir=$HOME/.local/share else - cachedir=$XDG_DATA_HOME; + cachedir=$XDG_DATA_HOME; fi fi mkdir -p $cachedir @@ -14,12 +14,12 @@ mkdir -p $cachedir url=https://www.nuget.org/nuget.exe if test ! -f $cachedir/nuget.exe; then - wget -o $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null + wget -O $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null fi if test ! -e .nuget; then mkdir .nuget - cp $cachedir/nuget.exe .nuget + cp $cachedir/nuget.exe .nuget/nuget.exe fi if test ! -d packages/KoreBuild; then @@ -27,14 +27,12 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi -KRE_VERSION=$(mono .nuget/nuget.exe install KRE-mono45-x86 -pre -o ~/.kre/packages | head -1 | sed "s/.*KRE-mono45-x86 \([^']*\).*/\1/") -KRE_BIN=~/.kre/packages/KRE-mono45-x86.$KRE_VERSION/bin +if ! type k > /dev/null 2>&1; then + source setup/kvm.sh +fi -chmod +x $KRE_BIN/k -chmod +x $KRE_BIN/klr -chmod +x $KRE_BIN/kpm -chmod +x $KRE_BIN/k-build +if ! type k > /dev/null 2>&1; then + kvm upgrade +fi -export PATH=$KRE_BIN:$PATH - -mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file +mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From b9d7561bf9a4036b2ab809d5a2ab9208526b0758 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 12 Jun 2014 15:04:56 -0700 Subject: [PATCH 109/846] Enable WebSocket and Opaque features. --- src/Microsoft.AspNet.Http/HttpContext.cs | 12 ++++++ src/Microsoft.AspNet.Http/project.json | 1 + .../IHttpOpaqueUpgradeFeature.cs | 13 ++++++ .../IHttpWebSocketFeature.cs | 9 ++-- .../IWebSocketAcceptContext.cs | 13 ++++++ .../Microsoft.AspNet.HttpFeature.kproj | 4 +- src/Microsoft.AspNet.HttpFeature/project.json | 1 + .../DefaultHttpContext.cs | 43 ++++++++++++++++++- .../Infrastructure/Constants.cs | 1 + .../Microsoft.AspNet.PipelineCore.kproj | 3 +- .../WebSocketAcceptContext.cs | 12 ++++++ .../project.json | 1 + .../OwinEnvironmentTests.cs | 16 +++++++ 13 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 7bad161454..7bd166d4da 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; @@ -27,6 +28,10 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken OnRequestAborted { get; } + public abstract bool IsWebSocketRequest { get; } + + public abstract IList WebSocketRequestedProtocols { get; } + public abstract void Abort(); public abstract void Dispose(); @@ -60,5 +65,12 @@ namespace Microsoft.AspNet.Http } public abstract Task> AuthenticateAsync(IList authenticationTypes); + + public virtual Task AcceptWebSocketAsync() + { + return AcceptWebSocket(subProtocol: null); + } + + public abstract Task AcceptWebSocket(string subProtocol); } } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index f626e3463a..11a017e2d5 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -5,6 +5,7 @@ "net45": {}, "k10": { "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs new file mode 100644 index 0000000000..f4fb2f4f0f --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs @@ -0,0 +1,13 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface IHttpOpaqueUpgradeFeature + { + bool IsUpgradableRequest { get; } + Task UpgradeAsync(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index a04a584532..3d87e86bb4 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#if NET45 using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.Framework.Runtime; @@ -11,8 +10,8 @@ namespace Microsoft.AspNet.HttpFeature [AssemblyNeutral] public interface IHttpWebSocketFeature { - bool IsWebSocketRequest { get; set; } - Task AcceptAsync(); + bool IsWebSocketRequest { get; } + + Task AcceptAsync(IWebSocketAcceptContext context); } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs new file mode 100644 index 0000000000..dbcc14c7ce --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface IWebSocketAcceptContext + { + string SubProtocol { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 38f5ea72e7..96237c3118 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -24,12 +24,14 @@ + + @@ -39,4 +41,4 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 7060443fce..2fa40105ad 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -4,6 +4,7 @@ "net45": {}, "k10": { "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", "System.IO": "4.0.0.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index a5c559f112..4a8b059972 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -4,12 +4,14 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -19,6 +21,8 @@ namespace Microsoft.AspNet.PipelineCore { public class DefaultHttpContext : HttpContext { + private static IList EmptyList = new List(); + private readonly HttpRequest _request; private readonly HttpResponse _response; @@ -26,6 +30,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _serviceProviders; private FeatureReference _authentication; private FeatureReference _lifetime; + private FeatureReference _webSockets; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -37,6 +42,8 @@ namespace Microsoft.AspNet.PipelineCore _items = FeatureReference.Default; _serviceProviders = FeatureReference.Default; _authentication = FeatureReference.Default; + _lifetime = FeatureReference.Default; + _webSockets = FeatureReference.Default; } IItemsFeature ItemsFeature @@ -59,6 +66,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _lifetime.Fetch(_features); } } + private IHttpWebSocketFeature WebSocketFeature + { + get { return _webSockets.Fetch(_features); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -110,6 +122,23 @@ namespace Microsoft.AspNet.PipelineCore } } + public override bool IsWebSocketRequest + { + get + { + var webSocketFeature = WebSocketFeature; + return webSocketFeature != null && webSocketFeature.IsWebSocketRequest; + } + } + + public override IList WebSocketRequestedProtocols + { + get + { + return Request.Headers.GetValues(Constants.Headers.WebSocketSubProtocols) ?? EmptyList; + } + } + public override void Abort() { var lifetime = LifetimeFeature; @@ -196,5 +225,15 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } + + public override Task AcceptWebSocket(string subProtocol) + { + var webSocketFeature = WebSocketFeature; + if (WebSocketFeature == null) + { + throw new NotSupportedException("WebSockets are not supported"); + } + return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol } ); + } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index e0cf75c268..1f440b0bf1 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -22,6 +22,7 @@ namespace Microsoft.AspNet.Http.Infrastructure internal const string Cookie = "Cookie"; internal const string SetCookie = "Set-Cookie"; internal const string Expires = "Expires"; + internal const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 957d775894..05dd7de5dd 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -51,6 +51,7 @@ + - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs new file mode 100644 index 0000000000..6e9a7ba0dd --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.PipelineCore +{ + public class WebSocketAcceptContext : IWebSocketAcceptContext + { + public virtual string SubProtocol { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 3af3011dda..0c280000e8 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -10,6 +10,7 @@ "net45": {}, "k10": { "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 5cd6230df6..87ae8aeb28 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; @@ -113,10 +114,25 @@ namespace Microsoft.AspNet.Owin get { throw new NotImplementedException(); } } + public override bool IsWebSocketRequest + { + get { throw new NotImplementedException(); } + } + + public override IList WebSocketRequestedProtocols + { + get { throw new NotImplementedException(); } + } + public override void Abort() { throw new NotImplementedException(); } + + public override Task AcceptWebSocket(string subProtocol) + { + throw new NotImplementedException(); + } } private class MoqHttpRequest : HttpRequest, IHttpRequestFeature From 434a128f1a1ee8ad78bc9eea0bc6c3d5f916dcc5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 13 Jun 2014 08:37:23 -0700 Subject: [PATCH 110/846] Rename AcceptWebSocket to AcceptWebSocketAsync. --- src/Microsoft.AspNet.Http/HttpContext.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 7bd166d4da..f14a8b059b 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -68,9 +68,9 @@ namespace Microsoft.AspNet.Http public virtual Task AcceptWebSocketAsync() { - return AcceptWebSocket(subProtocol: null); + return AcceptWebSocketAsync(subProtocol: null); } - public abstract Task AcceptWebSocket(string subProtocol); + public abstract Task AcceptWebSocketAsync(string subProtocol); } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 4a8b059972..b8383d05fe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -226,7 +226,7 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } - public override Task AcceptWebSocket(string subProtocol) + public override Task AcceptWebSocketAsync(string subProtocol) { var webSocketFeature = WebSocketFeature; if (WebSocketFeature == null) diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 87ae8aeb28..44f182db49 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -129,7 +129,7 @@ namespace Microsoft.AspNet.Owin throw new NotImplementedException(); } - public override Task AcceptWebSocket(string subProtocol) + public override Task AcceptWebSocketAsync(string subProtocol) { throw new NotImplementedException(); } From cd906e306ed9792c14913fc685d3977f2c0eaacd Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 18 Jun 2014 16:28:59 -0700 Subject: [PATCH 111/846] Change the default author in makefile.shade --- makefile.shade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makefile.shade b/makefile.shade index 6357ea2841..562494d144 100644 --- a/makefile.shade +++ b/makefile.shade @@ -1,7 +1,7 @@ var VERSION='0.1' var FULL_VERSION='0.1' -var AUTHORS='Microsoft' +var AUTHORS='Microsoft Open Technologies, Inc.' use-standard-lifecycle k-standard-goals From 2ae3a24a16dfd8df48edb029ac4b62ab0b68abc0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 18 Jun 2014 15:50:14 -0700 Subject: [PATCH 112/846] Remove CallCancelled property. Fix Owin query string. Add Owin user. Add Owin tests. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 7 - src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 39 ++- .../DefaultHttpRequest.cs | 13 - .../OwinEnvironmentTests.cs | 315 +++++++----------- 4 files changed, 155 insertions(+), 219 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index a59ae78ab6..9a09b01a65 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -120,12 +120,5 @@ namespace Microsoft.AspNet.Http /// /// The owin.RequestBody Stream. public abstract Stream Body { get; set; } - - /// - /// Gets or sets the cancellation token for the request. - /// - /// The cancellation token for the request. - public abstract CancellationToken CallCanceled { get; set; } - } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index c624e1a8c0..38cb35443c 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -8,11 +8,14 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Security.Claims; using System.Security.Cryptography.X509Certificates; +using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Owin { @@ -28,12 +31,14 @@ namespace Microsoft.AspNet.Owin _context = context; _entries = new Dictionary() { + { OwinConstants.CallCancelled, new FeatureMap(feature => feature.OnRequestAborted) }, { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => RemoveQuestionMark(feature.QueryString), + (feature, value) => feature.QueryString = AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, @@ -56,6 +61,8 @@ namespace Microsoft.AspNet.Owin { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, + + { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = MakeClaimsPrincipal((IPrincipal)value)) }, }; if (context.Request.IsSecure) @@ -222,6 +229,36 @@ namespace Microsoft.AspNet.Owin throw new NotImplementedException(); } + private string RemoveQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + if (queryString[0] == '?') + { + return queryString.Substring(1); + } + } + return queryString; + } + + private string AddQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + return '?' + queryString; + } + return queryString; + } + + private ClaimsPrincipal MakeClaimsPrincipal(IPrincipal principal) + { + if (principal is ClaimsPrincipal) + { + return principal as ClaimsPrincipal; + } + return new ClaimsPrincipal(principal); + } + public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 09106220e0..e99c7e0b02 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -149,18 +149,5 @@ namespace Microsoft.AspNet.PipelineCore { get { return RequestCookiesFeature.Cookies; } } - - public override System.Threading.CancellationToken CallCanceled - { - get - { - // TODO: Which feature exposes this? - return CancellationToken.None; - } - set - { - throw new NotImplementedException(); - } - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 44f182db49..ea603bc501 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -4,13 +4,14 @@ using System; using System.Collections.Generic; using System.IO; -using System.Net.WebSockets; +using System.Linq; using System.Security.Claims; using System.Threading; -using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore; using Xunit; namespace Microsoft.AspNet.Owin @@ -26,230 +27,148 @@ namespace Microsoft.AspNet.Owin [Fact] public void OwinEnvironmentCanBeCreated() { - MoqHttpContext context = new MoqHttpContext(); + HttpContext context = CreateContext(); context.Request.Method = "SomeMethod"; + context.User = new ClaimsPrincipal(new ClaimsIdentity("Foo")); + context.Request.Body = Stream.Null; + context.Request.Headers["CustomRequestHeader"] = "CustomRequestValue"; + context.Request.Path = new PathString("/path"); + context.Request.PathBase = new PathString("/pathBase"); + context.Request.Protocol = "http/1.0"; + context.Request.QueryString = new QueryString("?key=value"); + context.Request.Scheme = "http"; + context.Response.Body = Stream.Null; + context.Response.Headers["CustomResponseHeader"] = "CustomResponseValue"; + context.Response.StatusCode = 201; + + IDictionary env = new OwinEnvironment(context); + Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); + Assert.Equal("Foo", Get(env, "server.User").Identity.AuthenticationType); + Assert.Same(Stream.Null, Get(env, "owin.RequestBody")); + var requestHeaders = Get>(env, "owin.RequestHeaders"); + Assert.NotNull(requestHeaders); + Assert.Equal("CustomRequestValue", requestHeaders["CustomRequestHeader"].First()); + Assert.Equal("/path", Get(env, "owin.RequestPath")); + Assert.Equal("/pathBase", Get(env, "owin.RequestPathBase")); + Assert.Equal("http/1.0", Get(env, "owin.RequestProtocol")); + Assert.Equal("key=value", Get(env, "owin.RequestQueryString")); + Assert.Equal("http", Get(env, "owin.RequestScheme")); + + Assert.Same(Stream.Null, Get(env, "owin.ResponseBody")); + var responseHeaders = Get>(env, "owin.ResponseHeaders"); + Assert.NotNull(responseHeaders); + Assert.Equal("CustomResponseValue", responseHeaders["CustomResponseHeader"].First()); + Assert.Equal(201, Get(env, "owin.ResponseStatusCode")); + } + + [Fact] + public void OwinEnvironmentCanBeModified() + { + HttpContext context = CreateContext(); IDictionary env = new OwinEnvironment(context); - Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); - env["owin.RequestMethod"] = "SomeOtherMethod"; - Assert.Equal("SomeOtherMethod", context.Request.Method); + env["owin.RequestMethod"] = "SomeMethod"; + env["server.User"] = new ClaimsPrincipal(new ClaimsIdentity("Foo")); + env["owin.RequestBody"] = Stream.Null; + var requestHeaders = Get>(env, "owin.RequestHeaders"); + Assert.NotNull(requestHeaders); + requestHeaders["CustomRequestHeader"] = new[] { "CustomRequestValue" }; + env["owin.RequestPath"] = "/path"; + env["owin.RequestPathBase"] = "/pathBase"; + env["owin.RequestProtocol"] = "http/1.0"; + env["owin.RequestQueryString"] = "key=value"; + env["owin.RequestScheme"] = "http"; + env["owin.ResponseBody"] = Stream.Null; + var responseHeaders = Get>(env, "owin.ResponseHeaders"); + Assert.NotNull(responseHeaders); + responseHeaders["CustomResponseHeader"] = new[] { "CustomResponseValue" }; + env["owin.ResponseStatusCode"] = 201; + + Assert.Equal("SomeMethod", context.Request.Method); + Assert.Equal("Foo", context.User.Identity.AuthenticationType); + Assert.Same(Stream.Null, context.Request.Body); + Assert.Equal("CustomRequestValue", context.Request.Headers["CustomRequestHeader"]); + Assert.Equal("/path", context.Request.Path.Value); + Assert.Equal("/pathBase", context.Request.PathBase.Value); + Assert.Equal("http/1.0", context.Request.Protocol); + Assert.Equal("?key=value", context.Request.QueryString.Value); + Assert.Equal("http", context.Request.Scheme); + + Assert.Same(Stream.Null, context.Response.Body); + Assert.Equal("CustomResponseValue", context.Response.Headers["CustomResponseHeader"]); + Assert.Equal(201, context.Response.StatusCode); } - private class MoqHttpContext : HttpContext + private HttpContext CreateContext() { - private HttpRequest _request; - private IDictionary _items; + var features = new FeatureCollection(); + features.Add(typeof(IHttpRequestFeature), new MoqHttpRequestFeature()); + features.Add(typeof(IHttpResponseFeature), new MoqHttpResponseFeature()); + features.Add(typeof(IHttpAuthenticationFeature), new MoqHttpAuthenticationFeature()); + features.Add(typeof(IHttpRequestLifetimeFeature), new MoqHttpRequestLifetimeFeature()); + return new DefaultHttpContext(features); + } - public MoqHttpContext() + private class MoqHttpRequestFeature : IHttpRequestFeature + { + public MoqHttpRequestFeature() { - _request = new MoqHttpRequest(); - _items = new Dictionary(); + Headers = new Dictionary(); } - public override HttpRequest Request + public string Method { get; set; } + + public string Scheme { get; set; } + + public string Protocol { get; set; } + + public Stream Body { get; set; } + + public string PathBase { get; set; } + + public string Path { get; set; } + + public string QueryString { get; set; } + + public IDictionary Headers { get; set; } + } + + private class MoqHttpResponseFeature : IHttpResponseFeature + { + public MoqHttpResponseFeature() { - get { return _request; } + Headers = new Dictionary(); } - public override HttpResponse Response - { - get { throw new NotImplementedException(); } - } + public Stream Body { get; set; } - public override ClaimsPrincipal User - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + public int StatusCode { get; set; } - public override IDictionary Items - { - get { return _items; } - } + public string ReasonPhrase { get; set; } - public override IServiceProvider ApplicationServices - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + public IDictionary Headers { get; set; } - public override IServiceProvider RequestServices - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override void Dispose() - { - throw new NotImplementedException(); - } - - public override object GetFeature(Type type) - { - return Request; - } - - public override void SetFeature(Type type, object instance) - { - throw new NotImplementedException(); - } - - public override IEnumerable GetAuthenticationTypes() - { - throw new NotImplementedException(); - } - - public override IEnumerable Authenticate(IList authenticationTypes) - { - throw new NotImplementedException(); - } - - public override Task> AuthenticateAsync(IList authenticationTypes) - { - throw new NotImplementedException(); - } - - public override CancellationToken OnRequestAborted - { - get { throw new NotImplementedException(); } - } - - public override bool IsWebSocketRequest - { - get { throw new NotImplementedException(); } - } - - public override IList WebSocketRequestedProtocols - { - get { throw new NotImplementedException(); } - } - - public override void Abort() - { - throw new NotImplementedException(); - } - - public override Task AcceptWebSocketAsync(string subProtocol) + public void OnSendingHeaders(Action callback, object state) { throw new NotImplementedException(); } } - private class MoqHttpRequest : HttpRequest, IHttpRequestFeature + private class MoqHttpAuthenticationFeature : IHttpAuthenticationFeature { - public override HttpContext HttpContext - { - get { throw new NotImplementedException(); } - } + public ClaimsPrincipal User { get; set; } - public override string Method - { - get; - set; - } + public IAuthenticationHandler Handler { get; set; } + } - public override string Scheme - { - get; - set; - } + private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature + { + public CancellationToken OnRequestAborted { get; private set; } - public override bool IsSecure - { - get { return false; } - } - - public override HostString Host - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override PathString PathBase - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override PathString Path - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override QueryString QueryString - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override IReadableStringCollection Query - { - get { throw new NotImplementedException(); } - } - - public override Task GetFormAsync() + public void Abort() { throw new NotImplementedException(); } - - public override string Protocol - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override IHeaderDictionary Headers - { - get { throw new NotImplementedException(); } - } - - public override IReadableStringCollection Cookies - { - get { throw new NotImplementedException(); } - } - - public override long? ContentLength - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override Stream Body - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override CancellationToken CallCanceled - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - string IHttpRequestFeature.PathBase - { - get; - set; - } - - string IHttpRequestFeature.Path - { - get; - set; - } - - string IHttpRequestFeature.QueryString - { - get; - set; - } - - IDictionary IHttpRequestFeature.Headers - { - get; - set; - } } } } From b6f4207b3be1046b5409bf313dc96ff3881bd508 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 19 Jun 2014 11:46:13 -0700 Subject: [PATCH 113/846] #70 - Refactor client cert feature interface. --- ...tyFeature.cs => IHttpClientCertificateFeature.cs} | 12 ++++++++++-- .../Microsoft.AspNet.HttpFeature.kproj | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 10 +++++----- .../DefaultHttpRequest.cs | 6 +++--- 5 files changed, 21 insertions(+), 13 deletions(-) rename src/Microsoft.AspNet.HttpFeature/{IHttpTransportLayerSecurityFeature.cs => IHttpClientCertificateFeature.cs} (54%) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs similarity index 54% rename from src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs index 1eb020776f..ccaf9b1298 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs @@ -8,9 +8,17 @@ using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpTransportLayerSecurityFeature + public interface IHttpClientCertificateFeature { + /// + /// Synchronously retrieves the client certificate, if any. + /// X509Certificate ClientCertificate { get; set; } - Task LoadAsync(); + + /// + /// Asynchronously retrieves the client certificate, if any. + /// + /// + Task GetClientCertificateAsync(); } } diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 96237c3118..d9f328a5d5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -29,7 +29,7 @@ - + diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 38cb35443c..82656dcba9 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -67,9 +67,9 @@ namespace Microsoft.AspNet.Owin if (context.Request.IsSecure) { - _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.GetClientCertificateAsync))); } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index c0f75caa46..0e0a5abeb9 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Owin IHttpResponseFeature, IHttpConnectionFeature, IHttpSendFileFeature, - IHttpTransportLayerSecurityFeature, + IHttpClientCertificateFeature, IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -197,13 +197,13 @@ namespace Microsoft.AspNet.Owin } } - X509Certificate IHttpTransportLayerSecurityFeature.ClientCertificate + X509Certificate IHttpClientCertificateFeature.ClientCertificate { get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpTransportLayerSecurityFeature.LoadAsync() + Task IHttpClientCertificateFeature.GetClientCertificateAsync() { throw new NotImplementedException(); } @@ -228,7 +228,7 @@ namespace Microsoft.AspNet.Owin { return SupportsSendFile; } - else if (key == typeof(IHttpTransportLayerSecurityFeature)) + else if (key == typeof(IHttpClientCertificateFeature)) { return SupportsClientCerts; } @@ -256,7 +256,7 @@ namespace Microsoft.AspNet.Owin } if (SupportsClientCerts) { - keys.Add(typeof(IHttpTransportLayerSecurityFeature)); + keys.Add(typeof(IHttpClientCertificateFeature)); } return keys; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index e99c7e0b02..29a1e34b4c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _request = FeatureReference.Default; private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _transportLayerSecurity = FeatureReference.Default; + private FeatureReference _clientCertificate = FeatureReference.Default; private FeatureReference _query = FeatureReference.Default; private FeatureReference _form = FeatureReference.Default; private FeatureReference _cookies = FeatureReference.Default; @@ -43,9 +43,9 @@ namespace Microsoft.AspNet.PipelineCore get { return _connection.Fetch(_features); } } - private IHttpTransportLayerSecurityFeature HttpTransportLayerSecurityFeature + private IHttpClientCertificateFeature HttpClientCertificateFeature { - get { return _transportLayerSecurity.Fetch(_features); } + get { return _clientCertificate.Fetch(_features); } } private IQueryFeature QueryFeature From 7f1135cec3afb66a9e7f9decd274abd798afdcb4 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 19 Jun 2014 10:56:15 -0700 Subject: [PATCH 114/846] Bump version to 1.0.0-* --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 6 +++--- src/Microsoft.AspNet.HttpFeature/project.json | 6 +++--- src/Microsoft.AspNet.Owin/project.json | 4 ++-- src/Microsoft.AspNet.PipelineCore/project.json | 6 +++--- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 7 +------ test/Microsoft.AspNet.Http.Tests/project.json | 9 ++------- test/Microsoft.AspNet.Owin.Tests/project.json | 7 +------ test/Microsoft.AspNet.PipelineCore.Tests/project.json | 7 +------ 9 files changed, 17 insertions(+), 37 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 8fda7d4cff..04c5fa7e3a 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,5 +1,5 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": {}, "configurations": { "net45": {}, diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 11a017e2d5..def3e11e29 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,11 +1,11 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": {}, "configurations": { "net45": {}, "k10": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", @@ -16,7 +16,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Principal" : "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 2fa40105ad..96bece8d27 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,15 +1,15 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "configurations": { "net45": {}, "k10": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.IO": "4.0.0.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0.0", "System.Security.Principal": "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 18e1116930..70e5093a74 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,5 +1,5 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", @@ -20,7 +20,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0.0", "System.Security.Principal" : "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 0c280000e8..a90c55474e 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,6 +1,6 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -10,7 +10,7 @@ "net45": {}, "k10": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", @@ -21,7 +21,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Principal" : "4.0.0.0", "System.Text.Encoding": "4.0.20.0", "System.Threading.Tasks": "4.0.10.0" diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index ca05fee96f..deec853dae 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,14 +1,9 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 29620862ab..1c00f87e1d 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,15 +1,10 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.PipelineCore": "", - "Microsoft.AspNet.Testing": "0.1-alpha-*", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Microsoft.AspNet.Testing": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 362d8821c4..8d59b446c6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,16 +1,11 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Owin": "", "Microsoft.AspNet.PipelineCore": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 4efc819ed8..4b282a0a4b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,15 +1,10 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.PipelineCore": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" From 940d3554ae578ae2d3cc0191fa46599fc6d363e6 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Fri, 20 Jun 2014 14:32:48 -0700 Subject: [PATCH 115/846] Updating release Nuget.config --- NuGet.Config | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index a059188b09..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,13 +1,7 @@ - + - + - - - - - - - \ No newline at end of file + From f6f7c30a0507a04656da43026d7557fb52d6a294 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Fri, 20 Jun 2014 14:32:49 -0700 Subject: [PATCH 116/846] Updating dev Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From f08b6a8d53b4caed1a72166838ef633e690377fd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 24 Jun 2014 14:51:51 -0700 Subject: [PATCH 117/846] #3 - Add Count, Keys, and ContainsKey to IReadableStringCollection --- .../IReadableStringCollection.cs | 21 ++++-- .../Collections/ReadableStringCollection.cs | 27 ++++++++ .../Collections/RequestCookiesCollection.cs | 64 +++++++++++++++---- 3 files changed, 94 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs index 21a00450ea..8f18b618ba 100644 --- a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs @@ -19,7 +19,22 @@ namespace Microsoft.AspNet.Http /// string this[string key] { get; } - // Joined + /// + /// Gets the number of elements contained in the collection. + /// + int Count { get; } + + /// + /// Gets a collection containing the keys. + /// + ICollection Keys { get; } + + /// + /// Determines whether the collection contains an element with the specified key. + /// + /// + /// + bool ContainsKey(string key); /// /// Get the associated value from the collection. Multiple values will be merged. @@ -30,8 +45,6 @@ namespace Microsoft.AspNet.Http [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "Re-evaluate later.")] string Get(string key); - // Joined - /// /// Get the associated values from the collection in their original format. /// Returns null if the key is not present. @@ -39,7 +52,5 @@ namespace Microsoft.AspNet.Http /// /// IList GetValues(string key); - - // Raw } } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index 84f95d7e0e..139d8d1c78 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -31,6 +31,23 @@ namespace Microsoft.AspNet.PipelineCore.Collections private IDictionary Store { get; set; } + /// + /// Gets the number of elements contained in the collection. + /// + public int Count + { + get { return Store.Count; } + } + + /// + /// Gets a collection containing the keys. + /// + public ICollection Keys + { + get { return Store.Keys; } + } + + /// /// Get the associated value from the collection. Multiple values will be merged. /// Returns null if the key is not present. @@ -42,6 +59,16 @@ namespace Microsoft.AspNet.PipelineCore.Collections get { return Get(key); } } + /// + /// Determines whether the collection contains an element with the specified key. + /// + /// + /// + public bool ContainsKey(string key) + { + return Store.ContainsKey(key); + } + /// /// Get the associated value from the collection. Multiple values will be merged. /// Returns null if the key is not present. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index e562487fd1..5fd131d990 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -18,30 +18,55 @@ namespace Microsoft.AspNet.PipelineCore.Collections _dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); } - public IEnumerator> GetEnumerator() - { - foreach (var pair in _dictionary) - { - yield return new KeyValuePair(pair.Key, new[] { pair.Value }); - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - public string this[string key] { get { return Get(key); } } + /// + /// Gets the number of elements contained in the collection. + /// + public int Count + { + get { return _dictionary.Count; } + } + + /// + /// Gets a collection containing the keys. + /// + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + /// + /// Determines whether the collection contains an element with the specified key. + /// + /// + /// + public bool ContainsKey(string key) + { + return _dictionary.ContainsKey(key); + } + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// public string Get(string key) { string value; return _dictionary.TryGetValue(key, out value) ? value : null; } + /// + /// Get the associated values from the collection in their original format. + /// Returns null if the key is not present. + /// + /// + /// public IList GetValues(string key) { string value; @@ -56,6 +81,19 @@ namespace Microsoft.AspNet.PipelineCore.Collections ParsingHelpers.ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, _dictionary); } + public IEnumerator> GetEnumerator() + { + foreach (var pair in _dictionary) + { + yield return new KeyValuePair(pair.Key, new[] { pair.Value }); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + private static readonly Action AddCookieCallback = (name, value, state) => { var dictionary = (IDictionary)state; From 82f72581c9ec10e412a1f67a41604b0b777101c4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 24 Jun 2014 15:47:08 -0700 Subject: [PATCH 118/846] Add an explict Count to IHeaderDictionary to resolve ambiguity. --- src/Microsoft.AspNet.Http/IHeaderDictionary.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs index d740fe03bf..fecac4a0f4 100644 --- a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -18,6 +18,12 @@ namespace Microsoft.AspNet.Http /// the associated value from the collection as a single string or null if the key is not present. new string this[string key] { get; set; } + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count + /// + /// Gets the number of elements contained in the collection. + /// + new int Count { get; } + /// /// Get the associated values from the collection separated into individual values. /// Quoted values will not be split, and the quotes will be removed. From ff31b958fe0219b5252fc026ffbbd3938b630ff9 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 24 Jun 2014 12:06:55 -0700 Subject: [PATCH 119/846] #80 - Add CancellationToken to GetClientCertAsyc, GetFormAsync. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 13 +++++++++++-- .../IHttpClientCertificateFeature.cs | 3 ++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 3 ++- .../OwinFeatureCollection.cs | 2 +- .../DefaultHttpRequest.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 15 ++++++++++++--- src/Microsoft.AspNet.PipelineCore/IFormFeature.cs | 3 ++- .../FormFeatureTests.cs | 9 +++++---- 8 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 9a09b01a65..44fa1e945b 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -63,10 +63,19 @@ namespace Microsoft.AspNet.Http public abstract IReadableStringCollection Query { get; } /// - /// Gets the query value collection form collection. + /// Gets the form collection. /// /// The form collection parsed from the request body. - public abstract Task GetFormAsync(); + public virtual Task GetFormAsync() + { + return GetFormAsync(CancellationToken.None); + } + + /// + /// Gets the form collection. + /// + /// The form collection parsed from the request body. + public abstract Task GetFormAsync(CancellationToken cancel); /// /// Gets or set the owin.RequestProtocol. diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs index ccaf9b1298..2c9e77bdb1 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; +using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Runtime; @@ -19,6 +20,6 @@ namespace Microsoft.AspNet.HttpFeature /// Asynchronously retrieves the client certificate, if any. /// /// - Task GetClientCertificateAsync(); + Task GetClientCertificateAsync(CancellationToken cancel); } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 82656dcba9..8f6f9c4951 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -69,7 +69,8 @@ namespace Microsoft.AspNet.Owin { _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.GetClientCertificateAsync))); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap( + feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 0e0a5abeb9..8994dfa6f4 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -203,7 +203,7 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpClientCertificateFeature.GetClientCertificateAsync() + Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancel) { throw new NotImplementedException(); } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 29a1e34b4c..eba4253862 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -129,9 +129,9 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync() + public override Task GetFormAsync(CancellationToken cancel) { - return FormFeature.GetFormAsync(); + return FormFeature.GetFormAsync(cancel); } public override string Protocol diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index ad7598af3e..86e1d4c0f3 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -3,9 +3,10 @@ using System.IO; using System.Text; +using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -24,14 +25,22 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - public async Task GetFormAsync() + public async Task GetFormAsync(CancellationToken cancel) { var body = _request.Fetch(_features).Body; if (_bodyStream == null || _bodyStream != body) { _bodyStream = body; - using (var streamReader = new StreamReader(body, Encoding.UTF8, + if (!_bodyStream.CanSeek) + { + MemoryStream buffer = new MemoryStream(); + await _bodyStream.CopyToAsync(buffer, 4096, cancel); + _bodyStream = buffer; + _request.Fetch(_features).Body = _bodyStream; + _bodyStream.Seek(0, SeekOrigin.Begin); + } + using (var streamReader = new StreamReader(_bodyStream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 261b77d551..0aed1a00f3 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; @@ -8,6 +9,6 @@ namespace Microsoft.AspNet.PipelineCore { public interface IFormFeature { - Task GetFormAsync(); + Task GetFormAsync(CancellationToken cancel); } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index 6566bc75eb..b7fdc8f563 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -3,6 +3,7 @@ using System.IO; using System.Text; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; @@ -29,7 +30,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests var provider = new FormFeature(features.Object); // Act - var formCollection = await provider.GetFormAsync(); + var formCollection = await provider.GetFormAsync(CancellationToken.None); // Assert Assert.Equal("bar", formCollection["foo"]); @@ -53,16 +54,16 @@ namespace Microsoft.AspNet.PipelineCore.Tests var provider = new FormFeature(features.Object); // Act - 1 - var formCollection = await provider.GetFormAsync(); + var formCollection = await provider.GetFormAsync(CancellationToken.None); // Assert - 1 Assert.Equal("bar", formCollection["foo"]); Assert.Equal("2", formCollection["baz"]); - Assert.Same(formCollection, await provider.GetFormAsync()); + Assert.Same(formCollection, await provider.GetFormAsync(CancellationToken.None)); // Act - 2 request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent2)); - formCollection = await provider.GetFormAsync(); + formCollection = await provider.GetFormAsync(CancellationToken.None); // Assert - 2 Assert.Equal("value", formCollection["collection2"]); From 55e491e354321f83b7582c5898b01add117fa501 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 25 Jun 2014 09:15:11 -0700 Subject: [PATCH 120/846] Make CancellationToken a default param. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 11 +---------- .../DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 44fa1e945b..f8632e5751 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -66,16 +66,7 @@ namespace Microsoft.AspNet.Http /// Gets the form collection. /// /// The form collection parsed from the request body. - public virtual Task GetFormAsync() - { - return GetFormAsync(CancellationToken.None); - } - - /// - /// Gets the form collection. - /// - /// The form collection parsed from the request body. - public abstract Task GetFormAsync(CancellationToken cancel); + public abstract Task GetFormAsync(CancellationToken cancel = default(CancellationToken)); /// /// Gets or set the owin.RequestProtocol. diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index eba4253862..609bcf8b89 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -129,7 +129,7 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync(CancellationToken cancel) + public override Task GetFormAsync(CancellationToken cancel = default(CancellationToken)) { return FormFeature.GetFormAsync(cancel); } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 86e1d4c0f3..36b3a169c2 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.PipelineCore _bodyStream = body; if (!_bodyStream.CanSeek) { - MemoryStream buffer = new MemoryStream(); + var buffer = new MemoryStream(); await _bodyStream.CopyToAsync(buffer, 4096, cancel); _bodyStream = buffer; _request.Fetch(_features).Body = _bodyStream; From df730a47a94fe56da53ffc5dfe0051c3b09cd0ab Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 26 Jun 2014 10:11:29 -0700 Subject: [PATCH 121/846] Rename CancellationToken parameter. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 2 +- .../IHttpClientCertificateFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/IFormFeature.cs | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index f8632e5751..4d1aa1a9db 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Http /// Gets the form collection. /// /// The form collection parsed from the request body. - public abstract Task GetFormAsync(CancellationToken cancel = default(CancellationToken)); + public abstract Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)); /// /// Gets or set the owin.RequestProtocol. diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs index 2c9e77bdb1..b70fa027cf 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs @@ -20,6 +20,6 @@ namespace Microsoft.AspNet.HttpFeature /// Asynchronously retrieves the client certificate, if any. /// /// - Task GetClientCertificateAsync(CancellationToken cancel); + Task GetClientCertificateAsync(CancellationToken cancellationToken); } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 8994dfa6f4..f0ebf96365 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -203,7 +203,7 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancel) + Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) { throw new NotImplementedException(); } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 609bcf8b89..efdda560d1 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -129,9 +129,9 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync(CancellationToken cancel = default(CancellationToken)) + public override Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)) { - return FormFeature.GetFormAsync(cancel); + return FormFeature.GetFormAsync(cancellationToken); } public override string Protocol diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 36b3a169c2..25472d4057 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - public async Task GetFormAsync(CancellationToken cancel) + public async Task GetFormAsync(CancellationToken cancellationToken) { var body = _request.Fetch(_features).Body; @@ -35,7 +35,7 @@ namespace Microsoft.AspNet.PipelineCore if (!_bodyStream.CanSeek) { var buffer = new MemoryStream(); - await _bodyStream.CopyToAsync(buffer, 4096, cancel); + await _bodyStream.CopyToAsync(buffer, 4096, cancellationToken); _bodyStream = buffer; _request.Fetch(_features).Body = _bodyStream; _bodyStream.Seek(0, SeekOrigin.Begin); diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 0aed1a00f3..07debf7870 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -9,6 +9,6 @@ namespace Microsoft.AspNet.PipelineCore { public interface IFormFeature { - Task GetFormAsync(CancellationToken cancel); + Task GetFormAsync(CancellationToken cancellationToken); } } From f5173e44ae03227c1defbad89f6053b35f6c89d8 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 19 Jun 2014 13:42:01 -0700 Subject: [PATCH 122/846] Expand feature support for OWIN->K. --- .../Microsoft.AspNet.Owin.kproj | 3 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 36 ++------------- .../OwinFeatureCollection.cs | 40 +++++++++++++++-- src/Microsoft.AspNet.Owin/Utilities.cs | 45 +++++++++++++++++++ .../OwinFeatureCollectionTests.cs | 40 ++++++++++++++++- 5 files changed, 125 insertions(+), 39 deletions(-) create mode 100644 src/Microsoft.AspNet.Owin/Utilities.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 825f49a06f..ea1daa11aa 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -25,6 +25,7 @@ + - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 8f6f9c4951..040def476e 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,8 +37,8 @@ namespace Microsoft.AspNet.Owin { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => RemoveQuestionMark(feature.QueryString), - (feature, value) => feature.QueryString = AddQuestionMark(Convert.ToString(value))) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), + (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, @@ -62,7 +62,7 @@ namespace Microsoft.AspNet.Owin { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, - { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = MakeClaimsPrincipal((IPrincipal)value)) }, + { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value)) }, }; if (context.Request.IsSecure) @@ -230,36 +230,6 @@ namespace Microsoft.AspNet.Owin throw new NotImplementedException(); } - private string RemoveQuestionMark(string queryString) - { - if (!string.IsNullOrEmpty(queryString)) - { - if (queryString[0] == '?') - { - return queryString.Substring(1); - } - } - return queryString; - } - - private string AddQuestionMark(string queryString) - { - if (!string.IsNullOrEmpty(queryString)) - { - return '?' + queryString; - } - return queryString; - } - - private ClaimsPrincipal MakeClaimsPrincipal(IPrincipal principal) - { - if (principal is ClaimsPrincipal) - { - return principal as ClaimsPrincipal; - } - return new ClaimsPrincipal(principal); - } - public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index f0ebf96365..c7af211b46 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -8,10 +8,13 @@ using System.IO; using System.Linq; using System.Net; using System.Reflection; +using System.Security.Claims; using System.Security.Cryptography.X509Certificates; +using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.Owin @@ -25,6 +28,8 @@ namespace Microsoft.AspNet.Owin IHttpConnectionFeature, IHttpSendFileFeature, IHttpClientCertificateFeature, + IHttpRequestLifetimeFeature, + IHttpAuthenticationFeature, IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -81,8 +86,8 @@ namespace Microsoft.AspNet.Owin string IHttpRequestFeature.QueryString { - get { return Prop(OwinConstants.RequestQueryString); } - set { Prop(OwinConstants.RequestQueryString, value); } + get { return Utilities.AddQuestionMark(Prop(OwinConstants.RequestQueryString)); } + set { Prop(OwinConstants.RequestQueryString, Utilities.RemoveQuestionMark(value)); } } IDictionary IHttpRequestFeature.Headers @@ -203,11 +208,38 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) + async Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) + { + var loadAsync = Prop>(OwinConstants.CommonKeys.LoadClientCertAsync); + if (loadAsync != null) + { + await loadAsync(); + } + return Prop(OwinConstants.CommonKeys.ClientCertificate); + } + + CancellationToken IHttpRequestLifetimeFeature.OnRequestAborted + { + get { return Prop(OwinConstants.CallCancelled); } + } + + void IHttpRequestLifetimeFeature.Abort() { throw new NotImplementedException(); } + ClaimsPrincipal IHttpAuthenticationFeature.User + { + get { return Utilities.MakeClaimsPrincipal(Prop(OwinConstants.Security.User)); } + set { Prop(OwinConstants.Security.User, value); } + } + + IAuthenticationHandler IHttpAuthenticationFeature.Handler + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + public int Revision { get { return 0; } // Not modifiable @@ -249,6 +281,8 @@ namespace Microsoft.AspNet.Owin typeof(IHttpResponseFeature), typeof(IHttpConnectionFeature), typeof(IOwinEnvironmentFeature), + typeof(IHttpRequestLifetimeFeature), + typeof(IHttpAuthenticationFeature), }; if (SupportsSendFile) { diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs new file mode 100644 index 0000000000..ba3a4d4180 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Security.Principal; + +namespace Microsoft.AspNet.Owin +{ + internal static class Utilities + { + internal static string RemoveQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + if (queryString[0] == '?') + { + return queryString.Substring(1); + } + } + return queryString; + } + + internal static string AddQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + return '?' + queryString; + } + return queryString; + } + + internal static ClaimsPrincipal MakeClaimsPrincipal(IPrincipal principal) + { + if (principal == null) + { + return null; + } + if (principal is ClaimsPrincipal) + { + return principal as ClaimsPrincipal; + } + return new ClaimsPrincipal(principal); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index ca21c566de..663972150f 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -16,17 +16,53 @@ namespace Microsoft.AspNet.Owin object value; return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); } + private T Get(IDictionary env, string key) + { + object value; + return env.TryGetValue(key, out value) ? (T)value : default(T); + } [Fact] public void OwinHttpEnvironmentCanBeCreated() { var env = new Dictionary { - {"owin.RequestMethod", "POST"} + { "owin.RequestMethod", "POST" }, + { "owin.RequestPath", "/path" }, + { "owin.RequestPathBase", "/pathBase" }, + { "owin.RequestQueryString", "name=value" }, }; var features = new FeatureObject(new OwinFeatureCollection(env)); - Assert.Equal(Get(features).Method, "POST"); + var requestFeature = Get(features); + Assert.Equal(requestFeature.Method, "POST"); + Assert.Equal(requestFeature.Path, "/path"); + Assert.Equal(requestFeature.PathBase, "/pathBase"); + Assert.Equal(requestFeature.QueryString, "?name=value"); + } + + [Fact] + public void OwinHttpEnvironmentCanBeModified() + { + var env = new Dictionary + { + { "owin.RequestMethod", "POST" }, + { "owin.RequestPath", "/path" }, + { "owin.RequestPathBase", "/pathBase" }, + { "owin.RequestQueryString", "name=value" }, + }; + var features = new FeatureObject(new OwinFeatureCollection(env)); + + var requestFeature = Get(features); + requestFeature.Method = "GET"; + requestFeature.Path = "/path2"; + requestFeature.PathBase = "/pathBase2"; + requestFeature.QueryString = "?name=value2"; + + Assert.Equal("GET", Get(env, "owin.RequestMethod")); + Assert.Equal("/path2", Get(env, "owin.RequestPath")); + Assert.Equal("/pathBase2", Get(env, "owin.RequestPathBase")); + Assert.Equal("name=value2", Get(env, "owin.RequestQueryString")); } [Fact] From f4a397dfcc909deed02e962866ad71d94ac5f52e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 20 Jun 2014 12:13:51 -0700 Subject: [PATCH 123/846] OWIN: Support dynamically creatable features. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 57 +++++++++++++++---- .../OwinEnvironmentTests.cs | 8 --- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 040def476e..fd3565b16e 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -8,7 +8,6 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; -using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; @@ -16,6 +15,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.Owin { @@ -62,7 +62,10 @@ namespace Microsoft.AspNet.Owin { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, - { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value)) }, + { OwinConstants.Security.User, new FeatureMap(feature => feature.User, + (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), + () => new HttpAuthenticationFeature()) + }, }; if (context.Request.IsSecure) @@ -150,7 +153,11 @@ namespace Microsoft.AspNet.Owin FeatureMap entry; if (_entries.TryGetValue(key, out entry)) { - if (entry.Setter == null) + if (entry.CanSet) + { + entry.Set(_context, value); + } + else { _entries.Remove(key); if (value != null) @@ -158,10 +165,6 @@ namespace Microsoft.AspNet.Owin _context.Items[key] = value; } } - else - { - entry.Setter(_context.GetFeature(entry.FeatureInterface), value); - } } else { @@ -233,20 +236,32 @@ namespace Microsoft.AspNet.Owin public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) - : this(featureInterface, getter, null) + : this(featureInterface, getter, setter: null) { } public FeatureMap(Type featureInterface, Func getter, Action setter) + : this(featureInterface, getter, setter, featureCreator: null) + { + } + + public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureCreator) { FeatureInterface = featureInterface; Getter = getter; Setter = setter; + FeatureCreator = featureCreator; } - internal Type FeatureInterface { get; set; } - internal Func Getter { get; set; } - internal Action Setter { get; set; } + private Type FeatureInterface { get; set; } + private Func Getter { get; set; } + private Action Setter { get; set; } + private Func FeatureCreator { get; set; } + + public bool CanSet + { + get { return Setter != null; } + } internal object Get(HttpContext context) { @@ -260,7 +275,20 @@ namespace Microsoft.AspNet.Owin internal void Set(HttpContext context, object value) { - Setter(context.GetFeature(FeatureInterface), value); + var feature = context.GetFeature(FeatureInterface); + if (feature == null) + { + if (FeatureCreator == null) + { + throw new InvalidOperationException("Missing feature: " + FeatureInterface.FullName); + } + else + { + feature = FeatureCreator(); + context.SetFeature(FeatureInterface, feature); + } + } + Setter(feature, value); } } @@ -275,6 +303,11 @@ namespace Microsoft.AspNet.Owin : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) { } + + public FeatureMap(Func getter, Action setter, Func creator) + : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value), () => (T)creator()) + { + } } } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index ea603bc501..ddab64dca8 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -104,7 +104,6 @@ namespace Microsoft.AspNet.Owin var features = new FeatureCollection(); features.Add(typeof(IHttpRequestFeature), new MoqHttpRequestFeature()); features.Add(typeof(IHttpResponseFeature), new MoqHttpResponseFeature()); - features.Add(typeof(IHttpAuthenticationFeature), new MoqHttpAuthenticationFeature()); features.Add(typeof(IHttpRequestLifetimeFeature), new MoqHttpRequestLifetimeFeature()); return new DefaultHttpContext(features); } @@ -154,13 +153,6 @@ namespace Microsoft.AspNet.Owin } } - private class MoqHttpAuthenticationFeature : IHttpAuthenticationFeature - { - public ClaimsPrincipal User { get; set; } - - public IAuthenticationHandler Handler { get; set; } - } - private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature { public CancellationToken OnRequestAborted { get; private set; } From 13f4c242ab700c7ecde71cfb705dda4e221b83d0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 27 Jun 2014 09:52:56 -0700 Subject: [PATCH 124/846] Rename T to TFeature, Creator to Factory. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index fd3565b16e..5250b58479 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -241,22 +241,22 @@ namespace Microsoft.AspNet.Owin } public FeatureMap(Type featureInterface, Func getter, Action setter) - : this(featureInterface, getter, setter, featureCreator: null) + : this(featureInterface, getter, setter, featureFactory: null) { } - public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureCreator) + public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureFactory) { FeatureInterface = featureInterface; Getter = getter; Setter = setter; - FeatureCreator = featureCreator; + FeatureFactory = featureFactory; } private Type FeatureInterface { get; set; } private Func Getter { get; set; } private Action Setter { get; set; } - private Func FeatureCreator { get; set; } + private Func FeatureFactory { get; set; } public bool CanSet { @@ -278,13 +278,13 @@ namespace Microsoft.AspNet.Owin var feature = context.GetFeature(FeatureInterface); if (feature == null) { - if (FeatureCreator == null) + if (FeatureFactory == null) { - throw new InvalidOperationException("Missing feature: " + FeatureInterface.FullName); + throw new InvalidOperationException("Missing feature: " + FeatureInterface.FullName); // TODO: LOC } else { - feature = FeatureCreator(); + feature = FeatureFactory(); context.SetFeature(FeatureInterface, feature); } } @@ -292,20 +292,20 @@ namespace Microsoft.AspNet.Owin } } - public class FeatureMap : FeatureMap + public class FeatureMap : FeatureMap { - public FeatureMap(Func getter) - : base(typeof(T), feature => getter((T)feature)) + public FeatureMap(Func getter) + : base(typeof(TFeature), feature => getter((TFeature)feature)) { } - public FeatureMap(Func getter, Action setter) - : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) + public FeatureMap(Func getter, Action setter) + : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value)) { } - public FeatureMap(Func getter, Action setter, Func creator) - : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value), () => (T)creator()) + public FeatureMap(Func getter, Action setter, Func featureFactory) + : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value), () => featureFactory()) { } } From 05a275faae0dd99b0545b8427e4d8bcefce30ab1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 30 Jun 2014 11:06:32 -0700 Subject: [PATCH 125/846] OWIN: #87 Make IHttpAuthenticationFeature.Handler not throw. --- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index c7af211b46..acd3b2f850 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -234,11 +234,7 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.Security.User, value); } } - IAuthenticationHandler IHttpAuthenticationFeature.Handler - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } public int Revision { From bc2cf1223ed5a6f905193f3ac1a9bf3a4d6e1ea6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Jul 2014 16:24:27 -0700 Subject: [PATCH 126/846] #89 - Rename OnRequestAborted to RequestAborted. --- src/Microsoft.AspNet.Http/HttpContext.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 4 ++-- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index f14a8b059b..89c421e5cb 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Http public abstract IServiceProvider RequestServices { get; set; } - public abstract CancellationToken OnRequestAborted { get; } + public abstract CancellationToken RequestAborted { get; } public abstract bool IsWebSocketRequest { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index dca2418de9..b6bcee9c32 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.HttpFeature [AssemblyNeutral] public interface IHttpRequestLifetimeFeature { - CancellationToken OnRequestAborted { get; } + CancellationToken RequestAborted { get; } void Abort(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5250b58479..914837c083 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Owin _context = context; _entries = new Dictionary() { - { OwinConstants.CallCancelled, new FeatureMap(feature => feature.OnRequestAborted) }, + { OwinConstants.CallCancelled, new FeatureMap(feature => feature.RequestAborted) }, { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index acd3b2f850..f546eaa930 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -218,7 +218,7 @@ namespace Microsoft.AspNet.Owin return Prop(OwinConstants.CommonKeys.ClientCertificate); } - CancellationToken IHttpRequestLifetimeFeature.OnRequestAborted + CancellationToken IHttpRequestLifetimeFeature.RequestAborted { get { return Prop(OwinConstants.CallCancelled); } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index b8383d05fe..a6b56103f8 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -109,14 +109,14 @@ namespace Microsoft.AspNet.PipelineCore public int Revision { get { return _features.Revision; } } - public override CancellationToken OnRequestAborted + public override CancellationToken RequestAborted { get { var lifetime = LifetimeFeature; if (lifetime != null) { - return lifetime.OnRequestAborted; + return lifetime.RequestAborted; } return CancellationToken.None; } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index ddab64dca8..d7ce8ae590 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -155,7 +155,7 @@ namespace Microsoft.AspNet.Owin private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature { - public CancellationToken OnRequestAborted { get; private set; } + public CancellationToken RequestAborted { get; private set; } public void Abort() { From 10d8b1015e2b409ab05a7ace323ad58417bea8ea Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 26 Jun 2014 15:00:04 -0700 Subject: [PATCH 127/846] #69 Make auth APIs use IEnumerable instead of IList. --- src/Microsoft.AspNet.Http/HttpContext.cs | 4 +-- src/Microsoft.AspNet.Http/HttpResponse.cs | 10 +++---- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IChallengeContext.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext .cs | 2 +- .../DefaultHttpContext.cs | 4 +-- .../DefaultHttpResponse.cs | 6 ++--- .../Security/AuthTypeContext.cs | 11 +++++--- .../Security/AuthenticateContext.cs | 27 ++++++++++++------- .../Security/ChallengeContext.cs | 15 +++++++---- .../Security/SignInContext.cs | 15 +++++++---- .../Security/SignOutContext.cs | 15 +++++++---- 13 files changed, 72 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 89c421e5cb..191c3f02a6 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -57,14 +57,14 @@ namespace Microsoft.AspNet.Http return Authenticate(new[] { authenticationType }).SingleOrDefault(); } - public abstract IEnumerable Authenticate(IList authenticationTypes); + public abstract IEnumerable Authenticate(IEnumerable authenticationTypes); public virtual async Task AuthenticateAsync(string authenticationType) { return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); } - public abstract Task> AuthenticateAsync(IList authenticationTypes); + public abstract Task> AuthenticateAsync(IEnumerable authenticationTypes); public virtual Task AcceptWebSocketAsync() { diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 6f0a6a44dd..05ae0942d3 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -55,12 +55,12 @@ namespace Microsoft.AspNet.Http Challenge(new[] { authenticationType }, properties); } - public virtual void Challenge(IList authenticationTypes) + public virtual void Challenge(IEnumerable authenticationTypes) { Challenge(authenticationTypes, properties: null); } - public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); + public abstract void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties); public virtual void SignIn(ClaimsIdentity identity) { @@ -72,12 +72,12 @@ namespace Microsoft.AspNet.Http SignIn(new[] { identity }, properties); } - public virtual void SignIn(IList identities) + public virtual void SignIn(IEnumerable identities) { SignIn(identities, properties: null); } - public abstract void SignIn(IList identities, AuthenticationProperties properties); + public abstract void SignIn(IEnumerable identities, AuthenticationProperties properties); public virtual void SignOut() { @@ -89,6 +89,6 @@ namespace Microsoft.AspNet.Http SignOut(new[] { authenticationType }); } - public abstract void SignOut(IList authenticationTypes); + public abstract void SignOut(IEnumerable authenticationTypes); } } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index f44c411ffc..333c044f86 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface IAuthenticateContext { - IList AuthenticationTypes { get; } + IEnumerable AuthenticationTypes { get; } void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index c5855cb322..5f32f318df 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface IChallengeContext { - IList AuthenticationTypes {get;} + IEnumerable AuthenticationTypes {get;} IDictionary Properties {get;} void Accept(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index b6c1730a69..694ece38d2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface ISignInContext { - IList Identities { get; } + IEnumerable Identities { get; } IDictionary Properties { get; } void Accept(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 8346ae040b..232db13ad7 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface ISignOutContext { - IList AuthenticationTypes { get; } + IEnumerable AuthenticationTypes { get; } void Accept(string authenticationType, IDictionary description); } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index a6b56103f8..9afbc4368c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -178,7 +178,7 @@ namespace Microsoft.AspNet.PipelineCore return authTypeContext.Results; } - public override IEnumerable Authenticate(IList authenticationTypes) + public override IEnumerable Authenticate(IEnumerable authenticationTypes) { if (authenticationTypes == null) { @@ -202,7 +202,7 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } - public override async Task> AuthenticateAsync(IList authenticationTypes) + public override async Task> AuthenticateAsync(IEnumerable authenticationTypes) { if (authenticationTypes == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 436517b0b9..3a0b19cab0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -130,7 +130,7 @@ namespace Microsoft.AspNet.PipelineCore return Body.WriteAsync(bytes, 0, bytes.Length); } - public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) + public override void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties) { if (authenticationTypes == null) { @@ -153,7 +153,7 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignIn(IList identities, AuthenticationProperties properties) + public override void SignIn(IEnumerable identities, AuthenticationProperties properties) { if (identities == null) { @@ -175,7 +175,7 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignOut(IList authenticationTypes) + public override void SignOut(IEnumerable authenticationTypes) { if (authenticationTypes == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index 20bc565605..ffd779039e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -10,16 +10,21 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class AuthTypeContext : IAuthTypeContext { + private List _results; + public AuthTypeContext() { - Results = new List(); + _results = new List(); } - public IList Results { get; private set; } + public IEnumerable Results + { + get { return _results; } + } public void Accept(IDictionary description) { - Results.Add(new AuthenticationDescription(description)); + _results.Add(new AuthenticationDescription(description)); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 469c38cf3c..d975333fdf 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -14,33 +14,42 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class AuthenticateContext : IAuthenticateContext { - public AuthenticateContext(IList authenticationTypes) + private List _results; + private List _accepted; + + public AuthenticateContext(IEnumerable authenticationTypes) { if (authenticationTypes == null) { throw new ArgumentNullException("authenticationType"); } AuthenticationTypes = authenticationTypes; - Results = new List(); - Accepted = new List(); + _results = new List(); + _accepted = new List(); } - public IList AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationTypes { get; private set; } - public IList Results { get; private set; } + public IEnumerable Results + { + get { return _results; } + } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - Accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType - Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); + _accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType + _results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); } public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index b86f4cff8e..45afd34594 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -12,7 +12,9 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class ChallengeContext : IChallengeContext { - public ChallengeContext(IList authenticationTypes, IDictionary properties) + private List _accepted; + + public ChallengeContext(IEnumerable authenticationTypes, IDictionary properties) { if (authenticationTypes == null) { @@ -20,18 +22,21 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - Accepted = new List(); + _accepted = new List(); } - public IList AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationTypes { get; private set; } public IDictionary Properties { get; private set; } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Accept(string authenticationType, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 7f9694fd2a..b24a14758a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -10,7 +10,9 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class SignInContext : ISignInContext { - public SignInContext(IList identities, IDictionary dictionary) + private List _accepted; + + public SignInContext(IEnumerable identities, IDictionary dictionary) { if (identities == null) { @@ -18,18 +20,21 @@ namespace Microsoft.AspNet.PipelineCore.Security } Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); - Accepted = new List(); + _accepted = new List(); } - public IList Identities { get; private set; } + public IEnumerable Identities { get; private set; } public IDictionary Properties { get; private set; } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Accept(string authenticationType, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 1c8049d3cb..6ce2a64fa5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -9,23 +9,28 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class SignOutContext : ISignOutContext { - public SignOutContext(IList authenticationTypes) + private List _accepted; + + public SignOutContext(IEnumerable authenticationTypes) { if (authenticationTypes == null) { throw new ArgumentNullException("authenticationTypes"); } AuthenticationTypes = authenticationTypes; - Accepted = new List(); + _accepted = new List(); } - public IList AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationTypes { get; private set; } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Accept(string authenticationType, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } From 9028c6a1a57bf82da3bee6450c3f99e8752914da Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 3 Jul 2014 11:59:22 -0700 Subject: [PATCH 128/846] #88 Rename IHttpOpaqueUpgradeFeature to IHttpUpgradeFeature. --- .../IHttpOpaqueUpgradeFeature.cs | 13 ------------- .../IHttpUpgradeFeature.cs | 16 ++++++++++++++++ .../Microsoft.AspNet.HttpFeature.kproj | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-) delete mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs deleted file mode 100644 index f4fb2f4f0f..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.IO; -using System.Threading.Tasks; -using Microsoft.Framework.Runtime; - -namespace Microsoft.AspNet.HttpFeature -{ - [AssemblyNeutral] - public interface IHttpOpaqueUpgradeFeature - { - bool IsUpgradableRequest { get; } - Task UpgradeAsync(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs new file mode 100644 index 0000000000..3d3f924cae --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Threading.Tasks; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface IHttpUpgradeFeature + { + bool IsUpgradableRequest { get; } + Task UpgradeAsync(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index d9f328a5d5..5ee49bef8e 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -24,7 +24,7 @@ - + From 5bf4883cd99255902e669b74e54f77a2ed01f4ad Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 7 Jul 2014 10:48:07 -0700 Subject: [PATCH 129/846] #91 Provide a default constructor for DefaultHttpContext. --- .../DeafultHttpRequestFeature.cs | 30 ++++----- .../DefaultHttpContext.cs | 7 ++ .../DefaultHttpResponseFeature.cs | 33 +++++++++ .../Microsoft.AspNet.PipelineCore.kproj | 2 + .../MapPathMiddlewareTests.cs | 4 +- .../MapPredicateMiddlewareTests.cs | 4 +- .../Microsoft.AspNet.Http.Tests.kproj | 3 +- .../OwinEnvironmentTests.cs | 67 +------------------ .../DefaultHttpContextTests.cs | 19 +----- .../DefaultHttpRequestTests.cs | 28 +++----- 10 files changed, 73 insertions(+), 124 deletions(-) rename test/Microsoft.AspNet.Http.Tests/Fakes.cs => src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs (51%) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs diff --git a/test/Microsoft.AspNet.Http.Tests/Fakes.cs b/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs similarity index 51% rename from test/Microsoft.AspNet.Http.Tests/Fakes.cs rename to src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs index d33efeaa2b..bfbdf518a7 100644 --- a/test/Microsoft.AspNet.Http.Tests/Fakes.cs +++ b/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -6,10 +6,22 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNet.PipelineCore { - public class FakeHttpRequestFeature : IHttpRequestFeature + public class DeafultHttpRequestFeature : IHttpRequestFeature { + public DeafultHttpRequestFeature() + { + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Body = Stream.Null; + Protocol = string.Empty; + Scheme = string.Empty; + Method = string.Empty; + PathBase = string.Empty; + Path = string.Empty; + QueryString = string.Empty; + } + public string Protocol { get; set; } public string Scheme { get; set; } public string Method { get; set; } @@ -19,16 +31,4 @@ namespace Microsoft.AspNet.Builder.Extensions public IDictionary Headers { get; set; } public Stream Body { get; set; } } - - public class FakeHttpResponseFeature : IHttpResponseFeature - { - public int StatusCode { get; set; } - public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } - public Stream Body { get; set; } - public void OnSendingHeaders(Action callback, object state) - { - throw new NotImplementedException(); - } - } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 9afbc4368c..af1f15e790 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -33,6 +33,13 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _webSockets; private IFeatureCollection _features; + public DefaultHttpContext() + : this(new FeatureCollection()) + { + SetFeature(new DeafultHttpRequestFeature()); + SetFeature(new DefaultHttpResponseFeature()); + } + public DefaultHttpContext(IFeatureCollection features) { _features = features; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs new file mode 100644 index 0000000000..819ff17421 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultHttpResponseFeature : IHttpResponseFeature + { + public DefaultHttpResponseFeature() + { + StatusCode = 200; + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Body = Stream.Null; + } + + public int StatusCode { get; set; } + + public string ReasonPhrase { get; set; } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + public void OnSendingHeaders(Action callback, object state) + { + throw new NotSupportedException(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 05dd7de5dd..054abcaa32 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -27,6 +27,8 @@ + + diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 3bca69be56..4a9d68dd45 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -187,9 +187,7 @@ namespace Microsoft.AspNet.Builder.Extensions private HttpContext CreateRequest(string basePath, string requestPath) { - HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestFeature()); - context.SetFeature(new FakeHttpResponseFeature()); + HttpContext context = new DefaultHttpContext(); context.Request.PathBase = new PathString(basePath); context.Request.Path = new PathString(requestPath); return context; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index 17cce7c777..eb8ee8be9c 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -176,9 +176,7 @@ namespace Microsoft.AspNet.Builder.Extensions private HttpContext CreateRequest() { - HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestFeature()); - context.SetFeature(new FakeHttpResponseFeature()); + HttpContext context = new DefaultHttpContext(); return context; } } diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 883a9d895c..f8e3963d7c 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -21,10 +21,9 @@ - - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index d7ce8ae590..cdc5eb680f 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,16 +1,11 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Claims; -using System.Threading; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -101,66 +96,8 @@ namespace Microsoft.AspNet.Owin private HttpContext CreateContext() { - var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestFeature), new MoqHttpRequestFeature()); - features.Add(typeof(IHttpResponseFeature), new MoqHttpResponseFeature()); - features.Add(typeof(IHttpRequestLifetimeFeature), new MoqHttpRequestLifetimeFeature()); - return new DefaultHttpContext(features); - } - - private class MoqHttpRequestFeature : IHttpRequestFeature - { - public MoqHttpRequestFeature() - { - Headers = new Dictionary(); - } - - public string Method { get; set; } - - public string Scheme { get; set; } - - public string Protocol { get; set; } - - public Stream Body { get; set; } - - public string PathBase { get; set; } - - public string Path { get; set; } - - public string QueryString { get; set; } - - public IDictionary Headers { get; set; } - } - - private class MoqHttpResponseFeature : IHttpResponseFeature - { - public MoqHttpResponseFeature() - { - Headers = new Dictionary(); - } - - public Stream Body { get; set; } - - public int StatusCode { get; set; } - - public string ReasonPhrase { get; set; } - - public IDictionary Headers { get; set; } - - public void OnSendingHeaders(Action callback, object state) - { - throw new NotImplementedException(); - } - } - - private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature - { - public CancellationToken RequestAborted { get; private set; } - - public void Abort() - { - throw new NotImplementedException(); - } + var context = new DefaultHttpContext(); + return context; } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 6ece4245fa..723811a947 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -80,25 +80,8 @@ namespace Microsoft.AspNet.PipelineCore.Tests private HttpContext CreateContext() { - var context = new DefaultHttpContext(new FeatureCollection()); - context.SetFeature(new FakeHttpResponse()); + var context = new DefaultHttpContext(); return context; } - - private class FakeHttpResponse : IHttpResponseFeature - { - public int StatusCode { get; set; } - - public string ReasonPhrase { get; set; } - - public IDictionary Headers { get; set; } - - public Stream Body { get; set; } - - public void OnSendingHeaders(Action callback, object state) - { - throw new NotImplementedException(); - } - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 93d816e875..baa1c6c4ed 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -5,9 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; -using Moq; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests @@ -57,9 +55,9 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange const string expected = "localhost:9001"; - var headers = new Dictionary(StringComparer.Ordinal) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Host", new string[]{ expected } }, + { "Host", new string[] { expected } }, }; var request = CreateRequest(headers); @@ -77,7 +75,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange const string expected = "löcalhöst"; - var headers = new Dictionary(StringComparer.Ordinal) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "Host", new string[]{ "xn--lcalhst-90ae" } }, }; @@ -97,7 +95,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange const string expected = "xn--lcalhst-90ae"; - var headers = new Dictionary(StringComparer.Ordinal); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); var request = CreateRequest(headers); @@ -108,25 +106,19 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Equal(expected, headers["Host"][0]); } - private static DefaultHttpRequest CreateRequest(IDictionary headers) + private static HttpRequest CreateRequest(IDictionary headers) { - var requestInfo = new Mock(); - requestInfo.SetupGet(r => r.Headers).Returns(headers); - - var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestFeature), requestInfo.Object); - - var context = new DefaultHttpContext(features); - return new DefaultHttpRequest(context, features); + var context = new DefaultHttpContext(); + context.GetFeature().Headers = headers; + return context.Request; } - private static DefaultHttpRequest GetRequestWithContentLength(string contentLength = null) + private static HttpRequest GetRequestWithContentLength(string contentLength = null) { - var headers = new Dictionary(StringComparer.Ordinal); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); if (contentLength != null) { headers.Add("Content-Length", new[] { contentLength }); - } return CreateRequest(headers); From 578518d5c4b7d2742529cde983cc1533b5c484a1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 09:34:57 -0700 Subject: [PATCH 130/846] #66 Add response writing extensions. --- HttpAbstractions.sln | 217 ++++++++++-------- .../HttpResponseSendingExtensions.cs | 152 ++++++++++++ .../Microsoft.AspNet.Http.Extensions.kproj | 36 +++ .../NotNullAttribute.cs | 12 + .../project.json | 15 ++ src/Microsoft.AspNet.Http/HttpResponse.cs | 2 - .../HttpResponseWritingExtensions.cs | 42 ++++ .../Microsoft.AspNet.Http.kproj | 3 +- .../DefaultHttpResponse.cs | 6 - .../HttpResponseSendingExtensionsTests.cs | 87 +++++++ ...crosoft.AspNet.Http.Extensions.Tests.kproj | 35 +++ .../project.json | 20 ++ .../HttpResponseWritingExtensionsTests.cs | 39 ++++ .../Microsoft.AspNet.Http.Tests.kproj | 1 + 14 files changed, 558 insertions(+), 109 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj create mode 100644 src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/project.json create mode 100644 src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/project.json create mode 100644 test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index c4043ac0a1..5158aff09e 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21628.1 +VisualStudioVersion = 14.0.21813.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -25,6 +25,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "sr EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.kproj", "{16219571-3268-4D12-8689-12B7163DBA13}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.kproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.kproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,105 +39,116 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.Build.0 = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.Build.0 = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.ActiveCfg = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.Build.0 = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.Build.0 = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.Build.0 = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.Build.0 = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.ActiveCfg = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.Build.0 = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.Build.0 = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.Build.0 = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.Build.0 = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.ActiveCfg = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.Build.0 = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.Build.0 = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.Build.0 = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.Build.0 = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.ActiveCfg = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.Build.0 = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.Build.0 = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.ActiveCfg = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.Build.0 = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.Build.0 = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.Build.0 = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.Build.0 = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.ActiveCfg = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.ActiveCfg = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.Build.0 = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.ActiveCfg = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.Build.0 = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.ActiveCfg = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.Build.0 = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.ActiveCfg = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.Build.0 = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.ActiveCfg = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.Build.0 = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.ActiveCfg = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.Build.0 = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.ActiveCfg = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.Build.0 = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.ActiveCfg = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.Build.0 = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.Build.0 = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.Build.0 = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.Build.0 = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.Build.0 = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.Build.0 = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.Build.0 = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.Build.0 = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.ActiveCfg = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.Build.0 = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.ActiveCfg = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.ActiveCfg = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.Build.0 = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.ActiveCfg = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|x86.ActiveCfg = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Any CPU.Build.0 = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|x86.ActiveCfg = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Any CPU.Build.0 = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -148,5 +163,7 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {59BED991-F207-48ED-B24C-0A1D9C986C01} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {16219571-3268-4D12-8689-12B7163DBA13} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {CCC4363E-81E2-4058-94DD-00494E9E992A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {AE25EF21-7F91-4B86-B73E-AF746821D339} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs new file mode 100644 index 0000000000..b97da7c13b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs @@ -0,0 +1,152 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + /// + /// Convenience methods for writing to the response. + /// + public static class HttpResponseSendingExtensions + { + /// + /// Sends a response with the given Content-Type and body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(text, Encoding.UTF8, contentType, cancellationToken); + } + + /// + /// Sends a response with the given Content-Type, encoding, and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + if (string.IsNullOrEmpty(contentType)) + { + throw new ArgumentException("Empty Content-Type is not allowed."); + } + if (contentType.IndexOf("charset=", StringComparison.OrdinalIgnoreCase) < 0) + { + contentType += "; charset=" + encoding.WebName; + } + response.ContentType = contentType; + return response.SendAsync(text, encoding, cancellationToken); + } + + /// + /// Sends a response with the given body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(text, Encoding.UTF8, cancellationToken); + } + + /// + /// Sends a response with the given encoding and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) + { + byte[] data = encoding.GetBytes(text); + return response.SendAsync(data, cancellationToken); + } + + /// + /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(new ArraySegment(data), contentType, cancellationToken); + } + + /// + /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + if (string.IsNullOrEmpty(contentType)) + { + throw new ArgumentException("Empty Content-Type is not allowed."); + } + response.ContentType = contentType; + return response.SendAsync(data, cancellationToken); + } + + /// + /// Sends a response with the given body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(new ArraySegment(data), cancellationToken); + } + + /// + /// Sends a response with the given body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, int offset, int count, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(new ArraySegment(data, offset, count), cancellationToken); + } + + /// + /// Sends a response with the given body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, CancellationToken cancellationToken = default(CancellationToken)) + { + if (data.Array == null) + { + throw new ArgumentException("The Array cannot be null.", "data"); // TODO: LOC + } + response.ContentLength = data.Count; + return response.Body.WriteAsync(data.Array, data.Offset, data.Count, cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj new file mode 100644 index 0000000000..7ca2e89f22 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -0,0 +1,36 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + ccc4363e-81e2-4058-94dd-00494e9e992a + Library + Microsoft.AspNet.Http.Extensions + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs new file mode 100644 index 0000000000..d43b93e4e4 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json new file mode 100644 index 0000000000..6faa246274 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -0,0 +1,15 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "" + }, + "configurations" : { + "net45" : { + }, + "k10" : { + "dependencies": { + "System.Runtime": "4.0.20.0" + } + } + } +} diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 05ae0942d3..a404c17c94 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -33,8 +33,6 @@ namespace Microsoft.AspNet.Http public abstract void Redirect(string location, bool permanent); - public abstract Task WriteAsync(string data); - public virtual void Challenge() { Challenge(new string[0]); diff --git a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs new file mode 100644 index 0000000000..464513f895 --- /dev/null +++ b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + /// + /// Convenience methods for writing to the response. + /// + public static class HttpResponseWritingExtensions + { + /// + /// Writes the given text to the response body. UTF-8 encoding will be used. + /// + /// + /// + /// + /// + public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.WriteAsync(text, Encoding.UTF8, cancellationToken); + } + + /// + /// Writes the given text to the response body using the given encoding. + /// + /// + /// + /// + /// + /// + public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) + { + byte[] data = encoding.GetBytes(text); + return response.Body.WriteAsync(data, 0, data.Length, cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index a93ecf8e2a..0e326800f8 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -33,6 +33,7 @@ + @@ -48,4 +49,4 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 3a0b19cab0..5af0f9b5fe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -124,12 +124,6 @@ namespace Microsoft.AspNet.PipelineCore Headers.Set(Constants.Headers.Location, location); } - public override Task WriteAsync(string data) - { - var bytes = Encoding.UTF8.GetBytes(data); - return Body.WriteAsync(bytes, 0, bytes.Length); - } - public override void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties) { if (authenticationTypes == null) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs new file mode 100644 index 0000000000..d2e51ec219 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -0,0 +1,87 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions +{ + public class HttpResponseSendingExtensionsTests + { + [Fact] + public async Task SendData_SendBytes() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync(new byte[10]); + + Assert.Equal(10, context.Response.Body.Length); + Assert.Equal(10, context.Response.ContentLength); + Assert.Null(context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendBytesAndContentType() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync(new byte[10], "text/html"); + + Assert.Equal(10, context.Response.Body.Length); + Assert.Equal(10, context.Response.ContentLength); + Assert.Equal("text/html", context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendText() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World"); + + Assert.Equal(11, context.Response.Body.Length); + Assert.Equal(11, context.Response.ContentLength); + Assert.Null(context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendTextWithContentType() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World", "text/html"); + + Assert.Equal(11, context.Response.Body.Length); + Assert.Equal(11, context.Response.ContentLength); + Assert.Equal("text/html; charset=utf-8", context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendTextWithEncoding() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World", Encoding.UTF32); + + Assert.Equal(44, context.Response.Body.Length); + Assert.Equal(44, context.Response.ContentLength); + Assert.Null(context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendTextWithContentTypeAndEncoding() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World", Encoding.UTF32, "text/html"); + + Assert.Equal(44, context.Response.Body.Length); + Assert.Equal(44, context.Response.ContentLength); + Assert.Equal("text/html; charset=utf-32", context.Response.ContentType); + } + + private HttpContext CreateRequest() + { + HttpContext context = new DefaultHttpContext(); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj new file mode 100644 index 0000000000..6223e75396 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + ae25ef21-7f91-4b86-b73e-af746821d339 + Library + Microsoft.AspNet.Http.Extensions.Tests + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json new file mode 100644 index 0000000000..701d09c188 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.Http.Extensions": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.PipelineCore": "", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "configurations": { + "net45": { + "dependencies": { + "Shouldly": "1.1.1.1", + "System.Runtime": "" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs new file mode 100644 index 0000000000..e34518ea26 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Xunit; + +namespace Microsoft.AspNet.Http +{ + public class HttpResponseWritingExtensionsTests + { + [Fact] + public async Task WritingText_WriteText() + { + HttpContext context = CreateRequest(); + await context.Response.WriteAsync("Hello World"); + + Assert.Equal(11, context.Response.Body.Length); + } + + [Fact] + public async Task WritingText_MultipleWrites() + { + HttpContext context = CreateRequest(); + await context.Response.WriteAsync("Hello World"); + await context.Response.WriteAsync("Hello World"); + + Assert.Equal(22, context.Response.Body.Length); + } + + private HttpContext CreateRequest() + { + HttpContext context = new DefaultHttpContext(); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index f8e3963d7c..754a812c15 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -21,6 +21,7 @@ + From bd872c5fb036ce883a558a770c83699451c61e80 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 09:42:11 -0700 Subject: [PATCH 131/846] Fix rebase issue in tests. --- .../HttpResponseSendingExtensionsTests.cs | 4 ++-- .../HttpResponseWritingExtensionsTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs index d2e51ec219..05d662a955 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -1,10 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Extensions; -using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -81,6 +80,7 @@ namespace Microsoft.AspNet.Http.Extensions private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); return context; } } diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs index e34518ea26..aa6582e753 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs @@ -1,9 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Extensions; -using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -33,6 +32,7 @@ namespace Microsoft.AspNet.Http private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); return context; } } From 1ece87ef68aa6c0cc06bfbca558aee97f8148e4c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 9 Jul 2014 09:28:40 -0700 Subject: [PATCH 132/846] Fix mispelled class name. --- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 2 +- ...fultHttpRequestFeature.cs => DefaultHttpRequestFeature.cs} | 4 ++-- .../Microsoft.AspNet.PipelineCore.kproj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/Microsoft.AspNet.PipelineCore/{DeafultHttpRequestFeature.cs => DefaultHttpRequestFeature.cs} (90%) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index af1f15e790..148ef84e19 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.PipelineCore public DefaultHttpContext() : this(new FeatureCollection()) { - SetFeature(new DeafultHttpRequestFeature()); + SetFeature(new DefaultHttpRequestFeature()); SetFeature(new DefaultHttpResponseFeature()); } diff --git a/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs similarity index 90% rename from src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs rename to src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs index bfbdf518a7..156e362c9b 100644 --- a/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs @@ -8,9 +8,9 @@ using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.PipelineCore { - public class DeafultHttpRequestFeature : IHttpRequestFeature + public class DefaultHttpRequestFeature : IHttpRequestFeature { - public DeafultHttpRequestFeature() + public DefaultHttpRequestFeature() { Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 054abcaa32..358e55cca5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -27,7 +27,7 @@ - + From 31edabdfcb1aba6eecbd677d2a9dbeaf32400972 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 09:13:45 -0700 Subject: [PATCH 133/846] #96 Enable Owin->AspNet WebSockets. --- .../Microsoft.AspNet.Owin.kproj | 3 + src/Microsoft.AspNet.Owin/OwinConstants.cs | 1 + .../OwinFeatureCollection.cs | 38 +++- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 129 ++++++++++++ .../WebSockets/OwinWebSocketAcceptContext.cs | 39 ++++ .../WebSockets/OwinWebSocketAdapter.cs | 191 ++++++++++++++++++ 6 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index ea1daa11aa..44a2b3584a 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -26,6 +26,9 @@ + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 1e1296b67d..7589b57308 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -134,6 +134,7 @@ namespace Microsoft.AspNet.Owin // 3.2. Per Request public const string Accept = "websocket.Accept"; + public const string AcceptAlt = "websocket.AcceptAlt"; // Non-spec // 4. Accept diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index f546eaa930..bec1cd1292 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -7,15 +7,16 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.WebSockets; using System.Reflection; using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.Owin { @@ -30,6 +31,7 @@ namespace Microsoft.AspNet.Owin IHttpClientCertificateFeature, IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, + IHttpWebSocketFeature, IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -236,6 +238,32 @@ namespace Microsoft.AspNet.Owin IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } + /// + /// Gets or sets if the underlying server supports WebSockets. This is disabled by default. + /// The value should be consistant across requests. + /// + public bool SupportsWebSockets { get; set; } + + bool IHttpWebSocketFeature.IsWebSocketRequest + { + get + { + object obj; + return Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj); + } + } + + Task IHttpWebSocketFeature.AcceptAsync(IWebSocketAcceptContext context) + { + object obj; + if (!Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj)) + { + throw new NotSupportedException("WebSockets are not supported"); // TODO: LOC + } + var accept = (Func>)obj; + return accept(context); + } + public int Revision { get { return 0; } // Not modifiable @@ -260,6 +288,10 @@ namespace Microsoft.AspNet.Owin { return SupportsClientCerts; } + else if (key == typeof(IHttpWebSocketFeature)) + { + return SupportsWebSockets; + } // The rest of the features are always supported. return true; @@ -288,6 +320,10 @@ namespace Microsoft.AspNet.Owin { keys.Add(typeof(IHttpClientCertificateFeature)); } + if (SupportsWebSockets) + { + keys.Add(typeof(IHttpWebSocketFeature)); + } return keys; } } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs new file mode 100644 index 0000000000..ce45e4fc4f --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -0,0 +1,129 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + using WebSocketAccept = + Action + < + IDictionary, // WebSocket Accept parameters + Func // WebSocketFunc callback + < + IDictionary, // WebSocket environment + Task // Complete + > + >; + using WebSocketAcceptAlt = + Func + < + IWebSocketAcceptContext, // WebSocket Accept parameters + Task + >; + + public class OwinWebSocketAcceptAdapter + { + private WebSocketAccept _owinWebSocketAccept; + private TaskCompletionSource _requestTcs = new TaskCompletionSource(); + private TaskCompletionSource _acceptTcs = new TaskCompletionSource(); + private TaskCompletionSource _upstreamWentAsync = new TaskCompletionSource(); + private string _subProtocol = null; + + private OwinWebSocketAcceptAdapter(WebSocketAccept owinWebSocketAccept) + { + _owinWebSocketAccept = owinWebSocketAccept; + } + + private Task RequestTask { get { return _requestTcs.Task; } } + private Task UpstreamTask { get; set; } + private TaskCompletionSource UpstreamWentAsyncTcs { get { return _upstreamWentAsync; } } + + private async Task AcceptWebSocketAsync(IWebSocketAcceptContext context) + { + IDictionary options = null; + if (context is OwinWebSocketAcceptContext) + { + var acceptContext = context as OwinWebSocketAcceptContext; + options = acceptContext.Options; + _subProtocol = acceptContext.SubProtocol; + } + else if (context != null && context.SubProtocol != null) + { + options = new Dictionary(1) + { + { OwinConstants.WebSocket.SubProtocol, context.SubProtocol } + }; + _subProtocol = context.SubProtocol; + } + + // Accept may have been called synchronously on the original request thread, we might not have a task yet. Go async. + await _upstreamWentAsync.Task; + + _owinWebSocketAccept(options, OwinAcceptCallback); + _requestTcs.TrySetResult(0); // Let the pipeline unwind. + + return await _acceptTcs.Task; + } + + private Task OwinAcceptCallback(IDictionary webSocketContext) + { + _acceptTcs.TrySetResult(new OwinWebSocketAdapter(webSocketContext, _subProtocol)); + return UpstreamTask; + } + + // Make sure declined websocket requests complete. This is a no-op for accepted websocket requests. + private void EnsureCompleted(Task task) + { + if (task.IsCanceled) + { + _requestTcs.TrySetCanceled(); + } + else if (task.IsFaulted) + { + _requestTcs.TrySetException(task.Exception); + } + else + { + _requestTcs.TrySetResult(0); + } + } + + public static AppFunc AdaptWebSockets(AppFunc next) + { + return environment => + { + object accept; + if (environment.TryGetValue(OwinConstants.WebSocket.Accept, out accept) && accept is WebSocketAccept) + { + var adapter = new OwinWebSocketAcceptAdapter((WebSocketAccept)accept); + + environment[OwinConstants.WebSocket.AcceptAlt] = new WebSocketAcceptAlt(adapter.AcceptWebSocketAsync); + + try + { + adapter.UpstreamTask = next(environment); + adapter.UpstreamWentAsyncTcs.TrySetResult(0); + adapter.UpstreamTask.ContinueWith(adapter.EnsureCompleted, TaskContinuationOptions.ExecuteSynchronously); + } + catch (Exception ex) + { + adapter.UpstreamWentAsyncTcs.TrySetException(ex); + throw; + } + + return adapter.RequestTask; + } + else + { + return next(environment); + } + }; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs new file mode 100644 index 0000000000..b23e2dbdcb --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + public class OwinWebSocketAcceptContext : IWebSocketAcceptContext + { + private IDictionary _options = new Dictionary(1); + + public OwinWebSocketAcceptContext() + { + } + + public string SubProtocol + { + get + { + object obj; + if (_options.TryGetValue(OwinConstants.WebSocket.SubProtocol, out obj)) + { + return (string)obj; + } + return null; + } + set + { + _options[OwinConstants.WebSocket.SubProtocol] = value; + } + } + + public IDictionary Options + { + get { return _options; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs new file mode 100644 index 0000000000..d77fd57295 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -0,0 +1,191 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Net.WebSockets; + +namespace Microsoft.AspNet.Owin +{ + // http://owin.org/extensions/owin-WebSocket-Extension-v0.4.0.htm + using WebSocketCloseAsync = + Func; + using WebSocketReceiveAsync = + Func /* data */, + CancellationToken /* cancel */, + Task>>; + using WebSocketSendAsync = + Func /* data */, + int /* messageType */, + bool /* endOfMessage */, + CancellationToken /* cancel */, + Task>; + using RawWebSocketReceiveResult = Tuple; // count + + public class OwinWebSocketAdapter : WebSocket + { + private IDictionary _websocketContext; + private WebSocketSendAsync _sendAsync; + private WebSocketReceiveAsync _receiveAsync; + private WebSocketCloseAsync _closeAsync; + private WebSocketState _state; + private string _subProtocol; + + public OwinWebSocketAdapter(IDictionary websocketContext, string subProtocol) + { + _websocketContext = websocketContext; + _sendAsync = (WebSocketSendAsync)websocketContext[OwinConstants.WebSocket.SendAsync]; + _receiveAsync = (WebSocketReceiveAsync)websocketContext[OwinConstants.WebSocket.ReceiveAsync]; + _closeAsync = (WebSocketCloseAsync)websocketContext[OwinConstants.WebSocket.CloseAsync]; + _state = WebSocketState.Open; + _subProtocol = subProtocol; + } + + public override WebSocketCloseStatus? CloseStatus + { + get + { + object obj; + if (_websocketContext.TryGetValue(OwinConstants.WebSocket.ClientCloseStatus, out obj)) + { + return (WebSocketCloseStatus)obj; + } + return null; + } + } + + public override string CloseStatusDescription + { + get + { + object obj; + if (_websocketContext.TryGetValue(OwinConstants.WebSocket.ClientCloseDescription, out obj)) + { + return (string)obj; + } + return null; + } + } + + public override string SubProtocol + { + get + { + return _subProtocol; + } + } + + public override WebSocketState State + { + get + { + return _state; + } + } + + public override async Task ReceiveAsync(ArraySegment buffer, CancellationToken cancellationToken) + { + var rawResult = await _receiveAsync(buffer, cancellationToken); + var messageType = OpCodeToEnum(rawResult.Item1); + if (messageType == WebSocketMessageType.Close) + { + if (State == WebSocketState.Open) + { + _state = WebSocketState.CloseReceived; + } + else if (State == WebSocketState.CloseSent) + { + _state = WebSocketState.Closed; + } + return new WebSocketReceiveResult(rawResult.Item3, messageType, rawResult.Item2, CloseStatus, CloseStatusDescription); + } + else + { + return new WebSocketReceiveResult(rawResult.Item3, messageType, rawResult.Item2); + } + } + + public override Task SendAsync(ArraySegment buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) + { + return _sendAsync(buffer, EnumToOpCode(messageType), endOfMessage, cancellationToken); + } + + public override async Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) + { + if (State == WebSocketState.Open || State == WebSocketState.CloseReceived) + { + await CloseOutputAsync(closeStatus, statusDescription, cancellationToken); + } + + byte[] buffer = new byte[1024]; + while (State == WebSocketState.CloseSent) + { + // Drain until close received + await ReceiveAsync(new ArraySegment(buffer), cancellationToken); + } + } + + public override Task CloseOutputAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) + { + // TODO: Validate state + if (State == WebSocketState.Open) + { + _state = WebSocketState.CloseSent; + } + else if (State == WebSocketState.CloseReceived) + { + _state = WebSocketState.Closed; + } + return _closeAsync((int)closeStatus, statusDescription, cancellationToken); + } + + public override void Abort() + { + _state = WebSocketState.Aborted; + } + + public override void Dispose() + { + _state = WebSocketState.Closed; + } + + private static WebSocketMessageType OpCodeToEnum(int messageType) + { + switch (messageType) + { + case 0x1: + return WebSocketMessageType.Text; + case 0x2: + return WebSocketMessageType.Binary; + case 0x8: + return WebSocketMessageType.Close; + default: + throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + } + } + + private static int EnumToOpCode(WebSocketMessageType webSocketMessageType) + { + switch (webSocketMessageType) + { + case WebSocketMessageType.Text: + return 0x1; + case WebSocketMessageType.Binary: + return 0x2; + case WebSocketMessageType.Close: + return 0x8; + default: + throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + } + } + } +} \ No newline at end of file From b1c82c00667af055b7ae6363a14dd3ac6bc31a8f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 13:55:03 -0700 Subject: [PATCH 134/846] #96 Enable AspNet->Owin WebSockets. --- .../Microsoft.AspNet.Owin.kproj | 2 + src/Microsoft.AspNet.Owin/OwinConstants.cs | 1 + src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 12 ++ .../WebSockets/OwinWebSocketAcceptContext.cs | 15 +- .../WebSockets/WebSocketAcceptAdapter.cs | 88 +++++++++ .../WebSockets/WebSocketAdapter.cs | 172 ++++++++++++++++++ 6 files changed, 287 insertions(+), 3 deletions(-) create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 44a2b3584a..931181cfd8 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -29,6 +29,8 @@ + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 7589b57308..b86dfc1a75 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -130,6 +130,7 @@ namespace Microsoft.AspNet.Owin // 3.1. Startup public const string Version = "websocket.Version"; + public const string VersionValue = "1.0"; // 3.2. Per Request diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 914837c083..781ba621e2 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -8,6 +8,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.WebSockets; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; @@ -20,6 +21,12 @@ using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.Owin { using SendFileFunc = Func; + using WebSocketAcceptAlt = + Func + < + IWebSocketAcceptContext, // WebSocket Accept parameters + Task + >; public class OwinEnvironment : IDictionary { @@ -76,6 +83,11 @@ namespace Microsoft.AspNet.Owin feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } + if (context.IsWebSocketRequest) + { + _entries.Add(OwinConstants.WebSocket.AcceptAlt, new FeatureMap(feature => new WebSocketAcceptAlt(feature.AcceptAsync))); + } + _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index b23e2dbdcb..d67be74199 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -8,18 +8,23 @@ namespace Microsoft.AspNet.Owin { public class OwinWebSocketAcceptContext : IWebSocketAcceptContext { - private IDictionary _options = new Dictionary(1); + private IDictionary _options; - public OwinWebSocketAcceptContext() + public OwinWebSocketAcceptContext() : this(new Dictionary(1)) { } + public OwinWebSocketAcceptContext(IDictionary options) + { + _options = options; + } + public string SubProtocol { get { object obj; - if (_options.TryGetValue(OwinConstants.WebSocket.SubProtocol, out obj)) + if (_options != null && _options.TryGetValue(OwinConstants.WebSocket.SubProtocol, out obj)) { return (string)obj; } @@ -27,6 +32,10 @@ namespace Microsoft.AspNet.Owin } set { + if (_options == null) + { + _options = new Dictionary(1); + } _options[OwinConstants.WebSocket.SubProtocol] = value; } } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs new file mode 100644 index 0000000000..5d5b4a5f3b --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + using WebSocketAccept = + Action + < + IDictionary, // WebSocket Accept parameters + Func // WebSocketFunc callback + < + IDictionary, // WebSocket environment + Task // Complete + > + >; + using WebSocketAcceptAlt = + Func + < + IWebSocketAcceptContext, // WebSocket Accept parameters + Task + >; + + public class WebSocketAcceptAdapter + { + private IDictionary _env; + private WebSocketAcceptAlt _accept; + private AppFunc _callback; + private IDictionary _options; + + public WebSocketAcceptAdapter(IDictionary env, WebSocketAcceptAlt accept) + { + _env = env; + _accept = accept; + } + + private void AcceptWebSocket(IDictionary options, AppFunc callback) + { + _options = options; + _callback = callback; + _env[OwinConstants.ResponseStatusCode] = 101; + } + + public static AppFunc AdaptWebSockets(AppFunc next) + { + return async environment => + { + object accept; + if (environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out accept) && accept is WebSocketAcceptAlt) + { + var adapter = new WebSocketAcceptAdapter(environment, (WebSocketAcceptAlt)accept); + + environment[OwinConstants.WebSocket.Accept] = new WebSocketAccept(adapter.AcceptWebSocket); + await next(environment); + if ((int)environment[OwinConstants.ResponseStatusCode] == 101 && adapter._callback != null) + { + IWebSocketAcceptContext acceptContext = null; + object obj; + if (adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) + { + acceptContext = obj as IWebSocketAcceptContext; + } + else if (adapter._options != null) + { + acceptContext = new OwinWebSocketAcceptContext(adapter._options); + } + + var webSocket = await adapter._accept(acceptContext); + var webSocketAdapter = new WebSocketAdapter(webSocket, (CancellationToken)environment[OwinConstants.CallCancelled]); + await adapter._callback(webSocketAdapter.Environment); + await webSocketAdapter.CleanupAsync(); + } + } + else + { + await next(environment); + } + }; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs new file mode 100644 index 0000000000..245157b6c1 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -0,0 +1,172 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Owin +{ + using WebSocketCloseAsync = + Func; + using WebSocketReceiveAsync = + Func /* data */, + CancellationToken /* cancel */, + Task>>; + using WebSocketReceiveTuple = + Tuple; + using WebSocketSendAsync = + Func /* data */, + int /* messageType */, + bool /* endOfMessage */, + CancellationToken /* cancel */, + Task>; + + public class WebSocketAdapter + { + private readonly WebSocket _webSocket; + private readonly IDictionary _environment; + private readonly CancellationToken _cancellationToken; + private readonly WebSocket _context; + + internal WebSocketAdapter(WebSocket webSocket, CancellationToken ct) + { + _webSocket = webSocket; + _cancellationToken = ct; + + _environment = new Dictionary(); + _environment[OwinConstants.WebSocket.SendAsync] = new WebSocketSendAsync(SendAsync); + _environment[OwinConstants.WebSocket.ReceiveAsync] = new WebSocketReceiveAsync(ReceiveAsync); + _environment[OwinConstants.WebSocket.CloseAsync] = new WebSocketCloseAsync(CloseAsync); + _environment[OwinConstants.WebSocket.CallCancelled] = ct; + _environment[OwinConstants.WebSocket.Version] = OwinConstants.WebSocket.VersionValue; + + _environment[typeof(WebSocket).FullName] = webSocket; + } + + internal IDictionary Environment + { + get { return _environment; } + } + + internal Task SendAsync(ArraySegment buffer, int messageType, bool endOfMessage, CancellationToken cancel) + { + // Remap close messages to CloseAsync. System.Net.WebSockets.WebSocket.SendAsync does not allow close messages. + if (messageType == 0x8) + { + return RedirectSendToCloseAsync(buffer, cancel); + } + else if (messageType == 0x9 || messageType == 0xA) + { + // Ping & Pong, not allowed by the underlying APIs, silently discard. + return Task.FromResult(0); + } + + return _webSocket.SendAsync(buffer, OpCodeToEnum(messageType), endOfMessage, cancel); + } + + internal async Task ReceiveAsync(ArraySegment buffer, CancellationToken cancel) + { + WebSocketReceiveResult nativeResult = await _webSocket.ReceiveAsync(buffer, cancel); + + if (nativeResult.MessageType == WebSocketMessageType.Close) + { + _environment[OwinConstants.WebSocket.ClientCloseStatus] = (int)(nativeResult.CloseStatus ?? WebSocketCloseStatus.NormalClosure); + _environment[OwinConstants.WebSocket.ClientCloseDescription] = nativeResult.CloseStatusDescription ?? string.Empty; + } + + return new WebSocketReceiveTuple( + EnumToOpCode(nativeResult.MessageType), + nativeResult.EndOfMessage, + nativeResult.Count); + } + + internal Task CloseAsync(int status, string description, CancellationToken cancel) + { + return _webSocket.CloseOutputAsync((WebSocketCloseStatus)status, description, cancel); + } + + private Task RedirectSendToCloseAsync(ArraySegment buffer, CancellationToken cancel) + { + if (buffer.Array == null || buffer.Count == 0) + { + return CloseAsync(1000, string.Empty, cancel); + } + else if (buffer.Count >= 2) + { + // Unpack the close message. + int statusCode = + (buffer.Array[buffer.Offset] << 8) + | buffer.Array[buffer.Offset + 1]; + string description = Encoding.UTF8.GetString(buffer.Array, buffer.Offset + 2, buffer.Count - 2); + + return CloseAsync(statusCode, description, cancel); + } + else + { + throw new ArgumentOutOfRangeException("buffer"); + } + } + + internal async Task CleanupAsync() + { + switch (_webSocket.State) + { + case WebSocketState.Closed: // Closed gracefully, no action needed. + case WebSocketState.Aborted: // Closed abortively, no action needed. + break; + case WebSocketState.CloseReceived: + // Echo what the client said, if anything. + await _webSocket.CloseAsync(_webSocket.CloseStatus ?? WebSocketCloseStatus.NormalClosure, + _webSocket.CloseStatusDescription ?? string.Empty, _cancellationToken); + break; + case WebSocketState.Open: + case WebSocketState.CloseSent: // No close received, abort so we don't have to drain the pipe. + _webSocket.Abort(); + break; + default: + throw new ArgumentOutOfRangeException("state", _webSocket.State, string.Empty); + } + } + + private static WebSocketMessageType OpCodeToEnum(int messageType) + { + switch (messageType) + { + case 0x1: + return WebSocketMessageType.Text; + case 0x2: + return WebSocketMessageType.Binary; + case 0x8: + return WebSocketMessageType.Close; + default: + throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + } + } + + private static int EnumToOpCode(WebSocketMessageType webSocketMessageType) + { + switch (webSocketMessageType) + { + case WebSocketMessageType.Text: + return 0x1; + case WebSocketMessageType.Binary: + return 0x2; + case WebSocketMessageType.Close: + return 0x8; + default: + throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + } + } + } +} From 1074fc102a2b49010e5e714eff7cd5bb398a0a6b Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 9 Jul 2014 17:19:41 -0700 Subject: [PATCH 135/846] OWIN WebSockets: Cleanup, docs, extension methods. --- .../Microsoft.AspNet.Owin.kproj | 1 + .../OwinEnvironmentFeature.cs | 12 ++++++ src/Microsoft.AspNet.Owin/OwinExtensions.cs | 41 ++++++++++++++++--- .../OwinFeatureCollection.cs | 3 +- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 14 +++++++ .../WebSockets/OwinWebSocketAcceptContext.cs | 4 +- .../WebSockets/WebSocketAcceptAdapter.cs | 6 ++- 7 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 931181cfd8..822be75de7 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -23,6 +23,7 @@ + diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs new file mode 100644 index 0000000000..1675852e5f --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.Owin +{ + public class OwinEnvironmentFeature : IOwinEnvironmentFeature + { + public IDictionary Environment { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index d48462c16e..674befa4f9 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Builder { public static AddMiddleware UseOwin(this IBuilder builder) { - return middleware => + AddMiddleware add = middleware => { Func middleware1 = next1 => { @@ -36,11 +36,26 @@ namespace Microsoft.AspNet.Builder var app = middleware(exitMiddlware); return httpContext => { - return app.Invoke(new OwinEnvironment(httpContext)); + // Use the existing OWIN env if there is one. + IDictionary env; + var owinEnvFeature = httpContext.GetFeature(); + if (owinEnvFeature != null) + { + env = owinEnvFeature.Environment; + env[typeof(HttpContext).FullName] = httpContext; + } + else + { + env = new OwinEnvironment(httpContext); + } + return app.Invoke(env); }; }; builder.Use(middleware1); }; + // Adapt WebSockets by default. + add(WebSocketAcceptAdapter.AdaptWebSockets); + return add; } public static IBuilder UseOwin(this IBuilder builder, Action pipeline) @@ -51,6 +66,8 @@ namespace Microsoft.AspNet.Builder public static IBuilder UseBuilder(this AddMiddleware app) { + // Adapt WebSockets by default. + app(OwinWebSocketAcceptAdapter.AdaptWebSockets); var builder = new Builder(serviceProvider: null); CreateMiddleware middleware = CreateMiddlewareFactory(exit => @@ -74,10 +91,22 @@ namespace Microsoft.AspNet.Builder return env => { - return app.Invoke( - new DefaultHttpContext( - new FeatureCollection( - new OwinFeatureCollection(env)))); + // Use the existing HttpContext if there is one. + HttpContext context; + object obj; + if (env.TryGetValue(typeof(HttpContext).FullName, out obj)) + { + context = (HttpContext)obj; + context.SetFeature(new OwinEnvironmentFeature() { Environment = env }); + } + else + { + context = new DefaultHttpContext( + new FeatureCollection( + new OwinFeatureCollection(env))); + } + + return app.Invoke(context); }; }; } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index bec1cd1292..7478a81e68 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -39,6 +39,7 @@ namespace Microsoft.AspNet.Owin public OwinFeatureCollection(IDictionary environment) { Environment = environment; + SupportsWebSockets = true; } T Prop(string key) @@ -239,7 +240,7 @@ namespace Microsoft.AspNet.Owin IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } /// - /// Gets or sets if the underlying server supports WebSockets. This is disabled by default. + /// Gets or sets if the underlying server supports WebSockets. This is enabled by default. /// The value should be consistant across requests. /// public bool SupportsWebSockets { get; set; } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index ce45e4fc4f..15ec0a01f8 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -27,6 +27,10 @@ namespace Microsoft.AspNet.Owin Task >; + /// + /// This adapts the OWIN WebSocket accept flow to match the ASP.NET WebSocket Accept flow. + /// This enables ASP.NET components to use WebSockets on OWIN based servers. + /// public class OwinWebSocketAcceptAdapter { private WebSocketAccept _owinWebSocketAccept; @@ -94,6 +98,16 @@ namespace Microsoft.AspNet.Owin } } + // Order of operations: + // 1. A WebSocket handshake request is received by the middleware. + // 2. The middleware inserts an alternate Accept signature into the OWIN environment. + // 3. The middleware invokes Next and stores Next's Task locally. It then returns an alternate Task to the server. + // 4. The OwinFeatureCollection adapts the alternate Accept signature to IHttpWebSocketFeature.AcceptAsync. + // 5. A component later in the pipleline invokes IHttpWebSocketFeature.AcceptAsync (mapped to AcceptWebSocketAsync). + // 6. The middleware calls the OWIN Accept, providing a local callback, and returns an incomplete Task. + // 7. The middleware completes the alternate Task it returned from Invoke, telling the server that the request pipeline has completed. + // 8. The server invokes the middleware's callback, which creats a WebSocket adapter complete's the orriginal Accept Task with it. + // 9. The middleware waits while the application uses the WebSocket, where the end is signaled by the Next's Task completion. public static AppFunc AdaptWebSockets(AppFunc next) { return environment => diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index d67be74199..1e847e6264 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -10,8 +10,8 @@ namespace Microsoft.AspNet.Owin { private IDictionary _options; - public OwinWebSocketAcceptContext() : this(new Dictionary(1)) - { + public OwinWebSocketAcceptContext() : this(new Dictionary(1)) + { } public OwinWebSocketAcceptContext(IDictionary options) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 5d5b4a5f3b..9660a5d00e 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -28,6 +28,10 @@ namespace Microsoft.AspNet.Owin Task >; + /// + /// This adapts the ASP.NET WebSocket Accept flow to match the OWIN WebSocket accept flow. + /// This enables OWIN based components to use WebSockets on ASP.NET servers. + /// public class WebSocketAcceptAdapter { private IDictionary _env; @@ -63,7 +67,7 @@ namespace Microsoft.AspNet.Owin { IWebSocketAcceptContext acceptContext = null; object obj; - if (adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) + if (adapter._options != null && adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) { acceptContext = obj as IWebSocketAcceptContext; } From 8f39f6d4b54a4724f6234536eff0867242e89e31 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 13 Jul 2014 21:50:53 -0700 Subject: [PATCH 136/846] Renamed configurations to frameworks in project.json --- src/Microsoft.AspNet.FeatureModel/project.json | 6 +++--- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 6 +++--- src/Microsoft.AspNet.HttpFeature/project.json | 6 +++--- src/Microsoft.AspNet.Owin/project.json | 6 +++--- src/Microsoft.AspNet.PipelineCore/project.json | 6 +++--- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 6 +++--- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 6 +++--- test/Microsoft.AspNet.Owin.Tests/project.json | 6 +++--- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 6 +++--- 11 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 04c5fa7e3a..9e7153c202 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,7 +1,7 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -15,4 +15,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 6faa246274..05084820d7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,7 @@ "dependencies": { "Microsoft.AspNet.Http": "" }, - "configurations" : { + "frameworks" : { "net45" : { }, "k10" : { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index def3e11e29..ff2288af08 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,7 +1,7 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -22,4 +22,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 96bece8d27..88d1a45513 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,6 +1,6 @@ -{ +{ "version": "1.0.0-*", - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -16,4 +16,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 70e5093a74..03fac148ca 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "", @@ -6,7 +6,7 @@ "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "" }, - "configurations": { + "frameworks": { "net45": { }, "k10": { "dependencies": { @@ -27,4 +27,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index a90c55474e..d8d4da1ec8 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "dependencies": { @@ -6,7 +6,7 @@ "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "" }, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -28,4 +28,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index deec853dae..edd64952a5 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -8,7 +8,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -16,4 +16,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 701d09c188..d4f878c1ae 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -9,7 +9,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -17,4 +17,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 1c00f87e1d..3b3a2b30f5 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", @@ -9,7 +9,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -17,4 +17,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 8d59b446c6..ab327d0772 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -10,7 +10,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -18,4 +18,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 4b282a0a4b..d83574ead1 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -9,7 +9,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Moq": "4.2.1312.1622", @@ -18,4 +18,4 @@ } } } -} \ No newline at end of file +} From 6c94e0317b29415d3848cee9959c8971c1a21448 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 15:07:44 -0700 Subject: [PATCH 137/846] Reacting to System.Collections version change --- src/Microsoft.AspNet.Owin/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 03fac148ca..014ce61ad1 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -10,7 +10,7 @@ "net45": { }, "k10": { "dependencies": { - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", From ccbf458f71ba6bf074380901aa045c86d896273f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 15:27:24 -0700 Subject: [PATCH 138/846] Reacting to System.Collections version change --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 9e7153c202..935bd582a9 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -5,7 +5,7 @@ "net45": {}, "k10": { "dependencies": { - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Reflection.TypeExtensions": "4.0.0.0", diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index ff2288af08..4a641d3f1e 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,7 @@ "k10": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 014ce61ad1..0b5a236f1d 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -11,7 +11,7 @@ "k10": { "dependencies": { "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", + "System.ComponentModel": "4.0.10.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.IO": "4.0.0.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index d8d4da1ec8..1d116f7302 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -11,7 +11,7 @@ "k10": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.Diagnostics.Tools": "4.0.0.0", From 8ab566e049eadd730144822909ae3695f877f5fc Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 15:35:04 -0700 Subject: [PATCH 139/846] Reverting version change to ComponentModel --- src/Microsoft.AspNet.Owin/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 0b5a236f1d..014ce61ad1 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -11,7 +11,7 @@ "k10": { "dependencies": { "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.10.0", + "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.IO": "4.0.0.0", From dd7537de4a4519aeb441a74761d46561898bfae4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 12:11:51 -0700 Subject: [PATCH 140/846] #103 Fix ambigious Keys property on IHeaderDictionary. --- .../IHeaderDictionary.cs | 6 ++++ .../HeaderDictionaryTests.cs | 31 +++++++++++++++++++ .../Microsoft.AspNet.PipelineCore.Tests.kproj | 3 +- 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs index fecac4a0f4..e1304b5e5f 100644 --- a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -24,6 +24,12 @@ namespace Microsoft.AspNet.Http /// new int Count { get; } + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys + /// + /// Gets a collection containing the keys. + /// + new ICollection Keys { get; } + /// /// Get the associated values from the collection separated into individual values. /// Quoted values will not be split, and the quotes will be removed. diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs new file mode 100644 index 0000000000..667f2dcb8a --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.PipelineCore.Collections; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class HeaderDictionaryTests + { + [Fact] + public void PropertiesAreAccessible() + { + var headers = new HeaderDictionary( + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Header1", new[] { "Value1" } } + }); + + Assert.Equal(1, headers.Count); + Assert.Equal(new[] { "Headers1" }, headers.Keys); + Assert.True(headers.ContainsKey("headers1")); + Assert.False(headers.ContainsKey("headers2")); + Assert.Equal("Value1", headers["header1"]); + Assert.Equal("Value1", headers.Get("header1")); + Assert.Equal(new[] { "Value1" }, headers.GetValues("header1")); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 13a5649e18..09ea94747b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -23,10 +23,11 @@ + - + \ No newline at end of file From fe5202b3d2ad7dbd0606b6e83e9e11fd80c1b251 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 12:17:36 -0700 Subject: [PATCH 141/846] Fix test. --- .../HeaderDictionaryTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs index 667f2dcb8a..e182890112 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -20,9 +20,9 @@ namespace Microsoft.AspNet.PipelineCore.Tests }); Assert.Equal(1, headers.Count); - Assert.Equal(new[] { "Headers1" }, headers.Keys); - Assert.True(headers.ContainsKey("headers1")); - Assert.False(headers.ContainsKey("headers2")); + Assert.Equal(new[] { "Header1" }, headers.Keys); + Assert.True(headers.ContainsKey("header1")); + Assert.False(headers.ContainsKey("header2")); Assert.Equal("Value1", headers["header1"]); Assert.Equal("Value1", headers.Get("header1")); Assert.Equal(new[] { "Value1" }, headers.GetValues("header1")); From de1017e0108484278f57cf44f702d1d2f81d5d61 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 12:20:57 -0700 Subject: [PATCH 142/846] Fix test... --- .../HeaderDictionaryTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs index e182890112..74667bbeb0 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests }); Assert.Equal(1, headers.Count); - Assert.Equal(new[] { "Header1" }, headers.Keys); + Assert.Equal(new[] { "Header1" }, headers.Keys); Assert.True(headers.ContainsKey("header1")); Assert.False(headers.ContainsKey("header2")); Assert.Equal("Value1", headers["header1"]); From dc055f783a8634bfe46f4765699b0c8c7e55d807 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 16:12:46 -0700 Subject: [PATCH 143/846] #91 Add constructors to Form, Query, and Cookie features for testing. --- src/Microsoft.AspNet.Http/HostString.cs | 2 -- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 12 +++++++++++- .../Infrastructure/ParsingHelpers.cs | 2 -- .../Microsoft.AspNet.PipelineCore.kproj | 1 + .../NotNullAttribute.cs | 12 ++++++++++++ .../QueryFeature.cs | 15 ++++++++++++--- .../RequestCookiesFeature.cs | 16 +++++++++++++--- 7 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 1786a7c338..7e4381f9f1 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -136,9 +136,7 @@ namespace Microsoft.AspNet.Http throw new ArgumentNullException("uri"); } return new HostString(uri.GetComponents( -#if !NET40 UriComponents.NormalizedHost | // Always convert punycode to Unicode. -#endif UriComponents.HostAndPort, UriFormat.Unescaped)); } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 25472d4057..e695b460a3 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -20,13 +20,23 @@ namespace Microsoft.AspNet.PipelineCore private Stream _bodyStream; private IReadableStringCollection _form; - public FormFeature(IFeatureCollection features) + public FormFeature([NotNull] IReadableStringCollection form) + { + _form = form; + } + + public FormFeature([NotNull] IFeatureCollection features) { _features = features; } public async Task GetFormAsync(CancellationToken cancellationToken) { + if (_features == null) + { + return _form; + } + var body = _request.Fetch(_features).Body; if (_bodyStream == null || _bodyStream != body) diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 8dc89e6063..a545a1dac7 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -818,7 +818,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure StringComparer.OrdinalIgnoreCase); } -#if !NET40 internal static IFormCollection GetForm(string text) { IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -830,7 +829,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } return new FormCollection(form); } -#endif internal static string GetJoinedValue(IDictionary store, string key) { diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 358e55cca5..8caa5a4f61 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -31,6 +31,7 @@ + diff --git a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs new file mode 100644 index 0000000000..33fc2e3070 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.PipelineCore +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 71e75e5031..a2c7df5fe3 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -1,9 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -17,7 +16,12 @@ namespace Microsoft.AspNet.PipelineCore private string _queryString; private IReadableStringCollection _query; - public QueryFeature(IFeatureCollection features) + public QueryFeature([NotNull] IReadableStringCollection query) + { + _query = query; + } + + public QueryFeature([NotNull] IFeatureCollection features) { _features = features; } @@ -26,6 +30,11 @@ namespace Microsoft.AspNet.PipelineCore { get { + if (_features == null) + { + return _query; + } + var queryString = _request.Fetch(_features).QueryString; if (_query == null || _queryString != queryString) { diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 6af65fa206..5507708ea6 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -17,9 +17,14 @@ namespace Microsoft.AspNet.PipelineCore private readonly FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; - private static readonly string[] ZeroHeaders = new string[0]; + private IReadableStringCollection _cookies; - public RequestCookiesFeature(IFeatureCollection features) + public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) + { + _cookies = cookies; + } + + public RequestCookiesFeature([NotNull] IFeatureCollection features) { _features = features; } @@ -28,8 +33,13 @@ namespace Microsoft.AspNet.PipelineCore { get { + if (_features == null) + { + return _cookies; + } + var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? ""; + string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? string.Empty; if (_cookiesCollection == null) { From 0ba1731928bef68cb74f47c67dceef0f8334e1b3 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 17 Jul 2014 09:57:27 -0700 Subject: [PATCH 144/846] Add more feature constructors. --- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 6 ++++++ src/Microsoft.AspNet.PipelineCore/QueryFeature.cs | 6 ++++++ .../RequestCookiesFeature.cs | 8 +++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index e695b460a3..c2b90a6574 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; @@ -20,6 +21,11 @@ namespace Microsoft.AspNet.PipelineCore private Stream _bodyStream; private IReadableStringCollection _form; + public FormFeature([NotNull] IDictionary form) + : this (new ReadableStringCollection(form)) + { + } + public FormFeature([NotNull] IReadableStringCollection form) { _form = form; diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index a2c7df5fe3..1cf25622df 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; @@ -16,6 +17,11 @@ namespace Microsoft.AspNet.PipelineCore private string _queryString; private IReadableStringCollection _query; + public QueryFeature([NotNull] IDictionary query) + : this (new ReadableStringCollection(query)) + { + } + public QueryFeature([NotNull] IReadableStringCollection query) { _query = query; diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 5507708ea6..952bfed0f6 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -2,9 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -19,6 +20,11 @@ namespace Microsoft.AspNet.PipelineCore private RequestCookiesCollection _cookiesCollection; private IReadableStringCollection _cookies; + public RequestCookiesFeature([NotNull] IDictionary cookies) + : this (new ReadableStringCollection(cookies)) + { + } + public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) { _cookies = cookies; From 384d54577e9b148788b51c91eee1ef064d6c33a3 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 23 Jul 2014 09:14:34 -0700 Subject: [PATCH 145/846] Remove unused field. --- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 245157b6c1..79f8c0bf2e 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -37,7 +37,6 @@ namespace Microsoft.AspNet.Owin private readonly WebSocket _webSocket; private readonly IDictionary _environment; private readonly CancellationToken _cancellationToken; - private readonly WebSocket _context; internal WebSocketAdapter(WebSocket webSocket, CancellationToken ct) { From 80ffd26465afebfc4eacc68299ff56a5807207b1 Mon Sep 17 00:00:00 2001 From: harshgMSFT Date: Tue, 15 Jul 2014 17:57:44 -0700 Subject: [PATCH 146/846] Adding abstractions for request headers viz. Accept, Accept-Charset and Content-Type. --- HttpAbstractions.sln | 2 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 12 +++- .../DefaultHttpRequest.cs | 18 ++++++ .../Infrastructure/Constants.cs | 1 + .../DefaultHttpRequestTests.cs | 56 ++++++++++++++++++- 5 files changed, 83 insertions(+), 6 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 5158aff09e..46b9267189 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21813.0 +VisualStudioVersion = 14.0.21806.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 4d1aa1a9db..be5e1e14b1 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; +using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -95,7 +97,7 @@ namespace Microsoft.AspNet.Http /// Gets or sets the Content-Type header. /// /// The Content-Type header. - // (TODO header conventions?) public abstract string ContentType { get; set; } + public abstract string ContentType { get; set; } /// /// Gets or sets the Cache-Control header. @@ -113,7 +115,13 @@ namespace Microsoft.AspNet.Http /// Gets or set the Accept header. /// /// The Accept header. - // (TODO header conventions?) public abstract string Accept { get; set; } + public abstract string Accept { get; set; } + + /// + /// Gets or set the Accept-Charset header. + /// + /// The Accept-Charset header. + public abstract string AcceptCharset { get; set; } /// /// Gets or set the owin.RequestBody Stream. diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index efdda560d1..eac94536d6 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -149,5 +149,23 @@ namespace Microsoft.AspNet.PipelineCore { get { return RequestCookiesFeature.Cookies; } } + + public override string ContentType + { + get { return Headers[Constants.Headers.ContentType]; } + set { Headers[Constants.Headers.ContentType] = value; } + } + + public override string Accept + { + get { return Headers[Constants.Headers.Accept]; } + set { Headers[Constants.Headers.Accept] = value; } + } + + public override string AcceptCharset + { + get { return Headers[Constants.Headers.AcceptCharset]; } + set { Headers[Constants.Headers.AcceptCharset] = value; } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 1f440b0bf1..9404c79c70 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.Http.Infrastructure internal const string CacheControl = "Cache-Control"; internal const string MediaType = "Media-Type"; internal const string Accept = "Accept"; + internal const string AcceptCharset = "Accept-Charset"; internal const string Host = "Host"; internal const string ETag = "ETag"; internal const string Location = "Location"; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index baa1c6c4ed..c82bfd67b7 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -49,6 +49,36 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Null(request.ContentLength); } + [Fact] + public void GetContentType_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequestWithContentType(contentType: null); + + // Act and Assert + Assert.Null(request.ContentType); + } + + [Fact] + public void GetAcceptHeader_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequestWithAcceptHeader(acceptHeader: null); + + // Act and Assert + Assert.Null(request.Accept); + } + + [Fact] + public void GetAcceptCharsetHeader_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequestWithAcceptCharsetHeader(acceptCharset: null); + + // Act and Assert + Assert.Null(request.AcceptCharset); + } + [Fact] public void Host_GetsHostFromHeaders() { @@ -114,14 +144,34 @@ namespace Microsoft.AspNet.PipelineCore.Tests } private static HttpRequest GetRequestWithContentLength(string contentLength = null) + { + return GetRequestWithHeader("Content-Length", contentLength); + } + + private static HttpRequest GetRequestWithContentType(string contentType = null) + { + return GetRequestWithHeader("Content-Type", contentType); + } + + private static HttpRequest GetRequestWithAcceptHeader(string acceptHeader = null) + { + return GetRequestWithHeader("Accept", acceptHeader); + } + + private static HttpRequest GetRequestWithAcceptCharsetHeader(string acceptCharset = null) + { + return GetRequestWithHeader("Accept-Charset", acceptCharset); + } + + private static HttpRequest GetRequestWithHeader(string headerName, string headerValue) { var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); - if (contentLength != null) + if (headerValue != null) { - headers.Add("Content-Length", new[] { contentLength }); + headers.Add(headerName, new[] { headerValue }); } - return CreateRequest(headers); + return CreateRequest(headers); } } } From af279f6d2b6cdae9a8dde676a8494ef730aa47a6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Jul 2014 09:08:13 -0700 Subject: [PATCH 147/846] #65 Add a QueryBuilder. --- HttpAbstractions.sln | 28 ++++++- .../Microsoft.AspNet.WebUtilities.kproj | 35 +++++++++ .../QueryBuilder.cs | 74 ++++++++++++++++++ .../project.json | 14 ++++ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 35 +++++++++ .../QueryBuilderTests.cs | 77 +++++++++++++++++++ .../project.json | 17 ++++ 7 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj create mode 100644 src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/project.json create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 46b9267189..cdea46535d 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21806.0 +VisualStudioVersion = 14.0.21916.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -29,6 +29,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Exten EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.kproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.kproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.kproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -149,6 +153,26 @@ Global {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.Build.0 = Release|Any CPU {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|x86.ActiveCfg = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Any CPU.Build.0 = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|x86.ActiveCfg = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|x86.ActiveCfg = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Any CPU.Build.0 = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -165,5 +189,7 @@ Global {16219571-3268-4D12-8689-12B7163DBA13} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {CCC4363E-81E2-4058-94DD-00494E9E992A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AE25EF21-7F91-4B86-B73E-AF746821D339} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj new file mode 100644 index 0000000000..0e877575d0 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + a2fb7838-0031-4fad-ba3e-83c30b3af406 + Library + Microsoft.AspNet.WebUtilities + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs new file mode 100644 index 0000000000..a719db536d --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs @@ -0,0 +1,74 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.WebUtilities +{ + // The IEnumerable interface is required for the collection initialization syntax: new QueryBuilder() { { "key", "value" } }; + public class QueryBuilder : IEnumerable> + { + private IList> _params; + + public QueryBuilder() + { + _params = new List>(); + } + + public QueryBuilder(IEnumerable> parameters) + { + _params = new List>(parameters); + } + + public void Add(string key, string value) + { + _params.Add(new KeyValuePair(key, value)); + } + + public override string ToString() + { + var builder = new StringBuilder(); + bool first = true; + for (int i = 0; i < _params.Count; i++) + { + var pair = _params[i]; + builder.Append(first ? "?" : "&"); + first = false; + builder.Append(Uri.EscapeDataString(pair.Key)); + builder.Append("="); + builder.Append(Uri.EscapeDataString(pair.Value)); + } + + return builder.ToString(); + } + + public QueryString ToQueryString() + { + return new QueryString(ToString()); + } + + public override int GetHashCode() + { + return ToQueryString().GetHashCode(); + } + + public override bool Equals(object obj) + { + return ToQueryString().Equals(obj); + } + + public IEnumerator> GetEnumerator() + { + return _params.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _params.GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json new file mode 100644 index 0000000000..2c127c9880 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -0,0 +1,14 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + "frameworks": { + "net45": {}, + "k10": { + "dependencies": { + "System.Runtime": "4.0.20.0" + } + } + } +} diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj new file mode 100644 index 0000000000..a909df627d --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + 93c10e50-bcbb-4d8e-9492-d46e1396225b + Library + Microsoft.AspNet.WebUtilities.Tests + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs new file mode 100644 index 0000000000..2de60d8a46 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs @@ -0,0 +1,77 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class QueryBuilderTests + { + [Fact] + public void EmptyQuery_NoQuestionMark() + { + var builder = new QueryBuilder(); + Assert.Equal(string.Empty, builder.ToString()); + } + + [Fact] + public void AddSimple_NoEncoding() + { + var builder = new QueryBuilder(); + builder.Add("key", "value"); + Assert.Equal("?key=value", builder.ToString()); + } + + [Fact] + public void AddSpace_PercentEncoded() + { + var builder = new QueryBuilder(); + builder.Add("key", "value 1"); + Assert.Equal("?key=value%201", builder.ToString()); + } + + [Fact] + public void AddReservedCharacters_PercentEncoded() + { + var builder = new QueryBuilder(); + builder.Add("key&", "value#"); + Assert.Equal("?key%26=value%23", builder.ToString()); + } + + [Fact] + public void AddMultipleValues_AddedInOrder() + { + var builder = new QueryBuilder(); + builder.Add("key1", "value1"); + builder.Add("key2", "value2"); + builder.Add("key3", "value3"); + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); + } + + [Fact] + public void AddMultipleValuesViaConstructor_AddedInOrder() + { + var builder = new QueryBuilder(new[] + { + new KeyValuePair("key1", "value1"), + new KeyValuePair("key2", "value2"), + new KeyValuePair("key3", "value3"), + }); + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); + } + + [Fact] + public void AddMultipleValuesViaInitializer_AddedInOrder() + { + var builder = new QueryBuilder() + { + { "key1", "value1" }, + { "key2", "value2" }, + { "key3", "value3" }, + }; + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json new file mode 100644 index 0000000000..b7217ebcea --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -0,0 +1,17 @@ +{ + "dependencies": { + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.WebUtilities": "", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "frameworks": { + "net45": { + "dependencies": { + "System.Runtime": "" + } + } + } +} From 7be9cefc4c7671caba7d8fe538ba6a0ad308fdad Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Jul 2014 16:24:44 -0700 Subject: [PATCH 148/846] QueryBuilder Add overload for IEnumerable. --- .../QueryBuilder.cs | 14 ++++++++++--- .../QueryBuilderTests.cs | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs index a719db536d..28cdfa85fe 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs @@ -14,16 +14,24 @@ namespace Microsoft.AspNet.WebUtilities { private IList> _params; - public QueryBuilder() - { + public QueryBuilder() + { _params = new List>(); - } + } public QueryBuilder(IEnumerable> parameters) { _params = new List>(parameters); } + public void Add(string key, IEnumerable values) + { + foreach (var value in values) + { + _params.Add(new KeyValuePair(key, value)); + } + } + public void Add(string key, string value) { _params.Add(new KeyValuePair(key, value)); diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs index 2de60d8a46..76d3ac977d 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs @@ -50,6 +50,14 @@ namespace Microsoft.AspNet.WebUtilities Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); } + [Fact] + public void AddIEnumerableValues_AddedInOrder() + { + var builder = new QueryBuilder(); + builder.Add("key", new[] { "value1", "value2", "value3" }); + Assert.Equal("?key=value1&key=value2&key=value3", builder.ToString()); + } + [Fact] public void AddMultipleValuesViaConstructor_AddedInOrder() { @@ -73,5 +81,18 @@ namespace Microsoft.AspNet.WebUtilities }; Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); } + + [Fact] + public void CopyViaConstructor_AddedInOrder() + { + var builder = new QueryBuilder() + { + { "key1", "value1" }, + { "key2", "value2" }, + { "key3", "value3" }, + }; + var builder1 = new QueryBuilder(builder); + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder1.ToString()); + } } } \ No newline at end of file From 0c3afe95f56a87174591ac1edd5942ee745a8f1e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 5 Aug 2014 15:49:41 -0700 Subject: [PATCH 149/846] Updating release Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From cd78e115d4193c380afd366f9060bc1410450610 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 6 Aug 2014 12:30:43 -0700 Subject: [PATCH 150/846] Updating dev Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From 22f3d52762143243c9764a742f550016526770fc Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 6 Aug 2014 15:07:53 -0700 Subject: [PATCH 151/846] #111 - Change Challenge, SignIn parameter order to support params. --- src/Microsoft.AspNet.Http/HttpResponse.cs | 40 ++++++++++++++----- .../DefaultHttpResponse.cs | 5 ++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index a404c17c94..33fbd0a954 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Http public virtual void Challenge(AuthenticationProperties properties) { - Challenge(new string[0], properties); + Challenge(properties, new string[0]); } public virtual void Challenge(string authenticationType) @@ -48,34 +48,54 @@ namespace Microsoft.AspNet.Http Challenge(new[] { authenticationType }); } - public virtual void Challenge(string authenticationType, AuthenticationProperties properties) + public virtual void Challenge(AuthenticationProperties properties, string authenticationType) { - Challenge(new[] { authenticationType }, properties); + Challenge(properties, new[] { authenticationType }); + } + + public void Challenge(params string[] authenticationTypes) + { + Challenge((IEnumerable)authenticationTypes); } public virtual void Challenge(IEnumerable authenticationTypes) { - Challenge(authenticationTypes, properties: null); + Challenge(properties: null, authenticationTypes: authenticationTypes); } - public abstract void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties); + public void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) + { + Challenge(properties, (IEnumerable)authenticationTypes); + } + + public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes); public virtual void SignIn(ClaimsIdentity identity) { - SignIn(identity, properties: null); + SignIn(properties: null, identity: identity); } - public virtual void SignIn(ClaimsIdentity identity, AuthenticationProperties properties) + public virtual void SignIn(AuthenticationProperties properties, ClaimsIdentity identity) { - SignIn(new[] { identity }, properties); + SignIn(properties, new[] { identity }); + } + + public virtual void SignIn(params ClaimsIdentity[] identities) + { + SignIn(properties: null, identities: (IEnumerable)identities); } public virtual void SignIn(IEnumerable identities) { - SignIn(identities, properties: null); + SignIn(properties: null, identities: identities); } - public abstract void SignIn(IEnumerable identities, AuthenticationProperties properties); + public void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) + { + SignIn(properties, (IEnumerable)identities); + } + + public abstract void SignIn(AuthenticationProperties properties, IEnumerable identities); public virtual void SignOut() { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 5af0f9b5fe..3b50493b58 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.PipelineCore Headers.Set(Constants.Headers.Location, location); } - public override void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties) + public override void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes) { if (authenticationTypes == null) { @@ -147,12 +147,13 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignIn(IEnumerable identities, AuthenticationProperties properties) + public override void SignIn(AuthenticationProperties properties, IEnumerable identities) { if (identities == null) { throw new ArgumentNullException(); } + var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); From 6d45f817f9b3c6978bf76869829b76e2cc17c932 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 7 Aug 2014 15:58:26 -0700 Subject: [PATCH 152/846] Make new overloads virtual. --- src/Microsoft.AspNet.Http/HttpResponse.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 33fbd0a954..010d159ab8 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.Http Challenge(properties, new[] { authenticationType }); } - public void Challenge(params string[] authenticationTypes) + public virtual void Challenge(params string[] authenticationTypes) { Challenge((IEnumerable)authenticationTypes); } @@ -63,7 +63,7 @@ namespace Microsoft.AspNet.Http Challenge(properties: null, authenticationTypes: authenticationTypes); } - public void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) + public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) { Challenge(properties, (IEnumerable)authenticationTypes); } @@ -90,7 +90,7 @@ namespace Microsoft.AspNet.Http SignIn(properties: null, identities: identities); } - public void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) + public virtual void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) { SignIn(properties, (IEnumerable)identities); } From 274f20a383ffbdb8eef231c8c9665c97ff34f65d Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 15 Aug 2014 08:14:48 -0700 Subject: [PATCH 153/846] Removed source files from the project --- .../Microsoft.AspNet.FeatureModel.kproj | 10 +---- .../Microsoft.AspNet.Http.Extensions.kproj | 7 ---- .../Microsoft.AspNet.Http.kproj | 32 --------------- .../Microsoft.AspNet.HttpFeature.kproj | 24 ----------- .../Microsoft.AspNet.Owin.kproj | 17 -------- .../Microsoft.AspNet.PipelineCore.kproj | 40 ------------------- .../Microsoft.AspNet.WebUtilities.kproj | 6 --- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 11 +---- ...crosoft.AspNet.Http.Extensions.Tests.kproj | 6 --- .../Microsoft.AspNet.Http.Tests.kproj | 9 ----- .../Microsoft.AspNet.Owin.Tests.kproj | 9 +---- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 12 ------ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 6 --- 13 files changed, 3 insertions(+), 186 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 1938d81a2f..3ee51e0df8 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -16,13 +16,5 @@ 2.0 - - - - - - - - - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index 7ca2e89f22..b8536c1d7e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -25,12 +25,5 @@ 2.0 - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 0e326800f8..1daab236cd 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -16,37 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 5ee49bef8e..f14cfaec40 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -16,29 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 822be75de7..e7f58555b1 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -16,22 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 8caa5a4f61..bd57805ae6 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -16,45 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index 0e877575d0..9759976da3 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -25,11 +25,5 @@ 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index dddeb54073..0925c220ef 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -17,14 +17,5 @@ 2.0 - - - - - - - - - - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index 6223e75396..9bad335404 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -25,11 +25,5 @@ 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 754a812c15..787a78ff26 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -17,14 +17,5 @@ 2.0 - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index e0adddc849..050b89712d 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -16,12 +16,5 @@ 2.0 - - - - - - - - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 09ea94747b..d7a5995f6b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -17,17 +17,5 @@ 2.0 - - - - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index a909df627d..cbfdfe1f3d 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -25,11 +25,5 @@ 2.0 - - - - - - \ No newline at end of file From e2a3f1455b09ca92a87199f794b72f208e789af9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 20 Aug 2014 06:56:33 -0700 Subject: [PATCH 154/846] Reacting to System.IO package version change --- src/Microsoft.AspNet.Http/project.json | 4 ++-- src/Microsoft.AspNet.HttpFeature/project.json | 4 ++-- src/Microsoft.AspNet.Owin/project.json | 4 ++-- src/Microsoft.AspNet.PipelineCore/project.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 4a641d3f1e..3de806f0c7 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, "frameworks": { @@ -11,7 +11,7 @@ "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.Globalization.Extensions": "4.0.0.0", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 88d1a45513..6eb8e1aef3 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "frameworks": { "net45": {}, "k10": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 014ce61ad1..aed0aa1fd5 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "", @@ -14,7 +14,7 @@ "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 1d116f7302..316aaadbe0 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "dependencies": { @@ -16,7 +16,7 @@ "System.Diagnostics.Debug": "4.0.10.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", From 7230a3d78e8c369b2acf4cb2f835a186900cd49e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 7 Aug 2014 15:19:47 -0700 Subject: [PATCH 155/846] Add form and query helpers needed for Facebook auth. --- .../FormFeature.cs | 7 +- .../Infrastructure/ParsingHelpers.cs | 12 --- .../QueryFeature.cs | 2 +- .../RequestCookiesFeature.cs | 1 + .../project.json | 3 +- .../Collections/FormCollection.cs | 4 +- .../Collections/ReadableStringCollection.cs | 4 +- .../FormHelpers.cs | 18 ++++ .../NotNullAttribute.cs | 12 +++ .../ParsingHelpers.cs | 94 +++++++++++++++++++ .../QueryHelpers.cs | 20 ++++ 11 files changed, 155 insertions(+), 22 deletions(-) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.WebUtilities}/Collections/FormCollection.cs (87%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.WebUtilities}/Collections/ReadableStringCollection.cs (95%) create mode 100644 src/Microsoft.AspNet.WebUtilities/FormHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index c2b90a6574..271264b870 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -9,8 +9,9 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { @@ -60,8 +61,8 @@ namespace Microsoft.AspNet.PipelineCore detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { - string formQuery = await streamReader.ReadToEndAsync(); - _form = new ReadableStringCollection(ParsingHelpers.GetQuery(formQuery)); + string form = await streamReader.ReadToEndAsync(); + _form = FormHelpers.ParseForm(form); } } return _form; diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index a545a1dac7..2ede1ab15c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -818,18 +818,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure StringComparer.OrdinalIgnoreCase); } - internal static IFormCollection GetForm(string text) - { - IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); - foreach (var kv in accumulator) - { - form.Add(kv.Key, kv.Value.ToArray()); - } - return new FormCollection(form); - } - internal static string GetJoinedValue(IDictionary store, string key) { string[] values = GetUnmodifiedValues(store, key); diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 1cf25622df..ab5ea5157a 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -5,8 +5,8 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 952bfed0f6..8a3ae99e72 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -9,6 +9,7 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 316aaadbe0..81d5f9a326 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -4,7 +4,8 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "" + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.WebUtilities": "" }, "frameworks": { "net45": {}, diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs similarity index 87% rename from src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs rename to src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs index b1da4f6c3c..a9d1df8529 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs @@ -4,7 +4,7 @@ using Microsoft.AspNet.Http; using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.WebUtilities.Collections { /// /// Contains the parsed form values. @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.PipelineCore.Collections public class FormCollection : ReadableStringCollection, IFormCollection { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The store for the form. public FormCollection(IDictionary store) diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs index 139d8d1c78..97c03b0df2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs @@ -4,11 +4,9 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.WebUtilities.Collections { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs new file mode 100644 index 0000000000..17f8135465 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs @@ -0,0 +1,18 @@ +using System; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class FormHelpers + { + /// + /// Parses an HTTP form body. + /// + /// The HTTP form body to parse. + /// The object containing the parsed HTTP form body. + public static IFormCollection ParseForm(string text) + { + return ParsingHelpers.GetForm(text); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs b/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs new file mode 100644 index 0000000000..d489cf36b3 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs new file mode 100644 index 0000000000..c9f4e6f544 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.WebUtilities.Collections; + +namespace Microsoft.AspNet.WebUtilities +{ + internal static partial class ParsingHelpers + { + internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) + { + int textLength = text.Length; + int equalIndex = text.IndexOf('='); + if (equalIndex == -1) + { + equalIndex = textLength; + } + int scanIndex = 0; + while (scanIndex < textLength) + { + int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); + if (delimiterIndex == -1) + { + delimiterIndex = textLength; + } + if (equalIndex < delimiterIndex) + { + while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) + { + ++scanIndex; + } + string name = text.Substring(scanIndex, equalIndex - scanIndex); + string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); + callback( + Uri.UnescapeDataString(name.Replace('+', ' ')), + Uri.UnescapeDataString(value.Replace('+', ' ')), + state); + equalIndex = text.IndexOf('=', delimiterIndex); + if (equalIndex == -1) + { + equalIndex = textLength; + } + } + scanIndex = delimiterIndex + 1; + } + } + + private static readonly Action AppendItemCallback = (name, value, state) => + { + var dictionary = (IDictionary>)state; + + List existing; + if (!dictionary.TryGetValue(name, out existing)) + { + dictionary.Add(name, new List(1) { value }); + } + else + { + existing.Add(value); + } + }; + + internal static IFormCollection GetForm(string text) + { + IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); + foreach (var kv in accumulator) + { + form.Add(kv.Key, kv.Value.ToArray()); + } + return new FormCollection(form); + } + + internal static string GetJoinedValue(IDictionary store, string key) + { + string[] values = GetUnmodifiedValues(store, key); + return values == null ? null : string.Join(",", values); + } + + internal static string[] GetUnmodifiedValues(IDictionary store, string key) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + string[] values; + return store.TryGetValue(key, out values) ? values : null; + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs new file mode 100644 index 0000000000..27b8a96ded --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -0,0 +1,20 @@ +using System; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class QueryHelpers + { + /// + /// Append the given query key and value to the uri. + /// + /// The base uri. + /// The name of the query key. + /// The query value. + /// The combine result. + public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) + { + bool hasQuery = uri.IndexOf('?') != -1; + return uri + (hasQuery ? "&" : "?") + Uri.EscapeDataString(name) + "=" + Uri.EscapeDataString(value); + } + } +} \ No newline at end of file From ddc7f0895706004f715d4942a491cc5418ee1869 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 20 Aug 2014 12:38:04 -0700 Subject: [PATCH 156/846] #116 - Add IBuilder.Properties collection. --- src/Microsoft.AspNet.Http/IBuilder.cs | 5 +++ src/Microsoft.AspNet.PipelineCore/Builder.cs | 43 +++++++++++++++++-- .../Infrastructure/Constants.cs | 6 +++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs index 6a2c1b3197..1673390e07 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -2,17 +2,22 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; namespace Microsoft.AspNet.Builder { public interface IBuilder { IServiceProvider ApplicationServices { get; set; } + IServerInformation Server { get; set; } + IDictionary Properties { get; set; } + IBuilder Use(Func middleware); IBuilder New(); + RequestDelegate Build(); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index fae10cf6a2..12a95ebd8f 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.Builder { @@ -15,17 +16,51 @@ namespace Microsoft.AspNet.Builder public Builder(IServiceProvider serviceProvider) { + Properties = new Dictionary(); ApplicationServices = serviceProvider; } private Builder(Builder builder) { - ApplicationServices = builder.ApplicationServices; - Server = builder.Server; + Properties = builder.Properties; } - public IServiceProvider ApplicationServices { get; set; } - public IServerInformation Server { get; set; } + public IServiceProvider ApplicationServices + { + get + { + return GetProperty(Constants.BuilderProperties.ApplicationServices); + } + set + { + SetProperty(Constants.BuilderProperties.ApplicationServices, value); + } + } + + public IServerInformation Server + { + get + { + return GetProperty(Constants.BuilderProperties.ServerInformation); + } + set + { + SetProperty(Constants.BuilderProperties.ServerInformation, value); + } + } + + public IDictionary Properties { get; set; } + + private T GetProperty(string key) + { + object value; + return Properties.TryGetValue(key, out value) ? (T)value : default(T); + } + + private void SetProperty(string key, T value) + { + Properties[key] = value; + } public IBuilder Use(Func middleware) { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 9404c79c70..c918c4de33 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -25,5 +25,11 @@ namespace Microsoft.AspNet.Http.Infrastructure internal const string Expires = "Expires"; internal const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; } + + internal static class BuilderProperties + { + internal static string ServerInformation = "server.Information"; + internal static string ApplicationServices = "application.Services"; + } } } From bc0732f9007f8e2c2e1feb8904c0e4779cfe8a37 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 21 Aug 2014 12:13:26 -0700 Subject: [PATCH 157/846] Code cleanup. --- src/Microsoft.AspNet.Http/HostString.cs | 8 ++++---- src/Microsoft.AspNet.Http/PathString.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 12 +----------- src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs | 2 +- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 6 +++--- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 7e4381f9f1..67af893b19 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -8,7 +8,7 @@ using System.Globalization; namespace Microsoft.AspNet.Http { /// - /// Represents the host portion of a Uri can be used to construct Uri's properly formatted and encoded for use in + /// Represents the host portion of a URI can be used to construct URI's properly formatted and encoded for use in /// HTTP headers. /// public struct HostString : IEquatable @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Http /// Any Unicode is converted to punycode. IPv6 addresses will have brackets added if they are missing. /// /// - [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a uri is returned.")] + [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a URI is returned.")] public string ToUriComponent() { int index; @@ -82,12 +82,12 @@ namespace Microsoft.AspNet.Http } /// - /// Creates a new HostString from the given uri component. + /// Creates a new HostString from the given URI component. /// Any punycode will be converted to Unicode. /// /// /// - [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a uri is provided.")] + [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a URI is provided.")] public static HostString FromUriComponent(string uriComponent) { if (!string.IsNullOrEmpty(uriComponent)) diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index a6cf0c85b3..05dfa6d816 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Http /// /// The escaped path as it appears in the URI format. /// The resulting PathString - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with Uri processing")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with URI processing")] public static PathString FromUriComponent(string uriComponent) { // REVIEW: what is the exactly correct thing to do? diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 2ede1ab15c..f1db7fe748 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -8,7 +8,6 @@ using System.Globalization; using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure { @@ -507,7 +506,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - internal static partial class ParsingHelpers + internal static class ParsingHelpers { private static readonly Action AddCookieCallback = (name, value, state) => { @@ -592,10 +591,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure scanIndex = delimiterIndex + 1; } } - } - internal static partial class ParsingHelpers - { public static string GetHeader(IDictionary headers, string key) { string[] values = GetHeaderUnmodified(headers, key); @@ -783,10 +779,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure SetHeaderUnmodified(headers, key, existing.Concat(values)); } } - } - internal static partial class ParsingHelpers - { private static readonly Action AppendItemCallback = (name, value, state) => { var dictionary = (IDictionary>)state; @@ -833,10 +826,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure string[] values; return store.TryGetValue(key, out values) ? values : null; } - } - internal static partial class ParsingHelpers - { //internal static string GetHost(HttpRequest request) //{ // IHeaderDictionary headers = request.Headers; diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs index c9f4e6f544..e5dbd65a9c 100644 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -8,7 +8,7 @@ using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.WebUtilities { - internal static partial class ParsingHelpers + internal static class ParsingHelpers { internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) { diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 27b8a96ded..0b4de851bc 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -5,12 +5,12 @@ namespace Microsoft.AspNet.WebUtilities public static class QueryHelpers { /// - /// Append the given query key and value to the uri. + /// Append the given query key and value to the URI. /// - /// The base uri. + /// The base URI. /// The name of the query key. /// The query value. - /// The combine result. + /// The combined result. public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { bool hasQuery = uri.IndexOf('?') != -1; From 1aed739edb6a8fef1830fb86748a1334ae7f6b35 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 22 Aug 2014 09:04:30 -0700 Subject: [PATCH 158/846] WebUtilities: Add more query helpers. --- .../FormHelpers.cs | 5 +++- .../QueryHelpers.cs | 29 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs index 17f8135465..4c16485eb0 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.WebUtilities diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 0b4de851bc..d31a250fdb 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -1,4 +1,9 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Text; namespace Microsoft.AspNet.WebUtilities { @@ -16,5 +21,27 @@ namespace Microsoft.AspNet.WebUtilities bool hasQuery = uri.IndexOf('?') != -1; return uri + (hasQuery ? "&" : "?") + Uri.EscapeDataString(name) + "=" + Uri.EscapeDataString(value); } + + /// + /// Append the given query keys and values to the uri. + /// + /// The base uri. + /// A collection of name value query pairs to append. + /// The combine result. + public static string AddQueryString([NotNull] string uri, [NotNull] IDictionary queryString) + { + var sb = new StringBuilder(); + sb.Append(uri); + bool hasQuery = uri.IndexOf('?') != -1; + foreach (var parameter in queryString) + { + sb.Append(hasQuery ? '&' : '?'); + sb.Append(Uri.EscapeDataString(parameter.Key)); + sb.Append('='); + sb.Append(Uri.EscapeDataString(parameter.Value)); + hasQuery = true; + } + return sb.ToString(); + } } } \ No newline at end of file From aac0ce134cf1e76f001dcfd3b4f2187140dc3d9d Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 28 Aug 2014 23:31:29 -0700 Subject: [PATCH 159/846] Updated to use the new target framework in project.json --- src/Microsoft.AspNet.FeatureModel/project.json | 4 ++-- src/Microsoft.AspNet.Http.Extensions/project.json | 4 ++-- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 4 ++-- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- 13 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 935bd582a9..1fba2b6443 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,9 +1,9 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", "System.Linq": "4.0.0.0", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 05084820d7..d6d882dcf9 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "" @@ -6,7 +6,7 @@ "frameworks" : { "net45" : { }, - "k10" : { + "aspnetcore50" : { "dependencies": { "System.Runtime": "4.0.20.0" } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3de806f0c7..8b4e4847ae 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -3,7 +3,7 @@ "dependencies": {}, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 6eb8e1aef3..09e2ecaa34 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.IO": "4.0.10.0", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index aed0aa1fd5..ab619d0ecd 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -8,7 +8,7 @@ }, "frameworks": { "net45": { }, - "k10": { + "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 81d5f9a326..de5729dbe5 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -9,7 +9,7 @@ }, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 2c127c9880..c7db47e2cf 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "System.Runtime": "4.0.20.0" } diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index edd64952a5..6eb916901e 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index d4f878c1ae..606939399a 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.Http.Extensions": "", diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 3b3a2b30f5..e492a87bf0 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index ab327d0772..805a5b0b16 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index d83574ead1..335e9dc68e 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index b7217ebcea..68ed3039db 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.WebUtilities": "", From 90dad400299eedb37ff65eaf5f923e9823dcf1e0 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 4 Sep 2014 01:27:14 -0700 Subject: [PATCH 160/846] Updated to use the new target framework in project.json --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 1fba2b6443..1c37fbed40 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": {}, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index d6d882dcf9..ebdbd9b391 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Http": "" }, "frameworks" : { - "net45" : { + "aspnet50" : { }, "aspnetcore50" : { "dependencies": { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 8b4e4847ae..4e4141ca40 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": {}, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 09e2ecaa34..0c685167ae 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,7 +1,7 @@ { "version": "1.0.0-*", "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index ab619d0ecd..3959a57492 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -7,7 +7,7 @@ "Microsoft.AspNet.HttpFeature": "" }, "frameworks": { - "net45": { }, + "aspnet50": { }, "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index de5729dbe5..796736153e 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -8,7 +8,7 @@ "Microsoft.AspNet.WebUtilities": "" }, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index c7db47e2cf..e4f394f360 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "System.Runtime": "4.0.20.0" diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 6eb916901e..0140f1b937 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -9,7 +9,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 606939399a..da1a1aee7f 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -10,7 +10,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index e492a87bf0..eb6a78191d 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -10,7 +10,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 805a5b0b16..dec714b7e4 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -11,7 +11,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 335e9dc68e..d1179f1b2b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -10,7 +10,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Moq": "4.2.1312.1622", "System.Net.Http": "", diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 68ed3039db..f20bb8d0b0 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -8,7 +8,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "System.Runtime": "" } From ba4f44c4ea653334d9895aa05686246151379649 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 5 Sep 2014 01:48:46 -0700 Subject: [PATCH 161/846] Updated build.cmd --- build.cmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 3aaf957583..86ca5bbbf1 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_KRE_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 -CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 +CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -svr50 -x86 +CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From 335895d9b49042312eca12a089340adf3ca0a219 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 10 Sep 2014 11:45:02 -0700 Subject: [PATCH 162/846] #122 - Rename IBuilder to IApplicationBuilder. --- .../Extensions/MapExtensions.cs | 6 ++--- .../Extensions/MapWhenExtensions.cs | 8 +++---- .../Extensions/RunExtensions.cs | 2 +- .../Extensions/UseExtensions.cs | 2 +- .../{IBuilder.cs => IApplicationBuilder.cs} | 6 ++--- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 10 ++++----- .../{Builder.cs => ApplicationBuilder.cs} | 13 +++++------ .../MapPathMiddlewareTests.cs | 22 +++++++++---------- .../MapPredicateMiddlewareTests.cs | 22 +++++++++---------- ...derTests.cs => ApplicationBuilderTests.cs} | 4 ++-- 10 files changed, 47 insertions(+), 48 deletions(-) rename src/Microsoft.AspNet.Http/{IBuilder.cs => IApplicationBuilder.cs} (75%) rename src/Microsoft.AspNet.PipelineCore/{Builder.cs => ApplicationBuilder.cs} (86%) rename test/Microsoft.AspNet.PipelineCore.Tests/{BuilderTests.cs => ApplicationBuilderTests.cs} (89%) diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index b4a44adddf..9696b99da7 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Builder /// The path to match /// The branch to take for positive path matches /// - public static IBuilder Map([NotNull] this IBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) + public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) { return Map(app, new PathString(pathMatch), configuration); } @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Builder /// The path to match /// The branch to take for positive path matches /// - public static IBuilder Map([NotNull] this IBuilder app, PathString pathMatch, [NotNull] Action configuration) + public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, PathString pathMatch, [NotNull] Action configuration) { if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) { @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Builder } // create branch - IBuilder branchBuilder = app.New(); + var branchBuilder = app.New(); configuration(branchBuilder); var branch = branchBuilder.Build(); diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index b46bbbe0e9..63e65a0a11 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -23,10 +23,10 @@ namespace Microsoft.AspNet.Builder /// Invoked with the request environment to determine if the branch should be taken /// Configures a branch to take /// - public static IBuilder MapWhen([NotNull] this IBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) + public static IApplicationBuilder MapWhen([NotNull] this IApplicationBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) { // create branch - IBuilder branchBuilder = app.New(); + var branchBuilder = app.New(); configuration(branchBuilder); var branch = branchBuilder.Build(); @@ -46,10 +46,10 @@ namespace Microsoft.AspNet.Builder /// Invoked asynchronously with the request environment to determine if the branch should be taken /// Configures a branch to take /// - public static IBuilder MapWhenAsync([NotNull] this IBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) + public static IApplicationBuilder MapWhenAsync([NotNull] this IApplicationBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) { // create branch - IBuilder branchBuilder = app.New(); + var branchBuilder = app.New(); configuration(branchBuilder); var branch = branchBuilder.Build(); diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index de565c2e3d..694dd3ec0f 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Builder { public static class RunExtensions { - public static void Run([NotNull] this IBuilder app, [NotNull] RequestDelegate handler) + public static void Run([NotNull] this IApplicationBuilder app, [NotNull] RequestDelegate handler) { app.Use(_ => handler); } diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 3f0f8f51c3..038b14e03e 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Builder /// /// A function that handles the request or calls the given next function. /// - public static IBuilder Use(this IBuilder app, Func, Task> middleware) + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, Task> middleware) { return app.Use(next => { diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs similarity index 75% rename from src/Microsoft.AspNet.Http/IBuilder.cs rename to src/Microsoft.AspNet.Http/IApplicationBuilder.cs index 1673390e07..bed7c50f0d 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Builder { - public interface IBuilder + public interface IApplicationBuilder { IServiceProvider ApplicationServices { get; set; } @@ -14,9 +14,9 @@ namespace Microsoft.AspNet.Builder IDictionary Properties { get; set; } - IBuilder Use(Func middleware); + IApplicationBuilder Use(Func middleware); - IBuilder New(); + IApplicationBuilder New(); RequestDelegate Build(); } diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 674befa4f9..5bd2e0a9fa 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Builder public static class OwinExtensions { - public static AddMiddleware UseOwin(this IBuilder builder) + public static AddMiddleware UseOwin(this IApplicationBuilder builder) { AddMiddleware add = middleware => { @@ -58,17 +58,17 @@ namespace Microsoft.AspNet.Builder return add; } - public static IBuilder UseOwin(this IBuilder builder, Action pipeline) + public static IApplicationBuilder UseOwin(this IApplicationBuilder builder, Action pipeline) { pipeline(builder.UseOwin()); return builder; } - public static IBuilder UseBuilder(this AddMiddleware app) + public static IApplicationBuilder UseBuilder(this AddMiddleware app) { // Adapt WebSockets by default. app(OwinWebSocketAcceptAdapter.AdaptWebSockets); - var builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); CreateMiddleware middleware = CreateMiddlewareFactory(exit => { @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Builder }; } - public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) + public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) { var builder = app.UseBuilder(); pipeline(builder); diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs similarity index 86% rename from src/Microsoft.AspNet.PipelineCore/Builder.cs rename to src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs index 12a95ebd8f..71f6ef267b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs @@ -5,22 +5,21 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.Builder { - public class Builder : IBuilder + public class ApplicationBuilder : IApplicationBuilder { private readonly IList> _components = new List>(); - public Builder(IServiceProvider serviceProvider) + public ApplicationBuilder(IServiceProvider serviceProvider) { Properties = new Dictionary(); ApplicationServices = serviceProvider; } - private Builder(Builder builder) + private ApplicationBuilder(ApplicationBuilder builder) { Properties = builder.Properties; } @@ -62,15 +61,15 @@ namespace Microsoft.AspNet.Builder Properties[key] = value; } - public IBuilder Use(Func middleware) + public IApplicationBuilder Use(Func middleware) { _components.Add(middleware); return this; } - public IBuilder New() + public IApplicationBuilder New() { - return new Builder(this); + return new ApplicationBuilder(this); } public RequestDelegate Build() diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 4a9d68dd45..bdaa1eeedb 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Builder.Extensions { public class MapPathMiddlewareTests { - private static readonly Action ActionNotImplemented = new Action(_ => { throw new NotImplementedException(); }); + private static readonly Action ActionNotImplemented = new Action(_ => { throw new NotImplementedException(); }); private static Task Success(HttpContext context) { @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Builder.Extensions return Task.FromResult(null); } - private static void UseSuccess(IBuilder app) + private static void UseSuccess(IApplicationBuilder app) { app.Run(Success); } @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Builder.Extensions throw new NotImplementedException(); } - private static void UseNotImplemented(IBuilder app) + private static void UseNotImplemented(IApplicationBuilder app) { app.Run(NotImplemented); } @@ -41,8 +41,8 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void NullArguments_ArgumentNullException() { - var builder = new Builder(serviceProvider: null); - var noMiddleware = new Builder(serviceProvider: null).Build(); + var builder = new ApplicationBuilder(serviceProvider: null); + var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapOptions(); // TODO: [NotNull] Assert.Throws(() => builder.Map(null, ActionNotImplemented)); // TODO: [NotNull] Assert.Throws(() => builder.Map("/foo", (Action)null)); @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMatchFunc_BranchTaken(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -82,7 +82,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMatchAction_BranchTaken(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); var app = builder.Build(); app.Invoke(context).Wait(); @@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new Builder(serviceProvider: null).Map(matchPath, map => { }).Build()); + Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); } [Theory] @@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMismatchFunc_PassedThrough(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMismatchAction_PassedThrough(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -148,7 +148,7 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void ChainedRoutes_Success() { - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map("/route1", map => { map.Map((string)"/subroute1", UseSuccess); diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index eb8ee8be9c..c5016f3064 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Builder.Extensions return Task.FromResult(null); } - private static void UseSuccess(IBuilder app) + private static void UseSuccess(IApplicationBuilder app) { app.Run(Success); } @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Builder.Extensions throw new NotImplementedException(); } - private static void UseNotImplemented(IBuilder app) + private static void UseNotImplemented(IApplicationBuilder app) { app.Run(NotImplemented); } @@ -64,8 +64,8 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void NullArguments_ArgumentNullException() { - var builder = new Builder(serviceProvider: null); - var noMiddleware = new Builder(serviceProvider: null).Build(); + var builder = new ApplicationBuilder(serviceProvider: null); + var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapWhenOptions(); // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, (Action)null)); @@ -82,7 +82,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateTrue_BranchTaken() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(TruePredicate, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -94,7 +94,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateTrueAction_BranchTaken() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(TruePredicate, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -106,7 +106,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateFalseAction_PassThrough() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(FalsePredicate, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateAsyncTrueAction_BranchTaken() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhenAsync(TruePredicateAsync, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -131,7 +131,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateAsyncFalseAction_PassThrough() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhenAsync(FalsePredicateAsync, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -143,7 +143,7 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void ChainedPredicates_Success() { - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(TruePredicate, map1 => { map1.MapWhen((Predicate)FalsePredicate, UseNotImplemented); @@ -160,7 +160,7 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void ChainedPredicatesAsync_Success() { - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhenAsync(TruePredicateAsync, map1 => { map1.MapWhenAsync((PredicateAsync)FalsePredicateAsync, UseNotImplemented); diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs similarity index 89% rename from test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs rename to test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs index 1fab0f3938..755eee5f76 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs @@ -6,12 +6,12 @@ using Xunit; namespace Microsoft.AspNet.Builder.Tests { - public class BuilderTests + public class ApplicationBuilderTests { [Fact] public void BuildReturnsCallableDelegate() { - var builder = new Builder(null); + var builder = new ApplicationBuilder(null); var app = builder.Build(); var mockHttpContext = new Moq.Mock(); From 547d77778e7f28a70cec96655a760c80035f257b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 11 Sep 2014 10:06:46 -0700 Subject: [PATCH 163/846] Reacting to System.Text.Encoding package version change --- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 796736153e..ea2ee32856 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -24,7 +24,7 @@ "System.Runtime.InteropServices": "4.0.20.0", "System.Security.Claims": "1.0.0-*", "System.Security.Principal" : "4.0.0.0", - "System.Text.Encoding": "4.0.20.0", + "System.Text.Encoding": "4.0.10.0", "System.Threading.Tasks": "4.0.10.0" } } From 0bfe3c14db560f79d1bfe151db4363dc97c06733 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 10 Sep 2014 08:54:27 -0700 Subject: [PATCH 164/846] Port AuthProperties.AllowRefresh from Katana. --- .../Security/AuthenticationProperties.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index 6a6fb4fadf..afb9aca66a 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -17,6 +17,7 @@ namespace Microsoft.AspNet.Http.Security internal const string ExpiresUtcKey = ".expires"; internal const string IsPersistentKey = ".persistent"; internal const string RedirectUriKey = ".redirect"; + internal const string RefreshKey = ".refresh"; internal const string UtcDateTimeFormat = "r"; /// @@ -160,5 +161,39 @@ namespace Microsoft.AspNet.Http.Security } } } + + /// + /// Gets or sets if refreshing the authentication session should be allowed. + /// + public bool? AllowRefresh + { + get + { + string value; + if (Dictionary.TryGetValue(RefreshKey, out value)) + { + bool refresh; + if (bool.TryParse(value, out refresh)) + { + return refresh; + } + } + return null; + } + set + { + if (value.HasValue) + { + Dictionary[RefreshKey] = value.Value.ToString(); + } + else + { + if (Dictionary.ContainsKey(RefreshKey)) + { + Dictionary.Remove(RefreshKey); + } + } + } + } } } From 3811f47b23f05fd85ef4693d13381e285e79d647 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 15 Sep 2014 09:13:27 -0700 Subject: [PATCH 165/846] Use out var syntax. --- .../Security/AuthenticationProperties.cs | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index afb9aca66a..1ba80d02a6 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -75,8 +75,7 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; + return Dictionary.TryGetValue(RedirectUriKey, out var value) ? value : null; } set { @@ -101,11 +100,9 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - if (Dictionary.TryGetValue(IssuedUtcKey, out value)) + if (Dictionary.TryGetValue(IssuedUtcKey, out var value)) { - DateTimeOffset dateTimeOffset; - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) { return dateTimeOffset; } @@ -135,11 +132,9 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) + if (Dictionary.TryGetValue(ExpiresUtcKey, out var value)) { - DateTimeOffset dateTimeOffset; - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) { return dateTimeOffset; } @@ -169,11 +164,9 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - if (Dictionary.TryGetValue(RefreshKey, out value)) + if (Dictionary.TryGetValue(RefreshKey, out var value)) { - bool refresh; - if (bool.TryParse(value, out refresh)) + if (bool.TryParse(value, out var refresh)) { return refresh; } From ae0a44a0e1a15d7e013dc48fe0b0c87926e5cfb7 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 17 Sep 2014 09:57:44 -0700 Subject: [PATCH 166/846] Updating release NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From d61b6835498be7484ea9bd33423238f66eba2d41 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 17 Sep 2014 09:57:46 -0700 Subject: [PATCH 167/846] Updating dev NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From c2934912af7667947c43c94599fead54eb0cf9fe Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 16 Sep 2014 10:30:45 -0700 Subject: [PATCH 168/846] #121 - Make the query parsing API public. --- .../Infrastructure/ParsingHelpers.cs | 16 ----- .../QueryFeature.cs | 3 +- .../ParsingHelpers.cs | 17 +++++ .../QueryHelpers.cs | 11 ++++ .../QueryHelpersTests.cs | 64 +++++++++++++++++++ 5 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index f1db7fe748..10c9ef3672 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -795,22 +795,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } }; - private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; - - internal static IDictionary GetQuery(string queryString) - { - if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') - { - queryString = queryString.Substring(1); - } - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); - return accumulator.ToDictionary( - item => item.Key, - item => item.Value.ToArray(), - StringComparer.OrdinalIgnoreCase); - } - internal static string GetJoinedValue(IDictionary store, string key) { string[] values = GetUnmodifiedValues(store, key); diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index ab5ea5157a..5106808d03 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -6,6 +6,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities; using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore @@ -45,7 +46,7 @@ namespace Microsoft.AspNet.PipelineCore if (_query == null || _queryString != queryString) { _queryString = queryString; - _query = new ReadableStringCollection(ParsingHelpers.GetQuery(queryString)); + _query = QueryHelpers.ParseQuery(queryString); } return _query; } diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs index e5dbd65a9c..79f9d22ebd 100644 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.WebUtilities.Collections; @@ -90,5 +91,21 @@ namespace Microsoft.AspNet.WebUtilities string[] values; return store.TryGetValue(key, out values) ? values : null; } + + private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; + + internal static IReadableStringCollection GetQuery(string queryString) + { + if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + { + queryString = queryString.Substring(1); + } + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); + return new ReadableStringCollection(accumulator.ToDictionary( + item => item.Key, + item => item.Value.ToArray(), + StringComparer.OrdinalIgnoreCase)); + } } } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index d31a250fdb..f54ff50dea 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.WebUtilities { @@ -43,5 +44,15 @@ namespace Microsoft.AspNet.WebUtilities } return sb.ToString(); } + + /// + /// Parse a query string into its component key and value parts. + /// + /// The raw query string value, with or without the leading '?'. + /// A collection of parsed keys and values. + public static IReadableStringCollection ParseQuery(string text) + { + return ParsingHelpers.GetQuery(text); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs new file mode 100644 index 0000000000..3c81820e3e --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class QueryHelperTests + { + [Fact] + public void ParseQueryWithUniqueKeysWorks() + { + var collection = QueryHelpers.ParseQuery("?key1=value1&key2=value2"); + Assert.Equal(2, collection.Count); + Assert.Equal("value1", collection["key1"]); + Assert.Equal("value2", collection["key2"]); + } + + [Fact] + public void ParseQueryWithoutQuestionmarkWorks() + { + var collection = QueryHelpers.ParseQuery("key1=value1&key2=value2"); + Assert.Equal(2, collection.Count); + Assert.Equal("value1", collection["key1"]); + Assert.Equal("value2", collection["key2"]); + } + + [Fact] + public void ParseQueryWithDuplicateKeysGroups() + { + var collection = QueryHelpers.ParseQuery("?key1=valueA&key2=valueB&key1=valueC"); + Assert.Equal(2, collection.Count); + Assert.Equal("valueA,valueC", collection["key1"]); + Assert.Equal("valueB", collection["key2"]); + } + + [Fact] + public void ParseQueryWithSemicolonWorks() + { + var collection = QueryHelpers.ParseQuery("?key1=value1;key2=value2"); + Assert.Equal(2, collection.Count); + Assert.Equal("value1", collection["key1"]); + Assert.Equal("value2", collection["key2"]); + } + + [Fact] + public void ParseQueryWithEmptyValuesWorks() + { + var collection = QueryHelpers.ParseQuery("?key1=;key2="); + Assert.Equal(2, collection.Count); + Assert.Equal(string.Empty, collection["key1"]); + Assert.Equal(string.Empty, collection["key2"]); + } + + [Fact] + public void ParseQueryWithEmptyKeyWorks() + { + var collection = QueryHelpers.ParseQuery("?=value1;="); + Assert.Equal(1, collection.Count); + Assert.Equal("value1,", collection[""]); + } + } +} \ No newline at end of file From 38e085e3eff7165a2b63970726aa1c9f6e4e468a Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 1 Oct 2014 14:26:20 -0700 Subject: [PATCH 169/846] Removing out var usage --- .../Security/AuthenticationProperties.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index 1ba80d02a6..afb9aca66a 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -75,7 +75,8 @@ namespace Microsoft.AspNet.Http.Security { get { - return Dictionary.TryGetValue(RedirectUriKey, out var value) ? value : null; + string value; + return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; } set { @@ -100,9 +101,11 @@ namespace Microsoft.AspNet.Http.Security { get { - if (Dictionary.TryGetValue(IssuedUtcKey, out var value)) + string value; + if (Dictionary.TryGetValue(IssuedUtcKey, out value)) { - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) { return dateTimeOffset; } @@ -132,9 +135,11 @@ namespace Microsoft.AspNet.Http.Security { get { - if (Dictionary.TryGetValue(ExpiresUtcKey, out var value)) + string value; + if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) { - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) { return dateTimeOffset; } @@ -164,9 +169,11 @@ namespace Microsoft.AspNet.Http.Security { get { - if (Dictionary.TryGetValue(RefreshKey, out var value)) + string value; + if (Dictionary.TryGetValue(RefreshKey, out value)) { - if (bool.TryParse(value, out var refresh)) + bool refresh; + if (bool.TryParse(value, out refresh)) { return refresh; } From 20de1d0597fa8a12887f5478b7c4f54cc0d10b4b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 5 Oct 2014 05:08:07 -0700 Subject: [PATCH 170/846] Fix up references --- .../project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 54 +++++++++---------- .../project.json | 8 +-- .../project.json | 9 ++-- .../project.json | 11 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 9 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 13 +++-- .../project.json | 37 ++++++------- .../project.json | 24 ++++----- 9 files changed, 80 insertions(+), 87 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index ebdbd9b391..b19b3871c4 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,7 +1,7 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "" + "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks" : { "aspnet50" : { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 3959a57492..4bd0555d65 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,30 +1,30 @@ { - "version": "1.0.0-*", - "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.PipelineCore": "", - "Microsoft.AspNet.HttpFeature": "" - }, - "frameworks": { - "aspnet50": { }, - "aspnetcore50": { - "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Net.Primitives": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "1.0.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0.0", - "System.Security.Principal" : "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" - } + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" } + }, + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Collections": "4.0.10.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.IO": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Net.Primitives": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "1.0.0-*", + "System.Security.Cryptography.X509Certificates": "4.0.0.0", + "System.Security.Principal": "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0" + } + } } - } } diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index ea2ee32856..41392e7cec 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -2,10 +2,10 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.WebUtilities": "" + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*" }, "frameworks": { "aspnet50": {}, diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 0140f1b937..bf587219ea 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,8 +1,8 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { @@ -11,8 +11,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index da1a1aee7f..1e7c64bbe6 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,9 +1,9 @@ { "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.Http.Extensions": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { @@ -12,8 +12,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index eb6a78191d..e85c177c16 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,8 +1,8 @@ { "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, @@ -12,8 +12,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index dec714b7e4..9893f86030 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,10 +1,10 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Owin": "", - "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { @@ -13,8 +13,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index d1179f1b2b..3eb49d4bed 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,21 +1,22 @@ { - "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.PipelineCore": "", - "Xunit.KRunner": "1.0.0-*" - }, - "commands": { - "test": "Xunit.KRunner" - }, - "frameworks": { - "aspnet50": { - "dependencies": { - "Moq": "4.2.1312.1622", - "System.Net.Http": "", - "System.Runtime": "" - } + "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "frameworks": { + "aspnet50": { + "dependencies": { + "Moq": "4.2.1312.1622" + }, + "frameworkAssemblies": { + "System.Net.Http": "4.0.0.0" + } + } } - } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index f20bb8d0b0..868b37110c 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,17 +1,13 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.WebUtilities": "", - "Xunit.KRunner": "1.0.0-*" - }, - "commands": { - "test": "Xunit.KRunner" - }, - "frameworks": { - "aspnet50": { - "dependencies": { - "System.Runtime": "" - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "frameworks": { + "aspnet50": { } } - } } From f5577c589ef7a7f82fe2842860e5ca936689320d Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 8 Oct 2014 14:25:59 -0700 Subject: [PATCH 171/846] #130 - Remove semi-colon support from query parsing. --- src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs | 6 +++--- .../QueryHelpersTests.cs | 13 ++----------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs index 79f9d22ebd..257b206c6b 100644 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -68,7 +68,7 @@ namespace Microsoft.AspNet.WebUtilities { IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); + ParseDelimited(text, Ampersand, AppendItemCallback, accumulator); foreach (var kv in accumulator) { form.Add(kv.Key, kv.Value.ToArray()); @@ -92,7 +92,7 @@ namespace Microsoft.AspNet.WebUtilities return store.TryGetValue(key, out values) ? values : null; } - private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; + private static readonly char[] Ampersand = new[] { '&' }; internal static IReadableStringCollection GetQuery(string queryString) { @@ -101,7 +101,7 @@ namespace Microsoft.AspNet.WebUtilities queryString = queryString.Substring(1); } var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); + ParseDelimited(queryString, Ampersand, AppendItemCallback, accumulator); return new ReadableStringCollection(accumulator.ToDictionary( item => item.Key, item => item.Value.ToArray(), diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index 3c81820e3e..fea33d497a 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -35,19 +35,10 @@ namespace Microsoft.AspNet.WebUtilities Assert.Equal("valueB", collection["key2"]); } - [Fact] - public void ParseQueryWithSemicolonWorks() - { - var collection = QueryHelpers.ParseQuery("?key1=value1;key2=value2"); - Assert.Equal(2, collection.Count); - Assert.Equal("value1", collection["key1"]); - Assert.Equal("value2", collection["key2"]); - } - [Fact] public void ParseQueryWithEmptyValuesWorks() { - var collection = QueryHelpers.ParseQuery("?key1=;key2="); + var collection = QueryHelpers.ParseQuery("?key1=&key2="); Assert.Equal(2, collection.Count); Assert.Equal(string.Empty, collection["key1"]); Assert.Equal(string.Empty, collection["key2"]); @@ -56,7 +47,7 @@ namespace Microsoft.AspNet.WebUtilities [Fact] public void ParseQueryWithEmptyKeyWorks() { - var collection = QueryHelpers.ParseQuery("?=value1;="); + var collection = QueryHelpers.ParseQuery("?=value1&="); Assert.Equal(1, collection.Count); Assert.Equal("value1,", collection[""]); } From dc04ff843cb35e4a917258efd93c0a97ae51fa8b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 10 Oct 2014 10:32:48 -0700 Subject: [PATCH 172/846] Reacting to CLR package versioning changes --- .../project.json | 14 +++++----- .../project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 24 ++++++++--------- src/Microsoft.AspNet.HttpFeature/project.json | 14 +++++----- src/Microsoft.AspNet.Owin/project.json | 26 +++++++++---------- .../project.json | 26 +++++++++---------- .../project.json | 2 +- .../project.json | 2 +- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 1c37fbed40..595978bef8 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -5,13 +5,13 @@ "aspnet50": {}, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Reflection.TypeExtensions": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.20.0", - "System.Threading": "4.0.0.0" + "System.Collections": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Reflection": "4.0.10-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Threading": "4.0.0-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index b19b3871c4..e4d49e2085 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -8,7 +8,7 @@ }, "aspnetcore50" : { "dependencies": { - "System.Runtime": "4.0.20.0" + "System.Runtime": "4.0.20-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 4e4141ca40..fa763b1edb 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,19 +6,19 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.Globalization.Extensions": "4.0.0.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Principal" : "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Principal" : "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 0c685167ae..2706610f3e 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -5,14 +5,14 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.IO": "4.0.10.0", - "System.Net.Primitives": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.IO": "4.0.10-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0.0", - "System.Security.Principal": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 4bd0555d65..d1104b22ac 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -10,20 +10,20 @@ "aspnet50": { }, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Net.Primitives": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0.0", - "System.Security.Principal": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 41392e7cec..a2b0abf71f 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -12,20 +12,20 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Debug": "4.0.10.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Principal" : "4.0.0.0", - "System.Text.Encoding": "4.0.10.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Principal" : "4.0.0-beta-*", + "System.Text.Encoding": "4.0.10-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index e4f394f360..fcb9fea61d 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -7,7 +7,7 @@ "aspnet50": {}, "aspnetcore50": { "dependencies": { - "System.Runtime": "4.0.20.0" + "System.Runtime": "4.0.20-beta-*" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 3eb49d4bed..a175d93546 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -15,7 +15,7 @@ "Moq": "4.2.1312.1622" }, "frameworkAssemblies": { - "System.Net.Http": "4.0.0.0" + "System.Net.Http": "4.0.0-beta-*" } } } From 0d27849c143531d1f3399fe64de8352eac96a2cb Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 10 Oct 2014 12:19:24 -0700 Subject: [PATCH 173/846] Removing version token from framework assemblies node --- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index a175d93546..1c3bc620fe 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -15,7 +15,7 @@ "Moq": "4.2.1312.1622" }, "frameworkAssemblies": { - "System.Net.Http": "4.0.0-beta-*" + "System.Net.Http": "" } } } From 0f2b9b3701eab7e4bb651b4e95b04354828e0a93 Mon Sep 17 00:00:00 2001 From: Levi B Date: Mon, 13 Oct 2014 17:09:52 -0700 Subject: [PATCH 174/846] Add Base64UrlEncode / Base64UrlDecode. --- .../WebEncoders.cs | 183 ++++++++++++++++++ .../project.json | 23 +-- .../WebEncodersTests.cs | 78 ++++++++ 3 files changed, 273 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/WebEncoders.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs new file mode 100644 index 0000000000..f73c3c249f --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -0,0 +1,183 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// Contains utility APIs to assist with common encoding and decoding operations. + /// + public static class WebEncoders + { + /// + /// Decodes a base64url-encoded string. + /// + /// The base64url-encoded input to decode. + /// The base64url-decoded form of the input. + /// + /// The input must not contain any whitespace or padding characters. + /// Throws FormatException if the input is malformed. + /// + public static byte[] Base64UrlDecode([NotNull] string input) + { + return Base64UrlDecode(input, 0, input.Length); + } + + /// + /// Decodes a base64url-encoded substring of a given string. + /// + /// A string containing the base64url-encoded input to decode. + /// The position in at which decoding should begin. + /// The number of characters in to decode. + /// The base64url-decoded form of the input. + /// + /// The input must not contain any whitespace or padding characters. + /// Throws FormatException if the input is malformed. + /// + public static byte[] Base64UrlDecode([NotNull] string input, int offset, int count) + { + ValidateParameters(input.Length, offset, count); + + // Assumption: input is base64url encoded without padding and contains no whitespace. + + // First, we need to add the padding characters back. + int numPaddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); + char[] completeBase64Array = new char[checked(count + numPaddingCharsToAdd)]; + Debug.Assert(completeBase64Array.Length % 4 == 0, "Invariant: Array length must be a multiple of 4."); + input.CopyTo(offset, completeBase64Array, 0, count); + for (int i = 1; i <= numPaddingCharsToAdd; i++) + { + completeBase64Array[completeBase64Array.Length - i] = '='; + } + + // Next, fix up '-' -> '+' and '_' -> '/' + for (int i = 0; i < completeBase64Array.Length; i++) + { + char c = completeBase64Array[i]; + if (c == '-') + { + completeBase64Array[i] = '+'; + } + else if (c == '_') + { + completeBase64Array[i] = '/'; + } + } + + // Finally, decode. + // If the caller provided invalid base64 chars, they'll be caught here. + return Convert.FromBase64CharArray(completeBase64Array, 0, completeBase64Array.Length); + } + + /// + /// Encodes an input using base64url encoding. + /// + /// The binary input to encode. + /// The base64url-encoded form of the input. + public static string Base64UrlEncode([NotNull] byte[] input) + { + return Base64UrlEncode(input, 0, input.Length); + } + + /// + /// Encodes an input using base64url encoding. + /// + /// The binary input to encode. + /// The offset into at which to begin encoding. + /// The number of bytes of to encode. + /// The base64url-encoded form of the input. + public static string Base64UrlEncode([NotNull] byte[] input, int offset, int count) + { + ValidateParameters(input.Length, offset, count); + + // Special-case empty input + if (count == 0) + { + return String.Empty; + } + + // We're going to use base64url encoding with no padding characters. + // See RFC 4648, Sec. 5. + char[] buffer = new char[GetNumBase64CharsRequiredForInput(count)]; + int numBase64Chars = Convert.ToBase64CharArray(input, offset, count, buffer, 0); + + // Fix up '+' -> '-' and '/' -> '_' + for (int i = 0; i < numBase64Chars; i++) + { + char ch = buffer[i]; + if (ch == '+') + { + buffer[i] = '-'; + } + else if (ch == '/') + { + buffer[i] = '_'; + } + else if (ch == '=') + { + // We've reached a padding character: truncate the string from this point + return new String(buffer, 0, i); + } + } + + // If we got this far, the buffer didn't contain any padding chars, so turn + // it directly into a string. + return new String(buffer, 0, numBase64Chars); + } + + private static int GetNumBase64CharsRequiredForInput(int inputLength) + { + int numWholeOrPartialInputBlocks = checked(inputLength + 2) / 3; + return checked(numWholeOrPartialInputBlocks * 4); + } + + private static int GetNumBase64PaddingCharsInString(string str) + { + // Assumption: input contains a well-formed base64 string with no whitespace. + + // base64 guaranteed have 0 - 2 padding characters. + if (str[str.Length - 1] == '=') + { + if (str[str.Length - 2] == '=') + { + return 2; + } + return 1; + } + return 0; + } + + private static int GetNumBase64PaddingCharsToAddForDecode(int inputLength) + { + switch (inputLength % 4) + { + case 0: + return 0; + case 2: + return 2; + case 3: + return 1; + default: + throw new FormatException("TODO: Malformed input."); + } + } + + private static void ValidateParameters(int bufferLength, int offset, int count) + { + if (offset < 0) + { + throw new ArgumentOutOfRangeException("offset"); + } + if (count < 0) + { + throw new ArgumentOutOfRangeException("count"); + } + if (bufferLength - offset < count) + { + throw new ArgumentException("Invalid offset / length."); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index fcb9fea61d..74757f774a 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,14 +1,15 @@ { - "version": "1.0.0-*", - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" - }, - "frameworks": { - "aspnet50": {}, - "aspnetcore50": { - "dependencies": { - "System.Runtime": "4.0.20-beta-*" - } + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*" + } + } } - } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs new file mode 100644 index 0000000000..9813a780c3 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class WebEncodersTests + { + [Theory] + [InlineData("", 1, 0)] + [InlineData("", 0, 1)] + [InlineData("0123456789", 9, 2)] + [InlineData("0123456789", Int32.MaxValue, 2)] + [InlineData("0123456789", 9, -1)] + public void Base64UrlDecode_BadOffsets(string input, int offset, int count) + { + // Act & assert + Assert.ThrowsAny(() => + { + var retVal = WebEncoders.Base64UrlDecode(input, offset, count); + }); + } + + [Theory] + [InlineData("x")] + [InlineData("(x)")] + public void Base64UrlDecode_MalformedInput(string input) + { + // Act & assert + Assert.Throws(() => + { + var retVal = WebEncoders.Base64UrlDecode(input); + }); + } + + [Theory] + [InlineData("", "")] + [InlineData("123456qwerty++//X+/x", "123456qwerty--__X-_x")] + [InlineData("123456qwerty++//X+/xxw==", "123456qwerty--__X-_xxw")] + [InlineData("123456qwerty++//X+/xxw0=", "123456qwerty--__X-_xxw0")] + public void Base64UrlEncode_And_Decode(string base64Input, string expectedBase64Url) + { + // Arrange + byte[] input = new byte[3].Concat(Convert.FromBase64String(base64Input)).Concat(new byte[2]).ToArray(); + + // Act & assert - 1 + string actualBase64Url = WebEncoders.Base64UrlEncode(input, 3, input.Length - 5); // also helps test offsets + Assert.Equal(expectedBase64Url, actualBase64Url); + + // Act & assert - 2 + // Verify that values round-trip + byte[] roundTripped = WebEncoders.Base64UrlDecode("xx" + actualBase64Url + "yyy", 2, actualBase64Url.Length); // also helps test offsets + string roundTrippedAsBase64 = Convert.ToBase64String(roundTripped); + Assert.Equal(roundTrippedAsBase64, base64Input); + } + + [Theory] + [InlineData(0, 1, 0)] + [InlineData(0, 0, 1)] + [InlineData(10, 9, 2)] + [InlineData(10, Int32.MaxValue, 2)] + [InlineData(10, 9, -1)] + public void Base64UrlEncode_BadOffsets(int inputLength, int offset, int count) + { + // Arrange + byte[] input = new byte[inputLength]; + + // Act & assert + Assert.ThrowsAny(() => + { + var retVal = WebEncoders.Base64UrlEncode(input, offset, count); + }); + } + } +} From 8bd068f4a6ff2693e95eefec51a2fb63dab3e01d Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 15 Oct 2014 09:39:12 -0700 Subject: [PATCH 175/846] Move UseMiddleware from RequestContainer to Http.Extensions. --- .../UseMiddlewareExtensions.cs | 29 +++++++++++++++++++ .../project.json | 6 +++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs new file mode 100644 index 0000000000..bea600af4b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using System.Reflection; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Builder +{ + public static class UseMiddlewareExtensions + { + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) + { + return builder.UseMiddleware(typeof(T), args); + } + + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) + { + return builder.Use(next => + { + var typeActivator = builder.ApplicationServices.GetService(); + var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); + return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); + }); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index e4d49e2085..d8391b0906 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,13 +1,17 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*" }, "frameworks" : { "aspnet50" : { }, "aspnetcore50" : { "dependencies": { + "System.Reflection": "4.0.10-beta-*", + "System.Reflection.Extensions": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } } From dcb710cfbe20b3d8ba0e475245c39b8930461e85 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Oct 2014 09:47:52 -0700 Subject: [PATCH 176/846] Update Claims dependency. --- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index fa763b1edb..60649251d8 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -16,7 +16,7 @@ "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Principal" : "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 2706610f3e..d8b391950d 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -9,7 +9,7 @@ "System.Net.Primitives": "4.0.10-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index d1104b22ac..86bc6e3f81 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -20,7 +20,7 @@ "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index a2b0abf71f..955572d6fc 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -22,7 +22,7 @@ "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Principal" : "4.0.0-beta-*", "System.Text.Encoding": "4.0.10-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" From 2352bd7ca33712b9f144d3f6cf83cd1d97754662 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Fri, 17 Oct 2014 15:09:27 -0700 Subject: [PATCH 177/846] Change GetService calls to GetRequiredService GetRequiredService throws for missing services like GetService used to. --- src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index bea600af4b..1e61139153 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Builder { return builder.Use(next => { - var typeActivator = builder.ApplicationServices.GetService(); + var typeActivator = builder.ApplicationServices.GetRequiredService(); var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); From dc600a636a1f01b27493e6e122d7179e320310aa Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 15 Oct 2014 14:13:34 -0700 Subject: [PATCH 178/846] Support removing features from FeatureCollection. --- .../FeatureCollection.cs | 22 +++++++++++-- .../InterfaceDictionaryTests.cs | 31 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 222dc181f0..3b3f05b2b2 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -66,7 +66,12 @@ namespace Microsoft.AspNet.FeatureModel void SetInterface(Type type, object feature) { if (type == null) throw new ArgumentNullException("type"); - if (feature == null) throw new ArgumentNullException("feature"); + + if (feature == null) + { + Remove(type); + return; + } lock (_containerSync) { @@ -167,7 +172,20 @@ namespace Microsoft.AspNet.FeatureModel public bool Remove(Type key) { - throw new NotImplementedException(); + if (key == null) throw new ArgumentNullException("key"); + + lock (_containerSync) + { + Type priorFeatureType; + if (_featureTypeByName.TryGetValue(key.FullName, out priorFeatureType)) + { + _featureTypeByName.Remove(key.FullName); + _featureByFeatureType.Remove(priorFeatureType); + Interlocked.Increment(ref _containerRevision); + return true; + } + return false; + } } public bool TryGetValue(Type key, out object value) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index 37eac34813..9309814aa7 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -48,5 +48,36 @@ namespace Microsoft.AspNet.FeatureModel.Tests Assert.Throws(() => interfaces.Add(typeof(IThing), thing)); } + + [Fact] + public void RemovedInterfaceIsRemoved() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + + Assert.Equal(interfaces[typeof(IThing)], thing); + + Assert.True(interfaces.Remove(typeof(IThing))); + + object thing2; + Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); + } + + [Fact] + public void SetNullValueRemoves() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + Assert.Equal(interfaces[typeof(IThing)], thing); + + interfaces[typeof(IThing)] = null; + + object thing2; + Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); + } } } From 114d834876d91fffb42ea643044b434e85363411 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 15 Oct 2014 15:17:58 -0700 Subject: [PATCH 179/846] Add Session feature, object model, etc.. --- .../FeatureCollection.cs | 20 ++--- .../NotNullAttribute.cs | 12 +++ .../project.json | 4 +- .../SessionCollectionExtensions.cs | 60 +++++++++++++++ .../project.json | 2 - src/Microsoft.AspNet.Http/HttpContext.cs | 2 + .../ISessionCollection.cs | 21 ++++++ src/Microsoft.AspNet.HttpFeature/ISession.cs | 27 +++++++ .../ISessionFactory.cs | 16 ++++ .../ISessionFeature.cs | 16 ++++ .../Collections/SessionCollection.cs | 75 +++++++++++++++++++ .../DefaultHttpContext.cs | 29 +++++++ 12 files changed, 267 insertions(+), 17 deletions(-) create mode 100644 src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs create mode 100644 src/Microsoft.AspNet.Http/ISessionCollection.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/ISession.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 3b3f05b2b2..b86a3832b1 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -31,9 +31,8 @@ namespace Microsoft.AspNet.FeatureModel return GetInterface(null); } - public object GetInterface(Type type) + public object GetInterface([NotNull] Type type) { - if (type == null) throw new ArgumentNullException("type"); object feature; if (_featureByFeatureType.TryGetValue(type, out feature)) { @@ -63,10 +62,8 @@ namespace Microsoft.AspNet.FeatureModel return null; } - void SetInterface(Type type, object feature) + void SetInterface([NotNull] Type type, object feature) { - if (type == null) throw new ArgumentNullException("type"); - if (feature == null) { Remove(type); @@ -153,16 +150,13 @@ namespace Microsoft.AspNet.FeatureModel get { return false; } } - public bool ContainsKey(Type key) + public bool ContainsKey([NotNull] Type key) { - if (key == null) throw new ArgumentNullException("key"); return GetInterface(key) != null; } - public void Add(Type key, object value) + public void Add([NotNull] Type key, [NotNull] object value) { - if (key == null) throw new ArgumentNullException("key"); - if (value == null) throw new ArgumentNullException("value"); if (ContainsKey(key)) { throw new ArgumentException(); @@ -170,10 +164,8 @@ namespace Microsoft.AspNet.FeatureModel SetInterface(key, value); } - public bool Remove(Type key) + public bool Remove([NotNull] Type key) { - if (key == null) throw new ArgumentNullException("key"); - lock (_containerSync) { Type priorFeatureType; @@ -188,7 +180,7 @@ namespace Microsoft.AspNet.FeatureModel } } - public bool TryGetValue(Type key, out object value) + public bool TryGetValue([NotNull] Type key, out object value) { value = GetInterface(key); return value != null; diff --git a/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs b/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs new file mode 100644 index 0000000000..3869edda12 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.FeatureModel +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 595978bef8..5e0b3bc67f 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,6 +1,8 @@ { "version": "1.0.0-*", - "dependencies": {}, + "dependencies": { + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" + }, "frameworks": { "aspnet50": {}, "aspnetcore50": { diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs new file mode 100644 index 0000000000..d13f34be02 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Text; + +namespace Microsoft.AspNet.Http +{ + public static class SessionCollectionExtensions + { + public static void SetInt(this ISessionCollection session, string key, int value) + { + var bytes = new byte[] + { + (byte)(value >> 24), + (byte)(0xFF & (value >> 16)), + (byte)(0xFF & (value >> 8)), + (byte)(0xFF & value) + }; + session.Set(key, bytes); + } + + public static int? GetInt(this ISessionCollection session, string key) + { + var data = session.Get(key); + if (data == null || data.Length < 4) + { + return null; + } + return data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + } + + public static void SetString(this ISessionCollection session, string key, string value) + { + session.Set(key, Encoding.UTF8.GetBytes(value)); + } + + public static string GetString(this ISessionCollection session, string key) + { + var data = session.Get(key); + if (data == null) + { + return null; + } + return Encoding.UTF8.GetString(data); + } + + public static byte[] Get(this ISessionCollection session, string key) + { + byte[] value = null; + session.TryGetValue(key, out value); + return value; + } + + public static void Set(this ISessionCollection session, string key, byte[] value) + { + session.Set(key, new ArraySegment(value)); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index d8391b0906..eb0b74711f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -9,8 +9,6 @@ }, "aspnetcore50" : { "dependencies": { - "System.Reflection": "4.0.10-beta-*", - "System.Reflection.Extensions": "4.0.0-beta-*", "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 191c3f02a6..094b6671eb 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -28,6 +28,8 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken RequestAborted { get; } + public abstract ISessionCollection Session { get; } + public abstract bool IsWebSocketRequest { get; } public abstract IList WebSocketRequestedProtocols { get; } diff --git a/src/Microsoft.AspNet.Http/ISessionCollection.cs b/src/Microsoft.AspNet.Http/ISessionCollection.cs new file mode 100644 index 0000000000..5dd3029c78 --- /dev/null +++ b/src/Microsoft.AspNet.Http/ISessionCollection.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.Http +{ + public interface ISessionCollection : IEnumerable> + { + byte[] this[string key] { get; set; } + + bool TryGetValue(string key, out byte[] value); + + void Set(string key, ArraySegment value); + + void Remove(string key); + + void Clear(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/ISession.cs b/src/Microsoft.AspNet.HttpFeature/ISession.cs new file mode 100644 index 0000000000..6a0fe4035a --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/ISession.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface ISession + { + void Load(); + + void Commit(); + + bool TryGetValue(string key, out byte[] value); + + void Set(string key, ArraySegment value); + + void Remove(string key); + + void Clear(); + + IEnumerable Keys { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs b/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs new file mode 100644 index 0000000000..1187696726 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface ISessionFactory + { + bool IsAvailable { get; } + + ISession Create(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs b/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs new file mode 100644 index 0000000000..400f365b68 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + // TODO: Is there any reason not to flatten the Factory down into the Feature? + [AssemblyNeutral] + public interface ISessionFeature + { + ISessionFactory Factory { get; set; } + + ISession Session { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs new file mode 100644 index 0000000000..261b401cdb --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + public class SessionCollection : ISessionCollection + { + private readonly ISession _session; + + public SessionCollection(ISession session) + { + _session = session; + } + + public byte[] this[string key] + { + get + { + byte[] value; + TryGetValue(key, out value); + return value; + } + set + { + if (value == null) + { + Remove(key); + } + else + { + Set(key, new ArraySegment(value)); + } + } + } + + public bool TryGetValue(string key, out byte[] value) + { + return _session.TryGetValue(key, out value); + } + + public void Set(string key, ArraySegment value) + { + _session.Set(key, value); + } + + public void Remove(string key) + { + _session.Remove(key); + } + + public void Clear() + { + _session.Clear(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IEnumerator> GetEnumerator() + { + foreach (var key in _session.Keys) + { + yield return new KeyValuePair(key, this[key]); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 148ef84e19..308d896564 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -14,6 +14,7 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; using Microsoft.AspNet.PipelineCore.Security; @@ -31,6 +32,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _authentication; private FeatureReference _lifetime; private FeatureReference _webSockets; + private FeatureReference _session; private IFeatureCollection _features; public DefaultHttpContext() @@ -51,6 +53,7 @@ namespace Microsoft.AspNet.PipelineCore _authentication = FeatureReference.Default; _lifetime = FeatureReference.Default; _webSockets = FeatureReference.Default; + _session = FeatureReference.Default; } IItemsFeature ItemsFeature @@ -78,6 +81,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _webSockets.Fetch(_features); } } + private ISessionFeature SessionFeature + { + get { return _session.Fetch(_features); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -129,6 +137,27 @@ namespace Microsoft.AspNet.PipelineCore } } + public override ISessionCollection Session + { + get + { + var feature = SessionFeature; + if (feature == null) + { + throw new InvalidOperationException("Session has not been configured for this application or request."); + } + if (feature.Session == null) + { + if (feature.Factory == null) + { + throw new InvalidOperationException("No ISessionFactory available to create the ISession."); + } + feature.Session = feature.Factory.Create(); + } + return new SessionCollection(feature.Session); + } + } + public override bool IsWebSocketRequest { get From fee220569aa108078ab0e231080724eb74ec8b2d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 21 Oct 2014 12:43:28 -0700 Subject: [PATCH 180/846] Updating build.sh to work on Mono --- build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 4323aefc48..c7873ef58e 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild @@ -28,7 +28,7 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source setup/kvm.sh + source packages/KoreBuild/build/kvm.sh fi if ! type k > /dev/null 2>&1; then From 3bbdce3511a2062b3c51c39c82e6ad80b7527d39 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 31 Oct 2014 01:38:05 -0700 Subject: [PATCH 181/846] Added package descriptions --- src/Microsoft.AspNet.FeatureModel/project.json | 1 + src/Microsoft.AspNet.Http.Extensions/project.json | 1 + src/Microsoft.AspNet.Http/project.json | 1 + src/Microsoft.AspNet.HttpFeature/project.json | 1 + src/Microsoft.AspNet.Owin/project.json | 1 + src/Microsoft.AspNet.PipelineCore/project.json | 1 + src/Microsoft.AspNet.WebUtilities/project.json | 1 + 7 files changed, 7 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 5e0b3bc67f..20e2fae042 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index eb0b74711f..0254711dd8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 60649251d8..3adb7472e8 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": {}, "frameworks": { "aspnet50": {}, diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index d8b391950d..b2d2d6f3e0 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature interface definitions.", "frameworks": { "aspnet50": {}, "aspnetcore50": { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 86bc6e3f81..d8dac9991b 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 955572d6fc..6b1a0de735 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,6 +1,7 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature implementations.", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 74757f774a..0fb71d0a56 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 common helper methods such as URL encoding.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*" }, From 02aa1c50fffa386cb94112e353e9b0eb6e6a3d80 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 29 Oct 2014 14:28:40 -0700 Subject: [PATCH 182/846] #28 - Add Helper for building Uris. --- src/Microsoft.AspNet.Http/FragmentString.cs | 136 ++++++++++++++++++ src/Microsoft.AspNet.Http/HostString.cs | 5 + .../UriHelper.cs | 102 +++++++++++++ 3 files changed, 243 insertions(+) create mode 100644 src/Microsoft.AspNet.Http/FragmentString.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/UriHelper.cs diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http/FragmentString.cs new file mode 100644 index 0000000000..1d725e742c --- /dev/null +++ b/src/Microsoft.AspNet.Http/FragmentString.cs @@ -0,0 +1,136 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http +{ + /// + /// Provides correct handling for FragmentString value when needed to generate a URI string + /// + public struct FragmentString : IEquatable + { + /// + /// Represents the empty fragment string. This field is read-only. + /// + public static readonly FragmentString Empty = new FragmentString(string.Empty); + + private readonly string _value; + + /// + /// Initialize the fragment string with a given value. This value must be in escaped and delimited format with + /// a leading '#' character. + /// + /// The fragment string to be assigned to the Value property. + public FragmentString(string value) + { + if (!string.IsNullOrEmpty(value) && value[0] != '#') + { + throw new ArgumentException("The leading '#' must be included for a non-empty fragment.", "value"); + } + _value = value; + } + + /// + /// The escaped fragment string with the leading '#' character + /// + public string Value + { + get { return _value; } + } + + /// + /// True if the fragment string is not empty + /// + public bool HasValue + { + get { return !string.IsNullOrEmpty(_value); } + } + + /// + /// Provides the fragment string escaped in a way which is correct for combining into the URI representation. + /// A leading '#' character will be included unless the Value is null or empty. Characters which are potentially + /// dangerous are escaped. + /// + /// The fragment string value + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Provides the fragment string escaped in a way which is correct for combining into the URI representation. + /// A leading '#' character will be included unless the Value is null or empty. Characters which are potentially + /// dangerous are escaped. + /// + /// The fragment string value + public string ToUriComponent() + { + // Escape things properly so System.Uri doesn't mis-interpret the data. + return HasValue ? _value : string.Empty; + } + + /// + /// Returns an FragmentString given the fragment as it is escaped in the URI format. The string MUST NOT contain any + /// value that is not a fragment. + /// + /// The escaped fragment as it appears in the URI format. + /// The resulting FragmentString + public static FragmentString FromUriComponent(string uriComponent) + { + if (String.IsNullOrEmpty(uriComponent)) + { + return Empty; + } + return new FragmentString(uriComponent); + } + + /// + /// Returns an FragmentString given the fragment as from a Uri object. Relative Uri objects are not supported. + /// + /// The Uri object + /// The resulting FragmentString + public static FragmentString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); + if (!string.IsNullOrEmpty(fragmentValue)) + { + fragmentValue = "#" + fragmentValue; + } + return new FragmentString(fragmentValue); + } + + public bool Equals(FragmentString other) + { + return string.Equals(_value, other._value); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is FragmentString && Equals((FragmentString)obj); + } + + public override int GetHashCode() + { + return (_value != null ? _value.GetHashCode() : 0); + } + + public static bool operator ==(FragmentString left, FragmentString right) + { + return left.Equals(right); + } + + public static bool operator !=(FragmentString left, FragmentString right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 67af893b19..ae72f819cc 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -33,6 +33,11 @@ namespace Microsoft.AspNet.Http get { return _value; } } + public bool HasValue + { + get { return !string.IsNullOrEmpty(_value); } + } + /// /// Returns the value as normalized by ToUriComponent(). /// diff --git a/src/Microsoft.AspNet.WebUtilities/UriHelper.cs b/src/Microsoft.AspNet.WebUtilities/UriHelper.cs new file mode 100644 index 0000000000..491c599d20 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/UriHelper.cs @@ -0,0 +1,102 @@ +using System; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// A helper class for constructing encoded Uris for use in headers and other Uris. + /// + public class UriHelper + { + public UriHelper() + { + } + + public UriHelper(HttpRequest request) + { + Scheme = request.Scheme; + Host = request.Host; + PathBase = request.PathBase; + Path = request.Path; + Query = request.QueryString; + // Fragment is not a valid request field. + } + + public UriHelper(Uri uri) + { + Scheme = uri.Scheme; + Host = HostString.FromUriComponent(uri); + // Assume nothing is being put in PathBase + Path = PathString.FromUriComponent(uri); + Query = QueryString.FromUriComponent(uri); + Fragment = FragmentString.FromUriComponent(uri); + } + + public string Scheme { get; set; } + + public HostString Host { get; set; } + + public PathString PathBase { get; set; } + + public PathString Path { get; set; } + + public QueryString Query { get; set; } + + public FragmentString Fragment { get; set; } + + // Always returns at least '/' + public string GetPartialUri() + { + string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; + return path + Query + Fragment; + } + + // Always returns at least 'scheme://host/' + public string GetFullUri() + { + if (string.IsNullOrEmpty(Scheme)) + { + throw new InvalidOperationException("Missing Scheme"); + } + if (!Host.HasValue) + { + throw new InvalidOperationException("Missing Host"); + } + + string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; + return Scheme + "://" + Host + path + Query + Fragment; + } + + public static string Create(PathString pathBase, + PathString path = new PathString(), + QueryString query = new QueryString(), + FragmentString fragment = new FragmentString()) + { + return new UriHelper() + { + PathBase = pathBase, + Path = path, + Query = query, + Fragment = fragment + }.GetPartialUri(); + } + + public static string Create(string scheme, + HostString host, + PathString pathBase = new PathString(), + PathString path = new PathString(), + QueryString query = new QueryString(), + FragmentString fragment = new FragmentString()) + { + return new UriHelper() + { + Scheme = scheme, + Host = host, + PathBase = pathBase, + Path = path, + Query = query, + Fragment = fragment + }.GetFullUri(); + } + } +} \ No newline at end of file From b7d9e11a8442994cf5c4b8292d72b1efbd7e5a42 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sun, 2 Nov 2014 18:46:44 -0800 Subject: [PATCH 183/846] Middleware invokation with per-request services * Extension methods for .Use and .Run add service parameters to lambda * Middleware class .Invoke method may take services as additional parameters --- .../UseMiddlewareExtensions.cs | 35 ++++- .../Extensions/RunExtensions.cs | 21 +++ .../Extensions/UseExtensions.cs | 120 +++++++++++++++ .../UseWithServicesTests.cs | 141 ++++++++++++++++++ 4 files changed, 315 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index 1e61139153..8a9de346ab 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -5,6 +5,8 @@ using System; using System.Linq; using System.Reflection; using Microsoft.Framework.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { @@ -17,12 +19,41 @@ namespace Microsoft.AspNet.Builder public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) { + var applicationServices = builder.ApplicationServices; return builder.Use(next => { - var typeActivator = builder.ApplicationServices.GetRequiredService(); + var typeActivator = applicationServices.GetRequiredService(); var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); - return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); + var parameters = methodinfo.GetParameters(); + if (parameters[0].ParameterType != typeof(HttpContext)) + { + throw new Exception("TODO: Middleware Invoke method must take first argument of HttpContext"); + } + if (parameters.Length == 1) + { + return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); + } + return context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + var arguments = new object[parameters.Length]; + arguments[0] = context; + for(var index = 1; index != parameters.Length; ++index) + { + var serviceType = parameters[index].ParameterType; + arguments[index] = serviceProvider.GetService(serviceType); + if (arguments[index] == null) + { + throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", serviceType)); + } + } + return (Task)methodinfo.Invoke(instance, arguments); + }; }); } } diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 694dd3ec0f..4b74158aae 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -3,6 +3,7 @@ using System; using Microsoft.AspNet.Http; +using System.Threading.Tasks; namespace Microsoft.AspNet.Builder { @@ -12,5 +13,25 @@ namespace Microsoft.AspNet.Builder { app.Use(_ => handler); } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1) => handler(ctx, s1)); + } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1, s2) => handler(ctx, s1, s2)); + } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1, s2, s3) => handler(ctx, s1, s2, s3)); + } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1, s2, s3, s4) => handler(ctx, s1, s2, s3, s4)); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 038b14e03e..4be750be47 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -26,5 +26,125 @@ namespace Microsoft.AspNet.Builder }; }); } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider)); + }); + } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider)); + }); + } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// Per-request service required by middleware + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider)); + }); + } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// Per-request service required by middleware + /// Per-request service required by middleware + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, TService4, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider)); + }); + } + + private static TService GetRequiredService(IServiceProvider serviceProvider) + { + var service = (TService)serviceProvider.GetService(typeof(TService)); + + if (service == null) + { + throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", typeof(TService))); + } + + return service; + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs new file mode 100644 index 0000000000..9dc54ab09e --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -0,0 +1,141 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.AspNet.PipelineCore; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http.Extensions.Tests +{ + public class UseWithServicesTests + { + [Fact] + public async Task CallingUseThatAlsoTakesServices() + { + var builder = new ApplicationBuilder(new ServiceCollection() + .AddScoped() + .BuildServiceProvider()); + + ITestService theService = null; + builder.Use(async (ctx, next, testService) => + { + theService = testService; + await next(); + }); + + var app = builder.Build(); + await app(new DefaultHttpContext()); + + Assert.IsType(theService); + } + + [Fact] + public async Task ServicesArePerRequest() + { + var services = new ServiceCollection() + .AddScoped() + .AddTransient() + .BuildServiceProvider(); + var builder = new ApplicationBuilder(services); + + builder.Use(async (ctx, next) => + { + var serviceScopeFactory = services.GetRequiredService(); + using (var serviceScope = serviceScopeFactory.CreateScope()) + { + var priorApplicationServices = ctx.ApplicationServices; + var priorRequestServices = ctx.ApplicationServices; + ctx.ApplicationServices = services; + ctx.RequestServices = serviceScope.ServiceProvider; + try + { + await next(); + } + finally + { + ctx.ApplicationServices = priorApplicationServices; + ctx.RequestServices = priorRequestServices; + } + } + }); + + var testServicesA = new List(); + builder.Use(async (HttpContext ctx, Func next, ITestService testService) => + { + testServicesA.Add(testService); + await next(); + }); + + var testServicesB = new List(); + builder.Use(async (ctx, next, testService) => + { + testServicesB.Add(testService); + await next(); + }); + + var app = builder.Build(); + await app(new DefaultHttpContext()); + await app(new DefaultHttpContext()); + + Assert.Equal(2, testServicesA.Count); + Assert.IsType(testServicesA[0]); + Assert.IsType(testServicesA[1]); + + Assert.Equal(2, testServicesB.Count); + Assert.IsType(testServicesB[0]); + Assert.IsType(testServicesB[1]); + + Assert.Same(testServicesA[0], testServicesB[0]); + Assert.Same(testServicesA[1], testServicesB[1]); + + Assert.NotSame(testServicesA[0], testServicesA[1]); + Assert.NotSame(testServicesB[0], testServicesB[1]); + } + + [Fact] + public async Task InvokeMethodWillAllowPerRequestServices() + { + var services = new ServiceCollection() + .AddScoped() + .AddTransient() + .BuildServiceProvider(); + var builder = new ApplicationBuilder(services); + builder.UseMiddleware(); + var app = builder.Build(); + + var ctx1 = new DefaultHttpContext(); + await app(ctx1); + + var testService = ctx1.Items[typeof(ITestService)]; + Assert.IsType(testService); + } + } + + public interface ITestService + { + } + + public class TestService : ITestService + { + } + + public class TestMiddleware + { + RequestDelegate _next; + + public TestMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext context, ITestService testService) + { + context.Items[typeof(ITestService)] = testService; + } + } +} \ No newline at end of file From 75d8a8138643e4474319daab8066ce259b849976 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 6 Nov 2014 10:47:59 -0800 Subject: [PATCH 184/846] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 389e27e46055a95648efe48a512614fc4f8ff08e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 29 Oct 2014 16:32:50 -0700 Subject: [PATCH 185/846] #134 - Add HeadersSent api. --- src/Microsoft.AspNet.Http/HttpResponse.cs | 3 ++- .../IHttpResponseFeature.cs | 1 + .../OwinFeatureCollection.cs | 16 ++++++++++++++++ .../DefaultHttpResponse.cs | 5 +++++ .../DefaultHttpResponseFeature.cs | 5 +++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 010d159ab8..d0156b4ee9 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; -using System.Threading.Tasks; using Microsoft.AspNet.Http.Security; namespace Microsoft.AspNet.Http @@ -24,6 +23,8 @@ namespace Microsoft.AspNet.Http public abstract IResponseCookies Cookies { get; } + public abstract bool HeadersSent { get; } + public abstract void OnSendingHeaders(Action callback, object state); public virtual void Redirect(string location) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index cf322f6747..aa7603be03 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.HttpFeature string ReasonPhrase { get; set; } IDictionary Headers { get; set; } Stream Body { get; set; } + bool HeadersSent { get; } void OnSendingHeaders(Action callback, object state); } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 7478a81e68..23ca6df7bf 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -35,11 +35,22 @@ namespace Microsoft.AspNet.Owin IOwinEnvironmentFeature { public IDictionary Environment { get; set; } + private bool _headersSent; public OwinFeatureCollection(IDictionary environment) { Environment = environment; SupportsWebSockets = true; + + var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); + if (register != null) + { + register(state => + { + var collection = (OwinFeatureCollection)state; + collection._headersSent = true; + }, this); + } } T Prop(string key) @@ -129,6 +140,11 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseBody, value); } } + bool IHttpResponseFeature.HeadersSent + { + get { return _headersSent; } + } + void IHttpResponseFeature.OnSendingHeaders(Action callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 3b50493b58..03841751ec 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -105,6 +105,11 @@ namespace Microsoft.AspNet.PipelineCore get { return ResponseCookiesFeature.Cookies; } } + public override bool HeadersSent + { + get { return HttpResponseFeature.HeadersSent; } + } + public override void OnSendingHeaders(Action callback, object state) { HttpResponseFeature.OnSendingHeaders(callback, state); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs index 819ff17421..c3b933bb8a 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs @@ -25,6 +25,11 @@ namespace Microsoft.AspNet.PipelineCore public Stream Body { get; set; } + public bool HeadersSent + { + get { return false; } + } + public void OnSendingHeaders(Action callback, object state) { throw new NotSupportedException(); From 76bb27e5d3eb46c3e8676a688bf3f5d7a06ad284 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 12 Nov 2014 15:09:59 -0800 Subject: [PATCH 186/846] Update KProj to the latest format --- .../Microsoft.AspNet.FeatureModel.kproj | 18 +++++-------- .../Microsoft.AspNet.Http.Extensions.kproj | 27 +++++-------------- .../Microsoft.AspNet.Http.kproj | 18 +++++-------- .../Microsoft.AspNet.HttpFeature.kproj | 18 +++++-------- .../Microsoft.AspNet.Owin.kproj | 18 +++++-------- .../Microsoft.AspNet.PipelineCore.kproj | 18 +++++-------- .../Microsoft.AspNet.WebUtilities.kproj | 27 +++++-------------- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 19 +++++-------- ...crosoft.AspNet.Http.Extensions.Tests.kproj | 27 +++++-------------- .../Microsoft.AspNet.Http.Tests.kproj | 19 +++++-------- .../Microsoft.AspNet.Owin.Tests.kproj | 18 +++++-------- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 19 +++++-------- .../Microsoft.AspNet.WebUtilities.Tests.kproj | 27 +++++-------------- 13 files changed, 78 insertions(+), 195 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 3ee51e0df8..c155c5e1aa 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 32a4c918-30ee-41db-8e26-8a3bb88ed231 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index b8536c1d7e..2f956b8741 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - ccc4363e-81e2-4058-94dd-00494e9e992a - Library - Microsoft.AspNet.Http.Extensions - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 1daab236cd..c99a5537ec 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 22071333-15ba-4d16-a1d5-4d5b1a83fbdd - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index f14cfaec40..d1cd481026 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) d9128247-8f97-48b8-a863-f1f21a029fce - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index e7f58555b1..975d5aab4a 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 59bed991-f207-48ed-b24c-0a1d9c986c01 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index bd57805ae6..6a7b9e0bc5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) bcf0f967-8753-4438-bd07-aadca9ce509a - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index 9759976da3..ab15d3d1bd 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - a2fb7838-0031-4fad-ba3e-83c30b3af406 - Library - Microsoft.AspNet.WebUtilities - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index 0925c220ef..546c32e745 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -1,21 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) c5d2bae1-e182-48a0-aa74-1af14b782bf7 - Library - net45 - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index 9bad335404..6718966d19 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - ae25ef21-7f91-4b86-b73e-af746821d339 - Library - Microsoft.AspNet.Http.Extensions.Tests - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 787a78ff26..ee16369726 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -1,21 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) f16692b8-9f38-4dca-a582-e43172b989c6 - Library - net45 - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index 050b89712d..7214982973 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 16219571-3268-4d12-8689-12b7163dba13 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index d7a5995f6b..e8e0464bee 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -1,21 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) aa99af26-f7b1-4a6b-a922-5c25539f6391 - Library - net45 - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index cbfdfe1f3d..8dc5e1a1c4 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - 93c10e50-bcbb-4d8e-9492-d46e1396225b - Library - Microsoft.AspNet.WebUtilities.Tests - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + From 1dd3a2ee1f74abb314adad4897093135e662888e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 7 Nov 2014 14:08:43 -0800 Subject: [PATCH 187/846] #147 - OWIN: Throw KeyNotFoundException if the underlying Feature is missing. Return defaults for required entries. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 114 +++++++++++++----- .../OwinEnvironmentTests.cs | 32 +++++ 2 files changed, 118 insertions(+), 28 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 781ba621e2..2db8489a44 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -35,24 +35,32 @@ namespace Microsoft.AspNet.Owin public OwinEnvironment(HttpContext context) { + if (context.GetFeature() == null) + { + throw new ArgumentException("Missing required IHttpRequestFeature", "context"); + } + if (context.GetFeature() == null) + { + throw new ArgumentException("Missing required IHttpResponseFeature", "context"); + } + _context = context; _entries = new Dictionary() { - { OwinConstants.CallCancelled, new FeatureMap(feature => feature.RequestAborted) }, - { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, - { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, - { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, - { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, - { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), + { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, () => string.Empty, (feature, value) => feature.Protocol = Convert.ToString(value)) }, + { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, () => string.Empty, (feature, value) => feature.Scheme = Convert.ToString(value)) }, + { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, () => string.Empty, (feature, value) => feature.Method = Convert.ToString(value)) }, + { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, () => string.Empty, (feature, value) => feature.PathBase = Convert.ToString(value)) }, + { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, () => string.Empty, (feature, value) => feature.Path = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), () => string.Empty, (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, + { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), @@ -70,11 +78,28 @@ namespace Microsoft.AspNet.Owin { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, { OwinConstants.Security.User, new FeatureMap(feature => feature.User, - (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), + ()=> null, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), () => new HttpAuthenticationFeature()) }, }; + // owin.CallCancelled is required but the feature may not be present. + object ignored; + if (context.GetFeature() != null) + { + _entries[OwinConstants.CallCancelled] = new FeatureMap(feature => feature.RequestAborted); + } + else if (!_context.Items.TryGetValue(OwinConstants.CallCancelled, out ignored)) + { + _context.Items[OwinConstants.CallCancelled] = CancellationToken.None; + } + + // owin.Version is required. + if (!context.Items.TryGetValue(OwinConstants.OwinVersion, out ignored)) + { + _context.Items[OwinConstants.OwinVersion] = "1.0"; + } + if (context.Request.IsSecure) { _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, @@ -108,14 +133,17 @@ namespace Microsoft.AspNet.Owin bool IDictionary.ContainsKey(string key) { - return _entries.ContainsKey(key) || _context.Items.ContainsKey(key); + object value; + return ((IDictionary)this).TryGetValue(key, out value); } ICollection IDictionary.Keys { get { - return _entries.Keys.Concat(_context.Items.Keys.Select(key => Convert.ToString(key))).ToList(); + object value; + return _entries.Where(pair => pair.Value.TryGet(_context, out value)) + .Select(pair => pair.Key).Concat(_context.Items.Keys.Select(key => Convert.ToString(key))).ToList(); } } @@ -131,9 +159,8 @@ namespace Microsoft.AspNet.Owin bool IDictionary.TryGetValue(string key, out object value) { FeatureMap entry; - if (_entries.TryGetValue(key, out entry)) + if (_entries.TryGetValue(key, out entry) && entry.TryGet(_context, out value)) { - value = entry.Get(_context); return true; } return _context.Items.TryGetValue(key, out value); @@ -149,11 +176,11 @@ namespace Microsoft.AspNet.Owin get { FeatureMap entry; - if (_entries.TryGetValue(key, out entry)) - { - return entry.Get(_context); - } object value; + if (_entries.TryGetValue(key, out entry) && entry.TryGet(_context, out value)) + { + return value; + } if (_context.Items.TryGetValue(key, out value)) { return value; @@ -232,7 +259,11 @@ namespace Microsoft.AspNet.Owin { foreach (var entryPair in _entries) { - yield return new KeyValuePair(entryPair.Key, entryPair.Value.Get(_context)); + object value; + if (entryPair.Value.TryGet(_context, out value)) + { + yield return new KeyValuePair(entryPair.Key, value); + } } foreach (var entryPair in _context.Items) { @@ -248,26 +279,37 @@ namespace Microsoft.AspNet.Owin public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) - : this(featureInterface, getter, setter: null) + : this(featureInterface, getter, defaultFactory: null) + { + } + public FeatureMap(Type featureInterface, Func getter, Func defaultFactory) + : this(featureInterface, getter, defaultFactory, setter: null) { } public FeatureMap(Type featureInterface, Func getter, Action setter) - : this(featureInterface, getter, setter, featureFactory: null) + : this(featureInterface, getter, defaultFactory: null, setter: setter) { } - public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureFactory) + public FeatureMap(Type featureInterface, Func getter, Func defaultFactory, Action setter) + : this(featureInterface, getter, defaultFactory, setter, featureFactory: null) + { + } + + public FeatureMap(Type featureInterface, Func getter, Func defaultFactory, Action setter, Func featureFactory) { FeatureInterface = featureInterface; Getter = getter; Setter = setter; + DefaultFactory = defaultFactory; FeatureFactory = featureFactory; } private Type FeatureInterface { get; set; } private Func Getter { get; set; } private Action Setter { get; set; } + private Func DefaultFactory { get; set; } private Func FeatureFactory { get; set; } public bool CanSet @@ -275,14 +317,20 @@ namespace Microsoft.AspNet.Owin get { return Setter != null; } } - internal object Get(HttpContext context) + internal bool TryGet(HttpContext context, out object value) { object featureInstance = context.GetFeature(FeatureInterface); if (featureInstance == null) { - return null; + value = null; + return false; } - return Getter(featureInstance); + value = Getter(featureInstance); + if (value == null && DefaultFactory != null) + { + value = DefaultFactory(); + } + return true; } internal void Set(HttpContext context, object value) @@ -311,13 +359,23 @@ namespace Microsoft.AspNet.Owin { } + public FeatureMap(Func getter, Func defaultFactory) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory) + { + } + public FeatureMap(Func getter, Action setter) : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value)) { } - public FeatureMap(Func getter, Action setter, Func featureFactory) - : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value), () => featureFactory()) + public FeatureMap(Func getter, Func defaultFactory, Action setter) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory,(feature, value) => setter((TFeature)feature, value)) + { + } + + public FeatureMap(Func getter, Func defaultFactory, Action setter, Func featureFactory) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory, (feature, value) => setter((TFeature)feature, value), () => featureFactory()) { } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index cdc5eb680f..88fd2f7174 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -5,7 +5,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Claims; +using System.Threading; using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -94,6 +96,36 @@ namespace Microsoft.AspNet.Owin Assert.Equal(201, context.Response.StatusCode); } + [Theory] + [InlineData("server.LocalPort")] + public void OwinEnvironmentDoesNotContainEntriesForMissingFeatures(string key) + { + HttpContext context = CreateContext(); + IDictionary env = new OwinEnvironment(context); + + object value; + Assert.False(env.TryGetValue(key, out value)); + + Assert.Throws(() => env[key]); + + Assert.False(env.Keys.Contains(key)); + Assert.False(env.ContainsKey(key)); + } + + [Fact] + public void OwinEnvironmentSuppliesDefaultsForMissingRequiredEntries() + { + HttpContext context = CreateContext(); + IDictionary env = new OwinEnvironment(context); + + object value; + Assert.True(env.TryGetValue("owin.CallCancelled", out value), "owin.CallCancelled"); + Assert.True(env.TryGetValue("owin.Version", out value), "owin.Version"); + + Assert.Equal(CancellationToken.None, env["owin.CallCancelled"]); + Assert.Equal("1.0", env["owin.Version"]); + } + private HttpContext CreateContext() { var context = new DefaultHttpContext(); From ba693dd38302945d5f4dcf9d40318f366a5e7168 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 10 Nov 2014 09:17:17 -0800 Subject: [PATCH 188/846] Code cleanup. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 2db8489a44..6e132e632f 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -84,18 +84,17 @@ namespace Microsoft.AspNet.Owin }; // owin.CallCancelled is required but the feature may not be present. - object ignored; if (context.GetFeature() != null) { _entries[OwinConstants.CallCancelled] = new FeatureMap(feature => feature.RequestAborted); } - else if (!_context.Items.TryGetValue(OwinConstants.CallCancelled, out ignored)) + else if (!_context.Items.ContainsKey(OwinConstants.CallCancelled)) { _context.Items[OwinConstants.CallCancelled] = CancellationToken.None; } // owin.Version is required. - if (!context.Items.TryGetValue(OwinConstants.OwinVersion, out ignored)) + if (!context.Items.ContainsKey(OwinConstants.OwinVersion)) { _context.Items[OwinConstants.OwinVersion] = "1.0"; } From b5156a00b3621838d38473071a1b565d2ceb976f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 14 Nov 2014 15:14:16 -0800 Subject: [PATCH 189/846] Argument validation cleanup. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 6e132e632f..8a0e7cbcfd 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,11 +37,11 @@ namespace Microsoft.AspNet.Owin { if (context.GetFeature() == null) { - throw new ArgumentException("Missing required IHttpRequestFeature", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", "context"); } if (context.GetFeature() == null) { - throw new ArgumentException("Missing required IHttpResponseFeature", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", "context"); } _context = context; From 756970390688ceaca7bc26fb956723a0e1e8b6d7 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Tue, 25 Nov 2014 10:49:23 -0800 Subject: [PATCH 190/846] Add schema version to kproj files --- .../Microsoft.AspNet.FeatureModel.kproj | 3 +++ .../Microsoft.AspNet.Http.Extensions.kproj | 3 +++ src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 3 +++ .../Microsoft.AspNet.HttpFeature.kproj | 3 +++ src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 3 +++ .../Microsoft.AspNet.PipelineCore.kproj | 3 +++ .../Microsoft.AspNet.WebUtilities.kproj | 3 +++ .../Microsoft.AspNet.FeatureModel.Tests.kproj | 3 +++ .../Microsoft.AspNet.Http.Extensions.Tests.kproj | 3 +++ .../Microsoft.AspNet.Http.Tests.kproj | 3 +++ .../Microsoft.AspNet.Owin.Tests.kproj | 3 +++ .../Microsoft.AspNet.PipelineCore.Tests.kproj | 3 +++ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 3 +++ 13 files changed, 39 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index c155c5e1aa..561cd372d7 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index 2f956b8741..a9b64e3c08 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index c99a5537ec..1ccadbc30a 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index d1cd481026..25a0e7caf2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 975d5aab4a..b0acecf075 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 6a7b9e0bc5..3a0556def8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index ab15d3d1bd..75dd8975e7 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index 546c32e745..048ee0ea9b 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index 6718966d19..cf6c82e1bb 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index ee16369726..f307eafd3c 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index 7214982973..135f58392d 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index e8e0464bee..1e73261367 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index 8dc5e1a1c4..1a6f3883fd 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + From d75e4c87ba3ff7179826b79db5f3d11808449c29 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Mon, 8 Dec 2014 15:14:08 -0800 Subject: [PATCH 191/846] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From fd45ff532c7b11657269a8bbd889274f3d4e6426 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Mon, 8 Dec 2014 15:24:38 -0800 Subject: [PATCH 192/846] Updating to dev NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 2d3b0cb857..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From ae169aa794a3ddc10449020043fb71d6a8b880b1 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 15 Dec 2014 14:42:21 -0800 Subject: [PATCH 193/846] Reacting to System.Threading version changes --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 20e2fae042..6845cd91a4 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -14,7 +14,7 @@ "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Threading": "4.0.0-beta-*" + "System.Threading": "4.0.10-beta-*" } } } From b7eb1a92bb567e4efa9dc485a2252023f2cdb947 Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 15 Dec 2014 15:09:59 -0800 Subject: [PATCH 194/846] Update tests to use official xunit --- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 4 ++-- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 4 ++-- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index bf587219ea..867e8889e6 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -3,10 +3,10 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 1e7c64bbe6..85c20ce28b 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index e85c177c16..ff303ab74d 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 9893f86030..16f501140e 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -5,10 +5,10 @@ "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 1c3bc620fe..fda938bb96 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 868b37110c..c3fcb3e97c 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -2,10 +2,10 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { } From 5872feb224f731f2d64af0b1e6c8193b583031b1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 4 Nov 2014 16:31:18 -0800 Subject: [PATCH 195/846] #139 - Mime multipart request parsing. --- .../project.json | 2 +- src/Microsoft.AspNet.Http/FragmentString.cs | 6 +- src/Microsoft.AspNet.Http/HostString.cs | 6 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 22 +- src/Microsoft.AspNet.Http/IFormCollection.cs | 3 + src/Microsoft.AspNet.Http/IFormFile.cs | 20 + .../IFormFileCollection.cs | 16 + src/Microsoft.AspNet.Http/PathString.cs | 6 +- src/Microsoft.AspNet.Http/QueryString.cs | 6 +- .../Security/AuthenticateResult.cs | 10 +- .../Security/AuthenticationDescription.cs | 6 +- src/Microsoft.AspNet.Owin/NotNullAttribute.cs | 12 + .../OwinFeatureCollection.cs | 6 +- .../WebSockets/WebSocketAdapter.cs | 6 +- .../BufferingHelper.cs | 47 +++ .../Collections/FormCollection.cs | 20 +- .../Collections/FormFileCollection.cs | 36 ++ .../Collections/HeaderDictionary.cs | 7 +- .../Collections/ItemsDictionary.cs | 1 - .../Collections/ReadableStringCollection.cs | 21 +- .../Collections/ResponseCookies.cs | 21 +- .../DefaultHttpContext.cs | 12 +- .../DefaultHttpRequest.cs | 28 +- .../DefaultHttpResponse.cs | 19 +- .../FormFeature.cs | 193 +++++++-- src/Microsoft.AspNet.PipelineCore/FormFile.cs | 46 ++ .../IFormFeature.cs | 24 +- .../Infrastructure/ParsingHelpers.cs | 70 +--- .../QueryFeature.cs | 4 +- .../ReferenceReadStream.cs | 199 +++++++++ .../RequestCookiesFeature.cs | 1 - .../Security/AuthenticateContext.cs | 6 +- .../Security/ChallengeContext.cs | 8 +- .../Security/SignInContext.cs | 6 +- .../Security/SignOutContext.cs | 6 +- .../BufferedReadStream.cs | 396 ++++++++++++++++++ .../FileBufferingReadStream.cs | 248 +++++++++++ .../FormHelpers.cs | 21 - .../FormReader.cs | 188 +++++++++ .../KeyValueAccumulator.cs | 42 ++ .../MultipartReader.cs | 92 ++++ .../MultipartReaderStream.cs | 320 ++++++++++++++ .../MultipartSection.cs | 47 +++ .../ParsingHelpers.cs | 111 ----- .../QueryHelpers.cs | 45 +- .../StreamHelperExtensions.cs | 23 + .../project.json | 1 + .../FormFeatureTests.cs | 266 ++++++++++-- .../MultipartReaderTests.cs | 185 ++++++++ .../QueryHelpersTests.cs | 19 +- 50 files changed, 2487 insertions(+), 419 deletions(-) create mode 100644 src/Microsoft.AspNet.Http/IFormFile.cs create mode 100644 src/Microsoft.AspNet.Http/IFormFileCollection.cs create mode 100644 src/Microsoft.AspNet.Owin/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.PipelineCore}/Collections/FormCollection.cs (53%) create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.PipelineCore}/Collections/ReadableStringCollection.cs (86%) create mode 100644 src/Microsoft.AspNet.PipelineCore/FormFile.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs delete mode 100644 src/Microsoft.AspNet.WebUtilities/FormHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/FormReader.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/MultipartReader.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/MultipartSection.cs delete mode 100644 src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 0254711dd8..cbc45a6ddc 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -8,7 +8,7 @@ "frameworks" : { "aspnet50" : { }, - "aspnetcore50" : { + "aspnetcore50" : { "dependencies": { "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http/FragmentString.cs index 1d725e742c..f40ba626a1 100644 --- a/src/Microsoft.AspNet.Http/FragmentString.cs +++ b/src/Microsoft.AspNet.Http/FragmentString.cs @@ -90,12 +90,8 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting FragmentString - public static FragmentString FromUriComponent(Uri uri) + public static FragmentString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index ae72f819cc..c91ce65a5b 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -134,12 +134,8 @@ namespace Microsoft.AspNet.Http /// /// /// - public static HostString FromUriComponent(Uri uri) + public static HostString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } return new HostString(uri.GetComponents( UriComponents.NormalizedHost | // Always convert punycode to Unicode. UriComponents.HostAndPort, UriFormat.Unescaped)); diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index be5e1e14b1..8048152a08 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -64,12 +64,6 @@ namespace Microsoft.AspNet.Http /// The query value collection parsed from owin.RequestQueryString. public abstract IReadableStringCollection Query { get; } - /// - /// Gets the form collection. - /// - /// The form collection parsed from the request body. - public abstract Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)); - /// /// Gets or set the owin.RequestProtocol. /// @@ -128,5 +122,21 @@ namespace Microsoft.AspNet.Http /// /// The owin.RequestBody Stream. public abstract Stream Body { get; set; } + + /// + /// Checks the content-type header for form types. + /// + public abstract bool HasFormContentType { get; } + + /// + /// Gets or sets the request body as a form. + /// + public abstract IFormCollection Form { get; set; } + + /// + /// Reads the request body if it is a form. + /// + /// + public abstract Task ReadFormAsync(CancellationToken cancellationToken = new CancellationToken()); } } diff --git a/src/Microsoft.AspNet.Http/IFormCollection.cs b/src/Microsoft.AspNet.Http/IFormCollection.cs index a69162fa4d..4ec7437877 100644 --- a/src/Microsoft.AspNet.Http/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http/IFormCollection.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; + namespace Microsoft.AspNet.Http { /// @@ -8,5 +10,6 @@ namespace Microsoft.AspNet.Http /// public interface IFormCollection : IReadableStringCollection { + IFormFileCollection Files { get; } } } diff --git a/src/Microsoft.AspNet.Http/IFormFile.cs b/src/Microsoft.AspNet.Http/IFormFile.cs new file mode 100644 index 0000000000..a77a495d5e --- /dev/null +++ b/src/Microsoft.AspNet.Http/IFormFile.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; + +namespace Microsoft.AspNet.Http +{ + public interface IFormFile + { + string ContentType { get; } + + string ContentDisposition { get; } + + IHeaderDictionary Headers { get; } + + long Length { get; } + + Stream OpenReadStream(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/IFormFileCollection.cs b/src/Microsoft.AspNet.Http/IFormFileCollection.cs new file mode 100644 index 0000000000..56f1d5879d --- /dev/null +++ b/src/Microsoft.AspNet.Http/IFormFileCollection.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.Http +{ + public interface IFormFileCollection : IList + { + IFormFile this[string name] { get; } + + IFormFile GetFile(string name); + + IList GetFiles(string name); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index 05dfa6d816..2963c64d8f 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -86,12 +86,8 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting PathString - public static PathString FromUriComponent(Uri uri) + public static PathString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } // REVIEW: what is the exactly correct thing to do? return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); } diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index 5ba16151c7..c32e3bb037 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -102,12 +102,8 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting QueryString - public static QueryString FromUriComponent(Uri uri) + public static QueryString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } string queryValue = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(queryValue)) { diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs index 5a1998f336..38b48dcf0e 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs @@ -18,16 +18,8 @@ namespace Microsoft.AspNet.Http.Security /// Assigned to Identity. May be null. /// Assigned to Properties. Contains extra information carried along with the identity. /// Assigned to Description. Contains information describing the authentication provider. - public AuthenticationResult(IIdentity identity, AuthenticationProperties properties, AuthenticationDescription description) + public AuthenticationResult(IIdentity identity, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) { - if (properties == null) - { - throw new ArgumentNullException("properties"); - } - if (description == null) - { - throw new ArgumentNullException("description"); - } if (identity != null) { Identity = identity as ClaimsIdentity ?? new ClaimsIdentity(identity); diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs index d6423f34fd..2d7d4f0c73 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs @@ -27,12 +27,8 @@ namespace Microsoft.AspNet.Http.Security /// Initializes a new instance of the class /// /// - public AuthenticationDescription(IDictionary properties) + public AuthenticationDescription([NotNull] IDictionary properties) { - if (properties == null) - { - throw new ArgumentNullException("properties"); - } Dictionary = properties; } diff --git a/src/Microsoft.AspNet.Owin/NotNullAttribute.cs b/src/Microsoft.AspNet.Owin/NotNullAttribute.cs new file mode 100644 index 0000000000..a42aa58d4a --- /dev/null +++ b/src/Microsoft.AspNet.Owin/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Owin +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 23ca6df7bf..434817129d 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -399,12 +399,8 @@ namespace Microsoft.AspNet.Owin return TryGetValue(item.Key, out result) && result.Equals(item.Value); } - public void CopyTo(KeyValuePair[] array, int arrayIndex) + public void CopyTo([NotNull] KeyValuePair[] array, int arrayIndex) { - if (array == null) - { - throw new ArgumentNullException("array"); - } if (arrayIndex < 0 || arrayIndex > array.Length) { throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 79f8c0bf2e..9577785639 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -113,7 +113,7 @@ namespace Microsoft.AspNet.Owin } else { - throw new ArgumentOutOfRangeException("buffer"); + throw new ArgumentOutOfRangeException(nameof(buffer)); } } @@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Owin case 0x8: return WebSocketMessageType.Close; default: - throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(messageType), messageType, string.Empty); } } @@ -164,7 +164,7 @@ namespace Microsoft.AspNet.Owin case WebSocketMessageType.Close: return 0x8; default: - throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(webSocketMessageType), webSocketMessageType, string.Empty); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs new file mode 100644 index 0000000000..b10c017c36 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.WebUtilities; + +namespace Microsoft.AspNet.PipelineCore +{ + public static class BufferingHelper + { + internal const int DefaultBufferThreshold = 1024 * 30; + + public static string TempDirectory + { + get + { + var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP"); + if (string.IsNullOrEmpty(temp)) + { + temp = Environment.GetEnvironmentVariable("TEMP"); + } + + if (!Directory.Exists(temp)) + { + // TODO: ??? + throw new DirectoryNotFoundException(temp); + } + + return temp; + } + } + + public static HttpRequest EnableRewind([NotNull] this HttpRequest request, int bufferThreshold = DefaultBufferThreshold) + { + var body = request.Body; + if (!body.CanSeek) + { + // TODO: Register this buffer for disposal at the end of the request to ensure the temp file is deleted. + // Otherwise it won't get deleted until GC closes the stream. + request.Body = new FileBufferingReadStream(body, bufferThreshold, TempDirectory); + } + return request; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs similarity index 53% rename from src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index a9d1df8529..a80fea12d1 100644 --- a/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -1,23 +1,27 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; using System.Collections.Generic; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.WebUtilities.Collections +namespace Microsoft.AspNet.PipelineCore.Collections { /// /// Contains the parsed form values. /// public class FormCollection : ReadableStringCollection, IFormCollection { - /// - /// Initializes a new instance of the class. - /// - /// The store for the form. - public FormCollection(IDictionary store) - : base(store) + public FormCollection([NotNull] IDictionary store) + : this(store, new FormFileCollection()) { } + + public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) + : base(store) + { + Files = files; + } + + public IFormFileCollection Files { get; private set; } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs new file mode 100644 index 0000000000..10aad2bfa2 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + public class FormFileCollection : List, IFormFileCollection + { + public IFormFile this[string name] + { + get { return GetFile(name); } + } + + public IFormFile GetFile(string name) + { + return Find(file => string.Equals(name, GetName(file.ContentDisposition))); + } + + public IList GetFiles(string name) + { + return FindAll(file => string.Equals(name, GetName(file.ContentDisposition))); + } + + private static string GetName(string contentDisposition) + { + // TODO: Strongly typed headers will take care of this + // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" + var offset = contentDisposition.IndexOf("name=\"") + "name=\"".Length; + var key = contentDisposition.Substring(offset, contentDisposition.IndexOf("\"", offset) - offset); // Remove quotes + return key; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index 22d62c5989..dfd54393cc 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -20,13 +20,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// Initializes a new instance of the class. /// /// The underlying data store. - public HeaderDictionary(IDictionary store) + public HeaderDictionary([NotNull] IDictionary store) { - if (store == null) - { - throw new ArgumentNullException("store"); - } - Store = store; } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index e9c21c835d..dc5216d117 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs similarity index 86% rename from src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index 97c03b0df2..1e12bb6dc1 100644 --- a/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.WebUtilities.Collections +namespace Microsoft.AspNet.PipelineCore.Collections { /// /// Accessors for query, forms, etc. @@ -17,13 +17,8 @@ namespace Microsoft.AspNet.WebUtilities.Collections /// Create a new wrapper /// /// - public ReadableStringCollection(IDictionary store) + public ReadableStringCollection([NotNull] IDictionary store) { - if (store == null) - { - throw new ArgumentNullException("store"); - } - Store = store; } @@ -75,7 +70,7 @@ namespace Microsoft.AspNet.WebUtilities.Collections /// public string Get(string key) { - return ParsingHelpers.GetJoinedValue(Store, key); + return GetJoinedValue(Store, key); } /// @@ -108,5 +103,15 @@ namespace Microsoft.AspNet.WebUtilities.Collections { return GetEnumerator(); } + + private static string GetJoinedValue(IDictionary store, string key) + { + string[] values; + if (store.TryGetValue(key, out values)) + { + return string.Join(",", values); + } + return null; + } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 27bfbbd38e..2412b54a83 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -19,13 +19,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// Create a new wrapper /// /// - public ResponseCookies(IHeaderDictionary headers) + public ResponseCookies([NotNull] IHeaderDictionary headers) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } - Headers = headers; } @@ -47,13 +42,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// /// /// - public void Append(string key, string value, CookieOptions options) + public void Append(string key, string value, [NotNull] CookieOptions options) { - if (options == null) - { - throw new ArgumentNullException("options"); - } - bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); bool expiresHasValue = options.Expires.HasValue; @@ -98,13 +88,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// /// /// - public void Delete(string key, CookieOptions options) + public void Delete(string key, [NotNull] CookieOptions options) { - if (options == null) - { - throw new ArgumentNullException("options"); - } - bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 308d896564..3b445fefbe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -214,12 +214,8 @@ namespace Microsoft.AspNet.PipelineCore return authTypeContext.Results; } - public override IEnumerable Authenticate(IEnumerable authenticationTypes) + public override IEnumerable Authenticate([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); @@ -238,12 +234,8 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } - public override async Task> AuthenticateAsync(IEnumerable authenticationTypes) + public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index eac94536d6..da839c1f16 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -2,13 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Globalization; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -55,7 +54,7 @@ namespace Microsoft.AspNet.PipelineCore private IFormFeature FormFeature { - get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(_features)); } + get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(this)); } } private IRequestCookiesFeature RequestCookiesFeature @@ -83,7 +82,7 @@ namespace Microsoft.AspNet.PipelineCore set { HttpRequestFeature.QueryString = value.Value; } } - public override long? ContentLength + public override long? ContentLength { get { @@ -129,11 +128,6 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - return FormFeature.GetFormAsync(cancellationToken); - } - public override string Protocol { get { return HttpRequestFeature.Protocol; } @@ -167,5 +161,21 @@ namespace Microsoft.AspNet.PipelineCore get { return Headers[Constants.Headers.AcceptCharset]; } set { Headers[Constants.Headers.AcceptCharset] = value; } } + + public override bool HasFormContentType + { + get { return FormFeature.HasFormContentType; } + } + + public override IFormCollection Form + { + get { return FormFeature.ReadForm(); } + set { FormFeature.Form = value; } + } + + public override Task ReadFormAsync(CancellationToken cancellationToken) + { + return FormFeature.ReadFormAsync(cancellationToken); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 03841751ec..16d187450d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -129,12 +129,8 @@ namespace Microsoft.AspNet.PipelineCore Headers.Set(Constants.Headers.Location, location); } - public override void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes) + public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; @@ -152,13 +148,8 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignIn(AuthenticationProperties properties, IEnumerable identities) + public override void SignIn(AuthenticationProperties properties, [NotNull] IEnumerable identities) { - if (identities == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); @@ -175,12 +166,8 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignOut(IEnumerable authenticationTypes) + public override void SignOut([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationTypes); diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 271264b870..8d20871688 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -1,71 +1,192 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.WebUtilities; -using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { public class FormFeature : IFormFeature { - private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; - private Stream _bodyStream; - private IReadableStringCollection _form; + private readonly HttpRequest _request; - public FormFeature([NotNull] IDictionary form) - : this (new ReadableStringCollection(form)) + public FormFeature([NotNull] IFormCollection form) { + Form = form; } - public FormFeature([NotNull] IReadableStringCollection form) + public FormFeature([NotNull] HttpRequest request) { - _form = form; + _request = request; } - public FormFeature([NotNull] IFeatureCollection features) + public bool HasFormContentType { - _features = features; - } - - public async Task GetFormAsync(CancellationToken cancellationToken) - { - if (_features == null) + get { - return _form; + // Set directly + if (Form != null) + { + return true; + } + + return HasApplicationFormContentType() || HasMultipartFormContentType(); + } + } + + public IFormCollection Form { get; set; } + + public IFormCollection ReadForm() + { + if (Form != null) + { + return Form; } - var body = _request.Fetch(_features).Body; - - if (_bodyStream == null || _bodyStream != body) + if (!HasFormContentType) { - _bodyStream = body; - if (!_bodyStream.CanSeek) + throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); + } + + // TODO: How do we prevent thread exhaustion? + return ReadFormAsync(CancellationToken.None).GetAwaiter().GetResult(); + } + + public async Task ReadFormAsync(CancellationToken cancellationToken) + { + if (Form != null) + { + return Form; + } + + if (!HasFormContentType) + { + throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); + } + + cancellationToken.ThrowIfCancellationRequested(); + + _request.EnableRewind(); + + IDictionary formFields = null; + var files = new FormFileCollection(); + + // Some of these code paths use StreamReader which does not support cancellation tokens. + using (cancellationToken.Register(_request.HttpContext.Abort)) + { + // Check the content-type + if (HasApplicationFormContentType()) { - var buffer = new MemoryStream(); - await _bodyStream.CopyToAsync(buffer, 4096, cancellationToken); - _bodyStream = buffer; - _request.Fetch(_features).Body = _bodyStream; - _bodyStream.Seek(0, SeekOrigin.Begin); + // TODO: Read the charset from the content-type header after we get strongly typed headers + formFields = await FormReader.ReadFormAsync(_request.Body, cancellationToken); } - using (var streamReader = new StreamReader(_bodyStream, Encoding.UTF8, - detectEncodingFromByteOrderMarks: true, - bufferSize: 1024, leaveOpen: true)) + else if (HasMultipartFormContentType()) { - string form = await streamReader.ReadToEndAsync(); - _form = FormHelpers.ParseForm(form); + var formAccumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + + var boundary = GetBoundary(_request.ContentType); + var multipartReader = new MultipartReader(boundary, _request.Body); + var section = await multipartReader.ReadNextSectionAsync(cancellationToken); + while (section != null) + { + var headers = new HeaderDictionary(section.Headers); + var contentDisposition = headers["Content-Disposition"]; + if (HasFileContentDisposition(contentDisposition)) + { + // Find the end + await section.Body.DrainAsync(cancellationToken); + + var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length) + { + Headers = headers, + }; + files.Add(file); + } + else if (HasFormDataContentDisposition(contentDisposition)) + { + // Content-Disposition: form-data; name="key" + // + // value + + // TODO: Strongly typed headers will take care of this + var offset = contentDisposition.IndexOf("name=") + "name=".Length; + var key = contentDisposition.Substring(offset + 1, contentDisposition.Length - offset - 2); // Remove quotes + + // TODO: Read the charset from the content-disposition header after we get strongly typed headers + using (var reader = new StreamReader(section.Body, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) + { + var value = await reader.ReadToEndAsync(); + formAccumulator.Append(key, value); + } + } + else + { + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + contentDisposition); + } + + section = await multipartReader.ReadNextSectionAsync(cancellationToken); + } + + formFields = formAccumulator.GetResults(); } } - return _form; + + Form = new FormCollection(formFields, files); + return Form; + } + + private bool HasApplicationFormContentType() + { + // TODO: Strongly typed headers will take care of this for us + // Content-Type: application/x-www-form-urlencoded; charset=utf-8 + var contentType = _request.ContentType; + return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private bool HasMultipartFormContentType() + { + // TODO: Strongly typed headers will take care of this for us + // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq + var contentType = _request.ContentType; + return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("multipart/form-data", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private bool HasFormDataContentDisposition(string contentDisposition) + { + // TODO: Strongly typed headers will take care of this for us + // Content-Disposition: form-data; name="key"; + return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && !contentDisposition.Contains("filename="); + } + + private bool HasFileContentDisposition(string contentDisposition) + { + // TODO: Strongly typed headers will take care of this for us + // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" + return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && contentDisposition.Contains("filename="); + } + + // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq + private static string GetBoundary(string contentType) + { + // TODO: Strongly typed headers will take care of this for us + // TODO: Limit the length of boundary we accept. The spec says ~70 chars. + var elements = contentType.Split(' '); + var element = elements.Where(entry => entry.StartsWith("boundary=")).First(); + var boundary = element.Substring("boundary=".Length); + // Remove quotes + if (boundary.Length >= 2 && boundary[0] == '"' && boundary[boundary.Length - 1] == '"') + { + boundary = boundary.Substring(1, boundary.Length - 2); + } + return boundary; } } } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFile.cs b/src/Microsoft.AspNet.PipelineCore/FormFile.cs new file mode 100644 index 0000000000..19ea07466f --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/FormFile.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.PipelineCore +{ + public class FormFile : IFormFile + { + private Stream _baseStream; + private long _baseStreamOffset; + private long _length; + + public FormFile(Stream baseStream, long baseStreamOffset, long length) + { + _baseStream = baseStream; + _baseStreamOffset = baseStreamOffset; + _length = length; + } + + public string ContentDisposition + { + get { return Headers["Content-Disposition"]; } + set { Headers["Content-Disposition"] = value; } + } + + public string ContentType + { + get { return Headers["Content-Type"]; } + set { Headers["Content-Type"] = value; } + } + + public IHeaderDictionary Headers { get; set; } + + public long Length + { + get { return _length; } + } + + public Stream OpenReadStream() + { + return new ReferenceReadStream(_baseStream, _baseStreamOffset, _length); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 07debf7870..cc84d32a4b 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -4,11 +4,33 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.PipelineCore { public interface IFormFeature { - Task GetFormAsync(CancellationToken cancellationToken); + /// + /// Indicates if the request has a supported form content-type. + /// + bool HasFormContentType { get; } + + /// + /// The parsed form, if any. + /// + IFormCollection Form { get; set; } + + /// + /// Parses the request body as a form. + /// + /// + IFormCollection ReadForm(); + + /// + /// Parses the request body as a form. + /// + /// + /// + Task ReadFormAsync(CancellationToken cancellationToken); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 10c9ef3672..e0ed2c7333 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -445,12 +445,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure #endregion - public bool StartsWith(string text, StringComparison comparisonType) + public bool StartsWith([NotNull] string text, StringComparison comparisonType) { - if (text == null) - { - throw new ArgumentNullException("text"); - } int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -460,12 +456,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; } - public bool EndsWith(string text, StringComparison comparisonType) + public bool EndsWith([NotNull] string text, StringComparison comparisonType) { - if (text == null) - { - throw new ArgumentNullException("text"); - } int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -475,12 +467,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; } - public bool Equals(string text, StringComparison comparisonType) + public bool Equals([NotNull] string text, StringComparison comparisonType) { - if (text == null) - { - throw new ArgumentNullException("text"); - } int textLength = text.Length; if (!HasValue || _count != textLength) { @@ -615,25 +603,17 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static string[] GetHeaderUnmodified(IDictionary headers, string key) + public static string[] GetHeaderUnmodified([NotNull] IDictionary headers, string key) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } string[] values; return headers.TryGetValue(key, out values) ? values : null; } - public static void SetHeader(IDictionary headers, string key, string value) + public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, string value) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } if (string.IsNullOrWhiteSpace(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (string.IsNullOrWhiteSpace(value)) { @@ -645,15 +625,11 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void SetHeaderJoined(IDictionary headers, string key, params string[] values) + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } if (string.IsNullOrWhiteSpace(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (values == null || values.Length == 0) { @@ -697,15 +673,11 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return value; } - public static void SetHeaderUnmodified(IDictionary headers, string key, params string[] values) + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } if (string.IsNullOrWhiteSpace(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (values == null || values.Length == 0) { @@ -717,16 +689,12 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void SetHeaderUnmodified(IDictionary headers, string key, IEnumerable values) + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, [NotNull] IEnumerable values) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } headers[key] = values.ToArray(); } - public static void AppendHeader(IDictionary headers, string key, string values) + public static void AppendHeader([NotNull] IDictionary headers, [NotNull] string key, string values) { if (string.IsNullOrWhiteSpace(values)) { @@ -744,7 +712,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { if (values == null || values.Length == 0) { @@ -762,7 +730,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void AppendHeaderUnmodified(IDictionary headers, string key, params string[] values) + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { if (values == null || values.Length == 0) { @@ -801,12 +769,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return values == null ? null : string.Join(",", values); } - internal static string[] GetUnmodifiedValues(IDictionary store, string key) + internal static string[] GetUnmodifiedValues([NotNull] IDictionary store, string key) { - if (store == null) - { - throw new ArgumentNullException("store"); - } string[] values; return store.TryGetValue(key, out values) ? values : null; } @@ -826,7 +790,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure // return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); //} - public static long? GetContentLength(IHeaderDictionary headers) + public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; @@ -840,7 +804,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return null; } - public static void SetContentLength(IHeaderDictionary headers, long? value) + public static void SetContentLength([NotNull] IHeaderDictionary headers, long? value) { if (value.HasValue) { diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 5106808d03..e57b406153 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -5,9 +5,9 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; using Microsoft.AspNet.WebUtilities; -using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.PipelineCore if (_query == null || _queryString != queryString) { _queryString = queryString; - _query = QueryHelpers.ParseQuery(queryString); + _query = new ReadableStringCollection(QueryHelpers.ParseQuery(queryString)); } return _query; } diff --git a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs new file mode 100644 index 0000000000..aaad97ae92 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs @@ -0,0 +1,199 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.PipelineCore +{ + /// + /// A Stream that wraps another stream starting at a certain offset and reading for the given length. + /// + internal class ReferenceReadStream : Stream + { + private readonly Stream _inner; + private readonly long _innerOffset; + private readonly long _length; + private long _position; + + private bool _disposed; + + public ReferenceReadStream([NotNull] Stream inner, long offset, long length) + { + _inner = inner; + _innerOffset = offset; + _length = length; + _inner.Position = offset; + } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return _inner.CanSeek; } + } + + public override bool CanWrite + { + get { return false; } + } + + public override long Length + { + get { return _length; } + } + + public override long Position + { + get { return _position; } + set + { + ThrowIfDisposed(); + if (value < 0 || value > Length) + { + throw new ArgumentOutOfRangeException("value", value, "The Position must be within the length of the Stream: " + Length); + } + VerifyPosition(); + _position = value; + _inner.Position = _innerOffset + _position; + } + } + + // Throws if the position in the underlying stream has changed without our knowledge, indicating someone else is trying + // to use the stream at the same time which could lead to data corruption. + private void VerifyPosition() + { + if (_inner.Position != _innerOffset + _position) + { + throw new InvalidOperationException("The inner stream position has changed unexpectedly."); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + if (origin == SeekOrigin.Begin) + { + Position = offset; + } + else if (origin == SeekOrigin.End) + { + Position = Length + offset; + } + else // if (origin == SeekOrigin.Current) + { + Position = Position + offset; + } + return Position; + } + + public override int Read(byte[] buffer, int offset, int count) + { + ThrowIfDisposed(); + VerifyPosition(); + var toRead = Math.Min(count, _length - _position); + var read = _inner.Read(buffer, offset, (int)toRead); + _position += read; + return read; + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + ThrowIfDisposed(); + VerifyPosition(); + var toRead = Math.Min(count, _length - _position); + var read = await _inner.ReadAsync(buffer, offset, (int)toRead, cancellationToken); + _position += read; + return read; + } +#if ASPNET50 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + ThrowIfDisposed(); + VerifyPosition(); + var tcs = new TaskCompletionSource(state); + BeginRead(buffer, offset, count, callback, tcs); + return tcs.Task; + } + + private async void BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, TaskCompletionSource tcs) + { + try + { + var read = await ReadAsync(buffer, offset, count); + tcs.TrySetResult(read); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + + if (callback != null) + { + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + } + } + + public override int EndRead(IAsyncResult asyncResult) + { + var task = (Task)asyncResult; + return task.GetAwaiter().GetResult(); + } +#endif + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } +#endif + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + throw new NotSupportedException(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _disposed = true; + } + } + + private void ThrowIfDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(ReferenceReadStream)); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 8a3ae99e72..952bfed0f6 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -9,7 +9,6 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; -using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index d975333fdf..1e27a006c4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -17,12 +17,8 @@ namespace Microsoft.AspNet.PipelineCore.Security private List _results; private List _accepted; - public AuthenticateContext(IEnumerable authenticationTypes) + public AuthenticateContext([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException("authenticationType"); - } AuthenticationTypes = authenticationTypes; _results = new List(); _accepted = new List(); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 45afd34594..ea87d06599 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -14,12 +14,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { private List _accepted; - public ChallengeContext(IEnumerable authenticationTypes, IDictionary properties) + public ChallengeContext([NotNull] IEnumerable authenticationTypes, IDictionary properties) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); _accepted = new List(); @@ -33,7 +29,7 @@ namespace Microsoft.AspNet.PipelineCore.Security { get { return _accepted; } } - + public void Accept(string authenticationType, IDictionary description) { _accepted.Add(authenticationType); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index b24a14758a..43a88a82de 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -12,12 +12,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { private List _accepted; - public SignInContext(IEnumerable identities, IDictionary dictionary) + public SignInContext([NotNull] IEnumerable identities, IDictionary dictionary) { - if (identities == null) - { - throw new ArgumentNullException("identities"); - } Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); _accepted = new List(); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 6ce2a64fa5..546c5bca83 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -11,12 +11,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { private List _accepted; - public SignOutContext(IEnumerable authenticationTypes) + public SignOutContext([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException("authenticationTypes"); - } AuthenticationTypes = authenticationTypes; _accepted = new List(); } diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs new file mode 100644 index 0000000000..944f126b93 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -0,0 +1,396 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + internal class BufferedReadStream : Stream + { + private const char CR = '\r'; + private const char LF = '\n'; + + private readonly Stream _inner; + private readonly byte[] _buffer; + private int _bufferOffset = 0; + private int _bufferCount = 0; + private bool _disposed; + + public BufferedReadStream([NotNull] Stream inner, int bufferSize) + { + _inner = inner; + _buffer = new byte[bufferSize]; + } + + public ArraySegment BufferedData + { + get { return new ArraySegment(_buffer, _bufferOffset, _bufferCount); } + } + + public override bool CanRead + { + get { return _inner.CanRead || _bufferCount > 0; } + } + + public override bool CanSeek + { + get { return _inner.CanSeek; } + } + + public override bool CanTimeout + { + get { return _inner.CanTimeout; } + } + + public override bool CanWrite + { + get { return _inner.CanWrite; } + } + + public override long Length + { + get { return _inner.Length; } + } + + public override long Position + { + get { return _inner.Position - _bufferCount; } + set + { + if (value < 0) + { + throw new ArgumentOutOfRangeException("value", value, "Position must be positive."); + } + if (value == Position) + { + return; + } + + // Backwards? + if (value <= _inner.Position) + { + // Forward within the buffer? + var innerOffset = (int)(_inner.Position - value); + if (innerOffset <= _bufferCount) + { + // Yes, just skip some of the buffered data + _bufferOffset += innerOffset; + _bufferCount -= innerOffset; + } + else + { + // No, reset the buffer + _bufferOffset = 0; + _bufferCount = 0; + _inner.Position = value; + } + } + else + { + // Forward, reset the buffer + _bufferOffset = 0; + _bufferCount = 0; + _inner.Position = value; + } + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + if (origin == SeekOrigin.Begin) + { + Position = offset; + } + else if (origin == SeekOrigin.Current) + { + Position = Position + offset; + } + else // if (origin == SeekOrigin.End) + { + Position = Length + offset; + } + return Position; + } + + public override void SetLength(long value) + { + _inner.SetLength(value); + } + + protected override void Dispose(bool disposing) + { + _disposed = true; + if (disposing) + { + _inner.Dispose(); + } + } + + public override void Flush() + { + _inner.Flush(); + } + + public override Task FlushAsync(CancellationToken cancellationToken) + { + return _inner.FlushAsync(cancellationToken); + } + + public override void Write(byte[] buffer, int offset, int count) + { + _inner.Write(buffer, offset, count); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + return _inner.BeginWrite(buffer, offset, count, callback, state); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + _inner.EndWrite(asyncResult); + } +#endif + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + return _inner.WriteAsync(buffer, offset, count, cancellationToken); + } + + public override int Read(byte[] buffer, int offset, int count) + { + ValidateBuffer(buffer, offset, count); + + // Drain buffer + if (_bufferCount > 0) + { + int toCopy = Math.Min(_bufferCount, count); + Buffer.BlockCopy(_buffer, _bufferOffset, buffer, offset, toCopy); + _bufferOffset += toCopy; + _bufferCount -= toCopy; + return toCopy; + } + + return _inner.Read(buffer, offset, count); + } + + public async override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + ValidateBuffer(buffer, offset, count); + + // Drain buffer + if (_bufferCount > 0) + { + int toCopy = Math.Min(_bufferCount, count); + Buffer.BlockCopy(_buffer, _bufferOffset, buffer, offset, toCopy); + _bufferOffset += toCopy; + _bufferCount -= toCopy; + return toCopy; + } + + return await _inner.ReadAsync(buffer, offset, count, cancellationToken); + } +#if ASPNET50 + // We only anticipate using ReadAsync + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + ValidateBuffer(buffer, offset, count); + + // Drain buffer + if (_bufferCount > 0) + { + int toCopy = Math.Min(_bufferCount, count); + Buffer.BlockCopy(_buffer, _bufferOffset, buffer, offset, toCopy); + _bufferOffset += toCopy; + _bufferCount -= toCopy; + + TaskCompletionSource tcs = new TaskCompletionSource(state); + tcs.TrySetResult(toCopy); + if (callback != null) + { + callback(tcs.Task); + } + return tcs.Task; + } + + return _inner.BeginRead(buffer, offset, count, callback, state); + } + + public override int EndRead(IAsyncResult asyncResult) + { + Task task = asyncResult as Task; + if (task != null) + { + return task.GetAwaiter().GetResult(); + } + return _inner.EndRead(asyncResult); + } +#endif + public bool EnsureBuffered() + { + if (_bufferCount > 0) + { + return true; + } + // Downshift to make room + _bufferOffset = 0; + _bufferCount = _inner.Read(_buffer, 0, _buffer.Length); + return _bufferCount > 0; + } + + public async Task EnsureBufferedAsync(CancellationToken cancellationToken) + { + if (_bufferCount > 0) + { + return true; + } + // Downshift to make room + _bufferOffset = 0; + _bufferCount = await _inner.ReadAsync(_buffer, 0, _buffer.Length, cancellationToken); + return _bufferCount > 0; + } + + public bool EnsureBuffered(int minCount) + { + if (minCount > _buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + } + while (_bufferCount < minCount) + { + // Downshift to make room + if (_bufferOffset > 0) + { + if (_bufferCount > 0) + { + Buffer.BlockCopy(_buffer, _bufferOffset, _buffer, 0, _bufferCount); + } + _bufferOffset = 0; + } + int read = _inner.Read(_buffer, _bufferOffset + _bufferCount, _buffer.Length - _bufferCount - _bufferOffset); + _bufferCount += read; + if (read == 0) + { + return false; + } + } + return true; + } + + public async Task EnsureBufferedAsync(int minCount, CancellationToken cancellationToken) + { + if (minCount > _buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + } + while (_bufferCount < minCount) + { + // Downshift to make room + if (_bufferOffset > 0) + { + if (_bufferCount > 0) + { + Buffer.BlockCopy(_buffer, _bufferOffset, _buffer, 0, _bufferCount); + } + _bufferOffset = 0; + } + int read = await _inner.ReadAsync(_buffer, _bufferOffset + _bufferCount, _buffer.Length - _bufferCount - _bufferOffset, cancellationToken); + _bufferCount += read; + if (read == 0) + { + return false; + } + } + return true; + } + + public string ReadLine(int lengthLimit) + { + CheckDisposed(); + StringBuilder builder = new StringBuilder(); + bool foundCR = false, foundCRLF = false; + while (!foundCRLF && EnsureBuffered()) + { + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); + } + ProcessLineChar(builder, ref foundCR, ref foundCRLF); + } + + if (foundCRLF) + { + return builder.ToString(0, builder.Length - 2); // Drop the CRLF + } + // Stream ended with no CRLF. + return builder.ToString(); + } + + public async Task ReadLineAsync(int lengthLimit, CancellationToken cancellationToken) + { + CheckDisposed(); + StringBuilder builder = new StringBuilder(); + bool foundCR = false, foundCRLF = false; + while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) + { + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); + } + + ProcessLineChar(builder, ref foundCR, ref foundCRLF); + } + + if (foundCRLF) + { + return builder.ToString(0, builder.Length - 2); // Drop the CRLF + } + // Stream ended with no CRLF. + return builder.ToString(); + } + + private void ProcessLineChar(StringBuilder builder, ref bool foundCR, ref bool foundCRLF) + { + char ch = (char)_buffer[_bufferOffset]; // TODO: Encoding enforcement + builder.Append(ch); + _bufferOffset++; + _bufferCount--; + if (ch == CR) + { + foundCR = true; + } + else if (ch == LF) + { + if (foundCR) + { + foundCRLF = true; + } + else + { + foundCR = false; + } + } + } + + private void CheckDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(BufferedReadStream)); + } + } + + private void ValidateBuffer(byte[] buffer, int offset, int count) + { + // Delegate most of our validation. + var ignored = new ArraySegment(buffer, offset, count); + if (count == 0) + { + throw new ArgumentOutOfRangeException(nameof(count), "The value must be greater than zero."); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs new file mode 100644 index 0000000000..2f23ab5247 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -0,0 +1,248 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// A Stream that wraps another stream and enables rewinding by buffering the content as it is read. + /// The content is buffered in memory up to a certain size and then spooled to a temp file on disk. + /// The temp file will be deleted on Dispose. + /// + public class FileBufferingReadStream : Stream + { + private readonly Stream _inner; + private readonly int _memoryThreshold; + private readonly string _tempFileDirectory; + + private Stream _buffer = new MemoryStream(); // TODO: We could have a more efficiently expanding buffer stream. + private bool _inMemory = true; + private bool _completelyBuffered; + + private bool _disposed; + + // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? + public FileBufferingReadStream([NotNull] Stream inner, int memoryThreshold, [NotNull] string tempFileDirectory) + { + _inner = inner; + _memoryThreshold = memoryThreshold; + _tempFileDirectory = tempFileDirectory; + } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return true; } + } + + public override bool CanWrite + { + get { return false; } + } + + public override long Length + { + get { return _buffer.Length; } + } + + public override long Position + { + get { return _buffer.Position; } + // Note this will not allow seeking forward beyond the end of the buffer. + set + { + ThrowIfDisposed(); + _buffer.Position = value; + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + ThrowIfDisposed(); + if (!_completelyBuffered && origin == SeekOrigin.End) + { + // Can't seek from the end until we've finished consuming the inner stream + throw new NotSupportedException("The content has not been fully buffered yet."); + } + else if (!_completelyBuffered && origin == SeekOrigin.Current && offset + Position > Length) + { + // Can't seek past the end of the buffer until we've finished consuming the inner stream + throw new NotSupportedException("The content has not been fully buffered yet."); + } + else if (!_completelyBuffered && origin == SeekOrigin.Begin && offset > Length) + { + // Can't seek past the end of the buffer until we've finished consuming the inner stream + throw new NotSupportedException("The content has not been fully buffered yet."); + } + return _buffer.Seek(offset, origin); + } + + private Stream CreateTempFile() + { + var fileName = Path.Combine(_tempFileDirectory, "ASPNET_" + Guid.NewGuid().ToString() + ".tmp"); + return new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete, 1024 * 16, + FileOptions.Asynchronous | FileOptions.DeleteOnClose | FileOptions.SequentialScan); + } + + public override int Read(byte[] buffer, int offset, int count) + { + ThrowIfDisposed(); + if (_buffer.Position < _buffer.Length || _completelyBuffered) + { + // Just read from the buffer + return _buffer.Read(buffer, offset, (int)Math.Min(count, _buffer.Length - _buffer.Position)); + } + + int read = _inner.Read(buffer, offset, count); + + if (_inMemory && _buffer.Length + read > _memoryThreshold) + { + var oldBuffer = _buffer; + _buffer = CreateTempFile(); + _inMemory = false; + oldBuffer.Position = 0; + oldBuffer.CopyTo(_buffer, 1024 * 16); + } + + if (read > 0) + { + _buffer.Write(buffer, offset, read); + } + else + { + _completelyBuffered = true; + } + + return read; + } +#if ASPNET50 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + ThrowIfDisposed(); + var tcs = new TaskCompletionSource(state); + BeginRead(buffer, offset, count, callback, tcs); + return tcs.Task; + } + + private async void BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, TaskCompletionSource tcs) + { + try + { + var read = await ReadAsync(buffer, offset, count); + tcs.TrySetResult(read); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + + if (callback != null) + { + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + } + } + + public override int EndRead(IAsyncResult asyncResult) + { + var task = (Task)asyncResult; + return task.GetAwaiter().GetResult(); + } +#endif + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + ThrowIfDisposed(); + if (_buffer.Position < _buffer.Length || _completelyBuffered) + { + // Just read from the buffer + return await _buffer.ReadAsync(buffer, offset, (int)Math.Min(count, _buffer.Length - _buffer.Position), cancellationToken); + } + + int read = await _inner.ReadAsync(buffer, offset, count, cancellationToken); + + if (_inMemory && _buffer.Length + read > _memoryThreshold) + { + var oldBuffer = _buffer; + _buffer = CreateTempFile(); + _inMemory = false; + oldBuffer.Position = 0; + await oldBuffer.CopyToAsync(_buffer, 1024 * 16, cancellationToken); + } + + if (read > 0) + { + await _buffer.WriteAsync(buffer, offset, read, cancellationToken); + } + else + { + _completelyBuffered = true; + } + + return read; + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } +#endif + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + throw new NotSupportedException(); + } + + protected override void Dispose(bool disposing) + { + if (!_disposed) + { + _disposed = true; + if (disposing) + { + _buffer.Dispose(); + } + } + } + + private void ThrowIfDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(FileBufferingReadStream)); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs deleted file mode 100644 index 4c16485eb0..0000000000 --- a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.WebUtilities -{ - public static class FormHelpers - { - /// - /// Parses an HTTP form body. - /// - /// The HTTP form body to parse. - /// The object containing the parsed HTTP form body. - public static IFormCollection ParseForm(string text) - { - return ParsingHelpers.GetForm(text); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs new file mode 100644 index 0000000000..7c6a034f78 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -0,0 +1,188 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// Used to read an 'application/x-www-form-urlencoded' form. + /// + public class FormReader + { + private readonly TextReader _reader; + private readonly char[] _buffer = new char[1024]; + private readonly StringBuilder _builder = new StringBuilder(); + private int _bufferOffset; + private int _bufferCount; + + public FormReader([NotNull] string data) + { + _reader = new StringReader(data); + } + + // TODO: Encoding + public FormReader([NotNull] Stream stream) + { + _reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); + } + + // Format: key1=value1&key2=value2 + /// + /// Reads the next key value pair from the form. + /// For unbuffered data use the async overload instead. + /// + /// The next key value pair, or null when the end of the form is reached. + public KeyValuePair? ReadNextPair() + { + var key = ReadWord('='); + if (string.IsNullOrEmpty(key) && _bufferCount == 0) + { + return null; + } + var value = ReadWord('&'); + return new KeyValuePair(key, value); + } + + // Format: key1=value1&key2=value2 + /// + /// Asynchronously reads the next key value pair from the form. + /// + /// + /// The next key value pair, or null when the end of the form is reached. + public async Task?> ReadNextPairAsync(CancellationToken cancellationToken) + { + var key = await ReadWordAsync('=', cancellationToken); + if (string.IsNullOrEmpty(key) && _bufferCount == 0) + { + return null; + } + var value = await ReadWordAsync('&', cancellationToken); + return new KeyValuePair(key, value); + } + + private string ReadWord(char seperator) + { + // TODO: Configurable value size limit + while (true) + { + // Empty + if (_bufferCount == 0) + { + Buffer(); + } + + // End + if (_bufferCount == 0) + { + return BuildWord(); + } + + var c = _buffer[_bufferOffset++]; + _bufferCount--; + + if (c == seperator) + { + return BuildWord(); + } + _builder.Append(c); + } + } + + private async Task ReadWordAsync(char seperator, CancellationToken cancellationToken) + { + // TODO: Configurable value size limit + while (true) + { + // Empty + if (_bufferCount == 0) + { + await BufferAsync(cancellationToken); + } + + // End + if (_bufferCount == 0) + { + return BuildWord(); + } + + var c = _buffer[_bufferOffset++]; + _bufferCount--; + + if (c == seperator) + { + return BuildWord(); + } + _builder.Append(c); + } + } + + // '+' un-escapes to ' ', %HH un-escapes as ASCII (or utf-8?) + private string BuildWord() + { + _builder.Replace('+', ' '); + var result = _builder.ToString(); + _builder.Clear(); + return Uri.UnescapeDataString(result); // TODO: Replace this, it's not completely accurate. + } + + private void Buffer() + { + _bufferOffset = 0; + _bufferCount = _reader.Read(_buffer, 0, _buffer.Length); + } + + private async Task BufferAsync(CancellationToken cancellationToken) + { + // TODO: StreamReader doesn't support cancellation? + cancellationToken.ThrowIfCancellationRequested(); + _bufferOffset = 0; + _bufferCount = await _reader.ReadAsync(_buffer, 0, _buffer.Length); + } + + /// + /// Parses text from an HTTP form body. + /// + /// The HTTP form body to parse. + /// The collection containing the parsed HTTP form body. + public static IDictionary ReadForm(string text) + { + var reader = new FormReader(text); + + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var pair = reader.ReadNextPair(); + while (pair.HasValue) + { + accumulator.Append(pair.Value.Key, pair.Value.Value); + pair = reader.ReadNextPair(); + } + + return accumulator.GetResults(); + } + + /// + /// Parses an HTTP form body. + /// + /// The HTTP form body to parse. + /// The collection containing the parsed HTTP form body. + public static async Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + { + var reader = new FormReader(stream); + + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var pair = await reader.ReadNextPairAsync(cancellationToken); + while (pair.HasValue) + { + accumulator.Append(pair.Value.Key, pair.Value.Value); + pair = await reader.ReadNextPairAsync(cancellationToken); + } + + return accumulator.GetResults(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs new file mode 100644 index 0000000000..4c9d629a47 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.WebUtilities +{ + public class KeyValueAccumulator + { + private Dictionary> _accumulator; + IEqualityComparer _comparer; + + public KeyValueAccumulator([NotNull] IEqualityComparer comparer) + { + _comparer = comparer; + _accumulator = new Dictionary>(comparer); + } + + public void Append(TKey key, TValue value) + { + List values; + if (_accumulator.TryGetValue(key, out values)) + { + values.Add(value); + } + else + { + _accumulator[key] = new List(1) { value }; + } + } + + public IDictionary GetResults() + { + var results = new Dictionary(_comparer); + foreach (var kv in _accumulator) + { + results.Add(kv.Key, kv.Value.ToArray()); + } + return results; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs new file mode 100644 index 0000000000..766e5361dc --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -0,0 +1,92 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + // https://www.ietf.org/rfc/rfc2046.txt + public class MultipartReader + { + private const int DefaultBufferSize = 1024 * 4; + + private readonly BufferedReadStream _stream; + private readonly string _boundary; + private MultipartReaderStream _currentStream; + + public MultipartReader([NotNull] string boundary, [NotNull] Stream stream) + : this(boundary, stream, DefaultBufferSize) + { + } + + public MultipartReader([NotNull] string boundary, [NotNull] Stream stream, int bufferSize) + { + if (bufferSize < boundary.Length + 8) // Size of the boundary + leading and trailing CRLF + leading and trailing '--' markers. + { + throw new ArgumentOutOfRangeException(nameof(bufferSize), bufferSize, "Insufficient buffer space, the buffer must be larger than the boundary: " + boundary); + } + _stream = new BufferedReadStream(stream, bufferSize); + _boundary = boundary; + // This stream will drain any preamble data and remove the first boundary marker. + _currentStream = new MultipartReaderStream(_stream, _boundary, expectLeadingCrlf: false); + } + + /// + /// The limit for individual header lines inside a multipart section. + /// + public int HeaderLengthLimit { get; set; } = 1024 * 4; + + /// + /// The combined size limit for headers per multipart section. + /// + public int TotalHeaderSizeLimit { get; set; } = 1024 * 16; + + public async Task ReadNextSectionAsync(CancellationToken cancellationToken = new CancellationToken()) + { + // Drain the prior section. + await _currentStream.DrainAsync(cancellationToken); + // If we're at the end return null + if (_currentStream.FinalBoundaryFound) + { + // There may be trailer data after the last boundary. + await _stream.DrainAsync(cancellationToken); + return null; + } + var headers = await ReadHeadersAsync(cancellationToken); + _currentStream = new MultipartReaderStream(_stream, _boundary); + long? baseStreamOffset = _stream.CanSeek ? (long?)_stream.Position : null; + return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; + } + + private async Task> ReadHeadersAsync(CancellationToken cancellationToken) + { + int totalSize = 0; + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); + while (!string.IsNullOrEmpty(line)) + { + totalSize += line.Length; + if (totalSize > TotalHeaderSizeLimit) + { + throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit); + } + int splitIndex = line.IndexOf(':'); + Debug.Assert(splitIndex > 0, "Invalid header line: " + line); + if (splitIndex >= 0) + { + var name = line.Substring(0, splitIndex); + var value = line.Substring(splitIndex + 1, line.Length - splitIndex - 1).Trim(); + accumulator.Append(name, value); + } + line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); + } + + return accumulator.GetResults(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs new file mode 100644 index 0000000000..d72809ef81 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -0,0 +1,320 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + internal class MultipartReaderStream : Stream + { + private readonly BufferedReadStream _innerStream; + private readonly byte[] _boundaryBytes; + private readonly int _finalBoundaryLength; + private readonly long _innerOffset; + private long _position; + private long _observedLength; + private bool _finished; + + /// + /// Creates a stream that reads until it reaches the given boundary pattern. + /// + /// + /// + public MultipartReaderStream([NotNull] BufferedReadStream stream, [NotNull] string boundary, bool expectLeadingCrlf = true) + { + _innerStream = stream; + _innerOffset = _innerStream.CanSeek ? _innerStream.Position : 0; + if (expectLeadingCrlf) + { + _boundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary); + } + else + { + _boundaryBytes = Encoding.UTF8.GetBytes("--" + boundary); + } + _finalBoundaryLength = _boundaryBytes.Length + 2; // Include the final '--' terminator. + } + + public bool FinalBoundaryFound { get; private set; } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return _innerStream.CanSeek; } + } + + public override bool CanWrite + { + get { return false; } + } + + public override long Length + { + get { return _observedLength; } + } + + public override long Position + { + get { return _position; } + set + { + if (value < 0) + { + throw new ArgumentOutOfRangeException("value", value, "The Position must be positive."); + } + if (value > _observedLength) + { + throw new ArgumentOutOfRangeException("value", value, "The Position must be less than length."); + } + _position = value; + if (_position < _observedLength) + { + _finished = false; + } + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + if (origin == SeekOrigin.Begin) + { + Position = offset; + } + else if (origin == SeekOrigin.Current) + { + Position = Position + offset; + } + else // if (origin == SeekOrigin.End) + { + Position = Length + offset; + } + return Position; + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } +#endif + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + throw new NotSupportedException(); + } + + private void PositionInnerStream() + { + if (_innerStream.CanSeek && _innerStream.Position != (_innerOffset + _position)) + { + _innerStream.Position = _innerOffset + _position; + } + } + + private int UpdatePosition(int read) + { + _position += read; + if (_observedLength < _position) + { + _observedLength = _position; + } + return read; + } +#if ASPNET50 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) + { + var tcs = new TaskCompletionSource(state); + InternalReadAsync(buffer, offset, size, callback, tcs); + return tcs.Task; + } + + private async void InternalReadAsync(byte[] buffer, int offset, int size, AsyncCallback callback, TaskCompletionSource tcs) + { + try + { + int read = await ReadAsync(buffer, offset, size); + tcs.TrySetResult(read); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + + if (callback != null) + { + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + } + } + + public override int EndRead(IAsyncResult asyncResult) + { + var task = (Task)asyncResult; + return task.GetAwaiter().GetResult(); + } +#endif + public override int Read(byte[] buffer, int offset, int count) + { + if (_finished) + { + return 0; + } + + PositionInnerStream(); + if (!_innerStream.EnsureBuffered(_finalBoundaryLength)) + { + throw new IOException("Unexpected end of stream."); + } + var bufferedData = _innerStream.BufferedData; + + // scan for a boundary match, full or partial. + int matchOffset; + int matchCount; + int read; + if (SubMatch(bufferedData, _boundaryBytes, out matchOffset, out matchCount)) + { + // We found a possible match, return any data before it. + if (matchOffset > bufferedData.Offset) + { + read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); + return UpdatePosition(read); + } + Debug.Assert(matchCount == _boundaryBytes.Length); + + // "The boundary may be followed by zero or more characters of + // linear whitespace. It is then terminated by either another CRLF" + // or -- for the final boundary. + byte[] boundary = new byte[_boundaryBytes.Length]; + read = _innerStream.Read(boundary, 0, boundary.Length); + Debug.Assert(read == boundary.Length); // It should have all been buffered + var remainder = _innerStream.ReadLine(lengthLimit: 100); // Whitespace may exceed the buffer. + remainder = remainder.Trim(); + if (string.Equals("--", remainder, StringComparison.Ordinal)) + { + FinalBoundaryFound = true; + } + Debug.Assert(FinalBoundaryFound || string.Equals(string.Empty, remainder, StringComparison.Ordinal), "Un-expected data found on the boundary line: " + remainder); + + _finished = true; + return 0; + } + + // No possible boundary match within the buffered data, return the data from the buffer. + read = _innerStream.Read(buffer, offset, Math.Min(count, bufferedData.Count)); + return UpdatePosition(read); + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + if (_finished) + { + return 0; + } + + PositionInnerStream(); + if (!await _innerStream.EnsureBufferedAsync(_finalBoundaryLength, cancellationToken)) + { + throw new IOException("Unexpected end of stream."); + } + var bufferedData = _innerStream.BufferedData; + + // scan for a boundary match, full or partial. + int matchOffset; + int matchCount; + int read; + if (SubMatch(bufferedData, _boundaryBytes, out matchOffset, out matchCount)) + { + // We found a possible match, return any data before it. + if (matchOffset > bufferedData.Offset) + { + // Sync, it's already buffered + read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); + return UpdatePosition(read); + } + Debug.Assert(matchCount == _boundaryBytes.Length); + + // "The boundary may be followed by zero or more characters of + // linear whitespace. It is then terminated by either another CRLF" + // or -- for the final boundary. + byte[] boundary = new byte[_boundaryBytes.Length]; + read = _innerStream.Read(boundary, 0, boundary.Length); + Debug.Assert(read == boundary.Length); // It should have all been buffered + var remainder = await _innerStream.ReadLineAsync(lengthLimit: 100, cancellationToken: cancellationToken); // Whitespace may exceed the buffer. + remainder = remainder.Trim(); + if (string.Equals("--", remainder, StringComparison.Ordinal)) + { + FinalBoundaryFound = true; + } + Debug.Assert(FinalBoundaryFound || string.Equals(string.Empty, remainder, StringComparison.Ordinal), "Un-expected data found on the boundary line: " + remainder); + + _finished = true; + return 0; + } + + // No possible boundary match within the buffered data, return the data from the buffer. + read = _innerStream.Read(buffer, offset, Math.Min(count, bufferedData.Count)); + return UpdatePosition(read); + } + + // Does Segment1 contain all of segment2, or does it end with the start of segment2? + // 1: AAAAABBBBBCCCCC + // 2: BBBBB + // Or: + // 1: AAAAABBB + // 2: BBBBB + private static bool SubMatch(ArraySegment segment1, byte[] matchBytes, out int matchOffset, out int matchCount) + { + matchCount = 0; + for (matchOffset = segment1.Offset; matchOffset < segment1.Offset + segment1.Count; matchOffset++) + { + int countLimit = segment1.Offset - matchOffset + segment1.Count; + for (matchCount = 0; matchCount < matchBytes.Length && matchCount < countLimit; matchCount++) + { + if (matchBytes[matchCount] != segment1.Array[matchOffset + matchCount]) + { + matchCount = 0; + break; + } + } + if (matchCount > 0) + { + break; + } + } + return matchCount > 0; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs new file mode 100644 index 0000000000..b35bcfee2a --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.AspNet.WebUtilities +{ + public class MultipartSection + { + public string ContentType + { + get + { + string[] values; + if (Headers.TryGetValue("Content-Type", out values)) + { + return string.Join(", ", values); + } + return null; + } + } + + public string ContentDisposition + { + get + { + string[] values; + if (Headers.TryGetValue("Content-Disposition", out values)) + { + return string.Join(", ", values); + } + return null; + } + } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + /// + /// The position where the body starts in the total multipart body. + /// This may not be available if the total multipart body is not seekable. + /// + public long? BaseStreamOffset { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs deleted file mode 100644 index 257b206c6b..0000000000 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.WebUtilities.Collections; - -namespace Microsoft.AspNet.WebUtilities -{ - internal static class ParsingHelpers - { - internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) - { - int textLength = text.Length; - int equalIndex = text.IndexOf('='); - if (equalIndex == -1) - { - equalIndex = textLength; - } - int scanIndex = 0; - while (scanIndex < textLength) - { - int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); - if (delimiterIndex == -1) - { - delimiterIndex = textLength; - } - if (equalIndex < delimiterIndex) - { - while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) - { - ++scanIndex; - } - string name = text.Substring(scanIndex, equalIndex - scanIndex); - string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); - callback( - Uri.UnescapeDataString(name.Replace('+', ' ')), - Uri.UnescapeDataString(value.Replace('+', ' ')), - state); - equalIndex = text.IndexOf('=', delimiterIndex); - if (equalIndex == -1) - { - equalIndex = textLength; - } - } - scanIndex = delimiterIndex + 1; - } - } - - private static readonly Action AppendItemCallback = (name, value, state) => - { - var dictionary = (IDictionary>)state; - - List existing; - if (!dictionary.TryGetValue(name, out existing)) - { - dictionary.Add(name, new List(1) { value }); - } - else - { - existing.Add(value); - } - }; - - internal static IFormCollection GetForm(string text) - { - IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, Ampersand, AppendItemCallback, accumulator); - foreach (var kv in accumulator) - { - form.Add(kv.Key, kv.Value.ToArray()); - } - return new FormCollection(form); - } - - internal static string GetJoinedValue(IDictionary store, string key) - { - string[] values = GetUnmodifiedValues(store, key); - return values == null ? null : string.Join(",", values); - } - - internal static string[] GetUnmodifiedValues(IDictionary store, string key) - { - if (store == null) - { - throw new ArgumentNullException("store"); - } - string[] values; - return store.TryGetValue(key, out values) ? values : null; - } - - private static readonly char[] Ampersand = new[] { '&' }; - - internal static IReadableStringCollection GetQuery(string queryString) - { - if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') - { - queryString = queryString.Substring(1); - } - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(queryString, Ampersand, AppendItemCallback, accumulator); - return new ReadableStringCollection(accumulator.ToDictionary( - item => item.Key, - item => item.Value.ToArray(), - StringComparer.OrdinalIgnoreCase)); - } - } -} diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index f54ff50dea..1414ef8f17 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.WebUtilities { @@ -50,9 +49,49 @@ namespace Microsoft.AspNet.WebUtilities /// /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. - public static IReadableStringCollection ParseQuery(string text) + public static IDictionary ParseQuery(string queryString) { - return ParsingHelpers.GetQuery(text); + if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + { + queryString = queryString.Substring(1); + } + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + + int textLength = queryString.Length; + int equalIndex = queryString.IndexOf('='); + if (equalIndex == -1) + { + equalIndex = textLength; + } + int scanIndex = 0; + while (scanIndex < textLength) + { + int delimiterIndex = queryString.IndexOf('&', scanIndex); + if (delimiterIndex == -1) + { + delimiterIndex = textLength; + } + if (equalIndex < delimiterIndex) + { + while (scanIndex != equalIndex && char.IsWhiteSpace(queryString[scanIndex])) + { + ++scanIndex; + } + string name = queryString.Substring(scanIndex, equalIndex - scanIndex); + string value = queryString.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); + accumulator.Append( + Uri.UnescapeDataString(name.Replace('+', ' ')), + Uri.UnescapeDataString(value.Replace('+', ' '))); + equalIndex = queryString.IndexOf('=', delimiterIndex); + if (equalIndex == -1) + { + equalIndex = textLength; + } + } + scanIndex = delimiterIndex + 1; + } + + return accumulator.GetResults(); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs new file mode 100644 index 0000000000..c5a2432db6 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class StreamHelperExtensions + { + public static async Task DrainAsync(this Stream stream, CancellationToken cancellationToken) + { + byte[] buffer = new byte[1024]; + cancellationToken.ThrowIfCancellationRequested(); + while (await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken) > 0) + { + // Not all streams support cancellation directly. + cancellationToken.ThrowIfCancellationRequested(); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 0fb71d0a56..963fcc3178 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -9,6 +9,7 @@ "aspnetcore50": { "dependencies": { "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.IO.FileSystem": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index b7fdc8f563..b129adc0e1 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -1,72 +1,266 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; +using System.Linq; using System.Text; -using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Moq; +using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.PipelineCore { public class FormFeatureTests { [Fact] - public async Task GetFormAsync_ReturnsParsedFormCollection() + public async Task ReadFormAsync_SimpleData_ReturnsParsedFormCollection() { // Arrange var formContent = Encoding.UTF8.GetBytes("foo=bar&baz=2"); - var features = new Mock(); - var request = new Mock(); - request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent)); + var context = new DefaultHttpContext(); + context.Request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; + context.Request.Body = new MemoryStream(formContent); - object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) - .Returns(true); - - var provider = new FormFeature(features.Object); + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); // Act - var formCollection = await provider.GetFormAsync(CancellationToken.None); + var formCollection = await context.Request.ReadFormAsync(); // Assert Assert.Equal("bar", formCollection["foo"]); Assert.Equal("2", formCollection["baz"]); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); } [Fact] - public async Task GetFormAsync_CachesFormCollectionPerBodyStream() + public async Task ReadFormAsync_EmptyKeyAtEndAllowed() { // Arrange - var formContent1 = Encoding.UTF8.GetBytes("foo=bar&baz=2"); - var formContent2 = Encoding.UTF8.GetBytes("collection2=value"); - var features = new Mock(); - var request = new Mock(); - request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent1)); + var formContent = Encoding.UTF8.GetBytes("=bar"); + var body = new MemoryStream(formContent); - object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) - .Returns(true); + var formCollection = await FormReader.ReadFormAsync(body); - var provider = new FormFeature(features.Object); + // Assert + Assert.Equal("bar", formCollection[""].FirstOrDefault()); + } - // Act - 1 - var formCollection = await provider.GetFormAsync(CancellationToken.None); + [Fact] + public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("=bar&baz=2"); + var body = new MemoryStream(formContent); - // Assert - 1 - Assert.Equal("bar", formCollection["foo"]); - Assert.Equal("2", formCollection["baz"]); - Assert.Same(formCollection, await provider.GetFormAsync(CancellationToken.None)); + var formCollection = await FormReader.ReadFormAsync(body); - // Act - 2 - request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent2)); - formCollection = await provider.GetFormAsync(CancellationToken.None); + // Assert + Assert.Equal("bar", formCollection[""].FirstOrDefault()); + Assert.Equal("2", formCollection["baz"].FirstOrDefault()); + } - // Assert - 2 - Assert.Equal("value", formCollection["collection2"]); + [Fact] + public async Task ReadFormAsync_EmptyValuedAtEndAllowed() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("foo="); + var body = new MemoryStream(formContent); + + var formCollection = await FormReader.ReadFormAsync(body); + + // Assert + Assert.Equal("", formCollection["foo"].FirstOrDefault()); + } + + [Fact] + public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("foo=&baz=2"); + var body = new MemoryStream(formContent); + + var formCollection = await FormReader.ReadFormAsync(body); + + // Assert + Assert.Equal("", formCollection["foo"].FirstOrDefault()); + Assert.Equal("2", formCollection["baz"].FirstOrDefault()); + } + + private const string MultipartContentType = "multipart/form-data; boundary=WebKitFormBoundary5pDRpGheQXaM8k3T"; + private const string EmptyMultipartForm = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + private const string MultipartFormWithField = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""description"" + +Foo +--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + private const string MultipartFormWithFile = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" +Content-Type: text/html + +Hello World +--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + private const string MultipartFormWithFieldAndFile = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""description"" + +Foo +--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" +Content-Type: text/html + +Hello World +--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + + [Fact] + public async Task ReadForm_EmptyMultipart_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(EmptyMultipartForm); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = context.Request.Form; + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formCollection, formFeature.Form); + Assert.Same(formCollection, await context.Request.ReadFormAsync()); + + // Content + Assert.Equal(0, formCollection.Count); + Assert.NotNull(formCollection.Files); + Assert.Equal(0, formCollection.Files.Count); + } + + [Fact] + public async Task ReadForm_MultipartWithField_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithField); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = context.Request.Form; + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formCollection, formFeature.Form); + Assert.Same(formCollection, await context.Request.ReadFormAsync()); + + // Content + Assert.Equal(1, formCollection.Count); + Assert.Equal("Foo", formCollection["description"]); + + Assert.NotNull(formCollection.Files); + Assert.Equal(0, formCollection.Files.Count); + } + + [Fact] + public async Task ReadFormAsync_MultipartWithFile_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithFile); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = await context.Request.ReadFormAsync(); + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); + Assert.Same(formCollection, context.Request.Form); + + // Content + Assert.Equal(0, formCollection.Count); + + Assert.NotNull(formCollection.Files); + Assert.Equal(1, formCollection.Files.Count); + + var file = formCollection.Files["myfile1"]; + Assert.Equal("text/html", file.ContentType); + Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""", file.ContentDisposition); + var body = file.OpenReadStream(); + using (var reader = new StreamReader(body)) + { + var content = reader.ReadToEnd(); + Assert.Equal(content, "Hello World"); + } + } + + [Fact] + public async Task ReadFormAsync_MultipartWithFieldAndFile_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithFieldAndFile); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = await context.Request.ReadFormAsync(); + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); + Assert.Same(formCollection, context.Request.Form); + + // Content + Assert.Equal(1, formCollection.Count); + Assert.Equal("Foo", formCollection["description"]); + + Assert.NotNull(formCollection.Files); + Assert.Equal(1, formCollection.Files.Count); + + var file = formCollection.Files["myfile1"]; + Assert.Equal("text/html", file.ContentType); + Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""", file.ContentDisposition); + var body = file.OpenReadStream(); + using (var reader = new StreamReader(body)) + { + var content = reader.ReadToEnd(); + Assert.Equal(content, "Hello World"); + } } } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs new file mode 100644 index 0000000000..a642511a86 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -0,0 +1,185 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class MultipartReaderTests + { + private const string Boundary = "9051914041544843365972754266"; + private const string OnePartBody = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266-- +"; + private const string OnePartBodyWithTrailingWhitespace = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266-- +"; + // It's non-compliant but common to leave off the last CRLF. + private const string OnePartBodyWithoutFinalCRLF = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266--"; + private const string TwoPartBody = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file1""; filename=""a.txt"" +Content-Type: text/plain + +Content of a.txt. + +--9051914041544843365972754266-- +"; + private const string ThreePartBody = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file1""; filename=""a.txt"" +Content-Type: text/plain + +Content of a.txt. + +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file2""; filename=""a.html"" +Content-Type: text/html + +Content of a.html. + +--9051914041544843365972754266-- +"; + + private static MemoryStream MakeStream(string text) + { + return new MemoryStream(Encoding.UTF8.GetBytes(text)); + } + + [Fact] + public async Task MutipartReader_ReadSinglePartBody_Success() + { + var stream = MakeStream(OnePartBody); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadSinglePartBodyWithTrailingWhitespace_Success() + { + var stream = MakeStream(OnePartBodyWithTrailingWhitespace); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadSinglePartBodyWithoutLastCRLF_Success() + { + var stream = MakeStream(OnePartBodyWithoutFinalCRLF); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadTwoPartBody_Success() + { + var stream = MakeStream(TwoPartBody); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file1\"; filename=\"a.txt\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/plain", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.txt.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ThreePartBody_Success() + { + var stream = MakeStream(ThreePartBody); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file1\"; filename=\"a.txt\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/plain", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.txt.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file2\"; filename=\"a.html\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/html", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.html.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index fea33d497a..e90c78305a 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq; using Xunit; namespace Microsoft.AspNet.WebUtilities @@ -13,8 +14,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?key1=value1&key2=value2"); Assert.Equal(2, collection.Count); - Assert.Equal("value1", collection["key1"]); - Assert.Equal("value2", collection["key2"]); + Assert.Equal("value1", collection["key1"].FirstOrDefault()); + Assert.Equal("value2", collection["key2"].FirstOrDefault()); } [Fact] @@ -22,8 +23,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("key1=value1&key2=value2"); Assert.Equal(2, collection.Count); - Assert.Equal("value1", collection["key1"]); - Assert.Equal("value2", collection["key2"]); + Assert.Equal("value1", collection["key1"].FirstOrDefault()); + Assert.Equal("value2", collection["key2"].FirstOrDefault()); } [Fact] @@ -31,8 +32,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?key1=valueA&key2=valueB&key1=valueC"); Assert.Equal(2, collection.Count); - Assert.Equal("valueA,valueC", collection["key1"]); - Assert.Equal("valueB", collection["key2"]); + Assert.Equal(new[] { "valueA", "valueC" }, collection["key1"]); + Assert.Equal("valueB", collection["key2"].FirstOrDefault()); } [Fact] @@ -40,8 +41,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?key1=&key2="); Assert.Equal(2, collection.Count); - Assert.Equal(string.Empty, collection["key1"]); - Assert.Equal(string.Empty, collection["key2"]); + Assert.Equal(string.Empty, collection["key1"].FirstOrDefault()); + Assert.Equal(string.Empty, collection["key2"].FirstOrDefault()); } [Fact] @@ -49,7 +50,7 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?=value1&="); Assert.Equal(1, collection.Count); - Assert.Equal("value1,", collection[""]); + Assert.Equal(new[] { "value1", "" }, collection[""]); } } } \ No newline at end of file From 4377bb24ce59bc25d346fe5bc84e5fc0cfe97617 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Fri, 9 Jan 2015 12:53:23 -0800 Subject: [PATCH 196/846] Added extension methods for FormFile --- .../FormFileExtensions.cs | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs new file mode 100644 index 0000000000..a0c78ead9e --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + /// + /// Extension methods for . + /// + public static class FormFileExtensions + { + private static int DefaultBufferSize = 81920; + + /// + /// Saves the contents of an uploaded file. + /// + /// The . + /// The name of the file to create. + public static void SaveAs([NotNull] this IFormFile formFile, string filename) + { + using (var fileStream = new FileStream(filename, FileMode.Create)) + { + var inputStream = formFile.OpenReadStream(); + inputStream.CopyTo(fileStream); + } + } + + /// + /// Asynchronously saves the contents of an uploaded file. + /// + /// The . + /// The name of the file to create. + public async static Task SaveAsAsync([NotNull] this IFormFile formFile, + string filename, + CancellationToken cancellationToken = default(CancellationToken)) + { + using (var fileStream = new FileStream(filename, FileMode.Create)) + { + var inputStream = formFile.OpenReadStream(); + await inputStream.CopyToAsync(fileStream, DefaultBufferSize, cancellationToken); + } + } + } +} \ No newline at end of file From 4fb21644fc3b2387e07e3622f2361652d4598c1f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 14 Jan 2015 15:41:09 -0800 Subject: [PATCH 197/846] Implement strongly typed headers. --- HttpAbstractions.sln | 32 +- .../Microsoft.AspNet.FeatureModel.kproj | 9 +- .../HeaderDictionaryTypeExtensions.cs | 202 +++++ .../Microsoft.AspNet.Http.Extensions.kproj | 9 +- .../QueryBuilder.cs | 3 +- .../RequestHeaders.cs | 259 +++++++ .../ResponseHeaders.cs | 156 ++++ .../UriHelper.cs | 18 +- .../project.json | 3 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 24 - .../Microsoft.AspNet.Http.kproj | 9 +- .../Microsoft.AspNet.HttpFeature.kproj | 9 +- .../Microsoft.AspNet.Owin.kproj | 9 +- .../OwinFeatureCollection.cs | 2 +- .../Collections/FormFileCollection.cs | 9 +- .../Collections/HeaderDictionary.cs | 4 + .../DefaultHttpRequest.cs | 12 - .../FormFeature.cs | 123 +-- .../Infrastructure/ParsingHelpers.cs | 19 - .../Microsoft.AspNet.PipelineCore.kproj | 9 +- .../project.json | 4 +- .../FormReader.cs | 21 +- .../Microsoft.AspNet.WebUtilities.kproj | 9 +- .../project.json | 6 +- .../BaseHeaderParser.cs | 70 ++ .../CacheControlHeaderValue.cs | 603 +++++++++++++++ .../ContentDispositionHeaderValue.cs | 702 ++++++++++++++++++ .../ContentRangeHeaderValue.cs | 397 ++++++++++ .../CookieHeaderParser.cs | 104 +++ .../CookieHeaderValue.cs | 256 +++++++ .../EntityTagHeaderValue.cs | 204 +++++ .../GenericHeaderParser.cs | 23 + src/Microsoft.Net.Http.Headers/HeaderNames.cs | 59 ++ .../HeaderQuality.cs | 18 + .../HeaderUtilities.cs | 232 ++++++ .../HttpHeaderParser.cs | 137 ++++ .../HttpParseResult.cs | 12 + .../HttpRuleParser.cs | 352 +++++++++ .../MediaTypeHeaderValue.cs | 408 ++++++++++ .../MediaTypeHeaderValueComparer.cs | 100 +++ .../Microsoft.Net.Http.Headers.kproj | 23 + .../NameValueHeaderValue.cs | 347 +++++++++ .../NotNullAttribute.cs | 12 + .../ObjectCollection.cs | 56 ++ .../RangeConditionHeaderValue.cs | 166 +++++ .../RangeHeaderValue.cs | 161 ++++ .../RangeItemHeaderValue.cs | 226 ++++++ .../SetCookieHeaderValue.cs | 364 +++++++++ .../StringWithQualityHeaderValue.cs | 225 ++++++ .../StringWithQualityHeaderValueComparer.cs | 71 ++ src/Microsoft.Net.Http.Headers/project.json | 19 + .../HeaderDictionaryTypeExtensionsTest.cs | 206 +++++ ...crosoft.AspNet.Http.Extensions.Tests.kproj | 9 +- .../QueryBuilderTests.cs | 2 +- .../UseWithServicesTests.cs | 5 +- .../DefaultHttpRequestTests.cs | 20 - .../Microsoft.AspNet.WebUtilities.Tests.kproj | 9 +- .../project.json | 4 +- .../CacheControlHeaderValueTest.cs | 599 +++++++++++++++ .../ContentDispositionHeaderValueTest.cs | 609 +++++++++++++++ .../ContentRangeHeaderValueTest.cs | 272 +++++++ .../CookieHeaderValueTest.cs | 229 ++++++ .../DateParserTest.cs | 58 ++ .../EntityTagHeaderValueTest.cs | 315 ++++++++ .../MediaTypeHeaderValueComparerTests.cs | 69 ++ .../MediaTypeHeaderValueTest.cs | 520 +++++++++++++ .../Microsoft.Net.Http.Headers.Tests.kproj | 23 + .../NameValueHeaderValueTest.cs | 394 ++++++++++ .../RangeConditionHeaderValueTest.cs | 174 +++++ .../RangeHeaderValueTest.cs | 183 +++++ .../RangeItemHeaderValueTest.cs | 162 ++++ .../SetCookieHeaderValueTest.cs | 259 +++++++ ...tringWithQualityHeaderValueComparerTest.cs | 64 ++ .../StringWithQualityHeaderValueTest.cs | 339 +++++++++ .../project.json | 18 + 75 files changed, 10676 insertions(+), 173 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.Http.Extensions}/QueryBuilder.cs (97%) create mode 100644 src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.Http.Extensions}/UriHelper.cs (85%) create mode 100644 src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/HeaderNames.cs create mode 100644 src/Microsoft.Net.Http.Headers/HeaderQuality.cs create mode 100644 src/Microsoft.Net.Http.Headers/HeaderUtilities.cs create mode 100644 src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/HttpParseResult.cs create mode 100644 src/Microsoft.Net.Http.Headers/HttpRuleParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs create mode 100644 src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj create mode 100644 src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/NotNullAttribute.cs create mode 100644 src/Microsoft.Net.Http.Headers/ObjectCollection.cs create mode 100644 src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs create mode 100644 src/Microsoft.Net.Http.Headers/project.json create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNet.Http.Extensions.Tests}/QueryBuilderTests.cs (98%) create mode 100644 test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj create mode 100644 test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index cdea46535d..8ae65bd225 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21916.0 +VisualStudioVersion = 14.0.22410.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -33,6 +33,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtiliti EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.kproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.kproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.kproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -173,6 +177,30 @@ Global {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|x86.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|x86.ActiveCfg = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|x86.Build.0 = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Any CPU.Build.0 = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|x86.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|x86.Build.0 = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|x86.Build.0 = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Any CPU.Build.0 = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.ActiveCfg = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -191,5 +219,7 @@ Global {AE25EF21-7F91-4B86-B73E-AF746821D339} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {A2FB7838-0031-4FAD-BA3E-83C30B3AF406} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 561cd372d7..5484c20589 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs new file mode 100644 index 0000000000..fc4438c018 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -0,0 +1,202 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Microsoft.AspNet.Http.Headers; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http +{ + public static class HeaderDictionaryTypeExtensions + { + public static RequestHeaders GetTypedHeaders(this HttpRequest request) + { + return new RequestHeaders(request.Headers); + } + + public static ResponseHeaders GetTypedHeaders(this HttpResponse response) + { + return new ResponseHeaders(response.Headers); + } + + public static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) + { + return headers.Get(name); + } + + public static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) + { + if (value == null) + { + headers.Remove(name); + } + else + { + headers[name] = value.ToString(); + } + } + + public static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) + { + if (values == null || values.Count == 0) + { + headers.Remove(name); + } + else + { + headers.SetValues(name, values.Select(value => value.ToString()).ToArray()); + } + } + + public static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) + { + if (value.HasValue) + { + headers[name] = HeaderUtilities.FormatDate(value.Value); + } + else + { + headers.Remove(name); + } + } + + public static void Append([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] object value) + { + headers.Append(name, value.ToString()); + } + + public static void AppendList([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] IList values) + { + headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + } + + private static IDictionary KnownParsers = new Dictionary() + { + { typeof(CacheControlHeaderValue), new Func(value => { CacheControlHeaderValue result; return CacheControlHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(ContentDispositionHeaderValue), new Func(value => { ContentDispositionHeaderValue result; return ContentDispositionHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(ContentRangeHeaderValue), new Func(value => { ContentRangeHeaderValue result; return ContentRangeHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(MediaTypeHeaderValue), new Func(value => { MediaTypeHeaderValue result; return MediaTypeHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(RangeConditionHeaderValue), new Func(value => { RangeConditionHeaderValue result; return RangeConditionHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(RangeHeaderValue), new Func(value => { RangeHeaderValue result; return RangeHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(EntityTagHeaderValue), new Func(value => { EntityTagHeaderValue result; return EntityTagHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(DateTimeOffset?), new Func(value => { DateTimeOffset result; return HeaderUtilities.TryParseDate(value, out result) ? result : (DateTimeOffset?)null; }) }, + { typeof(long?), new Func(value => { long result; return HeaderUtilities.TryParseInt64(value, out result) ? result : (long?)null; }) }, + }; + + private static IDictionary KnownListParsers = new Dictionary() + { + { typeof(MediaTypeHeaderValue), new Func, IList>(value => { IList result; return MediaTypeHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(StringWithQualityHeaderValue), new Func, IList>(value => { IList result; return StringWithQualityHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(CookieHeaderValue), new Func, IList>(value => { IList result; return CookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(EntityTagHeaderValue), new Func, IList>(value => { IList result; return EntityTagHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(SetCookieHeaderValue), new Func, IList>(value => { IList result; return SetCookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, + }; + + public static T Get([NotNull] this IHeaderDictionary headers, string name) + { + object temp; + if (KnownParsers.TryGetValue(typeof(T), out temp)) + { + var func = (Func)temp; + return func(headers[name]); + } + + var value = headers[name]; + if (string.IsNullOrWhiteSpace(value)) + { + return default(T); + } + + return GetViaReflection(value); + } + + public static IList GetList([NotNull] this IHeaderDictionary headers, string name) + { + object temp; + if (KnownListParsers.TryGetValue(typeof(T), out temp)) + { + var func = (Func, IList>)temp; + return func(headers.GetValues(name)); + } + + var values = headers.GetValues(name); + if (values == null || !values.Any()) + { + return null; + } + + return GetListViaReflection(values); + } + + private static T GetViaReflection(string value) + { + // TODO: Cache the reflected type for later? Only if success? + var type = typeof(T); + var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(methodInfo => + { + if (string.Equals("TryParse", methodInfo.Name, StringComparison.Ordinal) + && methodInfo.ReturnParameter.ParameterType.Equals(typeof(bool))) + { + var methodParams = methodInfo.GetParameters(); + return methodParams.Length == 2 + && methodParams[0].ParameterType.Equals(typeof(string)) + && methodParams[1].IsOut + && methodParams[1].ParameterType.Equals(type.MakeByRefType()); + } + return false; + }).FirstOrDefault(); + + if (method == null) + { + throw new NotSupportedException(string.Format( + "The given type '{0}' does not have a TryParse method with the required signature 'public static bool TryParse(string, out {0}).", nameof(T))); + } + + var parameters = new object[] { value, null }; + var success = (bool)method.Invoke(null, parameters); + if (success) + { + return (T)parameters[1]; + } + return default(T); + } + + private static IList GetListViaReflection(IList values) + { + // TODO: Cache the reflected type for later? Only if success? + var type = typeof(T); + var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(methodInfo => + { + if (string.Equals("TryParseList", methodInfo.Name, StringComparison.Ordinal) + && methodInfo.ReturnParameter.ParameterType.Equals(typeof(Boolean))) + { + var methodParams = methodInfo.GetParameters(); + return methodParams.Length == 2 + && methodParams[0].ParameterType.Equals(typeof(IList)) + && methodParams[1].IsOut + && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); + } + return false; + }).FirstOrDefault(); + + if (method == null) + { + throw new NotSupportedException(string.Format( + "The given type '{0}' does not have a TryParseList method with the required signature 'public static bool TryParseList(IList, out IList<{0}>).", nameof(T))); + } + + var parameters = new object[] { values, null }; + var success = (bool)method.Invoke(null, parameters); + if (success) + { + return (IList)parameters[1]; + } + return null; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index a9b64e3c08..b431b00760 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs similarity index 97% rename from src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs rename to src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index 28cdfa85fe..a4afbba272 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -5,9 +5,8 @@ using System; using System.Collections; using System.Collections.Generic; using System.Text; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNet.Http.Extensions { // The IEnumerable interface is required for the collection initialization syntax: new QueryBuilder() { { "key", "value" } }; public class QueryBuilder : IEnumerable> diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs new file mode 100644 index 0000000000..eeeef90b24 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -0,0 +1,259 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http.Headers +{ + public class RequestHeaders + { + public RequestHeaders([NotNull] IHeaderDictionary headers) + { + Headers = headers; + } + + public IHeaderDictionary Headers { get; private set; } + + public IList Accept + { + get + { + return Headers.GetList(HeaderNames.Accept); + } + set + { + Headers.SetList(HeaderNames.Accept, value); + } + } + + public IList AcceptCharset + { + get + { + return Headers.GetList(HeaderNames.AcceptCharset); + } + set + { + Headers.SetList(HeaderNames.AcceptCharset, value); + } + } + + public IList AcceptEncoding + { + get + { + return Headers.GetList(HeaderNames.AcceptEncoding); + } + set + { + Headers.SetList(HeaderNames.AcceptEncoding, value); + } + } + + public IList AcceptLanguage + { + get + { + return Headers.GetList(HeaderNames.AcceptLanguage); + } + set + { + Headers.SetList(HeaderNames.AcceptLanguage, value); + } + } + + public CacheControlHeaderValue CacheControl + { + get + { + return Headers.Get(HeaderNames.CacheControl); + } + set + { + Headers.Set(HeaderNames.CacheControl, value); + } + } + + public ContentDispositionHeaderValue ContentDisposition + { + get + { + return Headers.Get(HeaderNames.ContentDisposition); + } + set + { + Headers.Set(HeaderNames.ContentDisposition, value); + } + } + + public long? ContentLength + { + get + { + return Headers.Get(HeaderNames.ContentLength); + } + set + { + Headers.Set(HeaderNames.ContentLength, value.HasValue ? HeaderUtilities.FormatInt64(value.Value) : null); + } + } + + public ContentRangeHeaderValue ContentRange + { + get + { + return Headers.Get(HeaderNames.ContentRange); + } + set + { + Headers.Set(HeaderNames.ContentRange, value); + } + } + + public MediaTypeHeaderValue ContentType + { + get + { + return Headers.Get(HeaderNames.ContentType); + } + set + { + Headers.Set(HeaderNames.ContentType, value); + } + } + + public IList Cookie + { + get + { + return Headers.GetList(HeaderNames.Cookie); + } + set + { + Headers.SetList(HeaderNames.Cookie, value); + } + } + + public DateTimeOffset? Date + { + get + { + return Headers.GetDate(HeaderNames.Date); + } + set + { + Headers.SetDate(HeaderNames.Date, value); + } + } + + public DateTimeOffset? Expires + { + get + { + return Headers.GetDate(HeaderNames.Expires); + } + set + { + Headers.SetDate(HeaderNames.Expires, value); + } + } + + public HostString Host + { + get + { + return HostString.FromUriComponent(Headers[HeaderNames.Host]); + } + set + { + Headers[HeaderNames.Host] = value.ToUriComponent(); + } + } + + public IList IfMatch + { + get + { + return Headers.GetList(HeaderNames.IfMatch); + } + set + { + Headers.SetList(HeaderNames.IfMatch, value); + } + } + + public DateTimeOffset? IfModifiedSince + { + get + { + return Headers.GetDate(HeaderNames.IfModifiedSince); + } + set + { + Headers.SetDate(HeaderNames.IfModifiedSince, value); + } + } + + public IList IfNoneMatch + { + get + { + return Headers.GetList(HeaderNames.IfNoneMatch); + } + set + { + Headers.SetList(HeaderNames.IfNoneMatch, value); + } + } + + public RangeConditionHeaderValue IfRange + { + get + { + return Headers.Get(HeaderNames.IfRange); + } + set + { + Headers.Set(HeaderNames.IfRange, value); + } + } + + public DateTimeOffset? IfUnmodifiedSince + { + get + { + return Headers.GetDate(HeaderNames.IfUnmodifiedSince); + } + set + { + Headers.SetDate(HeaderNames.IfUnmodifiedSince, value); + } + } + + public DateTimeOffset? LastModified + { + get + { + return Headers.GetDate(HeaderNames.LastModified); + } + set + { + Headers.SetDate(HeaderNames.LastModified, value); + } + } + + public RangeHeaderValue Range + { + get + { + return Headers.Get(HeaderNames.Range); + } + set + { + Headers.Set(HeaderNames.Range, value); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs new file mode 100644 index 0000000000..4169f237a7 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -0,0 +1,156 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http.Extensions; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http.Headers +{ + public class ResponseHeaders + { + public ResponseHeaders([NotNull] IHeaderDictionary headers) + { + Headers = headers; + } + + public IHeaderDictionary Headers { get; private set; } + + public CacheControlHeaderValue CacheControl + { + get + { + return Headers.Get(HeaderNames.CacheControl); + } + set + { + Headers.Set(HeaderNames.CacheControl, value); + } + } + + public ContentDispositionHeaderValue ContentDisposition + { + get + { + return Headers.Get(HeaderNames.ContentDisposition); + } + set + { + Headers.Set(HeaderNames.ContentDisposition, value); + } + } + + public long? ContentLength + { + get + { + return Headers.Get(HeaderNames.ContentLength); + } + set + { + Headers.Set(HeaderNames.ContentLength, value.HasValue ? HeaderUtilities.FormatInt64(value.Value) : null); + } + } + + public ContentRangeHeaderValue ContentRange + { + get + { + return Headers.Get(HeaderNames.ContentRange); + } + set + { + Headers.Set(HeaderNames.ContentRange, value); + } + } + + public MediaTypeHeaderValue ContentType + { + get + { + return Headers.Get(HeaderNames.ContentType); + } + set + { + Headers.Set(HeaderNames.ContentType, value); + } + } + + public DateTimeOffset? Date + { + get + { + return Headers.GetDate(HeaderNames.Date); + } + set + { + Headers.SetDate(HeaderNames.Date, value); + } + } + + public EntityTagHeaderValue ETag + { + get + { + return Headers.Get(HeaderNames.ETag); + } + set + { + Headers.Set(HeaderNames.ETag, value); + } + } + public DateTimeOffset? Expires + { + get + { + return Headers.GetDate(HeaderNames.Expires); + } + set + { + Headers.SetDate(HeaderNames.Expires, value); + } + } + + public DateTimeOffset? LastModified + { + get + { + return Headers.GetDate(HeaderNames.LastModified); + } + set + { + Headers.SetDate(HeaderNames.LastModified, value); + } + } + + public UriHelper Location + { + get + { + Uri uri; + if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) + { + return new UriHelper(uri); + } + return null; + } + set + { + Headers.Set(HeaderNames.Location, value); + } + } + + public IList SetCookie + { + get + { + return Headers.GetList(HeaderNames.SetCookie); + } + set + { + Headers.SetList(HeaderNames.SetCookie, value); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs similarity index 85% rename from src/Microsoft.AspNet.WebUtilities/UriHelper.cs rename to src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 491c599d20..e271d41380 100644 --- a/src/Microsoft.AspNet.WebUtilities/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -1,7 +1,9 @@ -using System; -using Microsoft.AspNet.Http; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.WebUtilities +using System; + +namespace Microsoft.AspNet.Http.Extensions { /// /// A helper class for constructing encoded Uris for use in headers and other Uris. @@ -44,6 +46,11 @@ namespace Microsoft.AspNet.WebUtilities public FragmentString Fragment { get; set; } + public bool IsFullUri + { + get { return !string.IsNullOrEmpty(Scheme) && Host.HasValue; } + } + // Always returns at least '/' public string GetPartialUri() { @@ -67,6 +74,11 @@ namespace Microsoft.AspNet.WebUtilities return Scheme + "://" + Host + path + Query + Fragment; } + public override string ToString() + { + return IsFullUri ? GetFullUri() : GetPartialUri(); + } + public static string Create(PathString pathBase, PathString path = new PathString(), QueryString query = new QueryString(), diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index cbc45a6ddc..be234399ec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,8 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*" + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { "aspnet50" : { diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 8048152a08..5ab2010a59 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -93,30 +93,6 @@ namespace Microsoft.AspNet.Http /// The Content-Type header. public abstract string ContentType { get; set; } - /// - /// Gets or sets the Cache-Control header. - /// - /// The Cache-Control header. - // (TODO header conventions?) public abstract string CacheControl { get; set; } - - /// - /// Gets or sets the Media-Type header. - /// - /// The Media-Type header. - // (TODO header conventions?) public abstract string MediaType { get; set; } - - /// - /// Gets or set the Accept header. - /// - /// The Accept header. - public abstract string Accept { get; set; } - - /// - /// Gets or set the Accept-Charset header. - /// - /// The Accept-Charset header. - public abstract string AcceptCharset { get; set; } - /// /// Gets or set the owin.RequestBody Stream. /// diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 1ccadbc30a..3a68cce3bc 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 25a0e7caf2..90f93a0f7b 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index b0acecf075..4c7801eada 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 434817129d..3332221be8 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -294,7 +294,7 @@ namespace Microsoft.AspNet.Owin public bool ContainsKey(Type key) { // Does this type implement the requested interface? - if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) + if (key.GetTypeInfo().IsAssignableFrom(GetType().GetTypeInfo())) { // Check for conditional features if (key == typeof(IHttpSendFileFeature)) diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs index 10aad2bfa2..2ef4d29476 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using Microsoft.AspNet.Http; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.PipelineCore.Collections { @@ -26,11 +26,10 @@ namespace Microsoft.AspNet.PipelineCore.Collections private static string GetName(string contentDisposition) { - // TODO: Strongly typed headers will take care of this // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" - var offset = contentDisposition.IndexOf("name=\"") + "name=\"".Length; - var key = contentDisposition.Substring(offset, contentDisposition.IndexOf("\"", offset) - offset); // Remove quotes - return key; + ContentDispositionHeaderValue cd; + ContentDispositionHeaderValue.TryParse(contentDisposition, out cd); + return HeaderUtilities.RemoveQuotes(cd?.Name); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index dfd54393cc..bf362c94ed 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -16,6 +16,10 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// public class HeaderDictionary : IHeaderDictionary { + public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) + { + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index da839c1f16..d95c37b9c3 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -150,18 +150,6 @@ namespace Microsoft.AspNet.PipelineCore set { Headers[Constants.Headers.ContentType] = value; } } - public override string Accept - { - get { return Headers[Constants.Headers.Accept]; } - set { Headers[Constants.Headers.Accept] = value; } - } - - public override string AcceptCharset - { - get { return Headers[Constants.Headers.AcceptCharset]; } - set { Headers[Constants.Headers.AcceptCharset] = value; } - } - public override bool HasFormContentType { get { return FormFeature.HasFormContentType; } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 8d20871688..0180728be2 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -11,6 +11,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.WebUtilities; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.PipelineCore { @@ -28,6 +29,16 @@ namespace Microsoft.AspNet.PipelineCore _request = request; } + private MediaTypeHeaderValue ContentType + { + get + { + MediaTypeHeaderValue mt; + MediaTypeHeaderValue.TryParse(_request.ContentType, out mt); + return mt; + } + } + public bool HasFormContentType { get @@ -38,7 +49,8 @@ namespace Microsoft.AspNet.PipelineCore return true; } - return HasApplicationFormContentType() || HasMultipartFormContentType(); + var conentType = ContentType; + return HasApplicationFormContentType(conentType) || HasMultipartFormContentType(conentType); } } @@ -82,23 +94,25 @@ namespace Microsoft.AspNet.PipelineCore // Some of these code paths use StreamReader which does not support cancellation tokens. using (cancellationToken.Register(_request.HttpContext.Abort)) { + var contentType = ContentType; // Check the content-type - if (HasApplicationFormContentType()) + if (HasApplicationFormContentType(contentType)) { - // TODO: Read the charset from the content-type header after we get strongly typed headers - formFields = await FormReader.ReadFormAsync(_request.Body, cancellationToken); + var encoding = FilterEncoding(contentType.Encoding); + formFields = await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken); } - else if (HasMultipartFormContentType()) + else if (HasMultipartFormContentType(contentType)) { var formAccumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); - var boundary = GetBoundary(_request.ContentType); + var boundary = GetBoundary(contentType); var multipartReader = new MultipartReader(boundary, _request.Body); var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { var headers = new HeaderDictionary(section.Headers); - var contentDisposition = headers["Content-Disposition"]; + ContentDispositionHeaderValue contentDisposition; + ContentDispositionHeaderValue.TryParse(headers.Get(HeaderNames.ContentDisposition), out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { // Find the end @@ -116,12 +130,11 @@ namespace Microsoft.AspNet.PipelineCore // // value - // TODO: Strongly typed headers will take care of this - var offset = contentDisposition.IndexOf("name=") + "name=".Length; - var key = contentDisposition.Substring(offset + 1, contentDisposition.Length - offset - 2); // Remove quotes - - // TODO: Read the charset from the content-disposition header after we get strongly typed headers - using (var reader = new StreamReader(section.Body, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) + var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); + MediaTypeHeaderValue mediaType; + MediaTypeHeaderValue.TryParse(headers.Get(HeaderNames.ContentType), out mediaType); + var encoding = FilterEncoding(mediaType?.Encoding); + using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { var value = await reader.ReadToEndAsync(); formAccumulator.Append(key, value); @@ -129,7 +142,7 @@ namespace Microsoft.AspNet.PipelineCore } else { - System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + contentDisposition); + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers.Get(HeaderNames.ContentDisposition)); } section = await multipartReader.ReadNextSectionAsync(cancellationToken); @@ -143,48 +156,50 @@ namespace Microsoft.AspNet.PipelineCore return Form; } - private bool HasApplicationFormContentType() + private Encoding FilterEncoding(Encoding encoding) { - // TODO: Strongly typed headers will take care of this for us - // Content-Type: application/x-www-form-urlencoded; charset=utf-8 - var contentType = _request.ContentType; - return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase) >= 0; - } - - private bool HasMultipartFormContentType() - { - // TODO: Strongly typed headers will take care of this for us - // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq - var contentType = _request.ContentType; - return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("multipart/form-data", StringComparison.OrdinalIgnoreCase) >= 0; - } - - private bool HasFormDataContentDisposition(string contentDisposition) - { - // TODO: Strongly typed headers will take care of this for us - // Content-Disposition: form-data; name="key"; - return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && !contentDisposition.Contains("filename="); - } - - private bool HasFileContentDisposition(string contentDisposition) - { - // TODO: Strongly typed headers will take care of this for us - // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" - return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && contentDisposition.Contains("filename="); - } - - // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq - private static string GetBoundary(string contentType) - { - // TODO: Strongly typed headers will take care of this for us - // TODO: Limit the length of boundary we accept. The spec says ~70 chars. - var elements = contentType.Split(' '); - var element = elements.Where(entry => entry.StartsWith("boundary=")).First(); - var boundary = element.Substring("boundary=".Length); - // Remove quotes - if (boundary.Length >= 2 && boundary[0] == '"' && boundary[boundary.Length - 1] == '"') + // UTF-7 is insecure and should not be honored. UTF-8 will succeed for most cases. + if (encoding == null || Encoding.UTF7.Equals(encoding)) { - boundary = boundary.Substring(1, boundary.Length - 2); + return Encoding.UTF8; + } + return encoding; + } + + private bool HasApplicationFormContentType(MediaTypeHeaderValue contentType) + { + // Content-Type: application/x-www-form-urlencoded; charset=utf-8 + return contentType != null && contentType.MediaType.Equals("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase); + } + + private bool HasMultipartFormContentType(MediaTypeHeaderValue contentType) + { + // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq + return contentType != null && contentType.MediaType.Equals("multipart/form-data", StringComparison.OrdinalIgnoreCase); + } + + private bool HasFormDataContentDisposition(ContentDispositionHeaderValue contentDisposition) + { + // Content-Disposition: form-data; name="key"; + return contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") + && string.IsNullOrEmpty(contentDisposition.FileName) && string.IsNullOrEmpty(contentDisposition.FileNameStar); + } + + private bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition) + { + // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" + return contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") + && (!string.IsNullOrEmpty(contentDisposition.FileName) || !string.IsNullOrEmpty(contentDisposition.FileNameStar)); + } + + // Content-Type: multipart/form-data; boundary="----WebKitFormBoundarymx2fSWqWSd0OxQqq" + // TODO: Limit the length of boundary we accept. The spec says ~70 chars. + private static string GetBoundary(MediaTypeHeaderValue contentType) + { + var boundary = HeaderUtilities.RemoveQuotes(contentType.Boundary); + if (string.IsNullOrWhiteSpace(boundary)) + { + throw new InvalidOperationException("Missing content-type boundary."); } return boundary; } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index e0ed2c7333..48dab300ac 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -518,25 +518,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure request.HttpContext.Items[key] = value; } - internal static IDictionary GetCookies(HttpRequest request) - { - var cookies = GetItem>(request, "Microsoft.Owin.Cookies#dictionary"); - if (cookies == null) - { - cookies = new Dictionary(StringComparer.Ordinal); - SetItem(request, "Microsoft.Owin.Cookies#dictionary", cookies); - } - - string text = GetHeader(request.Headers, "Cookie"); - if (GetItem(request, "Microsoft.Owin.Cookies#text") != text) - { - cookies.Clear(); - ParseDelimited(text, SemicolonAndComma, AddCookieCallback, cookies); - SetItem(request, "Microsoft.Owin.Cookies#text", text); - } - return cookies; - } - internal static void ParseCookies(string cookiesHeader, IDictionary cookiesCollection) { ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, cookiesCollection); diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 3a0556def8..96b305e9b6 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 6b1a0de735..8eaabc9a33 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -6,7 +6,9 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*" + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, "frameworks": { "aspnet50": {}, diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 7c6a034f78..1682e7c5b2 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -26,10 +26,9 @@ namespace Microsoft.AspNet.WebUtilities _reader = new StringReader(data); } - // TODO: Encoding - public FormReader([NotNull] Stream stream) + public FormReader([NotNull] Stream stream, [NotNull] Encoding encoding) { - _reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); + _reader = new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); } // Format: key1=value1&key2=value2 @@ -168,11 +167,21 @@ namespace Microsoft.AspNet.WebUtilities /// /// Parses an HTTP form body. /// - /// The HTTP form body to parse. + /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static async Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) { - var reader = new FormReader(stream); + return ReadFormAsync(stream, Encoding.UTF8, cancellationToken); + } + + /// + /// Parses an HTTP form body. + /// + /// The HTTP form body to parse. + /// The collection containing the parsed HTTP form body. + public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) + { + var reader = new FormReader(stream, encoding); var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); var pair = await reader.ReadNextPairAsync(cancellationToken); diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index 75dd8975e7..efc8a50504 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 963fcc3178..e4e0e0cb08 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,15 +2,17 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods such as URL encoding.", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { "aspnet50": { }, "aspnetcore50": { "dependencies": { + "System.Collections": "4.0.10-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*" + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs new file mode 100644 index 0000000000..679394e42d --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + internal abstract class BaseHeaderParser : HttpHeaderParser + { + protected BaseHeaderParser(bool supportsMultipleValues) + : base(supportsMultipleValues) + { + } + + protected abstract int GetParsedValueLength(string value, int startIndex, out T parsedValue); + + public sealed override bool TryParseValue(string value, ref int index, out T parsedValue) + { + parsedValue = default(T); + + // If multiple values are supported (i.e. list of values), then accept an empty string: The header may + // be added multiple times to the request/response message. E.g. + // Accept: text/xml; q=1 + // Accept: + // Accept: text/plain; q=0.2 + if (string.IsNullOrEmpty(value) || (index == value.Length)) + { + return SupportsMultipleValues; + } + + var separatorFound = false; + var current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(value, index, SupportsMultipleValues, + out separatorFound); + + if (separatorFound && !SupportsMultipleValues) + { + return false; // leading separators not allowed if we don't support multiple values. + } + + if (current == value.Length) + { + if (SupportsMultipleValues) + { + index = current; + } + return SupportsMultipleValues; + } + + T result = default(T); + var length = GetParsedValueLength(value, current, out result); + + if (length == 0) + { + return false; + } + + current = current + length; + current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(value, current, SupportsMultipleValues, + out separatorFound); + + // If we support multiple values and we've not reached the end of the string, then we must have a separator. + if ((separatorFound && !SupportsMultipleValues) || (!separatorFound && (current < value.Length))) + { + return false; + } + + index = current; + parsedValue = result; + return true; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs new file mode 100644 index 0000000000..1de23f206f --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -0,0 +1,603 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class CacheControlHeaderValue + { + private const string MaxAgeString = "max-age"; + private const string MaxStaleString = "max-stale"; + private const string MinFreshString = "min-fresh"; + private const string MustRevalidateString = "must-revalidate"; + private const string NoCacheString = "no-cache"; + private const string NoStoreString = "no-store"; + private const string NoTransformString = "no-transform"; + private const string OnlyIfCachedString = "only-if-cached"; + private const string PrivateString = "private"; + private const string ProxyRevalidateString = "proxy-revalidate"; + private const string PublicString = "public"; + private const string SharedMaxAgeString = "s-maxage"; + + // The Cache-Control header is special: It is a header supporting a list of values, but we represent the list + // as _one_ instance of CacheControlHeaderValue. I.e we set 'SupportsMultipleValues' to 'true' since it is + // OK to have multiple Cache-Control headers in a request/response message. However, after parsing all + // Cache-Control headers, only one instance of CacheControlHeaderValue is created (if all headers contain valid + // values, otherwise we may have multiple strings containing the invalid values). + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(true, GetCacheControlLength); + + private static readonly Action CheckIsValidTokenAction = CheckIsValidToken; + + private bool _noCache; + private ICollection _noCacheHeaders; + private bool _noStore; + private TimeSpan? _maxAge; + private TimeSpan? _sharedMaxAge; + private bool _maxStale; + private TimeSpan? _maxStaleLimit; + private TimeSpan? _minFresh; + private bool _noTransform; + private bool _onlyIfCached; + private bool _public; + private bool _private; + private ICollection _privateHeaders; + private bool _mustRevalidate; + private bool _proxyRevalidate; + private ICollection _extensions; + + public CacheControlHeaderValue() + { + // This type is unique in that there is no single required parameter. + } + + public bool NoCache + { + get { return _noCache; } + set { _noCache = value; } + } + + public ICollection NoCacheHeaders + { + get + { + if (_noCacheHeaders == null) + { + _noCacheHeaders = new ObjectCollection(CheckIsValidTokenAction); + } + return _noCacheHeaders; + } + } + + public bool NoStore + { + get { return _noStore; } + set { _noStore = value; } + } + + public TimeSpan? MaxAge + { + get { return _maxAge; } + set { _maxAge = value; } + } + + public TimeSpan? SharedMaxAge + { + get { return _sharedMaxAge; } + set { _sharedMaxAge = value; } + } + + public bool MaxStale + { + get { return _maxStale; } + set { _maxStale = value; } + } + + public TimeSpan? MaxStaleLimit + { + get { return _maxStaleLimit; } + set { _maxStaleLimit = value; } + } + + public TimeSpan? MinFresh + { + get { return _minFresh; } + set { _minFresh = value; } + } + + public bool NoTransform + { + get { return _noTransform; } + set { _noTransform = value; } + } + + public bool OnlyIfCached + { + get { return _onlyIfCached; } + set { _onlyIfCached = value; } + } + + public bool Public + { + get { return _public; } + set { _public = value; } + } + + public bool Private + { + get { return _private; } + set { _private = value; } + } + + public ICollection PrivateHeaders + { + get + { + if (_privateHeaders == null) + { + _privateHeaders = new ObjectCollection(CheckIsValidTokenAction); + } + return _privateHeaders; + } + } + + public bool MustRevalidate + { + get { return _mustRevalidate; } + set { _mustRevalidate = value; } + } + + public bool ProxyRevalidate + { + get { return _proxyRevalidate; } + set { _proxyRevalidate = value; } + } + + public ICollection Extensions + { + get + { + if (_extensions == null) + { + _extensions = new ObjectCollection(); + } + return _extensions; + } + } + + public override string ToString() + { + var sb = new StringBuilder(); + + AppendValueIfRequired(sb, _noStore, NoStoreString); + AppendValueIfRequired(sb, _noTransform, NoTransformString); + AppendValueIfRequired(sb, _onlyIfCached, OnlyIfCachedString); + AppendValueIfRequired(sb, _public, PublicString); + AppendValueIfRequired(sb, _mustRevalidate, MustRevalidateString); + AppendValueIfRequired(sb, _proxyRevalidate, ProxyRevalidateString); + + if (_noCache) + { + AppendValueWithSeparatorIfRequired(sb, NoCacheString); + if ((_noCacheHeaders != null) && (_noCacheHeaders.Count > 0)) + { + sb.Append("=\""); + AppendValues(sb, _noCacheHeaders); + sb.Append('\"'); + } + } + + if (_maxAge.HasValue) + { + AppendValueWithSeparatorIfRequired(sb, MaxAgeString); + sb.Append('='); + sb.Append(((int)_maxAge.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + + if (_sharedMaxAge.HasValue) + { + AppendValueWithSeparatorIfRequired(sb, SharedMaxAgeString); + sb.Append('='); + sb.Append(((int)_sharedMaxAge.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + + if (_maxStale) + { + AppendValueWithSeparatorIfRequired(sb, MaxStaleString); + if (_maxStaleLimit.HasValue) + { + sb.Append('='); + sb.Append(((int)_maxStaleLimit.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + } + + if (_minFresh.HasValue) + { + AppendValueWithSeparatorIfRequired(sb, MinFreshString); + sb.Append('='); + sb.Append(((int)_minFresh.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + + if (_private) + { + AppendValueWithSeparatorIfRequired(sb, PrivateString); + if ((_privateHeaders != null) && (_privateHeaders.Count > 0)) + { + sb.Append("=\""); + AppendValues(sb, _privateHeaders); + sb.Append('\"'); + } + } + + NameValueHeaderValue.ToString(_extensions, ',', false, sb); + + return sb.ToString(); + } + + public override bool Equals(object obj) + { + var other = obj as CacheControlHeaderValue; + + if (other == null) + { + return false; + } + + if ((_noCache != other._noCache) || (_noStore != other._noStore) || (_maxAge != other._maxAge) || + (_sharedMaxAge != other._sharedMaxAge) || (_maxStale != other._maxStale) || + (_maxStaleLimit != other._maxStaleLimit) || (_minFresh != other._minFresh) || + (_noTransform != other._noTransform) || (_onlyIfCached != other._onlyIfCached) || + (_public != other._public) || (_private != other._private) || + (_mustRevalidate != other._mustRevalidate) || (_proxyRevalidate != other._proxyRevalidate)) + { + return false; + } + + if (!HeaderUtilities.AreEqualCollections(_noCacheHeaders, other._noCacheHeaders, + StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + if (!HeaderUtilities.AreEqualCollections(_privateHeaders, other._privateHeaders, + StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + if (!HeaderUtilities.AreEqualCollections(_extensions, other._extensions)) + { + return false; + } + + return true; + } + + public override int GetHashCode() + { + // Use a different bit for bool fields: bool.GetHashCode() will return 0 (false) or 1 (true). So we would + // end up having the same hash code for e.g. two instances where one has only noCache set and the other + // only noStore. + int result = _noCache.GetHashCode() ^ (_noStore.GetHashCode() << 1) ^ (_maxStale.GetHashCode() << 2) ^ + (_noTransform.GetHashCode() << 3) ^ (_onlyIfCached.GetHashCode() << 4) ^ + (_public.GetHashCode() << 5) ^ (_private.GetHashCode() << 6) ^ + (_mustRevalidate.GetHashCode() << 7) ^ (_proxyRevalidate.GetHashCode() << 8); + + // XOR the hashcode of timespan values with different numbers to make sure two instances with the same + // timespan set on different fields result in different hashcodes. + result = result ^ (_maxAge.HasValue ? _maxAge.Value.GetHashCode() ^ 1 : 0) ^ + (_sharedMaxAge.HasValue ? _sharedMaxAge.Value.GetHashCode() ^ 2 : 0) ^ + (_maxStaleLimit.HasValue ? _maxStaleLimit.Value.GetHashCode() ^ 4 : 0) ^ + (_minFresh.HasValue ? _minFresh.Value.GetHashCode() ^ 8 : 0); + + if ((_noCacheHeaders != null) && (_noCacheHeaders.Count > 0)) + { + foreach (var noCacheHeader in _noCacheHeaders) + { + result = result ^ StringComparer.OrdinalIgnoreCase.GetHashCode(noCacheHeader); + } + } + + if ((_privateHeaders != null) && (_privateHeaders.Count > 0)) + { + foreach (var privateHeader in _privateHeaders) + { + result = result ^ StringComparer.OrdinalIgnoreCase.GetHashCode(privateHeader); + } + } + + if ((_extensions != null) && (_extensions.Count > 0)) + { + foreach (var extension in _extensions) + { + result = result ^ extension.GetHashCode(); + } + } + + return result; + } + + public static CacheControlHeaderValue Parse(string input) + { + int index = 0; + // Cache-Control is unusual because there are no required values so the parser will succeed for an empty string, but still return null. + var result = Parser.ParseValue(input, ref index); + if (result == null) + { + throw new FormatException("No cache directives found."); + } + return result; + } + + public static bool TryParse(string input, out CacheControlHeaderValue parsedValue) + { + int index = 0; + // Cache-Control is unusual because there are no required values so the parser will succeed for an empty string, but still return null. + if (Parser.TryParseValue(input, ref index, out parsedValue) && parsedValue != null) + { + return true; + } + parsedValue = null; + return false; + } + + private static int GetCacheControlLength(string input, int startIndex, out CacheControlHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Cache-Control header consists of a list of name/value pairs, where the value is optional. So use an + // instance of NameValueHeaderParser to parse the string. + var current = startIndex; + NameValueHeaderValue nameValue = null; + var nameValueList = new List(); + while (current < input.Length) + { + if (!NameValueHeaderValue.MultipleValueParser.TryParseValue(input, ref current, out nameValue)) + { + return 0; + } + + nameValueList.Add(nameValue as NameValueHeaderValue); + } + + // If we get here, we were able to successfully parse the string as list of name/value pairs. Now analyze + // the name/value pairs. + + // Cache-Control is a header supporting lists of values. However, expose the header as an instance of + // CacheControlHeaderValue. + var result = new CacheControlHeaderValue(); + + if (!TrySetCacheControlValues(result, nameValueList)) + { + return 0; + } + + parsedValue = result; + + // If we get here we successfully parsed the whole string. + return input.Length - startIndex; + } + + private static bool TrySetCacheControlValues(CacheControlHeaderValue cc, + List nameValueList) + { + foreach (NameValueHeaderValue nameValue in nameValueList) + { + var success = true; + string name = nameValue.Name.ToLowerInvariant(); + + switch (name) + { + case NoCacheString: + success = TrySetOptionalTokenList(nameValue, ref cc._noCache, ref cc._noCacheHeaders); + break; + + case NoStoreString: + success = TrySetTokenOnlyValue(nameValue, ref cc._noStore); + break; + + case MaxAgeString: + success = TrySetTimeSpan(nameValue, ref cc._maxAge); + break; + + case MaxStaleString: + success = ((nameValue.Value == null) || TrySetTimeSpan(nameValue, ref cc._maxStaleLimit)); + if (success) + { + cc._maxStale = true; + } + break; + + case MinFreshString: + success = TrySetTimeSpan(nameValue, ref cc._minFresh); + break; + + case NoTransformString: + success = TrySetTokenOnlyValue(nameValue, ref cc._noTransform); + break; + + case OnlyIfCachedString: + success = TrySetTokenOnlyValue(nameValue, ref cc._onlyIfCached); + break; + + case PublicString: + success = TrySetTokenOnlyValue(nameValue, ref cc._public); + break; + + case PrivateString: + success = TrySetOptionalTokenList(nameValue, ref cc._private, ref cc._privateHeaders); + break; + + case MustRevalidateString: + success = TrySetTokenOnlyValue(nameValue, ref cc._mustRevalidate); + break; + + case ProxyRevalidateString: + success = TrySetTokenOnlyValue(nameValue, ref cc._proxyRevalidate); + break; + + case SharedMaxAgeString: + success = TrySetTimeSpan(nameValue, ref cc._sharedMaxAge); + break; + + default: + cc.Extensions.Add(nameValue); // success is always true + break; + } + + if (!success) + { + return false; + } + } + + return true; + } + + private static bool TrySetTokenOnlyValue(NameValueHeaderValue nameValue, ref bool boolField) + { + if (nameValue.Value != null) + { + return false; + } + + boolField = true; + return true; + } + + private static bool TrySetOptionalTokenList(NameValueHeaderValue nameValue, ref bool boolField, + ref ICollection destination) + { + Contract.Requires(nameValue != null); + + if (nameValue.Value == null) + { + boolField = true; + return true; + } + + // We need the string to be at least 3 chars long: 2x quotes and at least 1 character. Also make sure we + // have a quoted string. Note that NameValueHeaderValue will never have leading/trailing whitespaces. + var valueString = nameValue.Value; + if ((valueString.Length < 3) || (valueString[0] != '\"') || (valueString[valueString.Length - 1] != '\"')) + { + return false; + } + + // We have a quoted string. Now verify that the string contains a list of valid tokens separated by ','. + var current = 1; // skip the initial '"' character. + var maxLength = valueString.Length - 1; // -1 because we don't want to parse the final '"'. + var separatorFound = false; + var originalValueCount = destination == null ? 0 : destination.Count; + while (current < maxLength) + { + current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(valueString, current, true, + out separatorFound); + + if (current == maxLength) + { + break; + } + + var tokenLength = HttpRuleParser.GetTokenLength(valueString, current); + + if (tokenLength == 0) + { + // We already skipped whitespaces and separators. If we don't have a token it must be an invalid + // character. + return false; + } + + if (destination == null) + { + destination = new ObjectCollection(CheckIsValidTokenAction); + } + + destination.Add(valueString.Substring(current, tokenLength)); + + current = current + tokenLength; + } + + // After parsing a valid token list, we expect to have at least one value + if ((destination != null) && (destination.Count > originalValueCount)) + { + boolField = true; + return true; + } + + return false; + } + + private static bool TrySetTimeSpan(NameValueHeaderValue nameValue, ref TimeSpan? timeSpan) + { + Contract.Requires(nameValue != null); + + if (nameValue.Value == null) + { + return false; + } + + int seconds; + if (!HeaderUtilities.TryParseInt32(nameValue.Value, out seconds)) + { + return false; + } + + timeSpan = new TimeSpan(0, 0, seconds); + + return true; + } + + private static void AppendValueIfRequired(StringBuilder sb, bool appendValue, string value) + { + if (appendValue) + { + AppendValueWithSeparatorIfRequired(sb, value); + } + } + + private static void AppendValueWithSeparatorIfRequired(StringBuilder sb, string value) + { + if (sb.Length > 0) + { + sb.Append(", "); + } + sb.Append(value); + } + + private static void AppendValues(StringBuilder sb, IEnumerable values) + { + var first = true; + foreach (string value in values) + { + if (first) + { + first = false; + } + else + { + sb.Append(", "); + } + + sb.Append(value); + } + } + + private static void CheckIsValidToken(string item) + { + HeaderUtilities.CheckValidToken(item, "item"); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs new file mode 100644 index 0000000000..8a96da2efd --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -0,0 +1,702 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // Note this is for use both in HTTP (https://tools.ietf.org/html/rfc6266) and MIME (https://tools.ietf.org/html/rfc2183) + public class ContentDispositionHeaderValue + { + private const string FileNameString = "filename"; + private const string NameString = "name"; + private const string FileNameStarString = "filename*"; + private const string CreationDateString = "creation-date"; + private const string ModificationDateString = "modification-date"; + private const string ReadDateString = "read-date"; + private const string SizeString = "size"; + + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetDispositionTypeLength); + + // Use list instead of dictionary since we may have multiple parameters with the same name. + private ICollection _parameters; + private string _dispositionType; + + private ContentDispositionHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public ContentDispositionHeaderValue(string dispositionType) + { + CheckDispositionTypeFormat(dispositionType, "dispositionType"); + _dispositionType = dispositionType; + } + + public string DispositionType + { + get { return _dispositionType; } + set + { + CheckDispositionTypeFormat(value, "value"); + _dispositionType = value; + } + } + + public ICollection Parameters + { + get + { + if (_parameters == null) + { + _parameters = new ObjectCollection(); + } + return _parameters; + } + } + + // Helpers to access specific parameters in the list + + public string Name + { + get { return GetName(NameString); } + set { SetName(NameString, value); } + } + + public string FileName + { + get { return GetName(FileNameString); } + set { SetName(FileNameString, value); } + } + + public string FileNameStar + { + get { return GetName(FileNameStarString); } + set { SetName(FileNameStarString, value); } + } + + public DateTimeOffset? CreationDate + { + get { return GetDate(CreationDateString); } + set { SetDate(CreationDateString, value); } + } + + public DateTimeOffset? ModificationDate + { + get { return GetDate(ModificationDateString); } + set { SetDate(ModificationDateString, value); } + } + + public DateTimeOffset? ReadDate + { + get { return GetDate(ReadDateString); } + set { SetDate(ReadDateString, value); } + } + + public long? Size + { + get + { + var sizeParameter = NameValueHeaderValue.Find(_parameters, SizeString); + ulong value; + if (sizeParameter != null) + { + string sizeString = sizeParameter.Value; + if (UInt64.TryParse(sizeString, NumberStyles.Integer, CultureInfo.InvariantCulture, out value)) + { + return (long)value; + } + } + return null; + } + set + { + var sizeParameter = NameValueHeaderValue.Find(_parameters, SizeString); + if (value == null) + { + // Remove parameter + if (sizeParameter != null) + { + _parameters.Remove(sizeParameter); + } + } + else if (value < 0) + { + throw new ArgumentOutOfRangeException("value"); + } + else if (sizeParameter != null) + { + sizeParameter.Value = value.Value.ToString(CultureInfo.InvariantCulture); + } + else + { + string sizeString = value.Value.ToString(CultureInfo.InvariantCulture); + _parameters.Add(new NameValueHeaderValue(SizeString, sizeString)); + } + } + } + + /// + /// Sets both FileName and FileNameStar using encodings appropriate for HTTP headers. + /// + /// + public void SetHttpFileName(string fileName) + { + if (!string.IsNullOrEmpty(fileName)) + { + FileName = Sanatize(fileName); + } + else + { + FileName = fileName; + } + FileNameStar = fileName; + } + + /// + /// Sets the FileName parameter using encodings appropriate for MIME headers. + /// The FileNameStar paraemter is removed. + /// + /// + public void SetMimeFileName(string fileName) + { + FileNameStar = null; + FileName = fileName; + } + + public override string ToString() + { + return _dispositionType + NameValueHeaderValue.ToString(_parameters, ';', true); + } + + public override bool Equals(object obj) + { + var other = obj as ContentDispositionHeaderValue; + + if (other == null) + { + return false; + } + + return (string.Compare(_dispositionType, other._dispositionType, StringComparison.OrdinalIgnoreCase) == 0) && + HeaderUtilities.AreEqualCollections(_parameters, other._parameters); + } + + public override int GetHashCode() + { + // The dispositionType string is case-insensitive. + return StringComparer.OrdinalIgnoreCase.GetHashCode(_dispositionType) ^ NameValueHeaderValue.GetHashCode(_parameters); + } + + public static ContentDispositionHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out ContentDispositionHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetDispositionTypeLength(string input, int startIndex, out ContentDispositionHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + string dispositionType = null; + var dispositionTypeLength = GetDispositionTypeExpressionLength(input, startIndex, out dispositionType); + + if (dispositionTypeLength == 0) + { + return 0; + } + + var current = startIndex + dispositionTypeLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + var contentDispositionHeader = new ContentDispositionHeaderValue(); + contentDispositionHeader._dispositionType = dispositionType; + + // If we're not done and we have a parameter delimiter, then we have a list of parameters. + if ((current < input.Length) && (input[current] == ';')) + { + current++; // skip delimiter. + int parameterLength = NameValueHeaderValue.GetNameValueListLength(input, current, ';', + contentDispositionHeader.Parameters); + + parsedValue = contentDispositionHeader; + return current + parameterLength - startIndex; + } + + // We have a ContentDisposition header without parameters. + parsedValue = contentDispositionHeader; + return current - startIndex; + } + + private static int GetDispositionTypeExpressionLength(string input, int startIndex, out string dispositionType) + { + Contract.Requires((input != null) && (input.Length > 0) && (startIndex < input.Length)); + + // This method just parses the disposition type string, it does not parse parameters. + dispositionType = null; + + // Parse the disposition type, i.e. in content-disposition string + // "; param1=value1; param2=value2" + var typeLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (typeLength == 0) + { + return 0; + } + + dispositionType = input.Substring(startIndex, typeLength); + return typeLength; + } + + private static void CheckDispositionTypeFormat(string dispositionType, string parameterName) + { + if (string.IsNullOrEmpty(dispositionType)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + string tempDispositionType; + var dispositionTypeLength = GetDispositionTypeExpressionLength(dispositionType, 0, out tempDispositionType); + if ((dispositionTypeLength == 0) || (tempDispositionType.Length != dispositionType.Length)) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, + "Invalid disposition type '{0}'.", dispositionType)); + } + } + + // Gets a parameter of the given name and attempts to extract a date. + // Returns null if the parameter is not present or the format is incorrect. + private DateTimeOffset? GetDate(string parameter) + { + var dateParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (dateParameter != null) + { + string dateString = dateParameter.Value; + // Should have quotes, remove them. + if (IsQuoted(dateString)) + { + dateString = dateString.Substring(1, dateString.Length - 2); + } + DateTimeOffset date; + if (HttpRuleParser.TryStringToDate(dateString, out date)) + { + return date; + } + } + return null; + } + + // Add the given parameter to the list. Remove if date is null. + private void SetDate(string parameter, DateTimeOffset? date) + { + var dateParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (date == null) + { + // Remove parameter + if (dateParameter != null) + { + _parameters.Remove(dateParameter); + } + } + else + { + // Must always be quoted + var dateString = string.Format(CultureInfo.InvariantCulture, "\"{0}\"", HttpRuleParser.DateToString(date.Value)); + if (dateParameter != null) + { + dateParameter.Value = dateString; + } + else + { + Parameters.Add(new NameValueHeaderValue(parameter, dateString)); + } + } + } + + // Gets a parameter of the given name and attempts to decode it if necessary. + // Returns null if the parameter is not present or the raw value if the encoding is incorrect. + private string GetName(string parameter) + { + var nameParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (nameParameter != null) + { + string result; + // filename*=utf-8'lang'%7FMyString + if (parameter.EndsWith("*", StringComparison.Ordinal)) + { + if (TryDecode5987(nameParameter.Value, out result)) + { + return result; + } + return null; // Unrecognized encoding + } + + // filename="=?utf-8?B?BDFSDFasdfasdc==?=" + if (TryDecodeMime(nameParameter.Value, out result)) + { + return result; + } + // May not have been encoded + return nameParameter.Value; + } + return null; + } + + // Add/update the given parameter in the list, encoding if necessary. + // Remove if value is null/Empty + private void SetName(string parameter, string value) + { + var nameParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (string.IsNullOrEmpty(value)) + { + // Remove parameter + if (nameParameter != null) + { + _parameters.Remove(nameParameter); + } + } + else + { + var processedValue = string.Empty; + if (parameter.EndsWith("*", StringComparison.Ordinal)) + { + processedValue = Encode5987(value); + } + else + { + processedValue = EncodeAndQuoteMime(value); + } + + if (nameParameter != null) + { + nameParameter.Value = processedValue; + } + else + { + Parameters.Add(new NameValueHeaderValue(parameter, processedValue)); + } + } + } + + // Returns input for decoding failures, as the content might not be encoded + private string EncodeAndQuoteMime(string input) + { + var result = input; + var needsQuotes = false; + // Remove bounding quotes, they'll get re-added later + if (IsQuoted(result)) + { + result = result.Substring(1, result.Length - 2); + needsQuotes = true; + } + + if (RequiresEncoding(result)) + { + needsQuotes = true; // Encoded data must always be quoted, the equals signs are invalid in tokens + result = EncodeMime(result); // =?utf-8?B?asdfasdfaesdf?= + } + else if (!needsQuotes && HttpRuleParser.GetTokenLength(result, 0) != result.Length) + { + needsQuotes = true; + } + + if (needsQuotes) + { + // '\' and '"' must be escaped in a quoted string + result = result.Replace(@"\", @"\\"); + result = result.Replace(@"""", @"\"""); + // Re-add quotes "value" + result = string.Format(CultureInfo.InvariantCulture, "\"{0}\"", result); + } + return result; + } + + // Replaces characters not suitable for HTTP headers with '_' rather than MIME encoding them. + private string Sanatize(string input) + { + var result = input; + + if (RequiresEncoding(result)) + { + var builder = new StringBuilder(result.Length); + for (int i = 0; i < result.Length; i++) + { + var c = result[i]; + if ((int)c > 0x7f) + { + c = '_'; // Replace out-of-range characters + } + builder.Append(c); + } + result = builder.ToString(); + } + + return result; + } + + // Returns true if the value starts and ends with a quote + private bool IsQuoted(string value) + { + Contract.Assert(value != null); + + return value.Length > 1 && value.StartsWith("\"", StringComparison.Ordinal) + && value.EndsWith("\"", StringComparison.Ordinal); + } + + // tspecials are required to be in a quoted string. Only non-ascii needs to be encoded. + private bool RequiresEncoding(string input) + { + Contract.Assert(input != null); + + foreach (char c in input) + { + if ((int)c > 0x7f) + { + return true; + } + } + return false; + } + + // Encode using MIME encoding + private string EncodeMime(string input) + { + var buffer = Encoding.UTF8.GetBytes(input); + var encodedName = Convert.ToBase64String(buffer); + return string.Format(CultureInfo.InvariantCulture, "=?utf-8?B?{0}?=", encodedName); + } + + // Attempt to decode MIME encoded strings + private bool TryDecodeMime(string input, out string output) + { + Contract.Assert(input != null); + + output = null; + var processedInput = input; + // Require quotes, min of "=?e?b??=" + if (!IsQuoted(processedInput) || processedInput.Length < 10) + { + return false; + } + var parts = processedInput.Split('?'); + // "=, encodingName, encodingType, encodedData, =" + if (parts.Length != 5 || parts[0] != "\"=" || parts[4] != "=\"" || parts[2].ToLowerInvariant() != "b") + { + // Not encoded. + // This does not support multi-line encoding. + // Only base64 encoding is supported, not quoted printable + return false; + } + + try + { + var encoding = Encoding.GetEncoding(parts[1]); + var bytes = Convert.FromBase64String(parts[3]); + output = encoding.GetString(bytes); + return true; + } + catch (ArgumentException) + { + // Unknown encoding or bad characters + } + catch (FormatException) + { + // Bad base64 decoding + } + return false; + } + + // Encode a string using RFC 5987 encoding + // encoding'lang'PercentEncodedSpecials + private string Encode5987(string input) + { + var builder = new StringBuilder("UTF-8\'\'"); + foreach (char c in input) + { + // attr-char = ALPHA / DIGIT / "!" / "#" / "$" / "&" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + // ; token except ( "*" / "'" / "%" ) + if (c > 0x7F) // Encodes as multiple utf-8 bytes + { + var bytes = Encoding.UTF8.GetBytes(c.ToString()); + foreach (byte b in bytes) + { + HexEscape(builder, (char)b); + } + } + else if (!HttpRuleParser.IsTokenChar(c) || c == '*' || c == '\'' || c == '%') + { + // ASCII - Only one encoded byte + HexEscape(builder, c); + } + else + { + builder.Append(c); + } + } + return builder.ToString(); + } + + private static readonly char[] HexUpperChars = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + private static void HexEscape(StringBuilder builder, char c) + { + builder.Append('%'); + builder.Append(HexUpperChars[(c & 0xf0) >> 4]); + builder.Append(HexUpperChars[c & 0xf]); + } + + // Attempt to decode using RFC 5987 encoding. + // encoding'language'my%20string + private bool TryDecode5987(string input, out string output) + { + output = null; + var parts = input.Split('\''); + if (parts.Length != 3) + { + return false; + } + + var decoded = new StringBuilder(); + try + { + var encoding = Encoding.GetEncoding(parts[0]); + + var dataString = parts[2]; + var unescapedBytes = new byte[dataString.Length]; + var unescapedBytesCount = 0; + for (var index = 0; index < dataString.Length; index++) + { + if (IsHexEncoding(dataString, index)) // %FF + { + // Unescape and cache bytes, multi-byte characters must be decoded all at once + unescapedBytes[unescapedBytesCount++] = HexUnescape(dataString, ref index); + index--; // HexUnescape did +=3; Offset the for loop's ++ + } + else + { + if (unescapedBytesCount > 0) + { + // Decode any previously cached bytes + decoded.Append(encoding.GetString(unescapedBytes, 0, unescapedBytesCount)); + unescapedBytesCount = 0; + } + decoded.Append(dataString[index]); // Normal safe character + } + } + + if (unescapedBytesCount > 0) + { + // Decode any previously cached bytes + decoded.Append(encoding.GetString(unescapedBytes, 0, unescapedBytesCount)); + } + } + catch (ArgumentException) + { + return false; // Unknown encoding or bad characters + } + + output = decoded.ToString(); + return true; + } + + private static bool IsHexEncoding(string pattern, int index) + { + if ((pattern.Length - index) < 3) + { + return false; + } + if ((pattern[index] == '%') && IsEscapedAscii(pattern[index + 1], pattern[index + 2])) + { + return true; + } + return false; + } + + private static bool IsEscapedAscii(char digit, char next) + { + if (!(((digit >= '0') && (digit <= '9')) + || ((digit >= 'A') && (digit <= 'F')) + || ((digit >= 'a') && (digit <= 'f')))) + { + return false; + } + + if (!(((next >= '0') && (next <= '9')) + || ((next >= 'A') && (next <= 'F')) + || ((next >= 'a') && (next <= 'f')))) + { + return false; + } + + return true; + } + + private static byte HexUnescape(string pattern, ref int index) + { + if ((index < 0) || (index >= pattern.Length)) + { + throw new ArgumentOutOfRangeException("index"); + } + if ((pattern[index] == '%') + && (pattern.Length - index >= 3)) + { + var ret = UnEscapeAscii(pattern[index + 1], pattern[index + 2]); + index += 3; + return ret; + } + return (byte)pattern[index++]; + } + + internal static byte UnEscapeAscii(char digit, char next) + { + if (!(((digit >= '0') && (digit <= '9')) + || ((digit >= 'A') && (digit <= 'F')) + || ((digit >= 'a') && (digit <= 'f')))) + { + throw new ArgumentException(); + } + + var res = (digit <= '9') + ? ((int)digit - (int)'0') + : (((digit <= 'F') + ? ((int)digit - (int)'A') + : ((int)digit - (int)'a')) + + 10); + + if (!(((next >= '0') && (next <= '9')) + || ((next >= 'A') && (next <= 'F')) + || ((next >= 'a') && (next <= 'f')))) + { + throw new ArgumentException(); + } + + return (byte)((res << 4) + ((next <= '9') + ? ((int)next - (int)'0') + : (((next <= 'F') + ? ((int)next - (int)'A') + : ((int)next - (int)'a')) + + 10))); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs new file mode 100644 index 0000000000..53fd996b9f --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -0,0 +1,397 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class ContentRangeHeaderValue + { + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetContentRangeLength); + + private string _unit; + private long? _from; + private long? _to; + private long? _length; + + private ContentRangeHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public ContentRangeHeaderValue(long from, long to, long length) + { + // Scenario: "Content-Range: bytes 12-34/5678" + + if (length < 0) + { + throw new ArgumentOutOfRangeException("length"); + } + if ((to < 0) || (to > length)) + { + throw new ArgumentOutOfRangeException("to"); + } + if ((from < 0) || (from > to)) + { + throw new ArgumentOutOfRangeException("from"); + } + + _from = from; + _to = to; + _length = length; + _unit = HeaderUtilities.BytesUnit; + } + + public ContentRangeHeaderValue(long length) + { + // Scenario: "Content-Range: bytes */1234" + + if (length < 0) + { + throw new ArgumentOutOfRangeException("length"); + } + + _length = length; + _unit = HeaderUtilities.BytesUnit; + } + + public ContentRangeHeaderValue(long from, long to) + { + // Scenario: "Content-Range: bytes 12-34/*" + + if (to < 0) + { + throw new ArgumentOutOfRangeException("to"); + } + if ((from < 0) || (from > to)) + { + throw new ArgumentOutOfRangeException("from"); + } + + _from = from; + _to = to; + _unit = HeaderUtilities.BytesUnit; + } + + public string Unit + { + get { return _unit; } + set + { + HeaderUtilities.CheckValidToken(value, "value"); + _unit = value; + } + } + + public long? From + { + get { return _from; } + } + + public long? To + { + get { return _to; } + } + + public long? Length + { + get { return _length; } + } + + public bool HasLength // e.g. "Content-Range: bytes 12-34/*" + { + get { return _length != null; } + } + + public bool HasRange // e.g. "Content-Range: bytes */1234" + { + get { return _from != null; } + } + + public override bool Equals(object obj) + { + var other = obj as ContentRangeHeaderValue; + + if (other == null) + { + return false; + } + + return ((_from == other._from) && (_to == other._to) && (_length == other._length) && + (string.Compare(_unit, other._unit, StringComparison.OrdinalIgnoreCase) == 0)); + } + + public override int GetHashCode() + { + var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_unit); + + if (HasRange) + { + result = result ^ _from.GetHashCode() ^ _to.GetHashCode(); + } + + if (HasLength) + { + result = result ^ _length.GetHashCode(); + } + + return result; + } + + public override string ToString() + { + var sb = new StringBuilder(_unit); + sb.Append(' '); + + if (HasRange) + { + sb.Append(_from.Value.ToString(NumberFormatInfo.InvariantInfo)); + sb.Append('-'); + sb.Append(_to.Value.ToString(NumberFormatInfo.InvariantInfo)); + } + else + { + sb.Append('*'); + } + + sb.Append('/'); + if (HasLength) + { + sb.Append(_length.Value.ToString(NumberFormatInfo.InvariantInfo)); + } + else + { + sb.Append('*'); + } + + return sb.ToString(); + } + + public static ContentRangeHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out ContentRangeHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetContentRangeLength(string input, int startIndex, out ContentRangeHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the unit string: in ' -/' + var unitLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (unitLength == 0) + { + return 0; + } + + var unit = input.Substring(startIndex, unitLength); + var current = startIndex + unitLength; + var separatorLength = HttpRuleParser.GetWhitespaceLength(input, current); + + if (separatorLength == 0) + { + return 0; + } + + current = current + separatorLength; + + if (current == input.Length) + { + return 0; + } + + // Read range values and in ' -/' + var fromStartIndex = current; + var fromLength = 0; + var toStartIndex = 0; + var toLength = 0; + if (!TryGetRangeLength(input, ref current, out fromLength, out toStartIndex, out toLength)) + { + return 0; + } + + // After the range is read we expect the length separator '/' + if ((current == input.Length) || (input[current] != '/')) + { + return 0; + } + + current++; // Skip '/' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (current == input.Length) + { + return 0; + } + + // We may not have a length (e.g. 'bytes 1-2/*'). But if we do, parse the length now. + var lengthStartIndex = current; + var lengthLength = 0; + if (!TryGetLengthLength(input, ref current, out lengthLength)) + { + return 0; + } + + if (!TryCreateContentRange(input, unit, fromStartIndex, fromLength, toStartIndex, toLength, + lengthStartIndex, lengthLength, out parsedValue)) + { + return 0; + } + + return current - startIndex; + } + + private static bool TryGetLengthLength(string input, ref int current, out int lengthLength) + { + lengthLength = 0; + + if (input[current] == '*') + { + current++; + } + else + { + // Parse length value: in ' -/' + lengthLength = HttpRuleParser.GetNumberLength(input, current, false); + + if ((lengthLength == 0) || (lengthLength > HttpRuleParser.MaxInt64Digits)) + { + return false; + } + + current = current + lengthLength; + } + + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + return true; + } + + private static bool TryGetRangeLength(string input, ref int current, out int fromLength, out int toStartIndex, out int toLength) + { + fromLength = 0; + toStartIndex = 0; + toLength = 0; + + // Check if we have a value like 'bytes */133'. If yes, skip the range part and continue parsing the + // length separator '/'. + if (input[current] == '*') + { + current++; + } + else + { + // Parse first range value: in ' -/' + fromLength = HttpRuleParser.GetNumberLength(input, current, false); + + if ((fromLength == 0) || (fromLength > HttpRuleParser.MaxInt64Digits)) + { + return false; + } + + current = current + fromLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // After the first value, the '-' character must follow. + if ((current == input.Length) || (input[current] != '-')) + { + // We need a '-' character otherwise this can't be a valid range. + return false; + } + + current++; // skip the '-' character + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (current == input.Length) + { + return false; + } + + // Parse second range value: in ' -/' + toStartIndex = current; + toLength = HttpRuleParser.GetNumberLength(input, current, false); + + if ((toLength == 0) || (toLength > HttpRuleParser.MaxInt64Digits)) + { + return false; + } + + current = current + toLength; + } + + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + return true; + } + + private static bool TryCreateContentRange(string input, string unit, int fromStartIndex, int fromLength, + int toStartIndex, int toLength, int lengthStartIndex, int lengthLength, out ContentRangeHeaderValue parsedValue) + { + parsedValue = null; + + long from = 0; + if ((fromLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(fromStartIndex, fromLength), out from)) + { + return false; + } + + long to = 0; + if ((toLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(toStartIndex, toLength), out to)) + { + return false; + } + + // 'from' must not be greater than 'to' + if ((fromLength > 0) && (toLength > 0) && (from > to)) + { + return false; + } + + long length = 0; + if ((lengthLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(lengthStartIndex, lengthLength), + out length)) + { + return false; + } + + // 'from' and 'to' must be less than 'length' + if ((toLength > 0) && (lengthLength > 0) && (to >= length)) + { + return false; + } + + var result = new ContentRangeHeaderValue(); + result._unit = unit; + + if (fromLength > 0) + { + result._from = from; + result._to = to; + } + + if (lengthLength > 0) + { + result._length = length; + } + + parsedValue = result; + return true; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs new file mode 100644 index 0000000000..7c5be8753c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -0,0 +1,104 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Diagnostics.Contracts; + +namespace Microsoft.Net.Http.Headers +{ + internal class CookieHeaderParser : HttpHeaderParser + { + // The Cache-Control header is special: It is a header supporting a list of values, but we represent the list + // as _one_ instance of CacheControlHeaderValue. I.e we set 'SupportsMultipleValues' to 'true' since it is + // OK to have multiple Cache-Control headers in a request/response message. However, after parsing all + // Cache-Control headers, only one instance of CacheControlHeaderValue is created (if all headers contain valid + // values, otherwise we may have multiple strings containing the invalid values). + internal CookieHeaderParser(bool supportsMultipleValues) + : base(supportsMultipleValues) + { + } + + public sealed override bool TryParseValue(string value, ref int index, out CookieHeaderValue parsedValue) + { + parsedValue = null; + + // If multiple values are supported (i.e. list of values), then accept an empty string: The header may + // be added multiple times to the request/response message. E.g. + // Accept: text/xml; q=1 + // Accept: + // Accept: text/plain; q=0.2 + if (string.IsNullOrEmpty(value) || (index == value.Length)) + { + return SupportsMultipleValues; + } + + var separatorFound = false; + var current = GetNextNonEmptyOrWhitespaceIndex(value, index, SupportsMultipleValues, out separatorFound); + + if (separatorFound && !SupportsMultipleValues) + { + return false; // leading separators not allowed if we don't support multiple values. + } + + if (current == value.Length) + { + if (SupportsMultipleValues) + { + index = current; + } + return SupportsMultipleValues; + } + + CookieHeaderValue result = null; + int length = CookieHeaderValue.GetCookieLength(value, current, out result); + + if (length == 0) + { + return false; + } + + current = current + length; + current = GetNextNonEmptyOrWhitespaceIndex(value, current, SupportsMultipleValues, out separatorFound); + + // If we support multiple values and we've not reached the end of the string, then we must have a separator. + if ((separatorFound && !SupportsMultipleValues) || (!separatorFound && (current < value.Length))) + { + return false; + } + + index = current; + parsedValue = result; + return true; + } + + private static int GetNextNonEmptyOrWhitespaceIndex(string input, int startIndex, bool skipEmptyValues, out bool separatorFound) + { + Contract.Requires(input != null); + Contract.Requires(startIndex <= input.Length); // it's OK if index == value.Length. + + separatorFound = false; + var current = startIndex + HttpRuleParser.GetWhitespaceLength(input, startIndex); + + if ((current == input.Length) || (input[current] != ',' && input[current] != ';')) + { + return current; + } + + // If we have a separator, skip the separator and all following whitespaces. If we support + // empty values, continue until the current character is neither a separator nor a whitespace. + separatorFound = true; + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (skipEmptyValues) + { + while ((current < input.Length) && (input[current] == ',') && (input[current] == ';')) + { + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + } + + return current; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs new file mode 100644 index 0000000000..c4c1207380 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -0,0 +1,256 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // http://tools.ietf.org/html/rfc6265 + public class CookieHeaderValue + { + private static readonly CookieHeaderParser SingleValueParser = new CookieHeaderParser(supportsMultipleValues: false); + private static readonly CookieHeaderParser MultipleValueParser = new CookieHeaderParser(supportsMultipleValues: true); + + private string _name; + private string _value; + + private CookieHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public CookieHeaderValue([NotNull] string name) + : this(name, string.Empty) + { + } + + public CookieHeaderValue([NotNull] string name, [NotNull] string value) + { + Name = name; + Value = value; + } + + public string Name + { + get { return _name; } + set + { + CheckNameFormat(value, "name"); + _name = value; + } + } + + public string Value + { + get { return _value; } + set + { + CheckValueFormat(value, "value"); + _value = value; + } + } + + // name="val ue"; + public override string ToString() + { + var header = new StringBuilder(); + + header.Append(_name); + header.Append("="); + header.Append(_value); + + return header.ToString(); + } + + private static void AppendSegment(StringBuilder builder, string name, string value) + { + builder.Append("; "); + builder.Append(name); + if (value != null) + { + builder.Append("="); + builder.Append(value); + } + } + + public static CookieHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out CookieHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + // name=value; name="value" + internal static int GetCookieLength(string input, int startIndex, out CookieHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + var offset = startIndex; + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (offset >= input.Length)) + { + return 0; + } + + var result = new CookieHeaderValue(); + + // The caller should have already consumed any leading whitespace, commas, etc.. + + // Name=value; + + // Name + var itemLength = HttpRuleParser.GetTokenLength(input, offset); + if (itemLength == 0) + { + return 0; + } + result._name = input.Substring(offset, itemLength); + offset += itemLength; + + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + + string value; + // value or "quoted value" + itemLength = GetCookieValueLength(input, offset, out value); + // The value may be empty + result._value = input.Substring(offset, itemLength); + offset += itemLength; + + parsedValue = result; + return offset - startIndex; + } + + // cookie-value = *cookie-octet / ( DQUOTE* cookie-octet DQUOTE ) + // cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + // ; US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash + internal static int GetCookieValueLength(string input, int startIndex, out string value) + { + Contract.Requires(input != null); + Contract.Requires(startIndex >= 0); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + value = null; + if (startIndex >= input.Length) + { + return 0; + } + var inQuotes = false; + var offset = startIndex; + + if (input[offset] == '"') + { + inQuotes = true; + offset++; + } + + while (offset < input.Length) + { + var c = input[offset]; + if (!IsCookieValueChar(c)) + { + break; + } + + offset++; + } + + if (inQuotes) + { + if (offset == input.Length || input[offset] != '"') + { + return 0; // Missing final quote + } + offset++; + } + + int length = offset - startIndex; + if (length == 0) + { + return 0; + } + + value = input.Substring(startIndex, length); + return length; + } + + private static bool ReadEqualsSign(string input, ref int offset) + { + // = (no spaces) + if (offset >= input.Length || input[offset] != '=') + { + return false; + } + offset++; + return true; + } + + // cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + // ; US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash + private static bool IsCookieValueChar(char c) + { + if (c < 0x21 || c > 0x7E) + { + return false; + } + return !(c == '"' || c == ',' || c == ';' || c == '\\'); + } + + internal static void CheckNameFormat([NotNull] string name, string parameterName) + { + if (HttpRuleParser.GetTokenLength(name, 0) != name.Length) + { + throw new ArgumentException("Invalid cookie name: " + name, parameterName); + } + } + + internal static void CheckValueFormat([NotNull] string value, string parameterName) + { + string temp; + if (GetCookieValueLength(value, 0, out temp) != value.Length) + { + throw new ArgumentException("Invalid cookie value: " + value, parameterName); + } + } + + public override bool Equals(object obj) + { + var other = obj as CookieHeaderValue; + + if (other == null) + { + return false; + } + + return string.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) + && string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + } + + public override int GetHashCode() + { + return _name.GetHashCode() ^ _value.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs new file mode 100644 index 0000000000..af10ff345e --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -0,0 +1,204 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace Microsoft.Net.Http.Headers +{ + public class EntityTagHeaderValue + { + // Note that the ETag header does not allow a * but we're not that strict: We allow both '*' and ETag values in a single value. + // We can't guarantee that a single parsed value will be used directly in an ETag header. + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetEntityTagLength); + // Note that if multiple ETag values are allowed (e.g. 'If-Match', 'If-None-Match'), according to the RFC + // the value must either be '*' or a list of ETag values. It's not allowed to have both '*' and a list of + // ETag values. We're not that strict: We allow both '*' and ETag values in a list. If the server sends such + // an invalid list, we want to be able to represent it using the corresponding header property. + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetEntityTagLength); + + private static EntityTagHeaderValue AnyType; + + private string _tag; + private bool _isWeak; + + private EntityTagHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public EntityTagHeaderValue(string tag) + : this(tag, false) + { + } + + public EntityTagHeaderValue(string tag, bool isWeak) + { + if (string.IsNullOrEmpty(tag)) + { + throw new ArgumentException("An empty string is not allowed.", "tag"); + } + + int length = 0; + if (!isWeak && string.Equals(tag, "*", StringComparison.Ordinal)) + { + // * is valid, but W/* isn't. + _tag = tag; + } + else if ((HttpRuleParser.GetQuotedStringLength(tag, 0, out length) != HttpParseResult.Parsed) || + (length != tag.Length)) + { + // Note that we don't allow 'W/' prefixes for weak ETags in the 'tag' parameter. If the user wants to + // add a weak ETag, he can set 'isWeak' to true. + throw new FormatException("Invalid ETag name"); + } + + _tag = tag; + _isWeak = isWeak; + } + + public static EntityTagHeaderValue Any + { + get + { + if (AnyType == null) + { + AnyType = new EntityTagHeaderValue(); + AnyType._tag = "*"; + AnyType._isWeak = false; + } + return AnyType; + } + } + + public string Tag + { + get { return _tag; } + } + + public bool IsWeak + { + get { return _isWeak; } + } + + public override string ToString() + { + if (_isWeak) + { + return "W/" + _tag; + } + return _tag; + } + + public override bool Equals(object obj) + { + var other = obj as EntityTagHeaderValue; + + if (other == null) + { + return false; + } + + // Since the tag is a quoted-string we treat it case-sensitive. + return ((_isWeak == other._isWeak) && (string.CompareOrdinal(_tag, other._tag) == 0)); + } + + public override int GetHashCode() + { + // Since the tag is a quoted-string we treat it case-sensitive. + return _tag.GetHashCode() ^ _isWeak.GetHashCode(); + } + + public static EntityTagHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out EntityTagHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + internal static int GetEntityTagLength(string input, int startIndex, out EntityTagHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + var isWeak = false; + var current = startIndex; + + var firstChar = input[startIndex]; + if (firstChar == '*') + { + // We have '*' value, indicating "any" ETag. + parsedValue = Any; + current++; + } + else + { + // The RFC defines 'W/' as prefix, but we'll be flexible and also accept lower-case 'w'. + if ((firstChar == 'W') || (firstChar == 'w')) + { + current++; + // We need at least 3 more chars: the '/' character followed by two quotes. + if ((current + 2 >= input.Length) || (input[current] != '/')) + { + return 0; + } + isWeak = true; + current++; // we have a weak-entity tag. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + + var tagStartIndex = current; + var tagLength = 0; + if (HttpRuleParser.GetQuotedStringLength(input, current, out tagLength) != HttpParseResult.Parsed) + { + return 0; + } + + parsedValue = new EntityTagHeaderValue(); + if (tagLength == input.Length) + { + // Most of the time we'll have strong ETags without leading/trailing whitespaces. + Contract.Assert(startIndex == 0); + Contract.Assert(!isWeak); + parsedValue._tag = input; + parsedValue._isWeak = false; + } + else + { + parsedValue._tag = input.Substring(tagStartIndex, tagLength); + parsedValue._isWeak = isWeak; + } + + current = current + tagLength; + } + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + return current - startIndex; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs new file mode 100644 index 0000000000..c8e5f933e2 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + internal sealed class GenericHeaderParser : BaseHeaderParser + { + internal delegate int GetParsedValueLengthDelegate(string value, int startIndex, out T parsedValue); + + private GetParsedValueLengthDelegate _getParsedValueLength; + + internal GenericHeaderParser(bool supportsMultipleValues, [NotNull] GetParsedValueLengthDelegate getParsedValueLength) + : base(supportsMultipleValues) + { + _getParsedValueLength = getParsedValueLength; + } + + protected override int GetParsedValueLength(string value, int startIndex, out T parsedValue) + { + return _getParsedValueLength(value, startIndex, out parsedValue); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs new file mode 100644 index 0000000000..53f1d53dc9 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + public static class HeaderNames + { + public const string Accept = "Accept"; + public const string AcceptCharset = "Accept-Charset"; + public const string AcceptEncoding = "Accept-Encoding"; + public const string AcceptLanguage = "Accept-Language"; + public const string AcceptRanges = "Accept-Ranges"; + public const string Age = "Age"; + public const string Allow = "Allow"; + public const string Authorization = "Authorization"; + public const string CacheControl = "Cache-Control"; + public const string Connection = "Connection"; + public const string ContentDisposition = "Content-Disposition"; + public const string ContentEncoding = "Content-Encoding"; + public const string ContentLanguage = "Content-Language"; + public const string ContentLength = "Content-Length"; + public const string ContentLocation = "Content-Location"; + public const string ContentMD5 = "ContentMD5"; + public const string ContentRange = "Content-Range"; + public const string ContentType = "Content-Type"; + public const string Cookie = "Cookie"; + public const string Date = "Date"; + public const string ETag = "ETag"; + public const string Expires = "Expires"; + public const string Expect = "Expect"; + public const string From = "From"; + public const string Host = "Host"; + public const string IfMatch = "If-Match"; + public const string IfModifiedSince = "If-Modified-Since"; + public const string IfNoneMatch = "If-None-Match"; + public const string IfRange = "If-Range"; + public const string IfUnmodifiedSince = "If-Unmodified-Since"; + public const string LastModified = "Last-Modified"; + public const string Location = "Location"; + public const string MaxForwards = "Max-Forwards"; + public const string Pragma = "Pragma"; + public const string ProxyAuthenticate = "Proxy-Authenticate"; + public const string ProxyAuthorization = "Proxy-Authorization"; + public const string Range = "Range"; + public const string Referer = "Referer"; + public const string RetryAfter = "Retry-After"; + public const string Server = "Server"; + public const string SetCookie = "Set-Cookie"; + public const string TE = "TE"; + public const string Trailer = "Trailer"; + public const string TransferEncoding = "Transfer-Encoding"; + public const string Upgrade = "Upgrade"; + public const string UserAgent = "User-Agent"; + public const string Vary = "Vary"; + public const string Via = "Via"; + public const string Warning = "Warning"; + public const string WWWAuthenticate = "WWW-Authenticate"; + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/HeaderQuality.cs b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs new file mode 100644 index 0000000000..c5247e1aca --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + public static class HeaderQuality + { + /// + /// Quality factor to indicate a perfect match. + /// + public const double Match = 1.0; + + /// + /// Quality factor to indicate no match. + /// + public const double NoMatch = 0.0; + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs new file mode 100644 index 0000000000..aaf2d57470 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -0,0 +1,232 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + public static class HeaderUtilities + { + private const string QualityName = "q"; + internal const string BytesUnit = "bytes"; + + internal static void SetQuality(ICollection parameters, double? value) + { + Contract.Requires(parameters != null); + + var qualityParameter = NameValueHeaderValue.Find(parameters, QualityName); + if (value.HasValue) + { + // Note that even if we check the value here, we can't prevent a user from adding an invalid quality + // value using Parameters.Add(). Even if we would prevent the user from adding an invalid value + // using Parameters.Add() he could always add invalid values using HttpHeaders.AddWithoutValidation(). + // So this check is really for convenience to show users that they're trying to add an invalid + // value. + if ((value < 0) || (value > 1)) + { + throw new ArgumentOutOfRangeException("value"); + } + + var qualityString = ((double)value).ToString("0.0##", NumberFormatInfo.InvariantInfo); + if (qualityParameter != null) + { + qualityParameter.Value = qualityString; + } + else + { + parameters.Add(new NameValueHeaderValue(QualityName, qualityString)); + } + } + else + { + // Remove quality parameter + if (qualityParameter != null) + { + parameters.Remove(qualityParameter); + } + } + } + + internal static double? GetQuality(ICollection parameters) + { + Contract.Requires(parameters != null); + + var qualityParameter = NameValueHeaderValue.Find(parameters, QualityName); + if (qualityParameter != null) + { + // Note that the RFC requires decimal '.' regardless of the culture. I.e. using ',' as decimal + // separator is considered invalid (even if the current culture would allow it). + double qualityValue; + if (double.TryParse(qualityParameter.Value, NumberStyles.AllowDecimalPoint, + NumberFormatInfo.InvariantInfo, out qualityValue)) + { + return qualityValue; + } + } + return null; + } + + internal static void CheckValidToken(string value, string parameterName) + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + if (HttpRuleParser.GetTokenLength(value, 0) != value.Length) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid token '{0}.", value)); + } + } + + internal static void CheckValidQuotedString(string value, string parameterName) + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + int length; + if ((HttpRuleParser.GetQuotedStringLength(value, 0, out length) != HttpParseResult.Parsed) || + (length != value.Length)) // no trailing spaces allowed + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid quoted string '{0}'.", value)); + } + } + + internal static bool AreEqualCollections(ICollection x, ICollection y) + { + return AreEqualCollections(x, y, null); + } + + internal static bool AreEqualCollections(ICollection x, ICollection y, IEqualityComparer comparer) + { + if (x == null) + { + return (y == null) || (y.Count == 0); + } + + if (y == null) + { + return (x.Count == 0); + } + + if (x.Count != y.Count) + { + return false; + } + + if (x.Count == 0) + { + return true; + } + + // We have two unordered lists. So comparison is an O(n*m) operation which is expensive. Usually + // headers have 1-2 parameters (if any), so this comparison shouldn't be too expensive. + var alreadyFound = new bool[x.Count]; + var i = 0; + foreach (var xItem in x) + { + Contract.Assert(xItem != null); + + i = 0; + var found = false; + foreach (var yItem in y) + { + if (!alreadyFound[i]) + { + if (((comparer == null) && xItem.Equals(yItem)) || + ((comparer != null) && comparer.Equals(xItem, yItem))) + { + alreadyFound[i] = true; + found = true; + break; + } + } + i++; + } + + if (!found) + { + return false; + } + } + + // Since we never re-use a "found" value in 'y', we expecte 'alreadyFound' to have all fields set to 'true'. + // Otherwise the two collections can't be equal and we should not get here. + Contract.Assert(Contract.ForAll(alreadyFound, value => { return value; }), + "Expected all values in 'alreadyFound' to be true since collections are considered equal."); + + return true; + } + + internal static int GetNextNonEmptyOrWhitespaceIndex(string input, int startIndex, bool skipEmptyValues, + out bool separatorFound) + { + Contract.Requires(input != null); + Contract.Requires(startIndex <= input.Length); // it's OK if index == value.Length. + + separatorFound = false; + var current = startIndex + HttpRuleParser.GetWhitespaceLength(input, startIndex); + + if ((current == input.Length) || (input[current] != ',')) + { + return current; + } + + // If we have a separator, skip the separator and all following whitespaces. If we support + // empty values, continue until the current character is neither a separator nor a whitespace. + separatorFound = true; + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (skipEmptyValues) + { + while ((current < input.Length) && (input[current] == ',')) + { + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + } + + return current; + } + + internal static bool TryParseInt32(string value, out int result) + { + return int.TryParse(value, NumberStyles.None, NumberFormatInfo.InvariantInfo, out result); + } + + public static bool TryParseInt64(string value, out long result) + { + return long.TryParse(value, NumberStyles.None, NumberFormatInfo.InvariantInfo, out result); + } + + public static string FormatInt64(long value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + + public static bool TryParseDate(string input, out DateTimeOffset result) + { + return HttpRuleParser.TryStringToDate(input, out result); + } + + public static string FormatDate(DateTimeOffset dateTime) + { + return HttpRuleParser.DateToString(dateTime); + } + + public static string RemoveQuotes(string input) + { + if (!string.IsNullOrEmpty(input) && input.Length >= 2 && input[0] == '"' && input[input.Length - 1] == '"') + { + input = input.Substring(1, input.Length - 2); + } + return input; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs new file mode 100644 index 0000000000..af19f3421c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -0,0 +1,137 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + internal abstract class HttpHeaderParser + { + private bool _supportsMultipleValues; + + protected HttpHeaderParser(bool supportsMultipleValues) + { + _supportsMultipleValues = supportsMultipleValues; + } + + public bool SupportsMultipleValues + { + get { return _supportsMultipleValues; } + } + + // If a parser supports multiple values, a call to ParseValue/TryParseValue should return a value for 'index' + // pointing to the next non-whitespace character after a delimiter. E.g. if called with a start index of 0 + // for string "value , second_value", then after the call completes, 'index' must point to 's', i.e. the first + // non-whitespace after the separator ','. + public abstract bool TryParseValue(string value, ref int index, out T parsedValue); + + public T ParseValue(string value, ref int index) + { + // Index may be value.Length (e.g. both 0). This may be allowed for some headers (e.g. Accept but not + // allowed by others (e.g. Content-Length). The parser has to decide if this is valid or not. + Contract.Requires((value == null) || ((index >= 0) && (index <= value.Length))); + + // If a parser returns 'null', it means there was no value, but that's valid (e.g. "Accept: "). The caller + // can ignore the value. + T result = default(T); + if (!TryParseValue(value, ref index, out result)) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid value '{0}'.", + value == null ? "" : value.Substring(index))); + } + return result; + } + + public virtual bool TryParseValues(IList values, out IList parsedValues) + { + Contract.Assert(_supportsMultipleValues); + // If a parser returns an empty list, it means there was no value, but that's valid (e.g. "Accept: "). The caller + // can ignore the value. + parsedValues = null; + var results = new List(); + if (values == null) + { + return false; + } + foreach (var value in values) + { + int index = 0; + + while (!string.IsNullOrEmpty(value) && index < value.Length) + { + T output; + if (TryParseValue(value, ref index, out output)) + { + // The entry may not contain an actual value, like " , " + if (output != null) + { + results.Add(output); + } + } + else + { + return false; + } + } + } + if (results.Count > 0) + { + parsedValues = results; + return true; + } + return false; + } + + public IList ParseValues(IList values) + { + Contract.Assert(_supportsMultipleValues); + // If a parser returns an empty list, it means there was no value, but that's valid (e.g. "Accept: "). The caller + // can ignore the value. + var parsedValues = new List(); + if (values == null) + { + return parsedValues; + } + foreach (var value in values) + { + int index = 0; + + while (!string.IsNullOrEmpty(value) && index < value.Length) + { + T output; + if (TryParseValue(value, ref index, out output)) + { + // The entry may not contain an actual value, like " , " + if (output != null) + { + parsedValues.Add(output); + } + } + else + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid values '{0}'.", + values == null ? "" : value.Substring(index))); + } + } + } + return parsedValues; + } + + // If ValueType is a custom header value type (e.g. NameValueHeaderValue) it implements ToString() correctly. + // However for existing types like int, byte[], DateTimeOffset we can't override ToString(). Therefore the + // parser provides a ToString() virtual method that can be overridden by derived types to correctly serialize + // values (e.g. byte[] to Base64 encoded string). + // The default implementation is to just call ToString() on the value itself which is the right thing to do + // for most headers (custom types, string, etc.). + public virtual string ToString(object value) + { + Contract.Requires(value != null); + + return value.ToString(); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/HttpParseResult.cs b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs new file mode 100644 index 0000000000..76713cf1cc --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + internal enum HttpParseResult + { + Parsed, + NotParsed, + InvalidFormat, + } +} diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs new file mode 100644 index 0000000000..66f6361da7 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -0,0 +1,352 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + internal static class HttpRuleParser + { + private static readonly bool[] TokenChars; + private const int MaxNestedCount = 5; + private static readonly string[] DateFormats = new string[] { + // "r", // RFC 1123, required output format but too strict for input + "ddd, d MMM yyyy H:m:s 'GMT'", // RFC 1123 (r, except it allows both 1 and 01 for date and time) + "ddd, d MMM yyyy H:m:s", // RFC 1123, no zone - assume GMT + "d MMM yyyy H:m:s 'GMT'", // RFC 1123, no day-of-week + "d MMM yyyy H:m:s", // RFC 1123, no day-of-week, no zone + "ddd, d MMM yy H:m:s 'GMT'", // RFC 1123, short year + "ddd, d MMM yy H:m:s", // RFC 1123, short year, no zone + "d MMM yy H:m:s 'GMT'", // RFC 1123, no day-of-week, short year + "d MMM yy H:m:s", // RFC 1123, no day-of-week, short year, no zone + + "dddd, d'-'MMM'-'yy H:m:s 'GMT'", // RFC 850 + "dddd, d'-'MMM'-'yy H:m:s", // RFC 850 no zone + "ddd MMM d H:m:s yyyy", // ANSI C's asctime() format + + "ddd, d MMM yyyy H:m:s zzz", // RFC 5322 + "ddd, d MMM yyyy H:m:s", // RFC 5322 no zone + "d MMM yyyy H:m:s zzz", // RFC 5322 no day-of-week + "d MMM yyyy H:m:s", // RFC 5322 no day-of-week, no zone + }; + + internal const char CR = '\r'; + internal const char LF = '\n'; + internal const char SP = ' '; + internal const char Tab = '\t'; + internal const int MaxInt64Digits = 19; + internal const int MaxInt32Digits = 10; + + // iso-8859-1, Western European (ISO) + internal static readonly Encoding DefaultHttpEncoding = Encoding.GetEncoding(28591); + + static HttpRuleParser() + { + // token = 1* + // CTL = + + TokenChars = new bool[128]; // everything is false + + for (int i = 33; i < 127; i++) // skip Space (32) & DEL (127) + { + TokenChars[i] = true; + } + + // remove separators: these are not valid token characters + TokenChars[(byte)'('] = false; + TokenChars[(byte)')'] = false; + TokenChars[(byte)'<'] = false; + TokenChars[(byte)'>'] = false; + TokenChars[(byte)'@'] = false; + TokenChars[(byte)','] = false; + TokenChars[(byte)';'] = false; + TokenChars[(byte)':'] = false; + TokenChars[(byte)'\\'] = false; + TokenChars[(byte)'"'] = false; + TokenChars[(byte)'/'] = false; + TokenChars[(byte)'['] = false; + TokenChars[(byte)']'] = false; + TokenChars[(byte)'?'] = false; + TokenChars[(byte)'='] = false; + TokenChars[(byte)'{'] = false; + TokenChars[(byte)'}'] = false; + } + + internal static bool IsTokenChar(char character) + { + // Must be between 'space' (32) and 'DEL' (127) + if (character > 127) + { + return false; + } + + return TokenChars[character]; + } + + [Pure] + internal static int GetTokenLength(string input, int startIndex) + { + Contract.Requires(input != null); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + if (startIndex >= input.Length) + { + return 0; + } + + var current = startIndex; + + while (current < input.Length) + { + if (!IsTokenChar(input[current])) + { + return current - startIndex; + } + current++; + } + return input.Length - startIndex; + } + + internal static int GetWhitespaceLength(string input, int startIndex) + { + Contract.Requires(input != null); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + if (startIndex >= input.Length) + { + return 0; + } + + var current = startIndex; + + char c; + while (current < input.Length) + { + c = input[current]; + + if ((c == SP) || (c == Tab)) + { + current++; + continue; + } + + if (c == CR) + { + // If we have a #13 char, it must be followed by #10 and then at least one SP or HT. + if ((current + 2 < input.Length) && (input[current + 1] == LF)) + { + char spaceOrTab = input[current + 2]; + if ((spaceOrTab == SP) || (spaceOrTab == Tab)) + { + current += 3; + continue; + } + } + } + + return current - startIndex; + } + + // All characters between startIndex and the end of the string are LWS characters. + return input.Length - startIndex; + } + + internal static int GetNumberLength(string input, int startIndex, bool allowDecimal) + { + Contract.Requires(input != null); + Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + var current = startIndex; + char c; + + // If decimal values are not allowed, we pretend to have read the '.' character already. I.e. if a dot is + // found in the string, parsing will be aborted. + var haveDot = !allowDecimal; + + // The RFC doesn't allow decimal values starting with dot. I.e. value ".123" is invalid. It must be in the + // form "0.123". Also, there are no negative values defined in the RFC. So we'll just parse non-negative + // values. + // The RFC only allows decimal dots not ',' characters as decimal separators. Therefore value "1,23" is + // considered invalid and must be represented as "1.23". + if (input[current] == '.') + { + return 0; + } + + while (current < input.Length) + { + c = input[current]; + if ((c >= '0') && (c <= '9')) + { + current++; + } + else if (!haveDot && (c == '.')) + { + // Note that value "1." is valid. + haveDot = true; + current++; + } + else + { + break; + } + } + + return current - startIndex; + } + + internal static HttpParseResult GetQuotedStringLength(string input, int startIndex, out int length) + { + var nestedCount = 0; + return GetExpressionLength(input, startIndex, '"', '"', false, ref nestedCount, out length); + } + + // quoted-pair = "\" CHAR + // CHAR = + internal static HttpParseResult GetQuotedPairLength(string input, int startIndex, out int length) + { + Contract.Requires(input != null); + Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); + Contract.Ensures((Contract.ValueAtReturn(out length) >= 0) && + (Contract.ValueAtReturn(out length) <= (input.Length - startIndex))); + + length = 0; + + if (input[startIndex] != '\\') + { + return HttpParseResult.NotParsed; + } + + // Quoted-char has 2 characters. Check wheter there are 2 chars left ('\' + char) + // If so, check whether the character is in the range 0-127. If not, it's an invalid value. + if ((startIndex + 2 > input.Length) || (input[startIndex + 1] > 127)) + { + return HttpParseResult.InvalidFormat; + } + + // We don't care what the char next to '\' is. + length = 2; + return HttpParseResult.Parsed; + } + + internal static string DateToString(DateTimeOffset dateTime) + { + // Format according to RFC1123; 'r' uses invariant info (DateTimeFormatInfo.InvariantInfo) + return dateTime.ToUniversalTime().ToString("r", CultureInfo.InvariantCulture); + } + + internal static bool TryStringToDate(string input, out DateTimeOffset result) + { + // Try the various date formats in the order listed above. + // We should accept a wide verity of common formats, but only output RFC 1123 style dates. + if (DateTimeOffset.TryParseExact(input, DateFormats, DateTimeFormatInfo.InvariantInfo, + DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, out result)) + { + return true; + } + + return false; + } + + // TEXT = + // LWS = [CRLF] 1*( SP | HT ) + // CTL = + // + // Since we don't really care about the content of a quoted string or comment, we're more tolerant and + // allow these characters. We only want to find the delimiters ('"' for quoted string and '(', ')' for comment). + // + // 'nestedCount': Comments can be nested. We allow a depth of up to 5 nested comments, i.e. something like + // "(((((comment)))))". If we wouldn't define a limit an attacker could send a comment with hundreds of nested + // comments, resulting in a stack overflow exception. In addition having more than 1 nested comment (if any) + // is unusual. + private static HttpParseResult GetExpressionLength(string input, int startIndex, char openChar, + char closeChar, bool supportsNesting, ref int nestedCount, out int length) + { + Contract.Requires(input != null); + Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); + Contract.Ensures((Contract.Result() != HttpParseResult.Parsed) || + (Contract.ValueAtReturn(out length) > 0)); + + length = 0; + + if (input[startIndex] != openChar) + { + return HttpParseResult.NotParsed; + } + + var current = startIndex + 1; // Start parsing with the character next to the first open-char + while (current < input.Length) + { + // Only check whether we have a quoted char, if we have at least 3 characters left to read (i.e. + // quoted char + closing char). Otherwise the closing char may be considered part of the quoted char. + var quotedPairLength = 0; + if ((current + 2 < input.Length) && + (GetQuotedPairLength(input, current, out quotedPairLength) == HttpParseResult.Parsed)) + { + // We ignore invalid quoted-pairs. Invalid quoted-pairs may mean that it looked like a quoted pair, + // but we actually have a quoted-string: e.g. "\ü" ('\' followed by a char >127 - quoted-pair only + // allows ASCII chars after '\'; qdtext allows both '\' and >127 chars). + current = current + quotedPairLength; + continue; + } + + // If we support nested expressions and we find an open-char, then parse the nested expressions. + if (supportsNesting && (input[current] == openChar)) + { + nestedCount++; + try + { + // Check if we exceeded the number of nested calls. + if (nestedCount > MaxNestedCount) + { + return HttpParseResult.InvalidFormat; + } + + var nestedLength = 0; + HttpParseResult nestedResult = GetExpressionLength(input, current, openChar, closeChar, + supportsNesting, ref nestedCount, out nestedLength); + + switch (nestedResult) + { + case HttpParseResult.Parsed: + current += nestedLength; // add the length of the nested expression and continue. + break; + + case HttpParseResult.NotParsed: + Contract.Assert(false, "'NotParsed' is unexpected: We started nested expression " + + "parsing, because we found the open-char. So either it's a valid nested " + + "expression or it has invalid format."); + break; + + case HttpParseResult.InvalidFormat: + // If the nested expression is invalid, we can't continue, so we fail with invalid format. + return HttpParseResult.InvalidFormat; + + default: + Contract.Assert(false, "Unknown enum result: " + nestedResult); + break; + } + } + finally + { + nestedCount--; + } + } + + if (input[current] == closeChar) + { + length = current - startIndex + 1; + return HttpParseResult.Parsed; + } + current++; + } + + // We didn't see the final quote, therefore we have an invalid expression string. + return HttpParseResult.InvalidFormat; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs new file mode 100644 index 0000000000..1fa7535452 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -0,0 +1,408 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class MediaTypeHeaderValue + { + private const string CharsetString = "charset"; + private const string BoundaryString = "boundary"; + + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetMediaTypeLength); + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetMediaTypeLength); + + // Use list instead of dictionary since we may have multiple parameters with the same name. + private ICollection _parameters; + private string _mediaType; + + private MediaTypeHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public MediaTypeHeaderValue(string mediaType) + { + CheckMediaTypeFormat(mediaType, "mediaType"); + _mediaType = mediaType; + } + + public MediaTypeHeaderValue(string mediaType, double quality) + : this(mediaType) + { + Quality = quality; + } + + public string Charset + { + get + { + return NameValueHeaderValue.Find(_parameters, CharsetString)?.Value; + } + set + { + // We don't prevent a user from setting whitespace-only charsets. Like we can't prevent a user from + // setting a non-existing charset. + var charsetParameter = NameValueHeaderValue.Find(_parameters, CharsetString); + if (string.IsNullOrEmpty(value)) + { + // Remove charset parameter + if (charsetParameter != null) + { + _parameters.Remove(charsetParameter); + } + } + else + { + if (charsetParameter != null) + { + charsetParameter.Value = value; + } + else + { + Parameters.Add(new NameValueHeaderValue(CharsetString, value)); + } + } + } + } + + public Encoding Encoding + { + get + { + var charset = Charset; + if (!string.IsNullOrWhiteSpace(charset)) + { + try + { + return Encoding.GetEncoding(charset); + } + catch (ArgumentException) + { + // Invalid or not supported + } + } + return null; + } + set + { + if (value == null) + { + Charset = null; + } + else + { + Charset = value.WebName; + } + } + } + + public string Boundary + { + get + { + return NameValueHeaderValue.Find(_parameters, BoundaryString)?.Value; + } + set + { + var boundaryParameter = NameValueHeaderValue.Find(_parameters, BoundaryString); + if (string.IsNullOrEmpty(value)) + { + // Remove charset parameter + if (boundaryParameter != null) + { + _parameters.Remove(boundaryParameter); + } + } + else + { + if (boundaryParameter != null) + { + boundaryParameter.Value = value; + } + else + { + Parameters.Add(new NameValueHeaderValue(BoundaryString, value)); + } + } + } + } + + public ICollection Parameters + { + get + { + if (_parameters == null) + { + _parameters = new ObjectCollection(); + } + return _parameters; + } + } + + public double? Quality + { + get { return HeaderUtilities.GetQuality(Parameters); } + set { HeaderUtilities.SetQuality(Parameters, value); } + } + + public string MediaType + { + get { return _mediaType; } + set + { + CheckMediaTypeFormat(value, "value"); + _mediaType = value; + } + } + + public string Type + { + get + { + return _mediaType.Substring(0, _mediaType.IndexOf('/')); + } + } + + public string SubType + { + get + { + return _mediaType.Substring(_mediaType.IndexOf('/') + 1); + } + } + + /// + /// MediaType = "*/*" + /// + public bool MatchesAllTypes + { + get + { + return MediaType.Equals("*/*", StringComparison.Ordinal); + } + } + + /// + /// SubType = "*" + /// + public bool MatchesAllSubTypes + { + get + { + return SubType.Equals("*", StringComparison.Ordinal); + } + } + + public bool IsSubsetOf(MediaTypeHeaderValue otherMediaType) + { + if (otherMediaType == null) + { + return false; + } + + if (!Type.Equals(otherMediaType.Type, StringComparison.OrdinalIgnoreCase)) + { + if (!otherMediaType.MatchesAllTypes) + { + return false; + } + } + else if (!SubType.Equals(otherMediaType.SubType, StringComparison.OrdinalIgnoreCase)) + { + if (!otherMediaType.MatchesAllSubTypes) + { + return false; + } + } + + if (Parameters != null) + { + if (Parameters.Count != 0 && (otherMediaType.Parameters == null || otherMediaType.Parameters.Count == 0)) + { + return false; + } + + // Make sure all parameters listed locally are listed in the other one. The other one may have additional parameters. + foreach (var param in _parameters) + { + var otherParam = NameValueHeaderValue.Find(otherMediaType._parameters, param.Name); + if (otherParam == null) + { + return false; + } + if (!string.Equals(param.Value, otherParam.Value, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } + } + + return true; + } + + public override string ToString() + { + return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true); + } + + public override bool Equals(object obj) + { + var other = obj as MediaTypeHeaderValue; + + if (other == null) + { + return false; + } + + return (string.Compare(_mediaType, other._mediaType, StringComparison.OrdinalIgnoreCase) == 0) && + HeaderUtilities.AreEqualCollections(_parameters, other._parameters); + } + + public override int GetHashCode() + { + // The media-type string is case-insensitive. + return StringComparer.OrdinalIgnoreCase.GetHashCode(_mediaType) ^ NameValueHeaderValue.GetHashCode(_parameters); + } + + public static MediaTypeHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out MediaTypeHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + private static int GetMediaTypeLength(string input, int startIndex, out MediaTypeHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + string mediaType = null; + var mediaTypeLength = MediaTypeHeaderValue.GetMediaTypeExpressionLength(input, startIndex, out mediaType); + + if (mediaTypeLength == 0) + { + return 0; + } + + var current = startIndex + mediaTypeLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + MediaTypeHeaderValue mediaTypeHeader = null; + + // If we're not done and we have a parameter delimiter, then we have a list of parameters. + if ((current < input.Length) && (input[current] == ';')) + { + mediaTypeHeader = new MediaTypeHeaderValue(); + mediaTypeHeader._mediaType = mediaType; + + current++; // skip delimiter. + var parameterLength = NameValueHeaderValue.GetNameValueListLength(input, current, ';', + mediaTypeHeader.Parameters); + + parsedValue = mediaTypeHeader; + return current + parameterLength - startIndex; + } + + // We have a media type without parameters. + mediaTypeHeader = new MediaTypeHeaderValue(); + mediaTypeHeader._mediaType = mediaType; + parsedValue = mediaTypeHeader; + return current - startIndex; + } + + private static int GetMediaTypeExpressionLength(string input, int startIndex, out string mediaType) + { + Contract.Requires((input != null) && (input.Length > 0) && (startIndex < input.Length)); + + // This method just parses the "type/subtype" string, it does not parse parameters. + mediaType = null; + + // Parse the type, i.e. in media type string "/; param1=value1; param2=value2" + var typeLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (typeLength == 0) + { + return 0; + } + + var current = startIndex + typeLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the separator between type and subtype + if ((current >= input.Length) || (input[current] != '/')) + { + return 0; + } + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the subtype, i.e. in media type string "/; param1=value1; param2=value2" + var subtypeLength = HttpRuleParser.GetTokenLength(input, current); + + if (subtypeLength == 0) + { + return 0; + } + + // If there are no whitespaces between and in / get the media type using + // one Substring call. Otherwise get substrings for and and combine them. + var mediatTypeLength = current + subtypeLength - startIndex; + if (typeLength + subtypeLength + 1 == mediatTypeLength) + { + mediaType = input.Substring(startIndex, mediatTypeLength); + } + else + { + mediaType = input.Substring(startIndex, typeLength) + "/" + input.Substring(current, subtypeLength); + } + + return mediatTypeLength; + } + + private static void CheckMediaTypeFormat(string mediaType, string parameterName) + { + if (string.IsNullOrEmpty(mediaType)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + // Also no LWS between type and subtype are allowed. + string tempMediaType; + var mediaTypeLength = GetMediaTypeExpressionLength(mediaType, 0, out tempMediaType); + if ((mediaTypeLength == 0) || (tempMediaType.Length != mediaType.Length)) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid media type '{0}'.", mediaType)); + } + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs new file mode 100644 index 0000000000..0125b2dbc4 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.Net.Http.Headers +{ + /// + /// Implementation of that can compare accept media type header fields + /// based on their quality values (a.k.a q-values). + /// + public class MediaTypeHeaderValueComparer : IComparer + { + private static readonly MediaTypeHeaderValueComparer _mediaTypeComparer = + new MediaTypeHeaderValueComparer(); + + private MediaTypeHeaderValueComparer() + { + } + + public static MediaTypeHeaderValueComparer QualityComparer + { + get { return _mediaTypeComparer; } + } + + /// + /// + /// Performs comparisons based on the arguments' quality values + /// (aka their "q-value"). Values with identical q-values are considered equal (i.e. the result is 0) + /// with the exception that subtype wildcards are considered less than specific media types and full + /// wildcards are considered less than subtype wildcards. This allows callers to sort a sequence of + /// following their q-values in the order of specific + /// media types, subtype wildcards, and last any full wildcards. + /// + public int Compare(MediaTypeHeaderValue mediaType1, MediaTypeHeaderValue mediaType2) + { + if (object.ReferenceEquals(mediaType1, mediaType2)) + { + return 0; + } + + var returnValue = CompareBasedOnQualityFactor(mediaType1, mediaType2); + + if (returnValue == 0) + { + if (!mediaType1.Type.Equals(mediaType2.Type, StringComparison.OrdinalIgnoreCase)) + { + if (mediaType1.MatchesAllTypes) + { + return -1; + } + else if (mediaType2.MatchesAllTypes) + { + return 1; + } + else if (mediaType1.MatchesAllSubTypes && !mediaType2.MatchesAllSubTypes) + { + return -1; + } + else if (!mediaType1.MatchesAllSubTypes && mediaType2.MatchesAllSubTypes) + { + return 1; + } + } + else if (!mediaType1.SubType.Equals(mediaType2.SubType, StringComparison.OrdinalIgnoreCase)) + { + if (mediaType1.MatchesAllSubTypes) + { + return -1; + } + else if (mediaType2.MatchesAllSubTypes) + { + return 1; + } + } + } + + return returnValue; + } + + private static int CompareBasedOnQualityFactor(MediaTypeHeaderValue mediaType1, + MediaTypeHeaderValue mediaType2) + { + var mediaType1Quality = mediaType1.Quality ?? HeaderQuality.Match; + var mediaType2Quality = mediaType2.Quality ?? HeaderQuality.Match; + var qualityDifference = mediaType1Quality - mediaType2Quality; + if (qualityDifference < 0) + { + return -1; + } + else if (qualityDifference > 0) + { + return 1; + } + + return 0; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj new file mode 100644 index 0000000000..f6e3ec7676 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj @@ -0,0 +1,23 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 60aa2fdb-8121-4826-8d00-9a143fefaf66 + Microsoft.Net.Http.Headers + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs new file mode 100644 index 0000000000..fc943f7822 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -0,0 +1,347 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // According to the RFC, in places where a "parameter" is required, the value is mandatory + // (e.g. Media-Type, Accept). However, we don't introduce a dedicated type for it. So NameValueHeaderValue supports + // name-only values in addition to name/value pairs. + public class NameValueHeaderValue + { + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetNameValueLength); + internal static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetNameValueLength); + + private string _name; + private string _value; + + private NameValueHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public NameValueHeaderValue(string name) + : this(name, null) + { + } + + public NameValueHeaderValue(string name, string value) + { + CheckNameValueFormat(name, value); + + _name = name; + _value = value; + } + + public string Name + { + get { return _name; } + } + + public string Value + { + get { return _value; } + set + { + CheckValueFormat(value); + _value = value; + } + } + + public override int GetHashCode() + { + Contract.Assert(_name != null); + + var nameHashCode = StringComparer.OrdinalIgnoreCase.GetHashCode(_name); + + if (!string.IsNullOrEmpty(_value)) + { + // If we have a quoted-string, then just use the hash code. If we have a token, convert to lowercase + // and retrieve the hash code. + if (_value[0] == '"') + { + return nameHashCode ^ _value.GetHashCode(); + } + + return nameHashCode ^ StringComparer.OrdinalIgnoreCase.GetHashCode(_value); + } + + return nameHashCode; + } + + public override bool Equals(object obj) + { + var other = obj as NameValueHeaderValue; + + if (other == null) + { + return false; + } + + if (string.Compare(_name, other._name, StringComparison.OrdinalIgnoreCase) != 0) + { + return false; + } + + // RFC2616: 14.20: unquoted tokens should use case-INsensitive comparison; quoted-strings should use + // case-sensitive comparison. The RFC doesn't mention how to compare quoted-strings outside the "Expect" + // header. We treat all quoted-strings the same: case-sensitive comparison. + + if (string.IsNullOrEmpty(_value)) + { + return string.IsNullOrEmpty(other._value); + } + + if (_value[0] == '"') + { + // We have a quoted string, so we need to do case-sensitive comparison. + return (string.CompareOrdinal(_value, other._value) == 0); + } + else + { + return (string.Compare(_value, other._value, StringComparison.OrdinalIgnoreCase) == 0); + } + } + + public static NameValueHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out NameValueHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList input) + { + return MultipleValueParser.ParseValues(input); + } + + public static bool TryParseList(IList input, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(input, out parsedValues); + } + + public override string ToString() + { + if (!string.IsNullOrEmpty(_value)) + { + return _name + "=" + _value; + } + return _name; + } + + internal static void ToString(ICollection values, char separator, bool leadingSeparator, + StringBuilder destination) + { + Contract.Assert(destination != null); + + if ((values == null) || (values.Count == 0)) + { + return; + } + + foreach (var value in values) + { + if (leadingSeparator || (destination.Length > 0)) + { + destination.Append(separator); + destination.Append(' '); + } + destination.Append(value.ToString()); + } + } + + internal static string ToString(ICollection values, char separator, bool leadingSeparator) + { + if ((values == null) || (values.Count == 0)) + { + return null; + } + + var sb = new StringBuilder(); + + ToString(values, separator, leadingSeparator, sb); + + return sb.ToString(); + } + + internal static int GetHashCode(ICollection values) + { + if ((values == null) || (values.Count == 0)) + { + return 0; + } + + var result = 0; + foreach (var value in values) + { + result = result ^ value.GetHashCode(); + } + return result; + } + + private static int GetNameValueLength(string input, int startIndex, out NameValueHeaderValue parsedValue) + { + Contract.Requires(input != null); + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the name, i.e. in name/value string "=". Caller must remove + // leading whitespaces. + var nameLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (nameLength == 0) + { + return 0; + } + + var name = input.Substring(startIndex, nameLength); + var current = startIndex + nameLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the separator between name and value + if ((current == input.Length) || (input[current] != '=')) + { + // We only have a name and that's OK. Return. + parsedValue = new NameValueHeaderValue(); + parsedValue._name = name; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); // skip whitespaces + return current - startIndex; + } + + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the value, i.e. in name/value string "=" + int valueLength = GetValueLength(input, current); + + // Value after the '=' may be empty + // Use parameterless ctor to avoid double-parsing of name and value, i.e. skip public ctor validation. + parsedValue = new NameValueHeaderValue(); + parsedValue._name = name; + parsedValue._value = input.Substring(current, valueLength); + current = current + valueLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); // skip whitespaces + return current - startIndex; + } + + // Returns the length of a name/value list, separated by 'delimiter'. E.g. "a=b, c=d, e=f" adds 3 + // name/value pairs to 'nameValueCollection' if 'delimiter' equals ','. + internal static int GetNameValueListLength(string input, int startIndex, char delimiter, + ICollection nameValueCollection) + { + Contract.Requires(nameValueCollection != null); + Contract.Requires(startIndex >= 0); + + if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) + { + return 0; + } + + var current = startIndex + HttpRuleParser.GetWhitespaceLength(input, startIndex); + while (true) + { + NameValueHeaderValue parameter = null; + var nameValueLength = GetNameValueLength(input, current, out parameter); + + if (nameValueLength == 0) + { + // There may be a trailing ';' + return current - startIndex; + } + + nameValueCollection.Add(parameter); + current = current + nameValueLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if ((current == input.Length) || (input[current] != delimiter)) + { + // We're done and we have at least one valid name/value pair. + return current - startIndex; + } + + // input[current] is 'delimiter'. Skip the delimiter and whitespaces and try to parse again. + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + } + + public static NameValueHeaderValue Find(ICollection values, string name) + { + Contract.Requires((name != null) && (name.Length > 0)); + + if ((values == null) || (values.Count == 0)) + { + return null; + } + + foreach (var value in values) + { + if (string.Compare(value.Name, name, StringComparison.OrdinalIgnoreCase) == 0) + { + return value; + } + } + return null; + } + + internal static int GetValueLength(string input, int startIndex) + { + Contract.Requires(input != null); + + if (startIndex >= input.Length) + { + return 0; + } + + var valueLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (valueLength == 0) + { + // A value can either be a token or a quoted string. Check if it is a quoted string. + if (HttpRuleParser.GetQuotedStringLength(input, startIndex, out valueLength) != HttpParseResult.Parsed) + { + // We have an invalid value. Reset the name and return. + return 0; + } + } + return valueLength; + } + + private static void CheckNameValueFormat(string name, string value) + { + HeaderUtilities.CheckValidToken(name, "name"); + CheckValueFormat(value); + } + + private static void CheckValueFormat(string value) + { + // Either value is null/empty or a valid token/quoted string + if (!(string.IsNullOrEmpty(value) || (GetValueLength(value, 0) == value.Length))) + { + throw new FormatException(string.Format(System.Globalization.CultureInfo.InvariantCulture, "The header value is invalid: '{0}'", value)); + } + } + + private static NameValueHeaderValue CreateNameValue() + { + return new NameValueHeaderValue(); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs b/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs new file mode 100644 index 0000000000..a725ce11fe --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Net.Http.Headers +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs new file mode 100644 index 0000000000..f6746df140 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.ObjectModel; + +namespace Microsoft.Net.Http.Headers +{ + // List allows 'null' values to be added. This is not what we want so we use a custom Collection derived + // type to throw if 'null' gets added. Collection internally uses List which comes at some cost. In addition + // Collection.Add() calls List.InsertItem() which is an O(n) operation (compared to O(1) for List.Add()). + // This type is only used for very small collections (1-2 items) to keep the impact of using Collection small. + internal class ObjectCollection : Collection where T : class + { + private static readonly Action DefaultValidator = CheckNotNull; + + private Action _validator; + + public ObjectCollection() + : this(DefaultValidator) + { + } + + public ObjectCollection(Action validator) + { + _validator = validator; + } + + protected override void InsertItem(int index, T item) + { + if (_validator != null) + { + _validator(item); + } + base.InsertItem(index, item); + } + + protected override void SetItem(int index, T item) + { + if (_validator != null) + { + _validator(item); + } + base.SetItem(index, item); + } + + private static void CheckNotNull(T item) + { + // null values cannot be added to the collection. + if (item == null) + { + throw new ArgumentNullException("item"); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs new file mode 100644 index 0000000000..65f976a21c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -0,0 +1,166 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics.Contracts; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeConditionHeaderValue + { + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetRangeConditionLength); + + private DateTimeOffset? _lastModified; + private EntityTagHeaderValue _entityTag; + + private RangeConditionHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public RangeConditionHeaderValue(DateTimeOffset lastModified) + { + _lastModified = lastModified; + } + + public RangeConditionHeaderValue(EntityTagHeaderValue entityTag) + { + if (entityTag == null) + { + throw new ArgumentNullException("entityTag"); + } + + _entityTag = entityTag; + } + + public RangeConditionHeaderValue(string entityTag) + : this(new EntityTagHeaderValue(entityTag)) + { + } + + public DateTimeOffset? LastModified + { + get { return _lastModified; } + } + + public EntityTagHeaderValue EntityTag + { + get { return _entityTag; } + } + + public override string ToString() + { + if (_entityTag == null) + { + return HttpRuleParser.DateToString(_lastModified.Value); + } + return _entityTag.ToString(); + } + + public override bool Equals(object obj) + { + var other = obj as RangeConditionHeaderValue; + + if (other == null) + { + return false; + } + + if (_entityTag == null) + { + return (other._lastModified != null) && (_lastModified.Value == other._lastModified.Value); + } + + return _entityTag.Equals(other._entityTag); + } + + public override int GetHashCode() + { + if (_entityTag == null) + { + return _lastModified.Value.GetHashCode(); + } + + return _entityTag.GetHashCode(); + } + + public static RangeConditionHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out RangeConditionHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetRangeConditionLength(string input, int startIndex, out RangeConditionHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + // Make sure we have at least 2 characters + if (string.IsNullOrEmpty(input) || (startIndex + 1 >= input.Length)) + { + return 0; + } + + var current = startIndex; + + // Caller must remove leading whitespaces. + DateTimeOffset date = DateTimeOffset.MinValue; + EntityTagHeaderValue entityTag = null; + + // Entity tags are quoted strings optionally preceded by "W/". By looking at the first two character we + // can determine whether the string is en entity tag or a date. + var firstChar = input[current]; + var secondChar = input[current + 1]; + + if ((firstChar == '\"') || (((firstChar == 'w') || (firstChar == 'W')) && (secondChar == '/'))) + { + // trailing whitespaces are removed by GetEntityTagLength() + var entityTagLength = EntityTagHeaderValue.GetEntityTagLength(input, current, out entityTag); + + if (entityTagLength == 0) + { + return 0; + } + + current = current + entityTagLength; + + // RangeConditionHeaderValue only allows 1 value. There must be no delimiter/other chars after an + // entity tag. + if (current != input.Length) + { + return 0; + } + } + else + { + if (!HttpRuleParser.TryStringToDate(input.Substring(current), out date)) + { + return 0; + } + + // If we got a valid date, then the parser consumed the whole string (incl. trailing whitespaces). + current = input.Length; + } + + parsedValue = new RangeConditionHeaderValue(); + if (entityTag == null) + { + parsedValue._lastModified = date; + } + else + { + parsedValue._entityTag = entityTag; + } + + return current - startIndex; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs new file mode 100644 index 0000000000..3045a8b387 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs @@ -0,0 +1,161 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeHeaderValue + { + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetRangeLength); + + private string _unit; + private ICollection _ranges; + + public RangeHeaderValue() + { + _unit = HeaderUtilities.BytesUnit; + } + + public RangeHeaderValue(long? from, long? to) + { + // convenience ctor: "Range: bytes=from-to" + _unit = HeaderUtilities.BytesUnit; + Ranges.Add(new RangeItemHeaderValue(from, to)); + } + + public string Unit + { + get { return _unit; } + set + { + HeaderUtilities.CheckValidToken(value, "value"); + _unit = value; + } + } + + public ICollection Ranges + { + get + { + if (_ranges == null) + { + _ranges = new ObjectCollection(); + } + return _ranges; + } + } + + public override string ToString() + { + var sb = new StringBuilder(_unit); + sb.Append('='); + + var first = true; + foreach (var range in Ranges) + { + if (first) + { + first = false; + } + else + { + sb.Append(", "); + } + + sb.Append(range.From); + sb.Append('-'); + sb.Append(range.To); + } + + return sb.ToString(); + } + + public override bool Equals(object obj) + { + var other = obj as RangeHeaderValue; + + if (other == null) + { + return false; + } + + return (string.Compare(_unit, other._unit, StringComparison.OrdinalIgnoreCase) == 0) && + HeaderUtilities.AreEqualCollections(Ranges, other.Ranges); + } + + public override int GetHashCode() + { + var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_unit); + + foreach (var range in Ranges) + { + result = result ^ range.GetHashCode(); + } + + return result; + } + + public static RangeHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out RangeHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetRangeLength(string input, int startIndex, out RangeHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the unit string: in '=-, -' + var unitLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (unitLength == 0) + { + return 0; + } + + RangeHeaderValue result = new RangeHeaderValue(); + result._unit = input.Substring(startIndex, unitLength); + var current = startIndex + unitLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if ((current == input.Length) || (input[current] != '=')) + { + return 0; + } + + current++; // skip '=' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + var rangesLength = RangeItemHeaderValue.GetRangeItemListLength(input, current, result.Ranges); + + if (rangesLength == 0) + { + return 0; + } + + current = current + rangesLength; + Contract.Assert(current == input.Length, "GetRangeItemListLength() should consume the whole string or fail."); + + parsedValue = result; + return current - startIndex; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs new file mode 100644 index 0000000000..21c46f004c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -0,0 +1,226 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeItemHeaderValue + { + private long? _from; + private long? _to; + + public RangeItemHeaderValue(long? from, long? to) + { + if (!from.HasValue && !to.HasValue) + { + throw new ArgumentException("Invalid header range."); + } + if (from.HasValue && (from.Value < 0)) + { + throw new ArgumentOutOfRangeException("from"); + } + if (to.HasValue && (to.Value < 0)) + { + throw new ArgumentOutOfRangeException("to"); + } + if (from.HasValue && to.HasValue && (from.Value > to.Value)) + { + throw new ArgumentOutOfRangeException("from"); + } + + _from = from; + _to = to; + } + + public long? From + { + get { return _from; } + } + + public long? To + { + get { return _to; } + } + + public override string ToString() + { + if (!_from.HasValue) + { + return "-" + _to.Value.ToString(NumberFormatInfo.InvariantInfo); + } + else if (!_to.HasValue) + { + return _from.Value.ToString(NumberFormatInfo.InvariantInfo) + "-"; + } + return _from.Value.ToString(NumberFormatInfo.InvariantInfo) + "-" + + _to.Value.ToString(NumberFormatInfo.InvariantInfo); + } + + public override bool Equals(object obj) + { + var other = obj as RangeItemHeaderValue; + + if (other == null) + { + return false; + } + return ((_from == other._from) && (_to == other._to)); + } + + public override int GetHashCode() + { + if (!_from.HasValue) + { + return _to.GetHashCode(); + } + else if (!_to.HasValue) + { + return _from.GetHashCode(); + } + return _from.GetHashCode() ^ _to.GetHashCode(); + } + + // Returns the length of a range list. E.g. "1-2, 3-4, 5-6" adds 3 ranges to 'rangeCollection'. Note that empty + // list segments are allowed, e.g. ",1-2, , 3-4,,". + internal static int GetRangeItemListLength(string input, int startIndex, + ICollection rangeCollection) + { + Contract.Requires(rangeCollection != null); + Contract.Requires(startIndex >= 0); + Contract.Ensures((Contract.Result() == 0) || (rangeCollection.Count > 0), + "If we can parse the string, then we expect to have at least one range item."); + + if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) + { + return 0; + } + + // Empty segments are allowed, so skip all delimiter-only segments (e.g. ", ,"). + var separatorFound = false; + var current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(input, startIndex, true, out separatorFound); + // It's OK if we didn't find leading separator characters. Ignore 'separatorFound'. + + if (current == input.Length) + { + return 0; + } + + RangeItemHeaderValue range = null; + while (true) + { + var rangeLength = GetRangeItemLength(input, current, out range); + + if (rangeLength == 0) + { + return 0; + } + + rangeCollection.Add(range); + + current = current + rangeLength; + current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(input, current, true, out separatorFound); + + // If the string is not consumed, we must have a delimiter, otherwise the string is not a valid + // range list. + if ((current < input.Length) && !separatorFound) + { + return 0; + } + + if (current == input.Length) + { + return current - startIndex; + } + } + } + + internal static int GetRangeItemLength(string input, int startIndex, out RangeItemHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + // This parser parses number ranges: e.g. '1-2', '1-', '-2'. + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + var current = startIndex; + + // Try parse the first value of a value pair. + var fromStartIndex = current; + var fromLength = HttpRuleParser.GetNumberLength(input, current, false); + + if (fromLength > HttpRuleParser.MaxInt64Digits) + { + return 0; + } + + current = current + fromLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Afer the first value, the '-' character must follow. + if ((current == input.Length) || (input[current] != '-')) + { + // We need a '-' character otherwise this can't be a valid range. + return 0; + } + + current++; // skip the '-' character + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + var toStartIndex = current; + var toLength = 0; + + // If we didn't reach the end of the string, try parse the second value of the range. + if (current < input.Length) + { + toLength = HttpRuleParser.GetNumberLength(input, current, false); + + if (toLength > HttpRuleParser.MaxInt64Digits) + { + return 0; + } + + current = current + toLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + + if ((fromLength == 0) && (toLength == 0)) + { + return 0; // At least one value must be provided in order to be a valid range. + } + + // Try convert first value to int64 + long from = 0; + if ((fromLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(fromStartIndex, fromLength), out from)) + { + return 0; + } + + // Try convert second value to int64 + long to = 0; + if ((toLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(toStartIndex, toLength), out to)) + { + return 0; + } + + // 'from' must not be greater than 'to' + if ((fromLength > 0) && (toLength > 0) && (from > to)) + { + return 0; + } + + parsedValue = new RangeItemHeaderValue((fromLength == 0 ? (long?)null : (long?)from), + (toLength == 0 ? (long?)null : (long?)to)); + return current - startIndex; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs new file mode 100644 index 0000000000..3556454156 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -0,0 +1,364 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // http://tools.ietf.org/html/rfc6265 + public class SetCookieHeaderValue + { + private const string ExpiresToken = "expires"; + private const string MaxAgeToken = "max-age"; + private const string DomainToken = "domain"; + private const string PathToken = "path"; + private const string SecureToken = "secure"; + private const string HttpOnlyToken = "httponly"; + private const string DefaultPath = "/"; // TODO: Used? + + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetSetCookieLength); + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetSetCookieLength); + + private string _name; + private string _value; + + private SetCookieHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public SetCookieHeaderValue([NotNull] string name) + : this(name, string.Empty) + { + } + + public SetCookieHeaderValue([NotNull] string name, [NotNull] string value) + { + Name = name; + Value = value; + } + + public string Name + { + get { return _name; } + set + { + CookieHeaderValue.CheckNameFormat(value, "name"); + _name = value; + } + } + + public string Value + { + get { return _value; } + set + { + CookieHeaderValue.CheckValueFormat(value, "value"); + _value = value; + } + } + + public DateTimeOffset? Expires { get; set; } + + public TimeSpan? MaxAge { get; set; } + + public string Domain { get; set; } + + // TODO: PathString? + public string Path { get; set; } + + public bool Secure { get; set; } + + public bool HttpOnly { get; set; } + + // name="val ue"; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly + public override string ToString() + { + StringBuilder header = new StringBuilder(); + + header.Append(_name); + header.Append("="); + header.Append(_value); + + if (Expires.HasValue) + { + AppendSegment(header, ExpiresToken, HeaderUtilities.FormatDate(Expires.Value)); + } + + if (MaxAge.HasValue) + { + AppendSegment(header, MaxAgeToken, HeaderUtilities.FormatInt64((long)MaxAge.Value.TotalSeconds)); + } + + if (Domain != null) + { + AppendSegment(header, DomainToken, Domain); + } + + if (Path != null) + { + AppendSegment(header, PathToken, Path); + } + + if (Secure) + { + AppendSegment(header, SecureToken, null); + } + + if (HttpOnly) + { + AppendSegment(header, HttpOnlyToken, null); + } + + return header.ToString(); + } + + private static void AppendSegment(StringBuilder builder, string name, string value) + { + builder.Append("; "); + builder.Append(name); + if (value != null) + { + builder.Append("="); + builder.Append(value); + } + } + + public static SetCookieHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out SetCookieHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + // name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly + private static int GetSetCookieLength(string input, int startIndex, out SetCookieHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + var offset = startIndex; + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (offset >= input.Length)) + { + return 0; + } + + var result = new SetCookieHeaderValue(); + + // The caller should have already consumed any leading whitespace, commas, etc.. + + // Name=value; + + // Name + var itemLength = HttpRuleParser.GetTokenLength(input, offset); + if (itemLength == 0) + { + return 0; + } + result._name = input.Substring(offset, itemLength); + offset += itemLength; + + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + + string value; + // value or "quoted value" + itemLength = CookieHeaderValue.GetCookieValueLength(input, offset, out value); + // The value may be empty + result._value = input.Substring(offset, itemLength); + offset += itemLength; + + // *(';' SP cookie-av) + while (offset < input.Length) + { + if (input[offset] == ',') + { + // Divider between headers + break; + } + if (input[offset] != ';') + { + // Expecting a ';' between parameters + return 0; + } + offset++; + + offset += HttpRuleParser.GetWhitespaceLength(input, offset); + + // cookie-av = expires-av / max-age-av / domain-av / path-av / secure-av / httponly-av / extension-av + itemLength = HttpRuleParser.GetTokenLength(input, offset); + if (itemLength == 0) + { + // Trailing ';' or leading into garbage. Let the next parser fail. + break; + } + var token = input.Substring(offset, itemLength); + offset += itemLength; + + // expires-av = "Expires=" sane-cookie-date + if (string.Equals(token, ExpiresToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + var dateString = ReadToSemicolonOrEnd(input, ref offset); + DateTimeOffset expirationDate; + if (!HttpRuleParser.TryStringToDate(dateString, out expirationDate)) + { + // Invalid expiration date, abort + return 0; + } + result.Expires = expirationDate; + } + // max-age-av = "Max-Age=" non-zero-digit *DIGIT + else if (string.Equals(token, MaxAgeToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + + itemLength = HttpRuleParser.GetNumberLength(input, offset, allowDecimal: false); + if (itemLength == 0) + { + return 0; + } + var numberString = input.Substring(offset, itemLength); + long maxAge; + if (!HeaderUtilities.TryParseInt64(numberString, out maxAge)) + { + // Invalid expiration date, abort + return 0; + } + result.MaxAge = TimeSpan.FromSeconds(maxAge); + offset += itemLength; + } + // domain-av = "Domain=" domain-value + // domain-value = ; defined in [RFC1034], Section 3.5, as enhanced by [RFC1123], Section 2.1 + else if (string.Equals(token, DomainToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + // We don't do any detailed validation on the domain. + result.Domain = ReadToSemicolonOrEnd(input, ref offset); + } + // path-av = "Path=" path-value + // path-value = + else if (string.Equals(token, PathToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + // We don't do any detailed validation on the path. + result.Path = ReadToSemicolonOrEnd(input, ref offset); + } + // secure-av = "Secure" + else if (string.Equals(token, SecureToken, StringComparison.OrdinalIgnoreCase)) + { + result.Secure = true; + } + // httponly-av = "HttpOnly" + else if (string.Equals(token, HttpOnlyToken, StringComparison.OrdinalIgnoreCase)) + { + result.HttpOnly = true; + } + // extension-av = + else + { + // TODO: skip it? Store it in a list? + } + } + + parsedValue = result; + return offset - startIndex; + } + + private static bool ReadEqualsSign(string input, ref int offset) + { + // = (no spaces) + if (offset >= input.Length || input[offset] != '=') + { + return false; + } + offset++; + return true; + } + + private static string ReadToSemicolonOrEnd(string input, ref int offset) + { + var end = input.IndexOf(';', offset); + if (end < 0) + { + // Remainder of the string + end = input.Length; + } + var itemLength = end - offset; + var result = input.Substring(offset, itemLength); + offset += itemLength; + return result; + } + + public override bool Equals(object obj) + { + var other = obj as SetCookieHeaderValue; + + if (other == null) + { + return false; + } + + return string.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) + && string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase) + && Expires.Equals(other.Expires) + && MaxAge.Equals(other.MaxAge) + && string.Equals(Domain, other.Domain, StringComparison.OrdinalIgnoreCase) + && string.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase) + && Secure == other.Secure + && HttpOnly == other.HttpOnly; + } + + public override int GetHashCode() + { + return StringComparer.OrdinalIgnoreCase.GetHashCode(_name) + ^ StringComparer.OrdinalIgnoreCase.GetHashCode(_value) + ^ (Expires.HasValue ? Expires.GetHashCode() : 0) + ^ (MaxAge.HasValue ? MaxAge.GetHashCode() : 0) + ^ (Domain != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Domain) : 0) + ^ (Path != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Path) : 0) + ^ Secure.GetHashCode() + ^ HttpOnly.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs new file mode 100644 index 0000000000..41cacc9380 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -0,0 +1,225 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + public class StringWithQualityHeaderValue + { + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetStringWithQualityLength); + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetStringWithQualityLength); + + private string _value; + private double? _quality; + + private StringWithQualityHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public StringWithQualityHeaderValue(string value) + { + HeaderUtilities.CheckValidToken(value, "value"); + + _value = value; + } + + public StringWithQualityHeaderValue(string value, double quality) + { + HeaderUtilities.CheckValidToken(value, "value"); + + if ((quality < 0) || (quality > 1)) + { + throw new ArgumentOutOfRangeException("quality"); + } + + _value = value; + _quality = quality; + } + + public string Value + { + get { return _value; } + } + + public double? Quality + { + get { return _quality; } + } + + public override string ToString() + { + if (_quality.HasValue) + { + return _value + "; q=" + _quality.Value.ToString("0.0##", NumberFormatInfo.InvariantInfo); + } + + return _value; + } + + public override bool Equals(object obj) + { + var other = obj as StringWithQualityHeaderValue; + + if (other == null) + { + return false; + } + + if (string.Compare(_value, other._value, StringComparison.OrdinalIgnoreCase) != 0) + { + return false; + } + + if (_quality.HasValue) + { + // Note that we don't consider double.Epsilon here. We really consider two values equal if they're + // actually equal. This makes sure that we also get the same hashcode for two values considered equal + // by Equals(). + return other._quality.HasValue && (_quality.Value == other._quality.Value); + } + + // If we don't have a quality value, then 'other' must also have no quality assigned in order to be + // considered equal. + return !other._quality.HasValue; + } + + public override int GetHashCode() + { + var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_value); + + if (_quality.HasValue) + { + result = result ^ _quality.Value.GetHashCode(); + } + + return result; + } + + public static StringWithQualityHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out StringWithQualityHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList input) + { + return MultipleValueParser.ParseValues(input); + } + + public static bool TryParseList(IList input, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(input, out parsedValues); + } + + private static int GetStringWithQualityLength(string input, int startIndex, out StringWithQualityHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the value string: in '; q=' + var valueLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (valueLength == 0) + { + return 0; + } + + StringWithQualityHeaderValue result = new StringWithQualityHeaderValue(); + result._value = input.Substring(startIndex, valueLength); + var current = startIndex + valueLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if ((current == input.Length) || (input[current] != ';')) + { + parsedValue = result; + return current - startIndex; // we have a valid token, but no quality. + } + + current++; // skip ';' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // If we found a ';' separator, it must be followed by a quality information + if (!TryReadQuality(input, result, ref current)) + { + return 0; + } + + parsedValue = result; + return current - startIndex; + } + + private static bool TryReadQuality(string input, StringWithQualityHeaderValue result, ref int index) + { + var current = index; + + // See if we have a quality value by looking for "q" + if ((current == input.Length) || ((input[current] != 'q') && (input[current] != 'Q'))) + { + return false; + } + + current++; // skip 'q' identifier + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // If we found "q" it must be followed by "=" + if ((current == input.Length) || (input[current] != '=')) + { + return false; + } + + current++; // skip '=' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (current == input.Length) + { + return false; + } + + int qualityLength = HttpRuleParser.GetNumberLength(input, current, true); + + if (qualityLength == 0) + { + return false; + } + + double quality; + if (!double.TryParse(input.Substring(current, qualityLength), NumberStyles.AllowDecimalPoint, + NumberFormatInfo.InvariantInfo, out quality)) + { + return false; + } + + if ((quality < 0) || (quality > 1)) + { + return false; + } + + result._quality = quality; + + current = current + qualityLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + index = current; + return true; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs new file mode 100644 index 0000000000..d7a3def9e1 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.Net.Http.Headers +{ + /// + /// Implementation of that can compare content negotiation header fields + /// based on their quality values (a.k.a q-values). This applies to values used in accept-charset, + /// accept-encoding, accept-language and related header fields with similar syntax rules. See + /// for a comparer for media type + /// q-values. + /// + public class StringWithQualityHeaderValueComparer : IComparer + { + private static readonly StringWithQualityHeaderValueComparer _qualityComparer = + new StringWithQualityHeaderValueComparer(); + + private StringWithQualityHeaderValueComparer() + { + } + + public static StringWithQualityHeaderValueComparer QualityComparer + { + get { return _qualityComparer; } + } + + /// + /// Compares two based on their quality value + /// (a.k.a their "q-value"). + /// Values with identical q-values are considered equal (i.e the result is 0) with the exception of wild-card + /// values (i.e. a value of "*") which are considered less than non-wild-card values. This allows to sort + /// a sequence of following their q-values ending up with any + /// wild-cards at the end. + /// + /// The first value to compare. + /// The second value to compare + /// The result of the comparison. + public int Compare([NotNull] StringWithQualityHeaderValue stringWithQuality1, + [NotNull] StringWithQualityHeaderValue stringWithQuality2) + { + var quality1 = stringWithQuality1.Quality ?? HeaderQuality.Match; + var quality2 = stringWithQuality2.Quality ?? HeaderQuality.Match; + var qualityDifference = quality1 - quality2; + if (qualityDifference < 0) + { + return -1; + } + else if (qualityDifference > 0) + { + return 1; + } + + if (!String.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) + { + if (String.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) + { + return -1; + } + else if (String.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) + { + return 1; + } + } + + return 0; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json new file mode 100644 index 0000000000..c0c551004b --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -0,0 +1,19 @@ +{ + "version": "1.0.0-*", + "dependencies": { + }, + "frameworks" : { + "net45" : { }, + "aspnet50" : { }, + "aspnetcore50" : { + "dependencies": { + "System.Collections": "4.0.10-beta-*", + "System.Diagnostics.Contracts": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Text.Encoding": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*" + } + } + } +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs new file mode 100644 index 0000000000..6b437d8925 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -0,0 +1,206 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.Net.Http.Headers; +using Xunit; + +namespace Microsoft.AspNet.Http.Headers +{ + public class HeaderDictionaryTypeExtensionsTest + { + [Fact] + public void GetT_KnownTypeWithValidValue_Success() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.ContentType] = "text/plain"; + + var result = headers.Get(HeaderNames.ContentType); + + var expected = new MediaTypeHeaderValue("text/plain"); + Assert.Equal(expected, result); + } + + [Fact] + public void GetT_KnownTypeWithMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var result = headers.Get(HeaderNames.ContentType); + + Assert.Null(result); + } + + [Fact] + public void GetT_KnownTypeWithInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.ContentType] = "invalid"; + + var result = headers.Get(HeaderNames.ContentType); + + Assert.Null(result); + } + + [Fact] + public void GetT_UnknownTypeWithTryParseAndValidValue_Success() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + var result = headers.Get("custom"); + Assert.NotNull(result); + } + + [Fact] + public void GetT_UnknownTypeWithTryParseAndInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers["custom"] = "invalid"; + + var result = headers.Get("custom"); + Assert.Null(result); + } + + [Fact] + public void GetT_UnknownTypeWithTryParseAndMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var result = headers.Get("custom"); + Assert.Null(result); + } + + [Fact] + public void GetT_UnknownTypeWithoutTryParse_Throws() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + Assert.Throws(() => headers.Get("custom")); + } + + [Fact] + public void GetListT_KnownTypeWithValidValue_Success() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.Accept] = "text/plain; q=0.9, text/other, */*"; + + var result = headers.GetList(HeaderNames.Accept); + + var expected = new[] { + new MediaTypeHeaderValue("text/plain", 0.9), + new MediaTypeHeaderValue("text/other"), + new MediaTypeHeaderValue("*/*"), + }.ToList(); + Assert.Equal(expected, result); + } + + [Fact] + public void GetListT_KnownTypeWithMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var result = headers.GetList(HeaderNames.Accept); + + Assert.Null(result); + } + + [Fact] + public void GetListT_KnownTypeWithInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.Accept] = "invalid"; + + var result = headers.GetList(HeaderNames.Accept); + + Assert.Null(result); + } + + [Fact] + public void GetListT_UnknownTypeWithTryParseListAndValidValue_Success() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + var results = headers.GetList("custom"); + Assert.NotNull(results); + Assert.Equal(new[] { new TestHeaderValue() }.ToList(), results); + } + + [Fact] + public void GetListT_UnknownTypeWithTryParseListAndInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers["custom"] = "invalid"; + + var results = headers.GetList("custom"); + Assert.Null(results); + } + + [Fact] + public void GetListT_UnknownTypeWithTryParseListAndMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var results = headers.GetList("custom"); + Assert.Null(results); + } + + [Fact] + public void GetListT_UnknownTypeWithoutTryParseList_Throws() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + Assert.Throws(() => headers.GetList("custom")); + } + + public class TestHeaderValue + { + public static bool TryParse(string value, out TestHeaderValue result) + { + if (string.Equals("valid", value)) + { + result = new TestHeaderValue(); + return true; + } + result = null; + return false; + } + + public static bool TryParseList(IList values, out IList result) + { + var results = new List(); + foreach (var value in values) + { + if (string.Equals("valid", value)) + { + results.Add(new TestHeaderValue()); + } + } + if (results.Count > 0) + { + result = results; + return true; + } + result = null; + return false; + } + + public override bool Equals(object obj) + { + var other = obj as TestHeaderValue; + return other != null; + } + + public override int GetHashCode() + { + return 0; + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index cf6c82e1bb..b3dbf90a69 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs similarity index 98% rename from test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs rename to test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs index 76d3ac977d..2f52599c83 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNet.Http.Extensions { public class QueryBuilderTests { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 9dc54ab09e..1ed29d112e 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.Http.Extensions.Tests { } - public class TestMiddleware + public class TestMiddleware { RequestDelegate _next; @@ -133,9 +133,10 @@ namespace Microsoft.AspNet.Http.Extensions.Tests _next = next; } - public async Task Invoke(HttpContext context, ITestService testService) + public Task Invoke(HttpContext context, ITestService testService) { context.Items[typeof(ITestService)] = testService; + return Task.FromResult(0); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index c82bfd67b7..397d480580 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -59,26 +59,6 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Null(request.ContentType); } - [Fact] - public void GetAcceptHeader_ReturnsNullIfHeaderDoesNotExist() - { - // Arrange - var request = GetRequestWithAcceptHeader(acceptHeader: null); - - // Act and Assert - Assert.Null(request.Accept); - } - - [Fact] - public void GetAcceptCharsetHeader_ReturnsNullIfHeaderDoesNotExist() - { - // Arrange - var request = GetRequestWithAcceptCharsetHeader(acceptCharset: null); - - // Act and Assert - Assert.Null(request.AcceptCharset); - } - [Fact] public void Host_GetsHostFromHeaders() { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index 1a6f3883fd..098750fe14 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index c3fcb3e97c..a445ee721d 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -2,12 +2,14 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { } + "aspnet50": { }, + "aspnetcore50": { } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs new file mode 100644 index 0000000000..0ac0fe3d2c --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs @@ -0,0 +1,599 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class CacheControlHeaderValueTest + { + [Fact] + public void Properties_SetAndGetAllProperties_SetValueReturnedInGetter() + { + var cacheControl = new CacheControlHeaderValue(); + + // Bool properties + cacheControl.NoCache = true; + Assert.True(cacheControl.NoCache, "NoCache"); + cacheControl.NoStore = true; + Assert.True(cacheControl.NoStore, "NoStore"); + cacheControl.MaxStale = true; + Assert.True(cacheControl.MaxStale, "MaxStale"); + cacheControl.NoTransform = true; + Assert.True(cacheControl.NoTransform, "NoTransform"); + cacheControl.OnlyIfCached = true; + Assert.True(cacheControl.OnlyIfCached, "OnlyIfCached"); + cacheControl.Public = true; + Assert.True(cacheControl.Public, "Public"); + cacheControl.Private = true; + Assert.True(cacheControl.Private, "Private"); + cacheControl.MustRevalidate = true; + Assert.True(cacheControl.MustRevalidate, "MustRevalidate"); + cacheControl.ProxyRevalidate = true; + Assert.True(cacheControl.ProxyRevalidate, "ProxyRevalidate"); + + // TimeSpan properties + TimeSpan timeSpan = new TimeSpan(1, 2, 3); + cacheControl.MaxAge = timeSpan; + Assert.Equal(timeSpan, cacheControl.MaxAge); + cacheControl.SharedMaxAge = timeSpan; + Assert.Equal(timeSpan, cacheControl.SharedMaxAge); + cacheControl.MaxStaleLimit = timeSpan; + Assert.Equal(timeSpan, cacheControl.MaxStaleLimit); + cacheControl.MinFresh = timeSpan; + Assert.Equal(timeSpan, cacheControl.MinFresh); + + // String collection properties + Assert.NotNull(cacheControl.NoCacheHeaders); + Assert.Throws(() => cacheControl.NoCacheHeaders.Add(null)); + Assert.Throws(() => cacheControl.NoCacheHeaders.Add("invalid token")); + cacheControl.NoCacheHeaders.Add("token"); + Assert.Equal(1, cacheControl.NoCacheHeaders.Count); + Assert.Equal("token", cacheControl.NoCacheHeaders.First()); + + Assert.NotNull(cacheControl.PrivateHeaders); + Assert.Throws(() => cacheControl.PrivateHeaders.Add(null)); + Assert.Throws(() => cacheControl.PrivateHeaders.Add("invalid token")); + cacheControl.PrivateHeaders.Add("token"); + Assert.Equal(1, cacheControl.PrivateHeaders.Count); + Assert.Equal("token", cacheControl.PrivateHeaders.First()); + + // NameValueHeaderValue collection property + Assert.NotNull(cacheControl.Extensions); + Assert.Throws(() => cacheControl.Extensions.Add(null)); + cacheControl.Extensions.Add(new NameValueHeaderValue("name", "value")); + Assert.Equal(1, cacheControl.Extensions.Count); + Assert.Equal(new NameValueHeaderValue("name", "value"), cacheControl.Extensions.First()); + } + + [Fact] + public void ToString_UseRequestDirectiveValues_AllSerializedCorrectly() + { + var cacheControl = new CacheControlHeaderValue(); + Assert.Equal("", cacheControl.ToString()); + + // Note that we allow all combinations of all properties even though the RFC specifies rules what value + // can be used together. + // Also for property pairs (bool property + collection property) like 'NoCache' and 'NoCacheHeaders' the + // caller needs to set the bool property in order for the collection to be populated as string. + + // Cache Request Directive sample + cacheControl.NoStore = true; + Assert.Equal("no-store", cacheControl.ToString()); + cacheControl.NoCache = true; + Assert.Equal("no-store, no-cache", cacheControl.ToString()); + cacheControl.MaxAge = new TimeSpan(0, 1, 10); + Assert.Equal("no-store, no-cache, max-age=70", cacheControl.ToString()); + cacheControl.MaxStale = true; + Assert.Equal("no-store, no-cache, max-age=70, max-stale", cacheControl.ToString()); + cacheControl.MaxStaleLimit = new TimeSpan(0, 2, 5); + Assert.Equal("no-store, no-cache, max-age=70, max-stale=125", cacheControl.ToString()); + cacheControl.MinFresh = new TimeSpan(0, 3, 0); + Assert.Equal("no-store, no-cache, max-age=70, max-stale=125, min-fresh=180", cacheControl.ToString()); + + cacheControl = new CacheControlHeaderValue(); + cacheControl.NoTransform = true; + Assert.Equal("no-transform", cacheControl.ToString()); + cacheControl.OnlyIfCached = true; + Assert.Equal("no-transform, only-if-cached", cacheControl.ToString()); + cacheControl.Extensions.Add(new NameValueHeaderValue("custom")); + cacheControl.Extensions.Add(new NameValueHeaderValue("customName", "customValue")); + Assert.Equal("no-transform, only-if-cached, custom, customName=customValue", cacheControl.ToString()); + + cacheControl = new CacheControlHeaderValue(); + cacheControl.Extensions.Add(new NameValueHeaderValue("custom")); + Assert.Equal("custom", cacheControl.ToString()); + } + + [Fact] + public void ToString_UseResponseDirectiveValues_AllSerializedCorrectly() + { + var cacheControl = new CacheControlHeaderValue(); + Assert.Equal("", cacheControl.ToString()); + + cacheControl.NoCache = true; + Assert.Equal("no-cache", cacheControl.ToString()); + cacheControl.NoCacheHeaders.Add("token1"); + Assert.Equal("no-cache=\"token1\"", cacheControl.ToString()); + cacheControl.Public = true; + Assert.Equal("public, no-cache=\"token1\"", cacheControl.ToString()); + + cacheControl = new CacheControlHeaderValue(); + cacheControl.Private = true; + Assert.Equal("private", cacheControl.ToString()); + cacheControl.PrivateHeaders.Add("token2"); + cacheControl.PrivateHeaders.Add("token3"); + Assert.Equal("private=\"token2, token3\"", cacheControl.ToString()); + cacheControl.MustRevalidate = true; + Assert.Equal("must-revalidate, private=\"token2, token3\"", cacheControl.ToString()); + cacheControl.ProxyRevalidate = true; + Assert.Equal("must-revalidate, proxy-revalidate, private=\"token2, token3\"", cacheControl.ToString()); + } + + [Fact] + public void GetHashCode_CompareValuesWithBoolFieldsSet_MatchExpectation() + { + // Verify that different bool fields return different hash values. + var values = new CacheControlHeaderValue[9]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].ProxyRevalidate = true; + values[1].NoCache = true; + values[2].NoStore = true; + values[3].MaxStale = true; + values[4].NoTransform = true; + values[5].OnlyIfCached = true; + values[6].Public = true; + values[7].Private = true; + values[8].MustRevalidate = true; + + // Only one bool field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareHashCodes(values[i], values[j], false); + } + } + } + + // Validate that two instances with the same bool fields set are equal. + values[0].NoCache = true; + CompareHashCodes(values[0], values[1], false); + values[1].ProxyRevalidate = true; + CompareHashCodes(values[0], values[1], true); + } + + [Fact] + public void GetHashCode_CompareValuesWithTimeSpanFieldsSet_MatchExpectation() + { + // Verify that different timespan fields return different hash values. + var values = new CacheControlHeaderValue[4]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 1); + values[2].MinFresh = new TimeSpan(0, 1, 1); + values[3].SharedMaxAge = new TimeSpan(0, 1, 1); + + // Only one timespan field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareHashCodes(values[i], values[j], false); + } + } + } + + values[0].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareHashCodes(values[0], values[1], false); + + values[1].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareHashCodes(values[0], values[1], true); + } + + [Fact] + public void GetHashCode_CompareCollectionFieldsSet_MatchExpectation() + { + var cacheControl1 = new CacheControlHeaderValue(); + var cacheControl2 = new CacheControlHeaderValue(); + var cacheControl3 = new CacheControlHeaderValue(); + var cacheControl4 = new CacheControlHeaderValue(); + var cacheControl5 = new CacheControlHeaderValue(); + + cacheControl1.NoCache = true; + cacheControl1.NoCacheHeaders.Add("token2"); + + cacheControl2.NoCache = true; + cacheControl2.NoCacheHeaders.Add("token1"); + cacheControl2.NoCacheHeaders.Add("token2"); + + CompareHashCodes(cacheControl1, cacheControl2, false); + + cacheControl1.NoCacheHeaders.Add("token1"); + CompareHashCodes(cacheControl1, cacheControl2, true); + + // Since NoCache and Private generate different hash codes, even if NoCacheHeaders and PrivateHeaders + // have the same values, the hash code will be different. + cacheControl3.Private = true; + cacheControl3.PrivateHeaders.Add("token2"); + CompareHashCodes(cacheControl1, cacheControl3, false); + + + cacheControl4.Extensions.Add(new NameValueHeaderValue("custom")); + CompareHashCodes(cacheControl1, cacheControl4, false); + + cacheControl5.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + cacheControl5.Extensions.Add(new NameValueHeaderValue("custom")); + CompareHashCodes(cacheControl4, cacheControl5, false); + + cacheControl4.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + CompareHashCodes(cacheControl4, cacheControl5, true); + } + + [Fact] + public void Equals_CompareValuesWithBoolFieldsSet_MatchExpectation() + { + // Verify that different bool fields return different hash values. + var values = new CacheControlHeaderValue[9]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].ProxyRevalidate = true; + values[1].NoCache = true; + values[2].NoStore = true; + values[3].MaxStale = true; + values[4].NoTransform = true; + values[5].OnlyIfCached = true; + values[6].Public = true; + values[7].Private = true; + values[8].MustRevalidate = true; + + // Only one bool field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareValues(values[i], values[j], false); + } + } + } + + // Validate that two instances with the same bool fields set are equal. + values[0].NoCache = true; + CompareValues(values[0], values[1], false); + values[1].ProxyRevalidate = true; + CompareValues(values[0], values[1], true); + } + + [Fact] + public void Equals_CompareValuesWithTimeSpanFieldsSet_MatchExpectation() + { + // Verify that different timespan fields return different hash values. + var values = new CacheControlHeaderValue[4]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 1); + values[2].MinFresh = new TimeSpan(0, 1, 1); + values[3].SharedMaxAge = new TimeSpan(0, 1, 1); + + // Only one timespan field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareValues(values[i], values[j], false); + } + } + } + + values[0].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareValues(values[0], values[1], false); + + values[1].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareValues(values[0], values[1], true); + + var value1 = new CacheControlHeaderValue(); + value1.MaxStale = true; + var value2 = new CacheControlHeaderValue(); + value2.MaxStale = true; + CompareValues(value1, value2, true); + + value2.MaxStaleLimit = new TimeSpan(1, 2, 3); + CompareValues(value1, value2, false); + } + + [Fact] + public void Equals_CompareCollectionFieldsSet_MatchExpectation() + { + var cacheControl1 = new CacheControlHeaderValue(); + var cacheControl2 = new CacheControlHeaderValue(); + var cacheControl3 = new CacheControlHeaderValue(); + var cacheControl4 = new CacheControlHeaderValue(); + var cacheControl5 = new CacheControlHeaderValue(); + var cacheControl6 = new CacheControlHeaderValue(); + + cacheControl1.NoCache = true; + cacheControl1.NoCacheHeaders.Add("token2"); + + Assert.False(cacheControl1.Equals(null), "Compare with 'null'"); + + cacheControl2.NoCache = true; + cacheControl2.NoCacheHeaders.Add("token1"); + cacheControl2.NoCacheHeaders.Add("token2"); + + CompareValues(cacheControl1, cacheControl2, false); + + cacheControl1.NoCacheHeaders.Add("token1"); + CompareValues(cacheControl1, cacheControl2, true); + + // Since NoCache and Private generate different hash codes, even if NoCacheHeaders and PrivateHeaders + // have the same values, the hash code will be different. + cacheControl3.Private = true; + cacheControl3.PrivateHeaders.Add("token2"); + CompareValues(cacheControl1, cacheControl3, false); + + cacheControl4.Private = true; + cacheControl4.PrivateHeaders.Add("token3"); + CompareValues(cacheControl3, cacheControl4, false); + + cacheControl5.Extensions.Add(new NameValueHeaderValue("custom")); + CompareValues(cacheControl1, cacheControl5, false); + + cacheControl6.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + cacheControl6.Extensions.Add(new NameValueHeaderValue("custom")); + CompareValues(cacheControl5, cacheControl6, false); + + cacheControl5.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + CompareValues(cacheControl5, cacheControl6, true); + } + + [Fact] + public void TryParse_DifferentValidScenarios_AllReturnTrue() + { + var expected = new CacheControlHeaderValue(); + expected.NoCache = true; + CheckValidTryParse(" , no-cache ,,", expected); + + expected = new CacheControlHeaderValue(); + expected.NoCache = true; + expected.NoCacheHeaders.Add("token1"); + expected.NoCacheHeaders.Add("token2"); + CheckValidTryParse("no-cache=\"token1, token2\"", expected); + + expected = new CacheControlHeaderValue(); + expected.NoStore = true; + expected.MaxAge = new TimeSpan(0, 0, 125); + expected.MaxStale = true; + CheckValidTryParse(" no-store , max-age = 125, max-stale,", expected); + + expected = new CacheControlHeaderValue(); + expected.MinFresh = new TimeSpan(0, 0, 123); + expected.NoTransform = true; + expected.OnlyIfCached = true; + expected.Extensions.Add(new NameValueHeaderValue("custom")); + CheckValidTryParse("min-fresh=123, no-transform, only-if-cached, custom", expected); + + expected = new CacheControlHeaderValue(); + expected.Public = true; + expected.Private = true; + expected.PrivateHeaders.Add("token1"); + expected.MustRevalidate = true; + expected.ProxyRevalidate = true; + expected.Extensions.Add(new NameValueHeaderValue("c", "d")); + expected.Extensions.Add(new NameValueHeaderValue("a", "b")); + CheckValidTryParse(",public, , private=\"token1\", must-revalidate, c=d, proxy-revalidate, a=b", expected); + + expected = new CacheControlHeaderValue(); + expected.Private = true; + expected.SharedMaxAge = new TimeSpan(0, 0, 1234567890); + expected.MaxAge = new TimeSpan(0, 0, 987654321); + CheckValidTryParse("s-maxage=1234567890, private, max-age = 987654321,", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom", "")); + CheckValidTryParse("custom=", expected); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + // Token-only values + [InlineData("no-store=15")] + [InlineData("no-store=")] + [InlineData("no-transform=a")] + [InlineData("no-transform=")] + [InlineData("only-if-cached=\"x\"")] + [InlineData("only-if-cached=")] + [InlineData("public=\"x\"")] + [InlineData("public=")] + [InlineData("must-revalidate=\"1\"")] + [InlineData("must-revalidate=")] + [InlineData("proxy-revalidate=x")] + [InlineData("proxy-revalidate=")] + // Token with optional field-name list + [InlineData("no-cache=")] + [InlineData("no-cache=token")] + [InlineData("no-cache=\"token")] + [InlineData("no-cache=\"\"")] // at least one token expected as value + [InlineData("private=")] + [InlineData("private=token")] + [InlineData("private=\"token")] + [InlineData("private=\",\"")] // at least one token expected as value + [InlineData("private=\"=\"")] + // Token with delta-seconds value + [InlineData("max-age")] + [InlineData("max-age=")] + [InlineData("max-age=a")] + [InlineData("max-age=\"1\"")] + [InlineData("max-age=1.5")] + [InlineData("max-stale=")] + [InlineData("max-stale=a")] + [InlineData("max-stale=\"1\"")] + [InlineData("max-stale=1.5")] + [InlineData("min-fresh")] + [InlineData("min-fresh=")] + [InlineData("min-fresh=a")] + [InlineData("min-fresh=\"1\"")] + [InlineData("min-fresh=1.5")] + [InlineData("s-maxage")] + [InlineData("s-maxage=")] + [InlineData("s-maxage=a")] + [InlineData("s-maxage=\"1\"")] + [InlineData("s-maxage=1.5")] + // Invalid Extension values + [InlineData("custom value")] + public void TryParse_DifferentInvalidScenarios_ReturnsFalse(string input) + { + CheckInvalidTryParse(input); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + // Just verify parser is implemented correctly. Don't try to test syntax parsed by CacheControlHeaderValue. + var expected = new CacheControlHeaderValue(); + expected.NoStore = true; + expected.MinFresh = new TimeSpan(0, 2, 3); + CheckValidParse(" , no-store, min-fresh=123", expected); + + expected = new CacheControlHeaderValue(); + expected.MaxStale = true; + expected.NoCache = true; + expected.NoCacheHeaders.Add("t"); + CheckValidParse("max-stale, no-cache=\"t\", ,,", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom")); + CheckValidParse("custom =", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom", "")); + CheckValidParse("custom =", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(null); + CheckInvalidParse(""); + CheckInvalidParse(" "); + CheckInvalidParse("no-cache,="); + CheckInvalidParse("max-age=123x"); + CheckInvalidParse("=no-cache"); + CheckInvalidParse("no-cache no-store"); + CheckInvalidParse("会"); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + // Just verify parser is implemented correctly. Don't try to test syntax parsed by CacheControlHeaderValue. + var expected = new CacheControlHeaderValue(); + expected.NoStore = true; + expected.MinFresh = new TimeSpan(0, 2, 3); + CheckValidTryParse(" , no-store, min-fresh=123", expected); + + expected = new CacheControlHeaderValue(); + expected.MaxStale = true; + expected.NoCache = true; + expected.NoCacheHeaders.Add("t"); + CheckValidTryParse("max-stale, no-cache=\"t\", ,,", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom")); + CheckValidTryParse("custom = ", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom", "")); + CheckValidTryParse("custom =", expected); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("no-cache,="); + CheckInvalidTryParse("max-age=123x"); + CheckInvalidTryParse("=no-cache"); + CheckInvalidTryParse("no-cache no-store"); + CheckInvalidTryParse("会"); + } + + #region Helper methods + + private void CompareHashCodes(CacheControlHeaderValue x, CacheControlHeaderValue y, bool areEqual) + { + if (areEqual) + { + Assert.Equal(x.GetHashCode(), y.GetHashCode()); + } + else + { + Assert.NotEqual(x.GetHashCode(), y.GetHashCode()); + } + } + + private void CompareValues(CacheControlHeaderValue x, CacheControlHeaderValue y, bool areEqual) + { + Assert.Equal(areEqual, x.Equals(y)); + Assert.Equal(areEqual, y.Equals(x)); + } + + private void CheckValidParse(string input, CacheControlHeaderValue expectedResult) + { + var result = CacheControlHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => CacheControlHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, CacheControlHeaderValue expectedResult) + { + CacheControlHeaderValue result = null; + Assert.True(CacheControlHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + CacheControlHeaderValue result = null; + Assert.False(CacheControlHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs new file mode 100644 index 0000000000..41bb2bdaae --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -0,0 +1,609 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class ContentDispositionHeaderValueTest + { + [Fact] + public void Ctor_ContentDispositionNull_Throw() + { + Assert.Throws(() => new ContentDispositionHeaderValue(null)); + } + + [Fact] + public void Ctor_ContentDispositionEmpty_Throw() + { + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new ContentDispositionHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_ContentDispositionInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException(" inline "); + AssertFormatException(" inline"); + AssertFormatException("inline "); + AssertFormatException("\"inline\""); + AssertFormatException("te xt"); + AssertFormatException("te=xt"); + AssertFormatException("teäxt"); + AssertFormatException("text;"); + AssertFormatException("te/xt;"); + AssertFormatException("inline; name=someName; "); + AssertFormatException("text;name=someName"); // ctor takes only disposition-type name, no parameters + } + + [Fact] + public void Ctor_ContentDispositionValidFormat_SuccessfullyCreated() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Equal("inline", contentDisposition.DispositionType); + Assert.Equal(0, contentDisposition.Parameters.Count); + Assert.Null(contentDisposition.Name); + Assert.Null(contentDisposition.FileName); + Assert.Null(contentDisposition.CreationDate); + Assert.Null(contentDisposition.ModificationDate); + Assert.Null(contentDisposition.ReadDate); + Assert.Null(contentDisposition.Size); + } + + [Fact] + public void Parameters_AddNull_Throw() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Throws(() => contentDisposition.Parameters.Add(null)); + } + + [Fact] + public void ContentDisposition_SetAndGetContentDisposition_MatchExpectations() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Equal("inline", contentDisposition.DispositionType); + + contentDisposition.DispositionType = "attachment"; + Assert.Equal("attachment", contentDisposition.DispositionType); + } + + [Fact] + public void Name_SetNameAndValidateObject_ParametersEntryForNameAdded() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + contentDisposition.Name = "myname"; + Assert.Equal("myname", contentDisposition.Name); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("name", contentDisposition.Parameters.First().Name); + + contentDisposition.Name = null; + Assert.Null(contentDisposition.Name); + Assert.Equal(0, contentDisposition.Parameters.Count); + contentDisposition.Name = null; // It's OK to set it again to null; no exception. + } + + [Fact] + public void Name_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + NameValueHeaderValue name = new NameValueHeaderValue("NAME", "old_name"); + contentDisposition.Parameters.Add(name); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("NAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Name = "new_name"; + Assert.Equal("new_name", contentDisposition.Name); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("NAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(name); + Assert.Null(contentDisposition.Name); + } + + [Fact] + public void FileName_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileName = new NameValueHeaderValue("FILENAME", "old_name"); + contentDisposition.Parameters.Add(fileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + + contentDisposition.FileName = "new_name"; + Assert.Equal("new_name", contentDisposition.FileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(fileName); + Assert.Null(contentDisposition.FileName); + } + + [Fact] + public void FileName_NeedsEncoding_EncodedAndDecodedCorrectly() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + contentDisposition.FileName = "FileÃName.bat"; + Assert.Equal("FileÃName.bat", contentDisposition.FileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("filename", contentDisposition.Parameters.First().Name); + Assert.Equal("\"=?utf-8?B?RmlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(contentDisposition.Parameters.First()); + Assert.Null(contentDisposition.FileName); + } + + [Fact] + public void FileName_UnknownOrBadEncoding_PropertyFails() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileName = new NameValueHeaderValue("FILENAME", "\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\""); + contentDisposition.Parameters.Add(fileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.Parameters.First().Value); + Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.FileName); + + contentDisposition.FileName = "new_name"; + Assert.Equal("new_name", contentDisposition.FileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(fileName); + Assert.Null(contentDisposition.FileName); + } + + [Fact] + public void FileNameStar_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileNameStar = new NameValueHeaderValue("FILENAME*", "old_name"); + contentDisposition.Parameters.Add(fileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + Assert.Null(contentDisposition.FileNameStar); // Decode failure + + contentDisposition.FileNameStar = "new_name"; + Assert.Equal("new_name", contentDisposition.FileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + Assert.Equal("UTF-8\'\'new_name", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(fileNameStar); + Assert.Null(contentDisposition.FileNameStar); + } + + [Fact] + public void FileNameStar_NeedsEncoding_EncodedAndDecodedCorrectly() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + contentDisposition.FileNameStar = "FileÃName.bat"; + Assert.Equal("FileÃName.bat", contentDisposition.FileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("filename*", contentDisposition.Parameters.First().Name); + Assert.Equal("UTF-8\'\'File%C3%83Name.bat", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(contentDisposition.Parameters.First()); + Assert.Null(contentDisposition.FileNameStar); + } + + [Fact] + public void FileNameStar_UnknownOrBadEncoding_PropertyFails() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileNameStar = new NameValueHeaderValue("FILENAME*", "utf-99'lang'File%CZName.bat"); + contentDisposition.Parameters.Add(fileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + Assert.Equal("utf-99'lang'File%CZName.bat", contentDisposition.Parameters.First().Value); + Assert.Null(contentDisposition.FileNameStar); // Decode failure + + contentDisposition.FileNameStar = "new_name"; + Assert.Equal("new_name", contentDisposition.FileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(fileNameStar); + Assert.Null(contentDisposition.FileNameStar); + } + + [Fact] + public void Dates_AddDateParameterThenUseProperty_ParametersEntryIsOverwritten() + { + string validDateString = "\"Tue, 15 Nov 1994 08:12:31 GMT\""; + DateTimeOffset validDate = DateTimeOffset.Parse("Tue, 15 Nov 1994 08:12:31 GMT"); + + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var dateParameter = new NameValueHeaderValue("Creation-DATE", validDateString); + contentDisposition.Parameters.Add(dateParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("Creation-DATE", contentDisposition.Parameters.First().Name); + + Assert.Equal(validDate, contentDisposition.CreationDate); + + var newDate = validDate.AddSeconds(1); + contentDisposition.CreationDate = newDate; + Assert.Equal(newDate, contentDisposition.CreationDate); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("Creation-DATE", contentDisposition.Parameters.First().Name); + Assert.Equal("\"Tue, 15 Nov 1994 08:12:32 GMT\"", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(dateParameter); + Assert.Null(contentDisposition.CreationDate); + } + + [Fact] + public void Dates_InvalidDates_PropertyFails() + { + string invalidDateString = "\"Tue, 15 Nov 94 08:12 GMT\""; + + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var dateParameter = new NameValueHeaderValue("read-DATE", invalidDateString); + contentDisposition.Parameters.Add(dateParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("read-DATE", contentDisposition.Parameters.First().Name); + + Assert.Null(contentDisposition.ReadDate); + + contentDisposition.ReadDate = null; + Assert.Null(contentDisposition.ReadDate); + Assert.Equal(0, contentDisposition.Parameters.Count); + } + + [Fact] + public void Size_AddSizeParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var sizeParameter = new NameValueHeaderValue("SIZE", "279172874239"); + contentDisposition.Parameters.Add(sizeParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + Assert.Equal(279172874239, contentDisposition.Size); + + contentDisposition.Size = 279172874240; + Assert.Equal(279172874240, contentDisposition.Size); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(sizeParameter); + Assert.Null(contentDisposition.Size); + } + + [Fact] + public void Size_InvalidSizes_PropertyFails() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var sizeParameter = new NameValueHeaderValue("SIZE", "-279172874239"); + contentDisposition.Parameters.Add(sizeParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + Assert.Null(contentDisposition.Size); + + // Negatives not allowed + Assert.Throws(() => contentDisposition.Size = -279172874240); + Assert.Null(contentDisposition.Size); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(sizeParameter); + Assert.Null(contentDisposition.Size); + } + + [Fact] + public void ToString_UseDifferentContentDispositions_AllSerializedCorrectly() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Equal("inline", contentDisposition.ToString()); + + contentDisposition.Name = "myname"; + Assert.Equal("inline; name=myname", contentDisposition.ToString()); + + contentDisposition.FileName = "my File Name"; + Assert.Equal("inline; name=myname; filename=\"my File Name\"", contentDisposition.ToString()); + + contentDisposition.CreationDate = new DateTimeOffset(new DateTime(2011, 2, 15)); + Assert.Equal("inline; name=myname; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"", contentDisposition.ToString()); + + contentDisposition.Parameters.Add(new NameValueHeaderValue("custom", "\"custom value\"")); + Assert.Equal("inline; name=myname; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\"", contentDisposition.ToString()); + + contentDisposition.Name = null; + Assert.Equal("inline; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\"", contentDisposition.ToString()); + + contentDisposition.FileNameStar = "File%Name"; + Assert.Equal("inline; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\"; filename*=UTF-8\'\'File%25Name", + contentDisposition.ToString()); + + contentDisposition.FileName = null; + Assert.Equal("inline; creation-date=\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\";" + + " filename*=UTF-8\'\'File%25Name", contentDisposition.ToString()); + + contentDisposition.CreationDate = null; + Assert.Equal("inline; custom=\"custom value\"; filename*=UTF-8\'\'File%25Name", + contentDisposition.ToString()); + } + + [Fact] + public void GetHashCode_UseContentDispositionWithAndWithoutParameters_SameOrDifferentHashCodes() + { + var contentDisposition1 = new ContentDispositionHeaderValue("inline"); + var contentDisposition2 = new ContentDispositionHeaderValue("inline"); + contentDisposition2.Name = "myname"; + var contentDisposition3 = new ContentDispositionHeaderValue("inline"); + contentDisposition3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var contentDisposition4 = new ContentDispositionHeaderValue("INLINE"); + var contentDisposition5 = new ContentDispositionHeaderValue("INLINE"); + contentDisposition5.Parameters.Add(new NameValueHeaderValue("NAME", "MYNAME")); + + Assert.NotEqual(contentDisposition1.GetHashCode(), contentDisposition2.GetHashCode()); + Assert.NotEqual(contentDisposition1.GetHashCode(), contentDisposition3.GetHashCode()); + Assert.NotEqual(contentDisposition2.GetHashCode(), contentDisposition3.GetHashCode()); + Assert.Equal(contentDisposition1.GetHashCode(), contentDisposition4.GetHashCode()); + Assert.Equal(contentDisposition2.GetHashCode(), contentDisposition5.GetHashCode()); + } + + [Fact] + public void Equals_UseContentDispositionWithAndWithoutParameters_EqualOrNotEqualNoExceptions() + { + var contentDisposition1 = new ContentDispositionHeaderValue("inline"); + var contentDisposition2 = new ContentDispositionHeaderValue("inline"); + contentDisposition2.Name = "myName"; + var contentDisposition3 = new ContentDispositionHeaderValue("inline"); + contentDisposition3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var contentDisposition4 = new ContentDispositionHeaderValue("INLINE"); + var contentDisposition5 = new ContentDispositionHeaderValue("INLINE"); + contentDisposition5.Parameters.Add(new NameValueHeaderValue("NAME", "MYNAME")); + var contentDisposition6 = new ContentDispositionHeaderValue("INLINE"); + contentDisposition6.Parameters.Add(new NameValueHeaderValue("NAME", "MYNAME")); + contentDisposition6.Parameters.Add(new NameValueHeaderValue("custom", "value")); + var contentDisposition7 = new ContentDispositionHeaderValue("attachment"); + + Assert.False(contentDisposition1.Equals(contentDisposition2), "No params vs. name."); + Assert.False(contentDisposition2.Equals(contentDisposition1), "name vs. no params."); + Assert.False(contentDisposition1.Equals(null), "No params vs. ."); + Assert.False(contentDisposition1.Equals(contentDisposition3), "No params vs. custom param."); + Assert.False(contentDisposition2.Equals(contentDisposition3), "name vs. custom param."); + Assert.True(contentDisposition1.Equals(contentDisposition4), "Different casing."); + Assert.True(contentDisposition2.Equals(contentDisposition5), "Different casing in name."); + Assert.False(contentDisposition5.Equals(contentDisposition6), "name vs. custom param."); + Assert.False(contentDisposition1.Equals(contentDisposition7), "inline vs. text/other."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + var expected = new ContentDispositionHeaderValue("inline"); + CheckValidParse("\r\n inline ", expected); + CheckValidParse("inline", expected); + + // We don't have to test all possible input strings, since most of the pieces are handled by other parsers. + // The purpose of this test is to verify that these other parsers are combined correctly to build a + // Content-Disposition parser. + expected.Name = "myName"; + CheckValidParse("\r\n inline ; name = myName ", expected); + CheckValidParse(" inline;name=myName", expected); + + expected.Name = null; + expected.DispositionType = "attachment"; + expected.FileName = "foo-ae.html"; + expected.Parameters.Add(new NameValueHeaderValue("filename*", "UTF-8''foo-%c3%a4.html")); + CheckValidParse(@"attachment; filename*=UTF-8''foo-%c3%a4.html; filename=foo-ae.html", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(""); + CheckInvalidParse(" "); + CheckInvalidParse(null); + CheckInvalidParse("inline会"); + CheckInvalidParse("inline ,"); + CheckInvalidParse("inline,"); + CheckInvalidParse("inline; name=myName ,"); + CheckInvalidParse("inline; name=myName,"); + CheckInvalidParse("inline; name=my会Name"); + CheckInvalidParse("inline/"); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + var expected = new ContentDispositionHeaderValue("inline"); + CheckValidTryParse("\r\n inline ", expected); + CheckValidTryParse("inline", expected); + + // We don't have to test all possible input strings, since most of the pieces are handled by other parsers. + // The purpose of this test is to verify that these other parsers are combined correctly to build a + // Content-Disposition parser. + expected.Name = "myName"; + CheckValidTryParse("\r\n inline ; name = myName ", expected); + CheckValidTryParse(" inline;name=myName", expected); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse(""); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(null); + CheckInvalidTryParse("inline会"); + CheckInvalidTryParse("inline ,"); + CheckInvalidTryParse("inline,"); + CheckInvalidTryParse("inline; name=myName ,"); + CheckInvalidTryParse("inline; name=myName,"); + CheckInvalidTryParse("text/"); + } + + public static TheoryData ValidContentDispositionTestCases = new TheoryData() + { + { "inline", new ContentDispositionHeaderValue("inline") }, // @"This should be equivalent to not including the header at all." + { "inline;", new ContentDispositionHeaderValue("inline") }, + { "inline;name=", new ContentDispositionHeaderValue("inline") { Parameters = { new NameValueHeaderValue("name", "") } } }, // TODO: passing in a null value causes a strange assert on CoreCLR before the test even starts. Not reproducable in the body of a test. + { "inline;name=value", new ContentDispositionHeaderValue("inline") { Name = "value" } }, + { "inline;name=value;", new ContentDispositionHeaderValue("inline") { Name = "value" } }, + { "inline;name=value;", new ContentDispositionHeaderValue("inline") { Name = "value" } }, + { @"inline; filename=""foo.html""", new ContentDispositionHeaderValue("inline") { FileName = @"""foo.html""" } }, + { @"inline; filename=""Not an attachment!""", new ContentDispositionHeaderValue("inline") { FileName = @"""Not an attachment!""" } }, // 'inline', specifying a filename of Not an attachment! - this checks for proper parsing for disposition types. + { @"inline; filename=""foo.pdf""", new ContentDispositionHeaderValue("inline") { FileName = @"""foo.pdf""" } }, + { "attachment", new ContentDispositionHeaderValue("attachment") }, + { "ATTACHMENT", new ContentDispositionHeaderValue("ATTACHMENT") }, + { @"attachment; filename=""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""" } }, + { @"attachment; filename=""\""quoting\"" tested.html""", new ContentDispositionHeaderValue("attachment") { FileName = "\"\"quoting\" tested.html\"" } }, // 'attachment', specifying a filename of \"quoting\" tested.html (using double quotes around "quoting" to test... quoting) + { @"attachment; filename=""Here's a semicolon;.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""Here's a semicolon;.html""" } }, // , 'attachment', specifying a filename of Here's a semicolon;.html - this checks for proper parsing for parameters. + { @"attachment; foo=""bar""; filename=""foo.html""", new ContentDispositionHeaderValue(@"attachment") { FileName = @"""foo.html""", Parameters = { new NameValueHeaderValue("foo", @"""bar""") } } }, // 'attachment', specifying a filename of foo.html and an extension parameter "foo" which should be ignored (see Section 2.8 of RFC 2183.). + { @"attachment; foo=""\""\\"";filename=""foo.html""", new ContentDispositionHeaderValue(@"attachment") { FileName = @"""foo.html""", Parameters = { new NameValueHeaderValue("foo", @"""\""\\""") } } }, // 'attachment', specifying a filename of foo.html and an extension parameter "foo" which should be ignored (see Section 2.8 of RFC 2183.). The extension parameter actually uses backslash-escapes. This tests whether the UA properly skips the parameter. + { @"attachment; FILENAME=""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""" } }, + { @"attachment; filename=foo.html", new ContentDispositionHeaderValue("attachment") { FileName = "foo.html" } }, // 'attachment', specifying a filename of foo.html using a token instead of a quoted-string. + { @"attachment; filename='foo.bar'", new ContentDispositionHeaderValue("attachment") { FileName = "'foo.bar'" } }, // 'attachment', specifying a filename of 'foo.bar' using single quotes. + { @"attachment; filename=""foo-ä.html""", new ContentDispositionHeaderValue("attachment" ) { Parameters = { new NameValueHeaderValue("filename", @"""foo-ä.html""") } } }, // 'attachment', specifying a filename of foo-ä.html, using plain ISO-8859-1 + { @"attachment; filename=""foo-ä.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo-ä.html""" } }, // 'attachment', specifying a filename of foo-ä.html, which happens to be foo-ä.html using UTF-8 encoding. + { @"attachment; filename=""foo-%41.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""foo-%41.html""") } } }, + { @"attachment; filename=""50%.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""50%.html""") } } }, + { @"attachment; filename=""foo-%\41.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""foo-%\41.html""") } } }, // 'attachment', specifying a filename of foo-%41.html, using an escape character (this tests whether adding an escape character inside a %xx sequence can be used to disable the non-conformant %xx-unescaping). + { @"attachment; name=""foo-%41.html""", new ContentDispositionHeaderValue("attachment") { Name = @"""foo-%41.html""" } }, // 'attachment', specifying a name parameter of foo-%41.html. (this test was added to observe the behavior of the (unspecified) treatment of ""name"" as synonym for ""filename""; see Ned Freed's summary where this comes from in MIME messages) + { @"attachment; filename=""ä-%41.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""ä-%41.html""") } } }, // 'attachment', specifying a filename parameter of ä-%41.html. (this test was added to observe the behavior when non-ASCII characters and percent-hexdig sequences are combined) + { @"attachment; filename=""foo-%c3%a4-%e2%82%ac.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo-%c3%a4-%e2%82%ac.html""" } }, // 'attachment', specifying a filename of foo-%c3%a4-%e2%82%ac.html, using raw percent encoded UTF-8 to represent foo-ä-€.html + { @"attachment; filename =""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""" } }, + { @"attachment; xfilename=foo.html", new ContentDispositionHeaderValue("attachment" ) { Parameters = { new NameValueHeaderValue("xfilename", "foo.html") } } }, + { @"attachment; filename=""/foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""/foo.html""" } }, + { @"attachment; creation-date=""Wed, 12 Feb 1997 16:29:51 -0500""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("creation-date", @"""Wed, 12 Feb 1997 16:29:51 -0500""") } } }, + { @"attachment; modification-date=""Wed, 12 Feb 1997 16:29:51 -0500""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("modification-date", @"""Wed, 12 Feb 1997 16:29:51 -0500""") } } }, + { @"foobar", new ContentDispositionHeaderValue("foobar") }, // @"This should be equivalent to using ""attachment""." + { @"attachment; example=""filename=example.txt""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("example", @"""filename=example.txt""") } } }, + { @"attachment; filename*=iso-8859-1''foo-%E4.html", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename*", "iso-8859-1''foo-%E4.html") } } }, // 'attachment', specifying a filename of foo-ä.html, using RFC2231 encoded ISO-8859-1 + { @"attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename*", "UTF-8''foo-%c3%a4-%e2%82%ac.html") } } }, // 'attachment', specifying a filename of foo-ä-€.html, using RFC2231 encoded UTF-8 + { @"attachment; filename*=''foo-%c3%a4-%e2%82%ac.html", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename*", "''foo-%c3%a4-%e2%82%ac.html") } } }, // Behavior is undefined in RFC 2231, the charset part is missing, although UTF-8 was used. + { @"attachment; filename*=UTF-8''foo-a%22.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = @"foo-a"".html" } }, + { @"attachment; filename*= UTF-8''foo-%c3%a4.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = "foo-ä.html" } }, + { @"attachment; filename* =UTF-8''foo-%c3%a4.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = "foo-ä.html" } }, + { @"attachment; filename*=UTF-8''A-%2541.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = "A-%41.html" } }, + { @"attachment; filename*=UTF-8''%5cfoo.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = @"\foo.html" } }, + { @"attachment; filename=""foo-ae.html""; filename*=UTF-8''foo-%c3%a4.html", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo-ae.html""", FileNameStar = "foo-ä.html" } }, + { @"attachment; filename*=UTF-8''foo-%c3%a4.html; filename=""foo-ae.html""", new ContentDispositionHeaderValue("attachment") { FileNameStar = "foo-ä.html", FileName = @"""foo-ae.html""" } }, + { @"attachment; foobar=x; filename=""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""", Parameters = { new NameValueHeaderValue("foobar", "x") } } }, + { @"attachment; filename=""=?ISO-8859-1?Q?foo-=E4.html?=""", new ContentDispositionHeaderValue("attachment") { FileName = @"""=?ISO-8859-1?Q?foo-=E4.html?=""" } }, // attachment; filename="=?ISO-8859-1?Q?foo-=E4.html?=" + { @"attachment; filename=""=?utf-8?B?Zm9vLeQuaHRtbA==?=""", new ContentDispositionHeaderValue("attachment") { FileName = @"""=?utf-8?B?Zm9vLeQuaHRtbA==?=""" } }, // attachment; filename="=?utf-8?B?Zm9vLeQuaHRtbA==?=" + { @"attachment; filename=foo.html ;", new ContentDispositionHeaderValue("attachment") { FileName="foo.html" } }, // 'attachment', specifying a filename of foo.html using a token instead of a quoted-string, and adding a trailing semicolon., + }; + + [Theory] + [MemberData(nameof(ValidContentDispositionTestCases))] + public void ContentDispositionHeaderValue_ParseValid_Success(string input, ContentDispositionHeaderValue expected) + { + // System.Diagnostics.Debugger.Launch(); + var result = ContentDispositionHeaderValue.Parse(input); + Assert.Equal(expected, result); + } + + [Theory] + // Invalid values + [InlineData(@"""inline""")] // @"'inline' only, using double quotes", false) }, + [InlineData(@"""attachment""")] // @"'attachment' only, using double quotes", false) }, + [InlineData(@"attachment; filename=foo bar.html")] // @"'attachment', specifying a filename of foo bar.html without using quoting.", false) }, + // Duplicate file name parameter + // @"attachment; filename=""foo.html""; // filename=""bar.html""", @"'attachment', specifying two filename parameters. This is invalid syntax.", false) }, + [InlineData(@"attachment; filename=foo[1](2).html")] // @"'attachment', specifying a filename of foo[1](2).html, but missing the quotes. Also, ""["", ""]"", ""("" and "")"" are not allowed in the HTTP token production.", false) }, + [InlineData(@"attachment; filename=foo-ä.html")] // @"'attachment', specifying a filename of foo-ä.html, but missing the quotes.", false) }, + // HTML escaping, not supported + // @"attachment; filename=foo-ä.html", // "'attachment', specifying a filename of foo-ä.html (which happens to be foo-ä.html using UTF-8 encoding) but missing the quotes.", false) }, + [InlineData(@"filename=foo.html")] // @"Disposition type missing, filename specified.", false) }, + [InlineData(@"x=y; filename=foo.html")] // @"Disposition type missing, filename specified after extension parameter.", false) }, + [InlineData(@"""foo; filename=bar;baz""; filename=qux")] // @"Disposition type missing, filename ""qux"". Can it be more broken? (Probably)", false) }, + [InlineData(@"filename=foo.html, filename=bar.html")] // @"Disposition type missing, two filenames specified separated by a comma (this is syntactically equivalent to have two instances of the header with one filename parameter each).", false) }, + [InlineData(@"; filename=foo.html")] // @"Disposition type missing (but delimiter present), filename specified.", false) }, + // This is permitted as a parameter without a value + // @"inline; attachment; filename=foo.html", // @"Both disposition types specified.", false) }, + // This is permitted as a parameter without a value + // @"inline; attachment; filename=foo.html", // @"Both disposition types specified.", false) }, + [InlineData(@"attachment; filename=""foo.html"".txt")] // @"'attachment', specifying a filename parameter that is broken (quoted-string followed by more characters). This is invalid syntax. ", false) }, + [InlineData(@"attachment; filename=""bar")] // @"'attachment', specifying a filename parameter that is broken (missing ending double quote). This is invalid syntax.", false) }, + [InlineData(@"attachment; filename=foo""bar;baz""qux")] // @"'attachment', specifying a filename parameter that is broken (disallowed characters in token syntax). This is invalid syntax.", false) }, + [InlineData(@"attachment; filename=foo.html, attachment; filename=bar.html")] // @"'attachment', two comma-separated instances of the header field. As Content-Disposition doesn't use a list-style syntax, this is invalid syntax and, according to RFC 2616, Section 4.2, roughly equivalent to having two separate header field instances.", false) }, + [InlineData(@"filename=foo.html; attachment")] // @"filename parameter and disposition type reversed.", false) }, + // Escaping is not verified + // @"attachment; filename*=iso-8859-1''foo-%c3%a4-%e2%82%ac.html", // @"'attachment', specifying a filename of foo-ä-€.html, using RFC2231 encoded UTF-8, but declaring ISO-8859-1", false) }, + // Escaping is not verified + // @"attachment; filename *=UTF-8''foo-%c3%a4.html", // @"'attachment', specifying a filename of foo-ä.html, using RFC2231 encoded UTF-8, with whitespace before ""*=""", false) }, + // Escaping is not verified + // @"attachment; filename*=""UTF-8''foo-%c3%a4.html""", // @"'attachment', specifying a filename of foo-ä.html, using RFC2231 encoded UTF-8, with double quotes around the parameter value.", false) }, + [InlineData(@"attachment; filename==?ISO-8859-1?Q?foo-=E4.html?=")] // @"Uses RFC 2047 style encoded word. ""="" is invalid inside the token production, so this is invalid.", false) }, + [InlineData(@"attachment; filename==?utf-8?B?Zm9vLeQuaHRtbA==?=")] // @"Uses RFC 2047 style encoded word. ""="" is invalid inside the token production, so this is invalid.", false) }, + public void ContentDispositionHeaderValue_ParseInvalid_Throws(string input) + { + Assert.Throws(() => ContentDispositionHeaderValue.Parse(input)); + } + + public class ContentDispositionValue + { + public ContentDispositionValue(string value, string description, bool valid) + { + Value = value; + Description = description; + Valid = valid; + } + + public string Value { get; private set; } + + public string Description { get; private set; } + + public bool Valid { get; private set; } + } + + private void CheckValidParse(string input, ContentDispositionHeaderValue expectedResult) + { + var result = ContentDispositionHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => ContentDispositionHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, ContentDispositionHeaderValue expectedResult) + { + ContentDispositionHeaderValue result = null; + Assert.True(ContentDispositionHeaderValue.TryParse(input, out result), input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + ContentDispositionHeaderValue result = null; + Assert.False(ContentDispositionHeaderValue.TryParse(input, out result), input); + Assert.Null(result); + } + + private static void AssertFormatException(string contentDisposition) + { + Assert.Throws(() => new ContentDispositionHeaderValue(contentDisposition)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs new file mode 100644 index 0000000000..d479f4d46f --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs @@ -0,0 +1,272 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class ContentRangeHeaderValueTest + { + [Fact] + public void Ctor_LengthOnlyOverloadUseInvalidValues_Throw() + { + Assert.Throws(() => new ContentRangeHeaderValue(-1)); + } + + [Fact] + public void Ctor_LengthOnlyOverloadValidValues_ValuesCorrectlySet() + { + var range = new ContentRangeHeaderValue(5); + + Assert.False(range.HasRange, "HasRange"); + Assert.True(range.HasLength, "HasLength"); + Assert.Equal("bytes", range.Unit); + Assert.Null(range.From); + Assert.Null(range.To); + Assert.Equal(5, range.Length); + } + + [Fact] + public void Ctor_FromAndToOverloadUseInvalidValues_Throw() + { + Assert.Throws(() => new ContentRangeHeaderValue(-1, 1)); + Assert.Throws(() => new ContentRangeHeaderValue(0, -1)); + Assert.Throws(() => new ContentRangeHeaderValue(2, 1)); + } + + [Fact] + public void Ctor_FromAndToOverloadValidValues_ValuesCorrectlySet() + { + var range = new ContentRangeHeaderValue(0, 1); + + Assert.True(range.HasRange, "HasRange"); + Assert.False(range.HasLength, "HasLength"); + Assert.Equal("bytes", range.Unit); + Assert.Equal(0, range.From); + Assert.Equal(1, range.To); + Assert.Null(range.Length); + } + + [Fact] + public void Ctor_FromToAndLengthOverloadUseInvalidValues_Throw() + { + Assert.Throws(() => new ContentRangeHeaderValue(-1, 1, 2)); + Assert.Throws(() => new ContentRangeHeaderValue(0, -1, 2)); + Assert.Throws(() => new ContentRangeHeaderValue(0, 1, -1)); + Assert.Throws(() => new ContentRangeHeaderValue(2, 1, 3)); + Assert.Throws(() => new ContentRangeHeaderValue(1, 2, 1)); + } + + [Fact] + public void Ctor_FromToAndLengthOverloadValidValues_ValuesCorrectlySet() + { + var range = new ContentRangeHeaderValue(0, 1, 2); + + Assert.True(range.HasRange, "HasRange"); + Assert.True(range.HasLength, "HasLength"); + Assert.Equal("bytes", range.Unit); + Assert.Equal(0, range.From); + Assert.Equal(1, range.To); + Assert.Equal(2, range.Length); + } + + [Fact] + public void Unit_GetAndSetValidAndInvalidValues_MatchExpectation() + { + var range = new ContentRangeHeaderValue(0); + range.Unit = "myunit"; + Assert.Equal("myunit", range.Unit); + + Assert.Throws(() => range.Unit = null); + Assert.Throws(() => range.Unit = ""); + Assert.Throws(() => range.Unit = " x"); + Assert.Throws(() => range.Unit = "x "); + Assert.Throws(() => range.Unit = "x y"); + } + + [Fact] + public void ToString_UseDifferentRanges_AllSerializedCorrectly() + { + var range = new ContentRangeHeaderValue(1, 2, 3); + range.Unit = "myunit"; + Assert.Equal("myunit 1-2/3", range.ToString()); + + range = new ContentRangeHeaderValue(123456789012345678, 123456789012345679); + Assert.Equal("bytes 123456789012345678-123456789012345679/*", range.ToString()); + + range = new ContentRangeHeaderValue(150); + Assert.Equal("bytes */150", range.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentRanges_SameOrDifferentHashCodes() + { + var range1 = new ContentRangeHeaderValue(1, 2, 5); + var range2 = new ContentRangeHeaderValue(1, 2); + var range3 = new ContentRangeHeaderValue(5); + var range4 = new ContentRangeHeaderValue(1, 2, 5); + range4.Unit = "BYTES"; + var range5 = new ContentRangeHeaderValue(1, 2, 5); + range5.Unit = "myunit"; + + Assert.NotEqual(range1.GetHashCode(), range2.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range3.GetHashCode()); + Assert.NotEqual(range2.GetHashCode(), range3.GetHashCode()); + Assert.Equal(range1.GetHashCode(), range4.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range5.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var range1 = new ContentRangeHeaderValue(1, 2, 5); + var range2 = new ContentRangeHeaderValue(1, 2); + var range3 = new ContentRangeHeaderValue(5); + var range4 = new ContentRangeHeaderValue(1, 2, 5); + range4.Unit = "BYTES"; + var range5 = new ContentRangeHeaderValue(1, 2, 5); + range5.Unit = "myunit"; + var range6 = new ContentRangeHeaderValue(1, 3, 5); + var range7 = new ContentRangeHeaderValue(2, 2, 5); + var range8 = new ContentRangeHeaderValue(1, 2, 6); + + Assert.False(range1.Equals(null), "bytes 1-2/5 vs. "); + Assert.False(range1.Equals(range2), "bytes 1-2/5 vs. bytes 1-2/*"); + Assert.False(range1.Equals(range3), "bytes 1-2/5 vs. bytes */5"); + Assert.False(range2.Equals(range3), "bytes 1-2/* vs. bytes */5"); + Assert.True(range1.Equals(range4), "bytes 1-2/5 vs. BYTES 1-2/5"); + Assert.True(range4.Equals(range1), "BYTES 1-2/5 vs. bytes 1-2/5"); + Assert.False(range1.Equals(range5), "bytes 1-2/5 vs. myunit 1-2/5"); + Assert.False(range1.Equals(range6), "bytes 1-2/5 vs. bytes 1-3/5"); + Assert.False(range1.Equals(range7), "bytes 1-2/5 vs. bytes 2-2/5"); + Assert.False(range1.Equals(range8), "bytes 1-2/5 vs. bytes 1-2/6"); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" bytes 1-2/3 ", new ContentRangeHeaderValue(1, 2, 3)); + CheckValidParse("bytes * / 3", new ContentRangeHeaderValue(3)); + + CheckValidParse(" custom 1234567890123456789-1234567890123456799/*", + new ContentRangeHeaderValue(1234567890123456789, 1234567890123456799) { Unit = "custom" }); + + CheckValidParse(" custom * / 123 ", + new ContentRangeHeaderValue(123) { Unit = "custom" }); + + // Note that we don't have a public constructor for value 'bytes */*' since the RFC doesn't mention a + // scenario for it. However, if a server returns this value, we're flexible and accept it. + var result = ContentRangeHeaderValue.Parse("bytes */*"); + Assert.Equal("bytes", result.Unit); + Assert.Null(result.From); + Assert.Null(result.To); + Assert.Null(result.Length); + Assert.False(result.HasRange, "HasRange"); + Assert.False(result.HasLength, "HasLength"); + } + + [Theory] + [InlineData("bytes 1-2/3,")] // no character after 'length' allowed + [InlineData("x bytes 1-2/3")] + [InlineData("bytes 1-2/3.4")] + [InlineData(null)] + [InlineData("")] + [InlineData("bytes 3-2/5")] + [InlineData("bytes 6-6/5")] + [InlineData("bytes 1-6/5")] + [InlineData("bytes 1-2/")] + [InlineData("bytes 1-2")] + [InlineData("bytes 1-/")] + [InlineData("bytes 1-")] + [InlineData("bytes 1")] + [InlineData("bytes ")] + [InlineData("bytes a-2/3")] + [InlineData("bytes 1-b/3")] + [InlineData("bytes 1-2/c")] + [InlineData("bytes1-2/3")] + // More than 19 digits >>Int64.MaxValue + [InlineData("bytes 1-12345678901234567890/3")] + [InlineData("bytes 12345678901234567890-3/3")] + [InlineData("bytes 1-2/12345678901234567890")] + // Exceed Int64.MaxValue, but use 19 digits + [InlineData("bytes 1-9999999999999999999/3")] + [InlineData("bytes 9999999999999999999-3/3")] + [InlineData("bytes 1-2/9999999999999999999")] + public void Parse_SetOfInvalidValueStrings_Throws(string input) + { + Assert.Throws(() => ContentRangeHeaderValue.Parse(input)); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" bytes 1-2/3 ", new ContentRangeHeaderValue(1, 2, 3)); + CheckValidTryParse("bytes * / 3", new ContentRangeHeaderValue(3)); + + CheckValidTryParse(" custom 1234567890123456789-1234567890123456799/*", + new ContentRangeHeaderValue(1234567890123456789, 1234567890123456799) { Unit = "custom" }); + + CheckValidTryParse(" custom * / 123 ", + new ContentRangeHeaderValue(123) { Unit = "custom" }); + + // Note that we don't have a public constructor for value 'bytes */*' since the RFC doesn't mention a + // scenario for it. However, if a server returns this value, we're flexible and accept it. + ContentRangeHeaderValue result = null; + Assert.True(ContentRangeHeaderValue.TryParse("bytes */*", out result)); + Assert.Equal("bytes", result.Unit); + Assert.Null(result.From); + Assert.Null(result.To); + Assert.Null(result.Length); + Assert.False(result.HasRange, "HasRange"); + Assert.False(result.HasLength, "HasLength"); + } + + [Theory] + [InlineData("bytes 1-2/3,")] // no character after 'length' allowed + [InlineData("x bytes 1-2/3")] + [InlineData("bytes 1-2/3.4")] + [InlineData(null)] + [InlineData("")] + [InlineData("bytes 3-2/5")] + [InlineData("bytes 6-6/5")] + [InlineData("bytes 1-6/5")] + [InlineData("bytes 1-2/")] + [InlineData("bytes 1-2")] + [InlineData("bytes 1-/")] + [InlineData("bytes 1-")] + [InlineData("bytes 1")] + [InlineData("bytes ")] + [InlineData("bytes a-2/3")] + [InlineData("bytes 1-b/3")] + [InlineData("bytes 1-2/c")] + [InlineData("bytes1-2/3")] + // More than 19 digits >>Int64.MaxValue + [InlineData("bytes 1-12345678901234567890/3")] + [InlineData("bytes 12345678901234567890-3/3")] + [InlineData("bytes 1-2/12345678901234567890")] + // Exceed Int64.MaxValue, but use 19 digits + [InlineData("bytes 1-9999999999999999999/3")] + [InlineData("bytes 9999999999999999999-3/3")] + [InlineData("bytes 1-2/9999999999999999999")] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse(string input) + { + ContentRangeHeaderValue result = null; + Assert.False(ContentRangeHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private void CheckValidParse(string input, ContentRangeHeaderValue expectedResult) + { + var result = ContentRangeHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckValidTryParse(string input, ContentRangeHeaderValue expectedResult) + { + ContentRangeHeaderValue result = null; + Assert.True(ContentRangeHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs new file mode 100644 index 0000000000..9a25389a50 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -0,0 +1,229 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class CookieHeaderValueTest + { + public static TheoryData CookieHeaderDataSet + { + get + { + var dataset = new TheoryData(); + var header1 = new CookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3"); + dataset.Add(header1, "name1=n1=v1&n2=v2&n3=v3"); + + var header2 = new CookieHeaderValue("name2", ""); + dataset.Add(header2, "name2="); + + var header3 = new CookieHeaderValue("name3", "value3"); + dataset.Add(header3, "name3=value3"); + + var header4 = new CookieHeaderValue("name4", "\"value4\""); + dataset.Add(header4, "name4=\"value4\""); + + return dataset; + } + } + + public static TheoryData InvalidCookieHeaderDataSet + { + get + { + return new TheoryData + { + "=value", + "name=value;", + "name=value,", + }; + } + } + + public static TheoryData InvalidCookieNames + { + get + { + return new TheoryData + { + "", + "{acb}", + "[acb]", + "\"acb\"", + "a,b", + "a;b", + "a\\b", + "a b", + }; + } + } + + public static TheoryData InvalidCookieValues + { + get + { + return new TheoryData + { + { "\"" }, + { "a,b" }, + { "a;b" }, + { "a\\b" }, + { "\"abc" }, + { "a\"bc" }, + { "abc\"" }, + { "a b" }, + }; + } + } + public static TheoryData, string[]> ListOfCookieHeaderDataSet + { + get + { + var dataset = new TheoryData, string[]>(); + var header1 = new CookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3"); + var string1 = "name1=n1=v1&n2=v2&n3=v3"; + + var header2 = new CookieHeaderValue("name2", "value2"); + var string2 = "name2=value2"; + + var header3 = new CookieHeaderValue("name3", "value3"); + var string3 = "name3=value3"; + + var header4 = new CookieHeaderValue("name4", "\"value4\""); + var string4 = "name4=\"value4\""; + + dataset.Add(new[] { header1 }.ToList(), new[] { string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, null, "", " ", ";", " , ", string1 }); + dataset.Add(new[] { header2 }.ToList(), new[] { string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1, string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1 + ", " + string2 }); + dataset.Add(new[] { header2, header1 }.ToList(), new[] { string2 + "; " + string1 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, string3, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, string3, string4) }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(";", string1, string2, string3, string4) }); + + return dataset; + } + } + + // TODO: [Fact] + public void CookieHeaderValue_CtorThrowsOnNullName() + { + Assert.Throws(() => new CookieHeaderValue(null, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieNames))] + public void CookieHeaderValue_CtorThrowsOnInvalidName(string name) + { + Assert.Throws(() => new CookieHeaderValue(name, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieValues))] + public void CookieHeaderValue_CtorThrowsOnInvalidValue(string value) + { + Assert.Throws(() => new CookieHeaderValue("name", value)); + } + + [Fact] + public void CookieHeaderValue_Ctor1_InitializesCorrectly() + { + var header = new CookieHeaderValue("cookie"); + Assert.Equal("cookie", header.Name); + Assert.Equal(string.Empty, header.Value); + } + + [Theory] + [InlineData("name", "")] + [InlineData("name", "value")] + [InlineData("name", "\"acb\"")] + public void CookieHeaderValue_Ctor2InitializesCorrectly(string name, string value) + { + var header = new CookieHeaderValue(name, value); + Assert.Equal(name, header.Name); + Assert.Equal(value, header.Value); + } + + [Fact] + public void CookieHeaderValue_Value() + { + var cookie = new CookieHeaderValue("name"); + Assert.Equal(String.Empty, cookie.Value); + + cookie.Value = "value1"; + Assert.Equal("value1", cookie.Value); + } + + [Theory] + [MemberData(nameof(CookieHeaderDataSet))] + public void CookieHeaderValue_ToString(CookieHeaderValue input, string expectedValue) + { + Assert.Equal(expectedValue, input.ToString()); + } + + [Theory] + [MemberData(nameof(CookieHeaderDataSet))] + public void CookieHeaderValue_Parse_AcceptsValidValues(CookieHeaderValue cookie, string expectedValue) + { + var header = CookieHeaderValue.Parse(expectedValue); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(CookieHeaderDataSet))] + public void CookieHeaderValue_TryParse_AcceptsValidValues(CookieHeaderValue cookie, string expectedValue) + { + CookieHeaderValue header; + bool result = CookieHeaderValue.TryParse(expectedValue, out header); + Assert.True(result); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(InvalidCookieHeaderDataSet))] + public void CookieHeaderValue_Parse_RejectsInvalidValues(string value) + { + Assert.Throws(() => CookieHeaderValue.Parse(value)); + } + + [Theory] + [MemberData(nameof(InvalidCookieHeaderDataSet))] + public void CookieHeaderValue_TryParse_RejectsInvalidValues(string value) + { + CookieHeaderValue header; + bool result = CookieHeaderValue.TryParse(value, out header); + + Assert.False(result); + } + + [Theory] + [MemberData(nameof(ListOfCookieHeaderDataSet))] + public void CookieHeaderValue_ParseList_AcceptsValidValues(IList cookies, string[] input) + { + var results = CookieHeaderValue.ParseList(input); + + Assert.Equal(cookies, results); + } + + [Theory] + [MemberData(nameof(ListOfCookieHeaderDataSet))] + public void CookieHeaderValue_TryParseList_AcceptsValidValues(IList cookies, string[] input) + { + IList results; + bool result = CookieHeaderValue.TryParseList(input, out results); + Assert.True(result); + + Assert.Equal(cookies, results); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs new file mode 100644 index 0000000000..61479e9adf --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class DateParserTest + { + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + // We don't need to validate all possible date values, since they're already tested in HttpRuleParserTest. + // Just make sure the parser calls HttpRuleParser methods correctly. + CheckValidParsedValue("Tue, 15 Nov 1994 08:12:31 GMT", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero)); + CheckValidParsedValue(" Sunday, 06-Nov-94 08:49:37 GMT ", new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero)); + CheckValidParsedValue(" Tue,\r\n 15 Nov\r\n 1994 08:12:31 GMT ", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero)); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidParsedValue(null); + CheckInvalidParsedValue(string.Empty); + CheckInvalidParsedValue(" "); + CheckInvalidParsedValue("!!Sunday, 06-Nov-94 08:49:37 GMT"); + } + + [Fact] + public void ToString_UseDifferentValues_MatchExpectation() + { + Assert.Equal("Sat, 31 Jul 2010 15:38:57 GMT", + HeaderUtilities.FormatDate(new DateTimeOffset(2010, 7, 31, 15, 38, 57, TimeSpan.Zero))); + + Assert.Equal("Fri, 01 Jan 2010 01:01:01 GMT", + HeaderUtilities.FormatDate(new DateTimeOffset(2010, 1, 1, 1, 1, 1, TimeSpan.Zero))); + } + + #region Helper methods + + private void CheckValidParsedValue(string input, DateTimeOffset expectedResult) + { + DateTimeOffset result; + Assert.True(HeaderUtilities.TryParseDate(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParsedValue(string input) + { + DateTimeOffset result; + Assert.False(HeaderUtilities.TryParseDate(input, out result)); + Assert.Equal(new DateTimeOffset(), result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs new file mode 100644 index 0000000000..d94ce6409f --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs @@ -0,0 +1,315 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class EntityTagHeaderValueTest + { + [Fact] + public void Ctor_ETagNull_Throw() + { + Assert.Throws(() => new EntityTagHeaderValue(null)); + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new EntityTagHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_ETagInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException("tag"); + AssertFormatException(" tag "); + AssertFormatException("\"tag\" invalid"); + AssertFormatException("\"tag"); + AssertFormatException("tag\""); + AssertFormatException("\"tag\"\""); + AssertFormatException("\"\"tag\"\""); + AssertFormatException("\"\"tag\""); + AssertFormatException("W/\"tag\""); // tag value must not contain 'W/' + } + + [Fact] + public void Ctor_ETagValidFormat_SuccessfullyCreated() + { + var etag = new EntityTagHeaderValue("\"tag\""); + Assert.Equal("\"tag\"", etag.Tag); + Assert.False(etag.IsWeak, "IsWeak"); + } + + [Fact] + public void Ctor_ETagValidFormatAndIsWeak_SuccessfullyCreated() + { + var etag = new EntityTagHeaderValue("\"e tag\"", true); + Assert.Equal("\"e tag\"", etag.Tag); + Assert.True(etag.IsWeak, "IsWeak"); + } + + [Fact] + public void ToString_UseDifferentETags_AllSerializedCorrectly() + { + var etag = new EntityTagHeaderValue("\"e tag\""); + Assert.Equal("\"e tag\"", etag.ToString()); + + etag = new EntityTagHeaderValue("\"e tag\"", true); + Assert.Equal("W/\"e tag\"", etag.ToString()); + + etag = new EntityTagHeaderValue("\"\"", false); + Assert.Equal("\"\"", etag.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentETags_SameOrDifferentHashCodes() + { + var etag1 = new EntityTagHeaderValue("\"tag\""); + var etag2 = new EntityTagHeaderValue("\"TAG\""); + var etag3 = new EntityTagHeaderValue("\"tag\"", true); + var etag4 = new EntityTagHeaderValue("\"tag1\""); + var etag5 = new EntityTagHeaderValue("\"tag\""); + var etag6 = EntityTagHeaderValue.Any; + + Assert.NotEqual(etag1.GetHashCode(), etag2.GetHashCode()); + Assert.NotEqual(etag1.GetHashCode(), etag3.GetHashCode()); + Assert.NotEqual(etag1.GetHashCode(), etag4.GetHashCode()); + Assert.NotEqual(etag1.GetHashCode(), etag6.GetHashCode()); + Assert.Equal(etag1.GetHashCode(), etag5.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentETags_EqualOrNotEqualNoExceptions() + { + var etag1 = new EntityTagHeaderValue("\"tag\""); + var etag2 = new EntityTagHeaderValue("\"TAG\""); + var etag3 = new EntityTagHeaderValue("\"tag\"", true); + var etag4 = new EntityTagHeaderValue("\"tag1\""); + var etag5 = new EntityTagHeaderValue("\"tag\""); + var etag6 = EntityTagHeaderValue.Any; + + Assert.False(etag1.Equals(etag2), "Different casing."); + Assert.False(etag2.Equals(etag1), "Different casing."); + Assert.False(etag1.Equals(null), "tag vs. ."); + Assert.False(etag1.Equals(etag3), "strong vs. weak."); + Assert.False(etag3.Equals(etag1), "weak vs. strong."); + Assert.False(etag1.Equals(etag4), "tag vs. tag1."); + Assert.False(etag1.Equals(etag6), "tag vs. *."); + Assert.True(etag1.Equals(etag5), "tag vs. tag.."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse(" \"tag\" ", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse("\r\n \"tag\"\r\n ", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse("\"tag会\"", new EntityTagHeaderValue("\"tag会\"")); + CheckValidParse("W/\"tag\"", new EntityTagHeaderValue("\"tag\"", true)); + CheckValidParse("*", new EntityTagHeaderValue("*")); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(null); + CheckInvalidParse(string.Empty); + CheckInvalidParse(" "); + CheckInvalidParse(" !"); + CheckInvalidParse("tag\" !"); + CheckInvalidParse("!\"tag\""); + CheckInvalidParse("\"tag\","); + CheckInvalidParse("W"); + CheckInvalidParse("W/"); + CheckInvalidParse("W/\""); + CheckInvalidParse("\"tag\" \"tag2\""); + CheckInvalidParse("/\"tag\""); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse(" \"tag\" ", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse("\r\n \"tag\"\r\n ", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse("\"tag会\"", new EntityTagHeaderValue("\"tag会\"")); + CheckValidTryParse("W/\"tag\"", new EntityTagHeaderValue("\"tag\"", true)); + CheckValidTryParse("*", new EntityTagHeaderValue("*")); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(" !"); + CheckInvalidTryParse("tag\" !"); + CheckInvalidTryParse("!\"tag\""); + CheckInvalidTryParse("\"tag\","); + CheckInvalidTryParse("\"tag\" \"tag2\""); + CheckInvalidTryParse("/\"tag\""); + } + + [Fact] + public void ParseList_NullOrEmptyArray_ReturnsEmptyList() + { + var result = EntityTagHeaderValue.ParseList(null); + Assert.NotNull(result); + Assert.Equal(0, result.Count); + + result = EntityTagHeaderValue.ParseList(new string[0]); + Assert.NotNull(result); + Assert.Equal(0, result.Count); + + result = EntityTagHeaderValue.ParseList(new string[] { "" }); + Assert.NotNull(result); + Assert.Equal(0, result.Count); + } + + [Fact] + public void TryParseList_NullOrEmptyArray_ReturnsFalse() + { + IList results = null; + Assert.False(EntityTagHeaderValue.TryParseList(null, out results)); + Assert.False(EntityTagHeaderValue.TryParseList(new string[0], out results)); + Assert.False(EntityTagHeaderValue.TryParseList(new string[] { "" }, out results)); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "\"tag\"", + "", + " \"tag\" ", + "\r\n \"tag\"\r\n ", + "\"tag会\"", + "\"tag\",\"tag\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results = EntityTagHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "\"tag\"", + "", + " \"tag\" ", + "\r\n \"tag\"\r\n ", + "\"tag会\"", + "\"tag\",\"tag\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results; + Assert.True(EntityTagHeaderValue.TryParseList(inputs, out results)); + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "\"tag\", tag, \"tag\"", + "tag, \"tag\"", + "", + " \"tag ", + "\r\n tag\"\r\n ", + "\"tag会\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + Assert.Throws(() => EntityTagHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "\"tag\", tag, \"tag\"", + "tag, \"tag\"", + "", + " \"tag ", + "\r\n tag\"\r\n ", + "\"tag会\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results; + Assert.False(EntityTagHeaderValue.TryParseList(inputs, out results)); + } + + private void CheckValidParse(string input, EntityTagHeaderValue expectedResult) + { + var result = EntityTagHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => EntityTagHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, EntityTagHeaderValue expectedResult) + { + EntityTagHeaderValue result = null; + Assert.True(EntityTagHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + EntityTagHeaderValue result = null; + Assert.False(EntityTagHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private static void AssertFormatException(string tag) + { + Assert.Throws(() => new EntityTagHeaderValue(tag)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs new file mode 100644 index 0000000000..8ef17a55aa --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class MediaTypeHeaderValueComparerTests + { + public static IEnumerable SortValues + { + get + { + yield return new object[] { + new string[] + { + "application/*", + "text/plain", + "text/plain;q=1.0", + "text/plain", + "text/plain;q=0", + "*/*;q=0.8", + "*/*;q=1", + "text/*;q=1", + "text/plain;q=0.8", + "text/*;q=0.8", + "text/*;q=0.6", + "text/*;q=1.0", + "*/*;q=0.4", + "text/plain;q=0.6", + "text/xml", + }, + new string[] + { + "text/plain", + "text/plain;q=1.0", + "text/plain", + "text/xml", + "application/*", + "text/*;q=1", + "text/*;q=1.0", + "*/*;q=1", + "text/plain;q=0.8", + "text/*;q=0.8", + "*/*;q=0.8", + "text/plain;q=0.6", + "text/*;q=0.6", + "*/*;q=0.4", + "text/plain;q=0", + } + }; + } + } + + [Theory] + [MemberData(nameof(SortValues))] + public void SortMediaTypeHeaderValuesByQFactor_SortsCorrectly(IEnumerable unsorted, IEnumerable expectedSorted) + { + var unsortedValues = MediaTypeHeaderValue.ParseList(unsorted.ToList()); + var expectedSortedValues = MediaTypeHeaderValue.ParseList(expectedSorted.ToList()); + + var actualSorted = unsortedValues.OrderByDescending(m => m, MediaTypeHeaderValueComparer.QualityComparer).ToList(); + + Assert.Equal(expectedSortedValues, actualSorted); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs new file mode 100644 index 0000000000..140d629497 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -0,0 +1,520 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class MediaTypeHeaderValueTest + { + [Fact] + public void Ctor_MediaTypeNull_Throw() + { + Assert.Throws(() => new MediaTypeHeaderValue(null)); + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new MediaTypeHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_MediaTypeInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException(" text/plain "); + AssertFormatException("text / plain"); + AssertFormatException("text/ plain"); + AssertFormatException("text /plain"); + AssertFormatException("text/plain "); + AssertFormatException(" text/plain"); + AssertFormatException("te xt/plain"); + AssertFormatException("te=xt/plain"); + AssertFormatException("teäxt/plain"); + AssertFormatException("text/pläin"); + AssertFormatException("text"); + AssertFormatException("\"text/plain\""); + AssertFormatException("text/plain; charset=utf-8; "); + AssertFormatException("text/plain;"); + AssertFormatException("text/plain;charset=utf-8"); // ctor takes only media-type name, no parameters + } + + [Fact] + public void Ctor_MediaTypeValidFormat_SuccessfullyCreated() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Equal("text/plain", mediaType.MediaType); + Assert.Equal(0, mediaType.Parameters.Count); + Assert.Null(mediaType.Charset); + } + + [Fact] + public void Ctor_AddNameAndQuality_QualityParameterAdded() + { + var mediaType = new MediaTypeHeaderValue("application/xml", 0.08); + Assert.Equal(0.08, mediaType.Quality); + Assert.Equal("application/xml", mediaType.MediaType); + Assert.Equal(1, mediaType.Parameters.Count); + } + + [Fact] + public void Parameters_AddNull_Throw() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Throws(() => mediaType.Parameters.Add(null)); + } + + [Fact] + public void MediaType_SetAndGetMediaType_MatchExpectations() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Equal("text/plain", mediaType.MediaType); + + mediaType.MediaType = "application/xml"; + Assert.Equal("application/xml", mediaType.MediaType); + } + + [Fact] + public void Charset_SetCharsetAndValidateObject_ParametersEntryForCharsetAdded() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + mediaType.Charset = "mycharset"; + Assert.Equal("mycharset", mediaType.Charset); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("charset", mediaType.Parameters.First().Name); + + mediaType.Charset = null; + Assert.Null(mediaType.Charset); + Assert.Equal(0, mediaType.Parameters.Count); + mediaType.Charset = null; // It's OK to set it again to null; no exception. + } + + [Fact] + public void Charset_AddCharsetParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var charset = new NameValueHeaderValue("CHARSET", "old_charset"); + mediaType.Parameters.Add(charset); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("CHARSET", mediaType.Parameters.First().Name); + + mediaType.Charset = "new_charset"; + Assert.Equal("new_charset", mediaType.Charset); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("CHARSET", mediaType.Parameters.First().Name); + + mediaType.Parameters.Remove(charset); + Assert.Null(mediaType.Charset); + } + + [Fact] + public void Quality_SetCharsetAndValidateObject_ParametersEntryForCharsetAdded() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + mediaType.Quality = 0.563156454; + Assert.Equal(0.563, mediaType.Quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("q", mediaType.Parameters.First().Name); + Assert.Equal("0.563", mediaType.Parameters.First().Value); + + mediaType.Quality = null; + Assert.Null(mediaType.Quality); + Assert.Equal(0, mediaType.Parameters.Count); + mediaType.Quality = null; // It's OK to set it again to null; no exception. + } + + [Fact] + public void Quality_AddQualityParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + + var quality = new NameValueHeaderValue("q", "0.132"); + mediaType.Parameters.Add(quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("q", mediaType.Parameters.First().Name); + Assert.Equal(0.132, mediaType.Quality); + + mediaType.Quality = 0.9; + Assert.Equal(0.9, mediaType.Quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("q", mediaType.Parameters.First().Name); + + mediaType.Parameters.Remove(quality); + Assert.Null(mediaType.Quality); + } + + [Fact] + public void Quality_AddQualityParameterUpperCase_CaseInsensitiveComparison() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + + var quality = new NameValueHeaderValue("Q", "0.132"); + mediaType.Parameters.Add(quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("Q", mediaType.Parameters.First().Name); + Assert.Equal(0.132, mediaType.Quality); + } + + [Fact] + public void Quality_LessThanZero_Throw() + { + Assert.Throws(() => new MediaTypeHeaderValue("application/xml", -0.01)); + } + + [Fact] + public void Quality_GreaterThanOne_Throw() + { + var mediaType = new MediaTypeHeaderValue("application/xml"); + Assert.Throws(() => mediaType.Quality = 1.01); + } + + [Fact] + public void ToString_UseDifferentMediaTypes_AllSerializedCorrectly() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Equal("text/plain", mediaType.ToString()); + + mediaType.Charset = "utf-8"; + Assert.Equal("text/plain; charset=utf-8", mediaType.ToString()); + + mediaType.Parameters.Add(new NameValueHeaderValue("custom", "\"custom value\"")); + Assert.Equal("text/plain; charset=utf-8; custom=\"custom value\"", mediaType.ToString()); + + mediaType.Charset = null; + Assert.Equal("text/plain; custom=\"custom value\"", mediaType.ToString()); + } + + [Fact] + public void GetHashCode_UseMediaTypeWithAndWithoutParameters_SameOrDifferentHashCodes() + { + var mediaType1 = new MediaTypeHeaderValue("text/plain"); + var mediaType2 = new MediaTypeHeaderValue("text/plain"); + mediaType2.Charset = "utf-8"; + var mediaType3 = new MediaTypeHeaderValue("text/plain"); + mediaType3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType4 = new MediaTypeHeaderValue("TEXT/plain"); + var mediaType5 = new MediaTypeHeaderValue("TEXT/plain"); + mediaType5.Parameters.Add(new NameValueHeaderValue("CHARSET", "UTF-8")); + + Assert.NotEqual(mediaType1.GetHashCode(), mediaType2.GetHashCode()); + Assert.NotEqual(mediaType1.GetHashCode(), mediaType3.GetHashCode()); + Assert.NotEqual(mediaType2.GetHashCode(), mediaType3.GetHashCode()); + Assert.Equal(mediaType1.GetHashCode(), mediaType4.GetHashCode()); + Assert.Equal(mediaType2.GetHashCode(), mediaType5.GetHashCode()); + } + + [Fact] + public void Equals_UseMediaTypeWithAndWithoutParameters_EqualOrNotEqualNoExceptions() + { + var mediaType1 = new MediaTypeHeaderValue("text/plain"); + var mediaType2 = new MediaTypeHeaderValue("text/plain"); + mediaType2.Charset = "utf-8"; + var mediaType3 = new MediaTypeHeaderValue("text/plain"); + mediaType3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType4 = new MediaTypeHeaderValue("TEXT/plain"); + var mediaType5 = new MediaTypeHeaderValue("TEXT/plain"); + mediaType5.Parameters.Add(new NameValueHeaderValue("CHARSET", "UTF-8")); + var mediaType6 = new MediaTypeHeaderValue("TEXT/plain"); + mediaType6.Parameters.Add(new NameValueHeaderValue("CHARSET", "UTF-8")); + mediaType6.Parameters.Add(new NameValueHeaderValue("custom", "value")); + var mediaType7 = new MediaTypeHeaderValue("text/other"); + + Assert.False(mediaType1.Equals(mediaType2), "No params vs. charset."); + Assert.False(mediaType2.Equals(mediaType1), "charset vs. no params."); + Assert.False(mediaType1.Equals(null), "No params vs. ."); + Assert.False(mediaType1.Equals(mediaType3), "No params vs. custom param."); + Assert.False(mediaType2.Equals(mediaType3), "charset vs. custom param."); + Assert.True(mediaType1.Equals(mediaType4), "Different casing."); + Assert.True(mediaType2.Equals(mediaType5), "Different casing in charset."); + Assert.False(mediaType5.Equals(mediaType6), "charset vs. custom param."); + Assert.False(mediaType1.Equals(mediaType7), "text/plain vs. text/other."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse("\r\n text/plain ", new MediaTypeHeaderValue("text/plain")); + CheckValidParse("text/plain", new MediaTypeHeaderValue("text/plain")); + + CheckValidParse("\r\n text / plain ; charset = utf-8 ", new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }); + CheckValidParse(" text/plain;charset=utf-8", new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }); + + CheckValidParse("text/plain; charset=iso-8859-1", new MediaTypeHeaderValue("text/plain") { Charset = "iso-8859-1" }); + + var expected = new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }; + expected.Parameters.Add(new NameValueHeaderValue("custom", "value")); + CheckValidParse(" text/plain; custom=value;charset=utf-8", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Parameters.Add(new NameValueHeaderValue("custom")); + CheckValidParse(" text/plain; custom", expected); + + expected = new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }; + expected.Parameters.Add(new NameValueHeaderValue("custom", "\"x\"")); + CheckValidParse("text / plain ; custom =\r\n \"x\" ; charset = utf-8 ", expected); + + expected = new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }; + expected.Parameters.Add(new NameValueHeaderValue("custom", "\"x\"")); + CheckValidParse("text/plain;custom=\"x\";charset=utf-8", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + CheckValidParse("text/plain;", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Parameters.Add(new NameValueHeaderValue("name", "")); + CheckValidParse("text/plain;name=", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Parameters.Add(new NameValueHeaderValue("name", "value")); + CheckValidParse("text/plain;name=value;", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Charset = "iso-8859-1"; + expected.Quality = 1.0; + CheckValidParse("text/plain; charset=iso-8859-1; q=1.0", expected); + + expected = new MediaTypeHeaderValue("*/xml"); + expected.Charset = "utf-8"; + expected.Quality = 0.5; + CheckValidParse("\r\n */xml; charset=utf-8; q=0.5", expected); + + expected = new MediaTypeHeaderValue("*/*"); + CheckValidParse("*/*", expected); + + expected = new MediaTypeHeaderValue("text/*"); + expected.Charset = "utf-8"; + expected.Parameters.Add(new NameValueHeaderValue("foo", "bar")); + CheckValidParse("text/*; charset=utf-8; foo=bar", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Charset = "utf-8"; + expected.Quality = 0; + expected.Parameters.Add(new NameValueHeaderValue("foo", "bar")); + CheckValidParse("text/plain; charset=utf-8; foo=bar; q=0.0", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(""); + CheckInvalidParse(" "); + CheckInvalidParse(null); + CheckInvalidParse("text/plain会"); + CheckInvalidParse("text/plain ,"); + CheckInvalidParse("text/plain,"); + CheckInvalidParse("text/plain; charset=utf-8 ,"); + CheckInvalidParse("text/plain; charset=utf-8,"); + CheckInvalidParse("textplain"); + CheckInvalidParse("text/"); + CheckInvalidParse(",, , ,,text/plain; charset=iso-8859-1; q=1.0,\r\n */xml; charset=utf-8; q=0.5,,,"); + CheckInvalidParse("text/plain; charset=iso-8859-1; q=1.0, */xml; charset=utf-8; q=0.5"); + CheckInvalidParse(" , */xml; charset=utf-8; q=0.5 "); + CheckInvalidParse("text/plain; charset=iso-8859-1; q=1.0 , "); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + var expected = new MediaTypeHeaderValue("text/plain"); + CheckValidTryParse("\r\n text/plain ", expected); + CheckValidTryParse("text/plain", expected); + + // We don't have to test all possible input strings, since most of the pieces are handled by other parsers. + // The purpose of this test is to verify that these other parsers are combined correctly to build a + // media-type parser. + expected.Charset = "utf-8"; + CheckValidTryParse("\r\n text / plain ; charset = utf-8 ", expected); + CheckValidTryParse(" text/plain;charset=utf-8", expected); + + var value1 = new MediaTypeHeaderValue("text/plain"); + value1.Charset = "iso-8859-1"; + value1.Quality = 1.0; + + CheckValidTryParse("text/plain; charset=iso-8859-1; q=1.0", value1); + + var value2 = new MediaTypeHeaderValue("*/xml"); + value2.Charset = "utf-8"; + value2.Quality = 0.5; + + CheckValidTryParse("\r\n */xml; charset=utf-8; q=0.5", value2); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse(""); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(null); + CheckInvalidTryParse("text/plain会"); + CheckInvalidTryParse("text/plain ,"); + CheckInvalidTryParse("text/plain,"); + CheckInvalidTryParse("text/plain; charset=utf-8 ,"); + CheckInvalidTryParse("text/plain; charset=utf-8,"); + CheckInvalidTryParse("textplain"); + CheckInvalidTryParse("text/"); + CheckInvalidTryParse(",, , ,,text/plain; charset=iso-8859-1; q=1.0,\r\n */xml; charset=utf-8; q=0.5,,,"); + CheckInvalidTryParse("text/plain; charset=iso-8859-1; q=1.0, */xml; charset=utf-8; q=0.5"); + CheckInvalidTryParse(" , */xml; charset=utf-8; q=0.5 "); + CheckInvalidTryParse("text/plain; charset=iso-8859-1; q=1.0 , "); + } + + [Fact] + public void ParseList_NullOrEmptyArray_ReturnsEmptyList() + { + var results = MediaTypeHeaderValue.ParseList(null); + Assert.NotNull(results); + Assert.Equal(0, results.Count); + + results = MediaTypeHeaderValue.ParseList(new string[0]); + Assert.NotNull(results); + Assert.Equal(0, results.Count); + + results = MediaTypeHeaderValue.ParseList(new string[] { "" }); + Assert.NotNull(results); + Assert.Equal(0, results.Count); + } + + [Fact] + public void TryParseList_NullOrEmptyArray_ReturnsFalse() + { + IList results; + Assert.False(MediaTypeHeaderValue.TryParseList(null, out results)); + Assert.False(MediaTypeHeaderValue.TryParseList(new string[0], out results)); + Assert.False(MediaTypeHeaderValue.TryParseList(new string[] { "" }, out results)); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ReturnsValues() + { + var inputs = new[] { "text/html,application/xhtml+xml,", "application/xml;q=0.9,image/webp,*/*;q=0.8" }; + var results = MediaTypeHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ReturnsTrue() + { + var inputs = new[] { "text/html,application/xhtml+xml,", "application/xml;q=0.9,image/webp,*/*;q=0.8" }; + IList results; + Assert.True(MediaTypeHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "text/html,application/xhtml+xml, ignore-this, ignore/this", + "application/xml;q=0.9,image/webp,*/*;q=0.8" + }; + Assert.Throws(() => MediaTypeHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "text/html,application/xhtml+xml, ignore-this, ignore/this", + "application/xml;q=0.9,image/webp,*/*;q=0.8", + "application/xml;q=0 4" + }; + IList results; + Assert.False(MediaTypeHeaderValue.TryParseList(inputs, out results)); + } + + [Theory] + [InlineData("*/*;", "*/*")] + [InlineData("text/*;", "text/*")] + [InlineData("text/plain;", "text/plain")] + [InlineData("*/*;", "*/*;charset=utf-8;")] + [InlineData("text/*;", "*/*;charset=utf-8;")] + [InlineData("text/plain;", "*/*;charset=utf-8;")] + [InlineData("text/plain;", "text/*;charset=utf-8;")] + [InlineData("text/plain;", "text/plain;charset=utf-8;")] + [InlineData("text/plain;version=v1", "Text/plain;Version=v1")] + [InlineData("text/plain;version=v1", "tExT/plain;version=V1")] + [InlineData("text/plain;version=v1", "TEXT/PLAIN;VERSION=V1")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/plain;foo=bar;q=0.0;charset=utf-8")] // different order of parameters + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/*;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "*/*;charset=utf-8;foo=bar;q=0.0")] + public void IsSubsetOf_PositiveCases(string mediaType1, string mediaType2) + { + var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); + var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + + var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + Assert.True(isSubset); + } + + [Theory] + [InlineData("text/plain;version=v1", "text/plain;version=")] + [InlineData("*/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;missingparam=4;", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;missingparam=4;", "text/*;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;missingparam=4;", "*/*;charset=utf-8;foo=bar;q=0.0")] + public void IsSubsetOf_NegativeCases(string mediaType1, string mediaType2) + { + var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); + var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + + var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + Assert.False(isSubset); + } + + private void CheckValidParse(string input, MediaTypeHeaderValue expectedResult) + { + var result = MediaTypeHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => MediaTypeHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, MediaTypeHeaderValue expectedResult) + { + MediaTypeHeaderValue result = null; + Assert.True(MediaTypeHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + MediaTypeHeaderValue result = null; + Assert.False(MediaTypeHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private static void AssertFormatException(string mediaType) + { + Assert.Throws(() => new MediaTypeHeaderValue(mediaType)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj new file mode 100644 index 0000000000..cbf789a8a0 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj @@ -0,0 +1,23 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 + Microsoft.Net.Http.Headers.Tests + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs new file mode 100644 index 0000000000..3ae04a9212 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -0,0 +1,394 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class NameValueHeaderValueTest + { + [Fact] + public void Ctor_NameNull_Throw() + { + Assert.Throws(() => new NameValueHeaderValue(null)); + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new NameValueHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_NameInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException(" text ", null); + AssertFormatException("text ", null); + AssertFormatException(" text", null); + AssertFormatException("te xt", null); + AssertFormatException("te=xt", null); // The ctor takes a name which must not contain '='. + AssertFormatException("teäxt", null); + } + + [Fact] + public void Ctor_NameValidFormat_SuccessfullyCreated() + { + var nameValue = new NameValueHeaderValue("text", null); + Assert.Equal("text", nameValue.Name); + } + + [Fact] + public void Ctor_ValueInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException("text", " token "); + AssertFormatException("text", "token "); + AssertFormatException("text", " token"); + AssertFormatException("text", "token string"); + AssertFormatException("text", "\"quoted string with \" quotes\""); + AssertFormatException("text", "\"quoted string with \"two\" quotes\""); + } + + [Fact] + public void Ctor_ValueValidFormat_SuccessfullyCreated() + { + CheckValue(null); + CheckValue(string.Empty); + CheckValue("token_string"); + CheckValue("\"quoted string\""); + CheckValue("\"quoted string with quoted \\\" quote-pair\""); + } + + [Fact] + public void Value_CallSetterWithInvalidValues_Throw() + { + // Just verify that the setter calls the same validation the ctor invokes. + Assert.Throws(() => { var x = new NameValueHeaderValue("name"); x.Value = " x "; }); + Assert.Throws(() => { var x = new NameValueHeaderValue("name"); x.Value = "x y"; }); + } + + [Fact] + public void ToString_UseNoValueAndTokenAndQuotedStringValues_SerializedCorrectly() + { + var nameValue = new NameValueHeaderValue("text", "token"); + Assert.Equal("text=token", nameValue.ToString()); + + nameValue.Value = "\"quoted string\""; + Assert.Equal("text=\"quoted string\"", nameValue.ToString()); + + nameValue.Value = null; + Assert.Equal("text", nameValue.ToString()); + + nameValue.Value = string.Empty; + Assert.Equal("text", nameValue.ToString()); + } + + [Fact] + public void GetHashCode_ValuesUseDifferentValues_HashDiffersAccordingToRfc() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("text"); + + nameValue1.Value = null; + nameValue2.Value = null; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = null; + Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = string.Empty; + Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = null; + nameValue2.Value = string.Empty; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = "TOKEN"; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = "token"; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"QUOTED STRING\""; + Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"quoted string\""; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + } + + [Fact] + public void GetHashCode_NameUseDifferentCasing_HashDiffersAccordingToRfc() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("TEXT"); + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + } + + [Fact] + public void Equals_ValuesUseDifferentValues_ValuesAreEqualOrDifferentAccordingToRfc() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("text"); + + nameValue1.Value = null; + nameValue2.Value = null; + Assert.True(nameValue1.Equals(nameValue2), " vs. ."); + + nameValue1.Value = "token"; + nameValue2.Value = null; + Assert.False(nameValue1.Equals(nameValue2), "token vs. ."); + + nameValue1.Value = null; + nameValue2.Value = "token"; + Assert.False(nameValue1.Equals(nameValue2), " vs. token."); + + nameValue1.Value = string.Empty; + nameValue2.Value = "token"; + Assert.False(nameValue1.Equals(nameValue2), "string.Empty vs. token."); + + nameValue1.Value = null; + nameValue2.Value = string.Empty; + Assert.True(nameValue1.Equals(nameValue2), " vs. string.Empty."); + + nameValue1.Value = "token"; + nameValue2.Value = "TOKEN"; + Assert.True(nameValue1.Equals(nameValue2), "token vs. TOKEN."); + + nameValue1.Value = "token"; + nameValue2.Value = "token"; + Assert.True(nameValue1.Equals(nameValue2), "token vs. token."); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"QUOTED STRING\""; + Assert.False(nameValue1.Equals(nameValue2), "\"quoted string\" vs. \"QUOTED STRING\"."); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"quoted string\""; + Assert.True(nameValue1.Equals(nameValue2), "\"quoted string\" vs. \"quoted string\"."); + + Assert.False(nameValue1.Equals(null), "\"quoted string\" vs. ."); + } + + [Fact] + public void Equals_NameUseDifferentCasing_ConsideredEqual() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("TEXT"); + Assert.True(nameValue1.Equals(nameValue2), "text vs. TEXT."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" name = value ", new NameValueHeaderValue("name", "value")); + CheckValidParse(" name", new NameValueHeaderValue("name")); + CheckValidParse(" name ", new NameValueHeaderValue("name")); + CheckValidParse(" name=\"value\"", new NameValueHeaderValue("name", "\"value\"")); + CheckValidParse("name=value", new NameValueHeaderValue("name", "value")); + CheckValidParse("name=\"quoted str\"", new NameValueHeaderValue("name", "\"quoted str\"")); + CheckValidParse("name\t =va1ue", new NameValueHeaderValue("name", "va1ue")); + CheckValidParse("name= va*ue ", new NameValueHeaderValue("name", "va*ue")); + CheckValidParse("name=", new NameValueHeaderValue("name", "")); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse("name[value"); + CheckInvalidParse("name=value="); + CheckInvalidParse("name=会"); + CheckInvalidParse("name==value"); + CheckInvalidParse("name= va:ue"); + CheckInvalidParse("=value"); + CheckInvalidParse("name value"); + CheckInvalidParse("name=,value"); + CheckInvalidParse("会"); + CheckInvalidParse(null); + CheckInvalidParse(string.Empty); + CheckInvalidParse(" "); + CheckInvalidParse(" ,,"); + CheckInvalidParse(" , , name = value , "); + CheckInvalidParse(" name,"); + CheckInvalidParse(" ,name=\"value\""); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" name = value ", new NameValueHeaderValue("name", "value")); + CheckValidTryParse(" name", new NameValueHeaderValue("name")); + CheckValidTryParse(" name=\"value\"", new NameValueHeaderValue("name", "\"value\"")); + CheckValidTryParse("name=value", new NameValueHeaderValue("name", "value")); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("name[value"); + CheckInvalidTryParse("name=value="); + CheckInvalidTryParse("name=会"); + CheckInvalidTryParse("name==value"); + CheckInvalidTryParse("=value"); + CheckInvalidTryParse("name value"); + CheckInvalidTryParse("name=,value"); + CheckInvalidTryParse("会"); + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(" ,,"); + CheckInvalidTryParse(" , , name = value , "); + CheckInvalidTryParse(" name,"); + CheckInvalidTryParse(" ,name=\"value\""); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "name=value1", + "", + " name = value2 ", + "\r\n name =value3\r\n ", + "name=\"value 4\"", + "name=\"value会5\"", + "name=value6,name=value7", + "name=\"value 8\", name= \"value 9\"", + }; + var results = NameValueHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new NameValueHeaderValue("name", "value1"), + new NameValueHeaderValue("name", "value2"), + new NameValueHeaderValue("name", "value3"), + new NameValueHeaderValue("name", "\"value 4\""), + new NameValueHeaderValue("name", "\"value会5\""), + new NameValueHeaderValue("name", "value6"), + new NameValueHeaderValue("name", "value7"), + new NameValueHeaderValue("name", "\"value 8\""), + new NameValueHeaderValue("name", "\"value 9\""), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "name=value1", + "", + " name = value2 ", + "\r\n name =value3\r\n ", + "name=\"value 4\"", + "name=\"value会5\"", + "name=value6,name=value7", + "name=\"value 8\", name= \"value 9\"", + }; + IList results; + Assert.True(NameValueHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new NameValueHeaderValue("name", "value1"), + new NameValueHeaderValue("name", "value2"), + new NameValueHeaderValue("name", "value3"), + new NameValueHeaderValue("name", "\"value 4\""), + new NameValueHeaderValue("name", "\"value会5\""), + new NameValueHeaderValue("name", "value6"), + new NameValueHeaderValue("name", "value7"), + new NameValueHeaderValue("name", "\"value 8\""), + new NameValueHeaderValue("name", "\"value 9\""), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "name1=value1", + "name2", + " name3 = 3, value a", + "name4 =value4, name5 = value5 b", + "name6=\"value 6", + "name7=\"value会7\"", + "name8=value8,name9=value9", + "name10=\"value 10\", name11= \"value 11\"", + }; + Assert.Throws(() => NameValueHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "name1=value1", + "name2", + " name3 = 3, value a", + "name4 =value4, name5 = value5 b", + "name6=\"value 6", + "name7=\"value会7\"", + "name8=value8,name9=value9", + "name10=\"value 10\", name11= \"value 11\"", + }; + IList results; + Assert.False(NameValueHeaderValue.TryParseList(inputs, out results)); + } + + #region Helper methods + + private void CheckValidParse(string input, NameValueHeaderValue expectedResult) + { + var result = NameValueHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => NameValueHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, NameValueHeaderValue expectedResult) + { + NameValueHeaderValue result = null; + Assert.True(NameValueHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + NameValueHeaderValue result = null; + Assert.False(NameValueHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private static void CheckValue(string value) + { + var nameValue = new NameValueHeaderValue("text", value); + Assert.Equal(value, nameValue.Value); + } + + private static void AssertFormatException(string name, string value) + { + Assert.Throws(() => new NameValueHeaderValue(name, value)); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs new file mode 100644 index 0000000000..b47b03b026 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -0,0 +1,174 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeConditionHeaderValueTest + { + [Fact] + public void Ctor_EntityTagOverload_MatchExpectation() + { + var rangeCondition = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + Assert.Equal(new EntityTagHeaderValue("\"x\""), rangeCondition.EntityTag); + Assert.Null(rangeCondition.LastModified); + + EntityTagHeaderValue input = null; + Assert.Throws(() => new RangeConditionHeaderValue(input)); + } + + [Fact] + public void Ctor_EntityTagStringOverload_MatchExpectation() + { + var rangeCondition = new RangeConditionHeaderValue("\"y\""); + Assert.Equal(new EntityTagHeaderValue("\"y\""), rangeCondition.EntityTag); + Assert.Null(rangeCondition.LastModified); + + Assert.Throws(() => new RangeConditionHeaderValue((string)null)); + } + + [Fact] + public void Ctor_DateOverload_MatchExpectation() + { + var rangeCondition = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + Assert.Null(rangeCondition.EntityTag); + Assert.Equal(new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero), rangeCondition.LastModified); + } + + [Fact] + public void ToString_UseDifferentrangeConditions_AllSerializedCorrectly() + { + var rangeCondition = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + Assert.Equal("\"x\"", rangeCondition.ToString()); + + rangeCondition = new RangeConditionHeaderValue(new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + Assert.Equal("Thu, 15 Jul 2010 12:33:57 GMT", rangeCondition.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentrangeConditions_SameOrDifferentHashCodes() + { + var rangeCondition1 = new RangeConditionHeaderValue("\"x\""); + var rangeCondition2 = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + var rangeCondition3 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition4 = new RangeConditionHeaderValue( + new DateTimeOffset(2008, 8, 16, 13, 44, 10, TimeSpan.Zero)); + var rangeCondition5 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition6 = new RangeConditionHeaderValue( + new EntityTagHeaderValue("\"x\"", true)); + + Assert.Equal(rangeCondition1.GetHashCode(), rangeCondition2.GetHashCode()); + Assert.NotEqual(rangeCondition1.GetHashCode(), rangeCondition3.GetHashCode()); + Assert.NotEqual(rangeCondition3.GetHashCode(), rangeCondition4.GetHashCode()); + Assert.Equal(rangeCondition3.GetHashCode(), rangeCondition5.GetHashCode()); + Assert.NotEqual(rangeCondition1.GetHashCode(), rangeCondition6.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var rangeCondition1 = new RangeConditionHeaderValue("\"x\""); + var rangeCondition2 = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + var rangeCondition3 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition4 = new RangeConditionHeaderValue( + new DateTimeOffset(2008, 8, 16, 13, 44, 10, TimeSpan.Zero)); + var rangeCondition5 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition6 = new RangeConditionHeaderValue( + new EntityTagHeaderValue("\"x\"", true)); + + Assert.False(rangeCondition1.Equals(null), "\"x\" vs. "); + Assert.True(rangeCondition1.Equals(rangeCondition2), "\"x\" vs. \"x\""); + Assert.False(rangeCondition1.Equals(rangeCondition3), "\"x\" vs. date"); + Assert.False(rangeCondition3.Equals(rangeCondition1), "date vs. \"x\""); + Assert.False(rangeCondition3.Equals(rangeCondition4), "date vs. different date"); + Assert.True(rangeCondition3.Equals(rangeCondition5), "date vs. date"); + Assert.False(rangeCondition1.Equals(rangeCondition6), "\"x\" vs. W/\"x\""); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" \"x\" ", new RangeConditionHeaderValue("\"x\"")); + CheckValidParse(" Sun, 06 Nov 1994 08:49:37 GMT ", + new RangeConditionHeaderValue(new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero))); + CheckValidParse("Wed, 09 Nov 1994 08:49:37 GMT", + new RangeConditionHeaderValue(new DateTimeOffset(1994, 11, 9, 8, 49, 37, TimeSpan.Zero))); + CheckValidParse(" W/ \"tag\" ", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidParse(" w/\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidParse("\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\""))); + } + + [Theory] + [InlineData("\"x\" ,")] // no delimiter allowed + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT ,")] // no delimiter allowed + [InlineData("\"x\" Sun, 06 Nov 1994 08:49:37 GMT")] + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] + [InlineData(null)] + [InlineData("")] + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x")] + [InlineData("Wed, 09 Nov")] + [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x\",")] + [InlineData("Wed 09 Nov 1994 08:49:37 GMT,")] + public void Parse_SetOfInvalidValueStrings_Throws(string input) + { + Assert.Throws(() => RangeConditionHeaderValue.Parse(input)); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" \"x\" ", new RangeConditionHeaderValue("\"x\"")); + CheckValidTryParse(" Sun, 06 Nov 1994 08:49:37 GMT ", + new RangeConditionHeaderValue(new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero))); + CheckValidTryParse(" W/ \"tag\" ", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidTryParse(" w/\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidTryParse("\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\""))); + } + + [Theory] + [InlineData("\"x\" ,")] // no delimiter allowed + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT ,")] // no delimiter allowed + [InlineData("\"x\" Sun, 06 Nov 1994 08:49:37 GMT")] + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] + [InlineData(null)] + [InlineData("")] + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x")] + [InlineData("Wed, 09 Nov")] + [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x\",")] + [InlineData("Wed 09 Nov 1994 08:49:37 GMT,")] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse(string input) + { + RangeConditionHeaderValue result = null; + Assert.False(RangeConditionHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #region Helper methods + + private void CheckValidParse(string input, RangeConditionHeaderValue expectedResult) + { + var result = RangeConditionHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckValidTryParse(string input, RangeConditionHeaderValue expectedResult) + { + RangeConditionHeaderValue result = null; + Assert.True(RangeConditionHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs new file mode 100644 index 0000000000..22dc5dc749 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs @@ -0,0 +1,183 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeHeaderValueTest + { + [Fact] + public void Ctor_InvalidRange_Throw() + { + Assert.Throws(() => new RangeHeaderValue(5, 2)); + } + + [Fact] + public void Unit_GetAndSetValidAndInvalidValues_MatchExpectation() + { + var range = new RangeHeaderValue(); + range.Unit = "myunit"; + Assert.Equal("myunit", range.Unit); + + Assert.Throws(() => range.Unit = null); + Assert.Throws(() => range.Unit = ""); + Assert.Throws(() => range.Unit = " x"); + Assert.Throws(() => range.Unit = "x "); + Assert.Throws(() => range.Unit = "x y"); + } + + [Fact] + public void ToString_UseDifferentRanges_AllSerializedCorrectly() + { + var range = new RangeHeaderValue(); + range.Unit = "myunit"; + range.Ranges.Add(new RangeItemHeaderValue(1, 3)); + Assert.Equal("myunit=1-3", range.ToString()); + + range.Ranges.Add(new RangeItemHeaderValue(5, null)); + range.Ranges.Add(new RangeItemHeaderValue(null, 17)); + Assert.Equal("myunit=1-3, 5-, -17", range.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentRanges_SameOrDifferentHashCodes() + { + var range1 = new RangeHeaderValue(1, 2); + var range2 = new RangeHeaderValue(1, 2); + range2.Unit = "BYTES"; + var range3 = new RangeHeaderValue(1, null); + var range4 = new RangeHeaderValue(null, 2); + var range5 = new RangeHeaderValue(); + range5.Ranges.Add(new RangeItemHeaderValue(1, 2)); + range5.Ranges.Add(new RangeItemHeaderValue(3, 4)); + var range6 = new RangeHeaderValue(); + range6.Ranges.Add(new RangeItemHeaderValue(3, 4)); // reverse order of range5 + range6.Ranges.Add(new RangeItemHeaderValue(1, 2)); + + Assert.Equal(range1.GetHashCode(), range2.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range3.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range4.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range5.GetHashCode()); + Assert.Equal(range5.GetHashCode(), range6.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var range1 = new RangeHeaderValue(1, 2); + var range2 = new RangeHeaderValue(1, 2); + range2.Unit = "BYTES"; + var range3 = new RangeHeaderValue(1, null); + var range4 = new RangeHeaderValue(null, 2); + var range5 = new RangeHeaderValue(); + range5.Ranges.Add(new RangeItemHeaderValue(1, 2)); + range5.Ranges.Add(new RangeItemHeaderValue(3, 4)); + var range6 = new RangeHeaderValue(); + range6.Ranges.Add(new RangeItemHeaderValue(3, 4)); // reverse order of range5 + range6.Ranges.Add(new RangeItemHeaderValue(1, 2)); + var range7 = new RangeHeaderValue(1, 2); + range7.Unit = "other"; + + Assert.False(range1.Equals(null), "bytes=1-2 vs. "); + Assert.True(range1.Equals(range2), "bytes=1-2 vs. BYTES=1-2"); + Assert.False(range1.Equals(range3), "bytes=1-2 vs. bytes=1-"); + Assert.False(range1.Equals(range4), "bytes=1-2 vs. bytes=-2"); + Assert.False(range1.Equals(range5), "bytes=1-2 vs. bytes=1-2,3-4"); + Assert.True(range5.Equals(range6), "bytes=1-2,3-4 vs. bytes=3-4,1-2"); + Assert.False(range1.Equals(range7), "bytes=1-2 vs. other=1-2"); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" bytes=1-2 ", new RangeHeaderValue(1, 2)); + + var expected = new RangeHeaderValue(); + expected.Unit = "custom"; + expected.Ranges.Add(new RangeItemHeaderValue(null, 5)); + expected.Ranges.Add(new RangeItemHeaderValue(1, 4)); + CheckValidParse("custom = - 5 , 1 - 4 ,,", expected); + + expected = new RangeHeaderValue(); + expected.Unit = "custom"; + expected.Ranges.Add(new RangeItemHeaderValue(1, 2)); + CheckValidParse(" custom = 1 - 2", expected); + + expected = new RangeHeaderValue(); + expected.Ranges.Add(new RangeItemHeaderValue(1, 2)); + expected.Ranges.Add(new RangeItemHeaderValue(3, null)); + expected.Ranges.Add(new RangeItemHeaderValue(null, 4)); + CheckValidParse("bytes =1-2,,3-, , ,-4,,", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse("bytes=1-2x"); // only delimiter ',' allowed after last range + CheckInvalidParse("x bytes=1-2"); + CheckInvalidParse("bytes=1-2.4"); + CheckInvalidParse(null); + CheckInvalidParse(string.Empty); + + CheckInvalidParse("bytes=1"); + CheckInvalidParse("bytes="); + CheckInvalidParse("bytes"); + CheckInvalidParse("bytes 1-2"); + CheckInvalidParse("bytes= ,,, , ,,"); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" bytes=1-2 ", new RangeHeaderValue(1, 2)); + + var expected = new RangeHeaderValue(); + expected.Unit = "custom"; + expected.Ranges.Add(new RangeItemHeaderValue(null, 5)); + expected.Ranges.Add(new RangeItemHeaderValue(1, 4)); + CheckValidTryParse("custom = - 5 , 1 - 4 ,,", expected); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("bytes=1-2x"); // only delimiter ',' allowed after last range + CheckInvalidTryParse("x bytes=1-2"); + CheckInvalidTryParse("bytes=1-2.4"); + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + } + + #region Helper methods + + private void CheckValidParse(string input, RangeHeaderValue expectedResult) + { + var result = RangeHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => RangeHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, RangeHeaderValue expectedResult) + { + RangeHeaderValue result = null; + Assert.True(RangeHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + RangeHeaderValue result = null; + Assert.False(RangeHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs new file mode 100644 index 0000000000..573ae8964e --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs @@ -0,0 +1,162 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeItemHeaderValueTest + { + [Fact] + public void Ctor_BothValuesNull_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(null, null)); + } + + [Fact] + public void Ctor_FromValueNegative_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(-1, null)); + } + + [Fact] + public void Ctor_FromGreaterThanToValue_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(2, 1)); + } + + [Fact] + public void Ctor_ToValueNegative_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(null, -1)); + } + + [Fact] + public void Ctor_ValidFormat_SuccessfullyCreated() + { + var rangeItem = new RangeItemHeaderValue(1, 2); + Assert.Equal(1, rangeItem.From); + Assert.Equal(2, rangeItem.To); + } + + [Fact] + public void ToString_UseDifferentRangeItems_AllSerializedCorrectly() + { + // Make sure ToString() doesn't add any separators. + var rangeItem = new RangeItemHeaderValue(1000000000, 2000000000); + Assert.Equal("1000000000-2000000000", rangeItem.ToString()); + + rangeItem = new RangeItemHeaderValue(5, null); + Assert.Equal("5-", rangeItem.ToString()); + + rangeItem = new RangeItemHeaderValue(null, 10); + Assert.Equal("-10", rangeItem.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentRangeItems_SameOrDifferentHashCodes() + { + var rangeItem1 = new RangeItemHeaderValue(1, 2); + var rangeItem2 = new RangeItemHeaderValue(1, null); + var rangeItem3 = new RangeItemHeaderValue(null, 2); + var rangeItem4 = new RangeItemHeaderValue(2, 2); + var rangeItem5 = new RangeItemHeaderValue(1, 2); + + Assert.NotEqual(rangeItem1.GetHashCode(), rangeItem2.GetHashCode()); + Assert.NotEqual(rangeItem1.GetHashCode(), rangeItem3.GetHashCode()); + Assert.NotEqual(rangeItem1.GetHashCode(), rangeItem4.GetHashCode()); + Assert.Equal(rangeItem1.GetHashCode(), rangeItem5.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var rangeItem1 = new RangeItemHeaderValue(1, 2); + var rangeItem2 = new RangeItemHeaderValue(1, null); + var rangeItem3 = new RangeItemHeaderValue(null, 2); + var rangeItem4 = new RangeItemHeaderValue(2, 2); + var rangeItem5 = new RangeItemHeaderValue(1, 2); + + Assert.False(rangeItem1.Equals(rangeItem2), "1-2 vs. 1-."); + Assert.False(rangeItem2.Equals(rangeItem1), "1- vs. 1-2."); + Assert.False(rangeItem1.Equals(null), "1-2 vs. null."); + Assert.False(rangeItem1.Equals(rangeItem3), "1-2 vs. -2."); + Assert.False(rangeItem3.Equals(rangeItem1), "-2 vs. 1-2."); + Assert.False(rangeItem1.Equals(rangeItem4), "1-2 vs. 2-2."); + Assert.True(rangeItem1.Equals(rangeItem5), "1-2 vs. 1-2."); + } + + [Fact] + public void TryParse_DifferentValidScenarios_AllReturnNonZero() + { + CheckValidTryParse("1-2", 1, 2); + CheckValidTryParse(" 1-2", 1, 2); + CheckValidTryParse("0-0", 0, 0); + CheckValidTryParse(" 1-", 1, null); + CheckValidTryParse(" -2", null, 2); + + CheckValidTryParse(" 684684 - 123456789012345 ", 684684, 123456789012345); + + // The separator doesn't matter. It only parses until the first non-whitespace + CheckValidTryParse(" 1 - 2 ,", 1, 2); + + CheckValidTryParse(",,1-2, 3 - , , -6 , ,,", new Tuple(1, 2), new Tuple(3, null), + new Tuple(null, 6)); + CheckValidTryParse("1-2,", new Tuple(1, 2)); + CheckValidTryParse("1-", new Tuple(1, null)); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(",,")] + [InlineData("1")] + [InlineData("1-2,3")] + [InlineData("1--2")] + [InlineData("1,-2")] + [InlineData("-")] + [InlineData("--")] + [InlineData("2-1")] + [InlineData("12345678901234567890123-")] // >>Int64.MaxValue + [InlineData("-12345678901234567890123")] // >>Int64.MaxValue + [InlineData("9999999999999999999-")] // 19-digit numbers outside the Int64 range. + [InlineData("-9999999999999999999")] // 19-digit numbers outside the Int64 range. + public void TryParse_DifferentInvalidScenarios_AllReturnFalse(string input) + { + RangeHeaderValue result; + Assert.False(RangeHeaderValue.TryParse("byte=" + input, out result)); + } + + private static void CheckValidTryParse(string input, long? expectedFrom, long? expectedTo) + { + RangeHeaderValue result; + Assert.True(RangeHeaderValue.TryParse("byte=" + input, out result), input); + + var ranges = result.Ranges.ToArray(); + Assert.Equal(1, ranges.Length); + + var range = ranges.First(); + + Assert.Equal(expectedFrom, range.From); + Assert.Equal(expectedTo, range.To); + } + + private static void CheckValidTryParse(string input, params Tuple[] expectedRanges) + { + RangeHeaderValue result; + Assert.True(RangeHeaderValue.TryParse("byte=" + input, out result), input); + + var ranges = result.Ranges.ToArray(); + Assert.Equal(expectedRanges.Length, ranges.Length); + + for (int i = 0; i < expectedRanges.Length; i++) + { + Assert.Equal(expectedRanges[i].Item1, ranges[i].From); + Assert.Equal(expectedRanges[i].Item2, ranges[i].To); + } + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs new file mode 100644 index 0000000000..ee3e12292b --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -0,0 +1,259 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class SetCookieHeaderValueTest + { + public static TheoryData SetCookieHeaderDataSet + { + get + { + var dataset = new TheoryData(); + var header1 = new SetCookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + HttpOnly = true, + MaxAge = TimeSpan.FromDays(1), + Path = "path1", + Secure = true + }; + dataset.Add(header1, "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"); + + var header2 = new SetCookieHeaderValue("name2", ""); + dataset.Add(header2, "name2="); + + var header3 = new SetCookieHeaderValue("name2", "value2"); + dataset.Add(header3, "name2=value2"); + + var header4 = new SetCookieHeaderValue("name4", "value4") + { + MaxAge = TimeSpan.FromDays(1), + }; + dataset.Add(header4, "name4=value4; max-age=86400"); + + var header5 = new SetCookieHeaderValue("name5", "value5") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + }; + dataset.Add(header5, "name5=value5; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1"); + + return dataset; + } + } + + public static TheoryData InvalidSetCookieHeaderDataSet + { + get + { + return new TheoryData + { + "expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1", + "name=value; expires=Sun, 06 Nov 1994 08:49:37 ZZZ; max-age=86400; domain=domain1", + "name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=-86400; domain=domain1", + }; + } + } + + public static TheoryData InvalidCookieNames + { + get + { + return new TheoryData + { + "", + "{acb}", + "[acb]", + "\"acb\"", + "a,b", + "a;b", + "a\\b", + }; + } + } + + public static TheoryData InvalidCookieValues + { + get + { + return new TheoryData + { + { "\"" }, + { "a,b" }, + { "a;b" }, + { "a\\b" }, + { "\"abc" }, + { "a\"bc" }, + { "abc\"" }, + }; + } + } + public static TheoryData, string[]> ListOfSetCookieHeaderDataSet + { + get + { + var dataset = new TheoryData, string[]>(); + var header1 = new SetCookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + HttpOnly = true, + MaxAge = TimeSpan.FromDays(1), + Path = "path1", + Secure = true + }; + var string1 = "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"; + + var header2 = new SetCookieHeaderValue("name2", "value2"); + var string2 = "name2=value2"; + + var header3 = new SetCookieHeaderValue("name3", "value3") + { + MaxAge = TimeSpan.FromDays(1), + }; + var string3 = "name3=value3; max-age=86400"; + + var header4 = new SetCookieHeaderValue("name4", "value4") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + }; + var string4 = "name4=value4; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1"; + + dataset.Add(new[] { header1 }.ToList(), new[] { string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, null, "", " ", ",", " , ", string1 }); + dataset.Add(new[] { header2 }.ToList(), new[] { string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1, string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1 + ", " + string2 }); + dataset.Add(new[] { header2, header1 }.ToList(), new[] { string2 + ", " + string1 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, string3, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, string3, string4) }); + + return dataset; + } + } + + // TODO: [Fact] + public void SetCookieHeaderValue_CtorThrowsOnNullName() + { + Assert.Throws(() => new SetCookieHeaderValue(null, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieNames))] + public void SetCookieHeaderValue_CtorThrowsOnInvalidName(string name) + { + Assert.Throws(() => new SetCookieHeaderValue(name, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieValues))] + public void SetCookieHeaderValue_CtorThrowsOnInvalidValue(string value) + { + Assert.Throws(() => new SetCookieHeaderValue("name", value)); + } + + [Fact] + public void SetCookieHeaderValue_Ctor1_InitializesCorrectly() + { + var header = new SetCookieHeaderValue("cookie"); + Assert.Equal("cookie", header.Name); + Assert.Equal(string.Empty, header.Value); + } + + [Theory] + [InlineData("name", "")] + [InlineData("name", "value")] + [InlineData("name", "\"acb\"")] + public void SetCookieHeaderValue_Ctor2InitializesCorrectly(string name, string value) + { + var header = new SetCookieHeaderValue(name, value); + Assert.Equal(name, header.Name); + Assert.Equal(value, header.Value); + } + + [Fact] + public void SetCookieHeaderValue_Value() + { + var cookie = new SetCookieHeaderValue("name"); + Assert.Equal(String.Empty, cookie.Value); + + cookie.Value = "value1"; + Assert.Equal("value1", cookie.Value); + } + + [Theory] + [MemberData(nameof(SetCookieHeaderDataSet))] + public void SetCookieHeaderValue_ToString(SetCookieHeaderValue input, string expectedValue) + { + Assert.Equal(expectedValue, input.ToString()); + } + + [Theory] + [MemberData(nameof(SetCookieHeaderDataSet))] + public void SetCookieHeaderValue_Parse_AcceptsValidValues(SetCookieHeaderValue cookie, string expectedValue) + { + var header = SetCookieHeaderValue.Parse(expectedValue); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(SetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParse_AcceptsValidValues(SetCookieHeaderValue cookie, string expectedValue) + { + SetCookieHeaderValue header; + bool result = SetCookieHeaderValue.TryParse(expectedValue, out header); + Assert.True(result); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(InvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_Parse_RejectsInvalidValues(string value) + { + Assert.Throws(() => SetCookieHeaderValue.Parse(value)); + } + + [Theory] + [MemberData(nameof(InvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParse_RejectsInvalidValues(string value) + { + SetCookieHeaderValue header; + bool result = SetCookieHeaderValue.TryParse(value, out header); + + Assert.False(result); + } + + [Theory] + [MemberData(nameof(ListOfSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_ParseList_AcceptsValidValues(IList cookies, string[] input) + { + var results = SetCookieHeaderValue.ParseList(input); + + Assert.Equal(cookies, results); + } + + [Theory] + [MemberData(nameof(ListOfSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParseList_AcceptsValidValues(IList cookies, string[] input) + { + IList results; + bool result = SetCookieHeaderValue.TryParseList(input, out results); + Assert.True(result); + + Assert.Equal(cookies, results); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs new file mode 100644 index 0000000000..df4e729493 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class StringWithQualityHeaderValueComparerTest + { + public static TheoryData StringWithQualityHeaderValueComparerTestsBeforeAfterSortedValues + { + get + { + return new TheoryData + { + { + new string[] + { + "text", + "text;q=1.0", + "text", + "text;q=0", + "*;q=0.8", + "*;q=1", + "text;q=0.8", + "*;q=0.6", + "text;q=1.0", + "*;q=0.4", + "text;q=0.6", + }, + new string[] + { + "text", + "text;q=1.0", + "text", + "text;q=1.0", + "*;q=1", + "text;q=0.8", + "*;q=0.8", + "text;q=0.6", + "*;q=0.6", + "*;q=0.4", + "text;q=0", + } + } + }; + } + } + + [Theory] + [MemberData(nameof(StringWithQualityHeaderValueComparerTestsBeforeAfterSortedValues))] + public void SortStringWithQualityHeaderValuesByQFactor_SortsCorrectly(IEnumerable unsorted, IEnumerable expectedSorted) + { + var unsortedValues = StringWithQualityHeaderValue.ParseList(unsorted.ToList()); + var expectedSortedValues = StringWithQualityHeaderValue.ParseList(expectedSorted.ToList()); + + var actualSorted = unsortedValues.OrderByDescending(k => k, StringWithQualityHeaderValueComparer.QualityComparer).ToList(); + + Assert.True(expectedSortedValues.SequenceEqual(actualSorted)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs new file mode 100644 index 0000000000..0a57c61958 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs @@ -0,0 +1,339 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class StringWithQualityHeaderValueTest + { + [Fact] + public void Ctor_StringOnlyOverload_MatchExpectation() + { + var value = new StringWithQualityHeaderValue("token"); + Assert.Equal("token", value.Value); + Assert.Null(value.Quality); + + Assert.Throws(() => new StringWithQualityHeaderValue(null)); + Assert.Throws(() => new StringWithQualityHeaderValue("")); + Assert.Throws(() => new StringWithQualityHeaderValue("in valid")); + } + + [Fact] + public void Ctor_StringWithQualityOverload_MatchExpectation() + { + var value = new StringWithQualityHeaderValue("token", 0.5); + Assert.Equal("token", value.Value); + Assert.Equal(0.5, value.Quality); + + Assert.Throws(() => new StringWithQualityHeaderValue(null, 0.1)); + Assert.Throws(() => new StringWithQualityHeaderValue("", 0.1)); + Assert.Throws(() => new StringWithQualityHeaderValue("in valid", 0.1)); + + Assert.Throws(() => new StringWithQualityHeaderValue("t", 1.1)); + Assert.Throws(() => new StringWithQualityHeaderValue("t", -0.1)); + } + + [Fact] + public void ToString_UseDifferentValues_AllSerializedCorrectly() + { + var value = new StringWithQualityHeaderValue("token"); + Assert.Equal("token", value.ToString()); + + value = new StringWithQualityHeaderValue("token", 0.1); + Assert.Equal("token; q=0.1", value.ToString()); + + value = new StringWithQualityHeaderValue("token", 0); + Assert.Equal("token; q=0.0", value.ToString()); + + value = new StringWithQualityHeaderValue("token", 1); + Assert.Equal("token; q=1.0", value.ToString()); + + // Note that the quality value gets rounded + value = new StringWithQualityHeaderValue("token", 0.56789); + Assert.Equal("token; q=0.568", value.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentValues_SameOrDifferentHashCodes() + { + var value1 = new StringWithQualityHeaderValue("t", 0.123); + var value2 = new StringWithQualityHeaderValue("t", 0.123); + var value3 = new StringWithQualityHeaderValue("T", 0.123); + var value4 = new StringWithQualityHeaderValue("t"); + var value5 = new StringWithQualityHeaderValue("x", 0.123); + var value6 = new StringWithQualityHeaderValue("t", 0.5); + var value7 = new StringWithQualityHeaderValue("t", 0.1234); + var value8 = new StringWithQualityHeaderValue("T"); + var value9 = new StringWithQualityHeaderValue("x"); + + Assert.Equal(value1.GetHashCode(), value2.GetHashCode()); + Assert.Equal(value1.GetHashCode(), value3.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value4.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value5.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value6.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value7.GetHashCode()); + Assert.Equal(value4.GetHashCode(), value8.GetHashCode()); + Assert.NotEqual(value4.GetHashCode(), value9.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var value1 = new StringWithQualityHeaderValue("t", 0.123); + var value2 = new StringWithQualityHeaderValue("t", 0.123); + var value3 = new StringWithQualityHeaderValue("T", 0.123); + var value4 = new StringWithQualityHeaderValue("t"); + var value5 = new StringWithQualityHeaderValue("x", 0.123); + var value6 = new StringWithQualityHeaderValue("t", 0.5); + var value7 = new StringWithQualityHeaderValue("t", 0.1234); + var value8 = new StringWithQualityHeaderValue("T"); + var value9 = new StringWithQualityHeaderValue("x"); + + Assert.False(value1.Equals(null), "t; q=0.123 vs. "); + Assert.True(value1.Equals(value2), "t; q=0.123 vs. t; q=0.123"); + Assert.True(value1.Equals(value3), "t; q=0.123 vs. T; q=0.123"); + Assert.False(value1.Equals(value4), "t; q=0.123 vs. t"); + Assert.False(value4.Equals(value1), "t vs. t; q=0.123"); + Assert.False(value1.Equals(value5), "t; q=0.123 vs. x; q=0.123"); + Assert.False(value1.Equals(value6), "t; q=0.123 vs. t; q=0.5"); + Assert.False(value1.Equals(value7), "t; q=0.123 vs. t; q=0.1234"); + Assert.True(value4.Equals(value8), "t vs. T"); + Assert.False(value4.Equals(value9), "t vs. T"); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse("text", new StringWithQualityHeaderValue("text")); + CheckValidParse("text;q=0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidParse("text ; q = 0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidParse("\r\n text ; q = 0.5 ", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidParse(" text ", new StringWithQualityHeaderValue("text")); + CheckValidParse(" \r\n text \r\n ; \r\n q = 0.123", new StringWithQualityHeaderValue("text", 0.123)); + CheckValidParse(" text ; q = 0.123 ", new StringWithQualityHeaderValue("text", 0.123)); + CheckValidParse("text;q=1 ", new StringWithQualityHeaderValue("text", 1)); + CheckValidParse("*", new StringWithQualityHeaderValue("*")); + CheckValidParse("*;q=0.7", new StringWithQualityHeaderValue("*", 0.7)); + CheckValidParse(" t", new StringWithQualityHeaderValue("t")); + CheckValidParse("t;q=0.", new StringWithQualityHeaderValue("t", 0)); + CheckValidParse("t;q=1.", new StringWithQualityHeaderValue("t", 1)); + CheckValidParse("t ; q = 0", new StringWithQualityHeaderValue("t", 0)); + CheckValidParse("iso-8859-5", new StringWithQualityHeaderValue("iso-8859-5")); + CheckValidParse("unicode-1-1; q=0.8", new StringWithQualityHeaderValue("unicode-1-1", 0.8)); + } + + [Theory] + [InlineData("text,")] + [InlineData("\r\n text ; q = 0.5, next_text ")] + [InlineData(" text,next_text ")] + [InlineData(" ,, text, , ,next")] + [InlineData(" ,, text, , ,")] + [InlineData(", \r\n text \r\n ; \r\n q = 0.123")] + [InlineData("teäxt")] + [InlineData("text会")] + [InlineData("会")] + [InlineData("t;q=会")] + [InlineData("t;q=")] + [InlineData("t;q")] + [InlineData("t;会=1")] + [InlineData("t;q会=1")] + [InlineData("t y")] + [InlineData("t;q=1 y")] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + [InlineData(" ,,")] + [InlineData("t;q=-1")] + [InlineData("t;q=1.00001")] + [InlineData("t;")] + [InlineData("t;;q=1")] + [InlineData("t;q=a")] + [InlineData("t;qa")] + [InlineData("t;q1")] + public void Parse_SetOfInvalidValueStrings_Throws(string input) + { + Assert.Throws(() => StringWithQualityHeaderValue.Parse(input)); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse("text", new StringWithQualityHeaderValue("text")); + CheckValidTryParse("text;q=0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidTryParse("text ; q = 0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidTryParse("\r\n text ; q = 0.5 ", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidTryParse(" text ", new StringWithQualityHeaderValue("text")); + CheckValidTryParse(" \r\n text \r\n ; \r\n q = 0.123", new StringWithQualityHeaderValue("text", 0.123)); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("text,"); + CheckInvalidTryParse("\r\n text ; q = 0.5, next_text "); + CheckInvalidTryParse(" text,next_text "); + CheckInvalidTryParse(" ,, text, , ,next"); + CheckInvalidTryParse(" ,, text, , ,"); + CheckInvalidTryParse(", \r\n text \r\n ; \r\n q = 0.123"); + CheckInvalidTryParse("teäxt"); + CheckInvalidTryParse("text会"); + CheckInvalidTryParse("会"); + CheckInvalidTryParse("t;q=会"); + CheckInvalidTryParse("t;q="); + CheckInvalidTryParse("t;q"); + CheckInvalidTryParse("t;会=1"); + CheckInvalidTryParse("t;q会=1"); + CheckInvalidTryParse("t y"); + CheckInvalidTryParse("t;q=1 y"); + + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(" ,,"); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "text1", + "text2,", + "textA,textB", + "text3;q=0.5", + "text4;q=0.5,", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results = StringWithQualityHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("textA"), + new StringWithQualityHeaderValue("textB"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "text1", + "text2,", + "textA,textB", + "text3;q=0.5", + "text4;q=0.5,", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results; + Assert.True(StringWithQualityHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("textA"), + new StringWithQualityHeaderValue("textB"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "text1", + "text 1", + "text2", + "\"text 2\",", + "text3;q=0.5", + "text4;q=0.5, extra stuff", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + Assert.Throws(() => StringWithQualityHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "text1", + "text 1", + "text2", + "\"text 2\",", + "text3;q=0.5", + "text4;q=0.5, extra stuff", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results; + Assert.False(StringWithQualityHeaderValue.TryParseList(inputs, out results)); + } + + #region Helper methods + + private void CheckValidParse(string input, StringWithQualityHeaderValue expectedResult) + { + var result = StringWithQualityHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckValidTryParse(string input, StringWithQualityHeaderValue expectedResult) + { + StringWithQualityHeaderValue result = null; + Assert.True(StringWithQualityHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + StringWithQualityHeaderValue result = null; + Assert.False(StringWithQualityHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json new file mode 100644 index 0000000000..4ffa75e704 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -0,0 +1,18 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.Net.Http.Headers": "1.0.0-*", + "xunit.runner.kre": "1.0.0-*" + }, + "commands": { + "test": "xunit.runner.kre" + }, + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10-beta-*" + } + } + } +} From 68be1d1b19108e00ea49db4e5de5352c06699efd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 15 Jan 2015 11:52:34 -0800 Subject: [PATCH 198/846] #162 - Change PipelineCore namespace to Http.Core. Part-1. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- .../BufferingHelper.cs | 2 +- .../Collections/FormCollection.cs | 2 +- .../Collections/FormFileCollection.cs | 2 +- .../Collections/HeaderDictionary.cs | 4 +- .../Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 2 +- .../Collections/RequestCookiesCollection.cs | 4 +- .../Collections/ResponseCookies.cs | 2 +- .../Collections/SessionCollection.cs | 2 +- .../DefaultHttpContext.cs | 12 +++--- .../DefaultHttpRequest.cs | 6 +-- .../DefaultHttpResponse.cs | 8 ++-- .../FormFeature.cs | 4 +- src/Microsoft.AspNet.PipelineCore/FormFile.cs | 2 +- ...equestFeature.cs => HttpRequestFeature.cs} | 6 +-- ...ponseFeature.cs => HttpResponseFeature.cs} | 6 +-- .../IFormFeature.cs | 2 +- .../IItemsFeature.cs | 2 +- .../IQueryFeature.cs | 2 +- .../IRequestCookiesFeature.cs | 2 +- .../IResponseCookiesFeature.cs | 4 +- .../IServiceProvidersFeature.cs | 2 +- .../Infrastructure/FeatureReference.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 2 +- .../ItemsFeature.cs | 2 +- .../NotNullAttribute.cs | 2 +- .../QueryFeature.cs | 6 +-- .../ReferenceReadStream.cs | 2 +- .../RequestCookiesFeature.cs | 6 +-- .../ResponseCookiesFeature.cs | 6 +-- .../Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 2 +- .../Security/ChallengeContext.cs | 2 +- .../Security/HttpAuthenticationFeature.cs | 2 +- .../Security/SignInContext.cs | 2 +- .../Security/SignOutContext.cs | 2 +- .../ServiceProvidersFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 2 +- .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../HttpResponseSendingExtensionsTests.cs | 2 +- .../UseWithServicesTests.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 2 +- .../MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- .../OwinEnvironmentTests.cs | 3 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 2 +- .../FormFeatureTests.cs | 2 +- .../HeaderDictionaryTests.cs | 4 +- .../Properties/AssemblyInfo.cs | 39 ------------------- .../QueryFeatureTests.cs | 2 +- 53 files changed, 77 insertions(+), 117 deletions(-) rename src/Microsoft.AspNet.PipelineCore/{DefaultHttpRequestFeature.cs => HttpRequestFeature.cs} (87%) rename src/Microsoft.AspNet.PipelineCore/{DefaultHttpResponseFeature.cs => HttpResponseFeature.cs} (85%) delete mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 8a0e7cbcfd..9ff85950f2 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -16,7 +16,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Security; +using Microsoft.AspNet.Http.Core.Security; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 5bd2e0a9fa..fe4b17d1ac 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs index b10c017c36..58ef9c509e 100644 --- a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs +++ b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs @@ -6,7 +6,7 @@ using System.IO; using Microsoft.AspNet.Http; using Microsoft.AspNet.WebUtilities; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public static class BufferingHelper { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index a80fea12d1..55d7b321a0 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs index 2ef4d29476..d33992bff8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index bf362c94ed..72dc55ec36 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -7,9 +7,9 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index dc5216d117..06c27fbc1e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index 1e12bb6dc1..91f3b8c8f3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 5fd131d990..36a91735a3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -5,9 +5,9 @@ using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 2412b54a83..35aa02b17c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -8,7 +8,7 @@ using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs index 261b401cdb..8d2c3b7565 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { public class SessionCollection : ISessionCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 3b445fefbe..09915207ee 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -14,11 +14,11 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; -using Microsoft.AspNet.PipelineCore.Security; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Core.Security; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class DefaultHttpContext : HttpContext { @@ -38,8 +38,8 @@ namespace Microsoft.AspNet.PipelineCore public DefaultHttpContext() : this(new FeatureCollection()) { - SetFeature(new DefaultHttpRequestFeature()); - SetFeature(new DefaultHttpResponseFeature()); + SetFeature(new HttpRequestFeature()); + SetFeature(new HttpResponseFeature()); } public DefaultHttpContext(IFeatureCollection features) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index d95c37b9c3..28e8f2807c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -9,10 +9,10 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 16d187450d..46358ad69f 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -14,11 +14,11 @@ using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; -using Microsoft.AspNet.PipelineCore.Security; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Core.Security; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 0180728be2..a0f1d5db07 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -9,11 +9,11 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.WebUtilities; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/FormFile.cs b/src/Microsoft.AspNet.PipelineCore/FormFile.cs index 19ea07466f..bbf0a52699 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFile.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFile.cs @@ -4,7 +4,7 @@ using System.IO; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs b/src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs similarity index 87% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs rename to src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs index 156e362c9b..751b366ebe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs @@ -6,11 +6,11 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { - public class DefaultHttpRequestFeature : IHttpRequestFeature + public class HttpRequestFeature : IHttpRequestFeature { - public DefaultHttpRequestFeature() + public HttpRequestFeature() { Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs b/src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs similarity index 85% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs rename to src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs index c3b933bb8a..d4b5287885 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs @@ -6,11 +6,11 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { - public class DefaultHttpResponseFeature : IHttpResponseFeature + public class HttpResponseFeature : IHttpResponseFeature { - public DefaultHttpResponseFeature() + public HttpResponseFeature() { StatusCode = 200; Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index cc84d32a4b..00f2645118 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IFormFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs index 9afe1623de..a38a9cb720 100644 --- a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IItemsFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index e1ad3146c0..545200b3c5 100644 --- a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IQueryFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index ba1a0e3616..d52e714c71 100644 --- a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index 6d51b7a015..f33a15361b 100644 --- a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs index 03dffc578d..3435e53972 100644 --- a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index 0726b73b95..f6db6e4fef 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.FeatureModel; -namespace Microsoft.AspNet.PipelineCore.Infrastructure +namespace Microsoft.AspNet.Http.Core.Infrastructure { internal struct FeatureReference { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 48dab300ac..85208daa0d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Infrastructure +namespace Microsoft.AspNet.Http.Core.Infrastructure { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs index 54d7d123f4..50b32711a3 100644 --- a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs index 33fc2e3070..2328b5d5d8 100644 --- a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullAttribute : Attribute diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index e57b406153..e1b05f6b84 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -5,11 +5,11 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs index aaad97ae92..06755f543d 100644 --- a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs @@ -6,7 +6,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 952bfed0f6..e57ff741ce 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -7,10 +7,10 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index f8ea2bf1b7..801d6d4b05 100644 --- a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -4,10 +4,10 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index ffd779039e..d9e516e756 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class AuthTypeContext : IAuthTypeContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 1e27a006c4..e04326b257 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class AuthenticateContext : IAuthenticateContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index ea87d06599..5c8b8ef74b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -8,7 +8,7 @@ using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class ChallengeContext : IChallengeContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs index 368b888573..8e40287b22 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs @@ -4,7 +4,7 @@ using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 43a88a82de..9856e7ee1a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class SignInContext : ISignInContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 546c5bca83..4ebde735d2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class SignOutContext : ISignOutContext { diff --git a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs index 50bfab0065..9f218d9bbb 100644 --- a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs index 6e9a7ba0dd..3c935b52f8 100644 --- a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class WebSocketAcceptContext : IWebSocketAcceptContext { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index 6b437d8925..a7e15c1844 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; using Microsoft.Net.Http.Headers; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs index 05d662a955..ce046ba3e7 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -4,7 +4,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 1ed29d112e..d2393592ad 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -6,7 +6,7 @@ using Xunit; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using System.Collections.Generic; using System.Threading.Tasks; diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs index aa6582e753..c9692254f1 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,7 +3,7 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index bdaa1eeedb..e49637ed56 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -5,7 +5,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index c5016f3064..b0ef791a3e 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Builder.Extensions diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 88fd2f7174..b98e99cfc1 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -7,8 +7,7 @@ using System.Linq; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 723811a947..2b04823c53 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -12,7 +12,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 397d480580..e2518fd10b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -8,7 +8,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index b129adc0e1..7f1224c1b7 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class FormFeatureTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs index 74667bbeb0..4bee6e446d 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 2a4dd7d85d..0000000000 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("Microsoft.AspNet.PipelineCore.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.PipelineCore.Tests")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7c564547-b037-4054-a1ec-18e62717be47")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs index 975edda5b1..f76fdb25fe 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs @@ -6,7 +6,7 @@ using Microsoft.AspNet.HttpFeature; using Moq; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class QueryFeatureTests { From d43cf30eff2cbbcc33352c6f49bf1f7ffb13dfc0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 15 Jan 2015 12:37:34 -0800 Subject: [PATCH 199/846] #162 - Rename PipelineCore project to Http.Core. Part 2. --- HttpAbstractions.sln | 6 +++--- .../ApplicationBuilder.cs | 0 .../BufferingHelper.cs | 0 .../Collections/FormCollection.cs | 0 .../Collections/FormFileCollection.cs | 0 .../Collections/HeaderDictionary.cs | 0 .../Collections/ItemsDictionary.cs | 0 .../Collections/ReadableStringCollection.cs | 0 .../Collections/RequestCookiesCollection.cs | 0 .../Collections/ResponseCookies.cs | 0 .../Collections/SessionCollection.cs | 0 .../DefaultHttpContext.cs | 0 .../DefaultHttpRequest.cs | 0 .../DefaultHttpResponse.cs | 0 .../FormFeature.cs | 0 .../FormFile.cs | 0 .../HttpRequestFeature.cs | 0 .../HttpResponseFeature.cs | 0 .../IFormFeature.cs | 0 .../IItemsFeature.cs | 0 .../IQueryFeature.cs | 0 .../IRequestCookiesFeature.cs | 0 .../IResponseCookiesFeature.cs | 0 .../IServiceProvidersFeature.cs | 0 .../Infrastructure/Constants.cs | 0 .../Infrastructure/FeatureReference.cs | 0 .../Infrastructure/ParsingHelpers.cs | 0 .../ItemsFeature.cs | 0 .../Microsoft.AspNet.Http.Core.kproj} | 0 .../NotNullAttribute.cs | 0 .../QueryFeature.cs | 0 .../ReferenceReadStream.cs | 0 .../RequestCookiesFeature.cs | 0 .../ResponseCookiesFeature.cs | 0 .../Security/AuthTypeContext.cs | 0 .../Security/AuthenticateContext.cs | 0 .../Security/ChallengeContext.cs | 0 .../Security/HttpAuthenticationFeature.cs | 0 .../Security/SignInContext.cs | 0 .../Security/SignOutContext.cs | 0 .../ServiceProvidersFeature.cs | 0 .../WebSocketAcceptContext.cs | 0 .../project.json | 0 src/Microsoft.AspNet.Owin/project.json | 2 +- .../ApplicationBuilderTests.cs | 0 .../DefaultHttpContextTests.cs | 0 .../DefaultHttpRequestTests.cs | 0 .../FormFeatureTests.cs | 0 .../HeaderDictionaryTests.cs | 0 .../Microsoft.AspNet.Http.Core.Tests.kproj} | 0 .../QueryFeatureTests.cs | 0 .../project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- 56 files changed, 9 insertions(+), 9 deletions(-) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/BufferingHelper.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/FormCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/FormFileCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/HeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/ItemsDictionary.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/ReadableStringCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/RequestCookiesCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/ResponseCookies.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/SessionCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/DefaultHttpContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/DefaultHttpRequest.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/DefaultHttpResponse.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/FormFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/FormFile.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/HttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/HttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IFormFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IItemsFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IQueryFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IRequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Infrastructure/Constants.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Infrastructure/FeatureReference.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Infrastructure/ParsingHelpers.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ItemsFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj => Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj} (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/NotNullAttribute.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/QueryFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ReferenceReadStream.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/RequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/AuthTypeContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/AuthenticateContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/ChallengeContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/HttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/SignInContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/SignOutContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/WebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/project.json (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/ApplicationBuilderTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/DefaultHttpContextTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/DefaultHttpRequestTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/FormFeatureTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/HeaderDictionaryTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj => Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj} (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/QueryFeatureTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/project.json (90%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 8ae65bd225..e4bd71292f 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,13 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22410.0 +VisualStudioVersion = 14.0.22513.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject @@ -15,7 +15,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeatur EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject diff --git a/src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs rename to src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs rename to src/Microsoft.AspNet.Http.Core/BufferingHelper.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs rename to src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs rename to src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs rename to src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs rename to src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs rename to src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs rename to src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.Http.Core/FormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/FormFeature.cs rename to src/Microsoft.AspNet.Http.Core/FormFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/FormFile.cs b/src/Microsoft.AspNet.Http.Core/FormFile.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/FormFile.cs rename to src/Microsoft.AspNet.Http.Core/FormFile.cs diff --git a/src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs rename to src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs rename to src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.Http.Core/IFormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IFormFeature.cs rename to src/Microsoft.AspNet.Http.Core/IFormFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs b/src/Microsoft.AspNet.Http.Core/IItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs rename to src/Microsoft.AspNet.Http.Core/IItemsFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.Http.Core/IQueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs rename to src/Microsoft.AspNet.Http.Core/IQueryFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs rename to src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs rename to src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs b/src/Microsoft.AspNet.Http.Core/ItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs rename to src/Microsoft.AspNet.Http.Core/ItemsFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj rename to src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj diff --git a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs rename to src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/QueryFeature.cs rename to src/Microsoft.AspNet.Http.Core/QueryFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs rename to src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.Http.Core/project.json similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/project.json rename to src/Microsoft.AspNet.Http.Core/project.json diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index d8dac9991b..ce8c5b3058 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" } }, "frameworks": { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj rename to test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json similarity index 90% rename from test/Microsoft.AspNet.PipelineCore.Tests/project.json rename to test/Microsoft.AspNet.Http.Core.Tests/project.json index fda938bb96..3d6bee5edb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -3,7 +3,7 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 85c20ce28b..55f53f5fe7 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -3,7 +3,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index ff303ab74d..134db2aeae 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 16f501140e..4725d69b82 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index a445ee721d..d449b763bd 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { From 26860ad7de3e74a7c72bb5900e3928b27456a7d3 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 15 Jan 2015 18:34:38 -0800 Subject: [PATCH 200/846] Code cleanup --- src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index a0c78ead9e..e97059c66b 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -12,7 +12,8 @@ namespace Microsoft.AspNet.Http /// public static class FormFileExtensions { - private static int DefaultBufferSize = 81920; + // Stream.CopyTo method uses 80KB as the default buffer size. + private static int DefaultBufferSize = 80 * 1024; /// /// Saves the contents of an uploaded file. From db484a7dcb32d4ff7e137c08480192126268ce88 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Fri, 16 Jan 2015 17:08:30 -0800 Subject: [PATCH 201/846] Rename Microsoft.AspNet.HttpFeature to Microsoft.AspNet.Http.Interfaces --- HttpAbstractions.sln | 2 +- .../Collections/SessionCollection.cs | 2 +- src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs | 4 ++-- src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs | 4 ++-- src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/QueryFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs | 2 +- .../Security/HttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/project.json | 2 +- .../AssemblyNeutralAttribute.cs | 0 .../IHttpApplicationFeature.cs | 2 +- .../IHttpBufferingFeature.cs | 2 +- .../IHttpClientCertificateFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- .../IHttpSendFileFeature.cs | 2 +- .../IHttpUpgradeFeature.cs | 2 +- .../IHttpWebSocketFeature.cs | 2 +- .../ISession.cs | 2 +- .../ISessionFactory.cs | 2 +- .../ISessionFeature.cs | 2 +- .../IWebSocketAcceptContext.cs | 2 +- .../Microsoft.AspNet.Http.Interfaces.kproj} | 0 .../Security/IAuthTypeContext.cs | 2 +- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IAuthenticationHandler.cs | 2 +- .../Security/IChallengeContext.cs | 2 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext .cs | 2 +- .../project.json | 0 src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 2 +- test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Http.Core.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- .../Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- 59 files changed, 60 insertions(+), 60 deletions(-) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/AssemblyNeutralAttribute.cs (100%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpApplicationFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpBufferingFeature.cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpClientCertificateFeature.cs (95%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpConnectionFeature.cs (92%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpRequestFeature.cs (94%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpRequestLifetimeFeature.cs (90%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpResponseFeature.cs (93%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpSendFileFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpUpgradeFeature.cs (90%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpWebSocketFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/ISession.cs (93%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/ISessionFactory.cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/ISessionFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IWebSocketAcceptContext.cs (88%) rename src/{Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj => Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj} (100%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IAuthTypeContext.cs (88%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IAuthenticateContext.cs (93%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IAuthenticationHandler.cs (92%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IChallengeContext.cs (90%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IHttpAuthenticationFeature.cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/ISignInContext.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/ISignOutContext .cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/project.json (100%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index e4bd71292f..7a857f0800 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -11,7 +11,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs index 8d2c3b7565..52ad9af615 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs @@ -5,7 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 09915207ee..2de1680de3 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -12,8 +12,8 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Security; diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 28e8f2807c..46fa1907b7 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 46358ad69f..7e44614704 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -12,8 +12,8 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Security; diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs index 751b366ebe..ae9fb236c9 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs index d4b5287885..4a5c6c7634 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index e1b05f6b84..d9bfb76406 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index e57ff741ce..ea0aa45cf7 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs index 801d6d4b05..d4bf2d180a 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs index d9e516e756..df792fc74f 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs index e04326b257..95dd14a8d2 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs @@ -8,7 +8,7 @@ using System.Security.Claims; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs index 5c8b8ef74b..aa9a424fc4 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs index 8e40287b22..f0989c420c 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs index 9856e7ee1a..0e9383e97c 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs index 4ebde735d2..c2ed25f04a 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs index 3c935b52f8..48e3cd7c71 100644 --- a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 8eaabc9a33..91374fa6c6 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -5,7 +5,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs similarity index 100% rename from src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs rename to src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs index 344f87352c..2a885ecbbb 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpApplicationFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs index 53b7fd9894..83a6be21d0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs @@ -3,7 +3,7 @@ using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpBufferingFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs index b70fa027cf..556265c165 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs @@ -6,7 +6,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpClientCertificateFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs similarity index 92% rename from src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs index 7598c9ce0b..51940f3709 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs @@ -4,7 +4,7 @@ using System.Net; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpConnectionFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs similarity index 94% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs index 66b5c5fa82..ca178a7dfa 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpRequestFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs similarity index 90% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs index b6bcee9c32..498463dbc3 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpRequestLifetimeFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs similarity index 93% rename from src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index aa7603be03..b28700df9c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpResponseFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs index be42442acc..dcb598e6ce 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs @@ -5,7 +5,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpSendFileFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs similarity index 90% rename from src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs index 3d3f924cae..98d4e60cba 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpUpgradeFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index 3d87e86bb4..d3aeaae642 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -5,7 +5,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpWebSocketFeature diff --git a/src/Microsoft.AspNet.HttpFeature/ISession.cs b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs similarity index 93% rename from src/Microsoft.AspNet.HttpFeature/ISession.cs rename to src/Microsoft.AspNet.Http.Interfaces/ISession.cs index 6a0fe4035a..d18fca3e99 100644 --- a/src/Microsoft.AspNet.HttpFeature/ISession.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface ISession diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs rename to src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs index 1187696726..e8917db76d 100644 --- a/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs @@ -4,7 +4,7 @@ using System; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface ISessionFactory diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs index 400f365b68..360e407c65 100644 --- a/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs @@ -3,7 +3,7 @@ using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { // TODO: Is there any reason not to flatten the Factory down into the Feature? [AssemblyNeutral] diff --git a/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs similarity index 88% rename from src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs index dbcc14c7ce..80becb585a 100644 --- a/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs @@ -3,7 +3,7 @@ using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IWebSocketAcceptContext diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj similarity index 100% rename from src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj rename to src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs similarity index 88% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs index bf3627a3d8..d3308720c9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IAuthTypeContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs similarity index 93% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 333c044f86..1e354a8149 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IAuthenticateContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs similarity index 92% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index f081744b22..ca68c40668 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IAuthenticationHandler diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs similarity index 90% rename from src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index 5f32f318df..94d64b6257 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IChallengeContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index 4ee676b095..74605995a9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -4,7 +4,7 @@ using System.Security.Claims; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IHttpAuthenticationFeature diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index 694ece38d2..eea09aa055 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface ISignInContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs index 232db13ad7..fd4fe89b11 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface ISignOutContext diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json similarity index 100% rename from src/Microsoft.AspNet.HttpFeature/project.json rename to src/Microsoft.AspNet.Http.Interfaces/project.json diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 9ff85950f2..4a97095eda 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,8 +14,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Security; namespace Microsoft.AspNet.Owin diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 3332221be8..469933cf64 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -15,8 +15,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 15ec0a01f8..20e73c2967 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 1e847e6264..063f43eead 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 9660a5d00e..1d43a8a85c 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index ce8c5b3058..ffa82b3a9e 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -5,7 +5,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" } + "Microsoft.AspNet.Http.Interfaces": { "version": "1.0.0-*", "type": "build" } }, "frameworks": { "aspnet50": { }, diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 867e8889e6..6dfc567e0b 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 2b04823c53..146967c135 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -9,7 +9,7 @@ using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs index e2518fd10b..7c5557bb2a 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs index f76fdb25fe..91846bc000 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index 3d6bee5edb..df6823dc6d 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 55f53f5fe7..ddf07a3826 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index e49637ed56..ae1a7c5985 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -4,7 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index b0ef791a3e..bc94b5717c 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 134db2aeae..f6549fc724 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 663972150f..93becf8a60 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 4725d69b82..f0caf021ab 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" From dceba03f4a3b9264df49643953d473b149d856b5 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 19 Jan 2015 01:43:09 -0800 Subject: [PATCH 202/846] Removed unused dependencies #173 --- src/Microsoft.AspNet.FeatureModel/project.json | 1 - src/Microsoft.AspNet.Owin/project.json | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 6845cd91a4..72c7319d68 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,6 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, "frameworks": { "aspnet50": {}, diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index ffa82b3a9e..19cc720380 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -4,8 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": { "version": "1.0.0-*", "type": "build" } + "Microsoft.AspNet.Http.Core": "1.0.0-*" }, "frameworks": { "aspnet50": { }, From 236801ee6ec0c6d95822a93c8ab8f4feb367fca3 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 20 Jan 2015 01:31:48 -0800 Subject: [PATCH 203/846] Updating build.cmd and build.sh to use dotnetsdk --- build.cmd | 6 +++--- build.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 86ca5bbbf1..c8041fdd9d 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_KRE_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dotnetsdk use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index c7873ef58e..3f3c731c04 100755 --- a/build.sh +++ b/build.sh @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/kvm.sh + source setup/dotnetsdk.sh fi if ! type k > /dev/null 2>&1; then - kvm upgrade + dotnetsdk upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From 382c3af065fd06c71686d1102723ac60fc003e7b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 20 Jan 2015 01:36:08 -0800 Subject: [PATCH 204/846] Updating build.cmd and build.sh to use dotnetsdk --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 3f3c731c04..350d7e389a 100755 --- a/build.sh +++ b/build.sh @@ -28,7 +28,7 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source setup/dotnetsdk.sh + source packages/KoreBuild/build/dotnetsdk.sh fi if ! type k > /dev/null 2>&1; then From 118fc73707be5b49a6602e733ff4cab8d1876bc7 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Tue, 20 Jan 2015 17:22:50 -0800 Subject: [PATCH 205/846] Updating NuGet.config --- NuGet.Config | 1 - 1 file changed, 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 2d3b0cb857..53454b2000 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,6 @@  - From 93c5b0f2c8fe7f5a14eab7475b916813271f453f Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 20 Jan 2015 18:19:02 -0800 Subject: [PATCH 206/846] Rename SKIP_KRE_INSTALL to SKIP_DOTNET_INSTALL --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index c8041fdd9d..220a1ff561 100644 --- a/build.cmd +++ b/build.cmd @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_KRE_INSTALL%"=="1" goto run +IF "%SKIP_DOTNET_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 From 97c9f8f479dc8071b7a3b402258ee50af38d51d8 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Wed, 21 Jan 2015 15:49:10 -0800 Subject: [PATCH 207/846] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 15a51e423f52457159064333f238cf425a6340d2 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 22 Jan 2015 09:41:29 -0800 Subject: [PATCH 208/846] #175 - Decode multipart headers as UTF-8. --- .../BufferedReadStream.cs | 41 ++++--- .../MultipartReaderTests.cs | 111 ++++++++++++++++++ 2 files changed, 131 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 944f126b93..847873e2d1 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -11,8 +11,8 @@ namespace Microsoft.AspNet.WebUtilities { internal class BufferedReadStream : Stream { - private const char CR = '\r'; - private const char LF = '\n'; + private const byte CR = (byte)'\r'; + private const byte LF = (byte)'\n'; private readonly Stream _inner; private readonly byte[] _buffer; @@ -310,8 +310,9 @@ namespace Microsoft.AspNet.WebUtilities public string ReadLine(int lengthLimit) { CheckDisposed(); - StringBuilder builder = new StringBuilder(); + var builder = new MemoryStream(200); bool foundCR = false, foundCRLF = false; + while (!foundCRLF && EnsureBuffered()) { if (builder.Length > lengthLimit) @@ -321,19 +322,15 @@ namespace Microsoft.AspNet.WebUtilities ProcessLineChar(builder, ref foundCR, ref foundCRLF); } - if (foundCRLF) - { - return builder.ToString(0, builder.Length - 2); // Drop the CRLF - } - // Stream ended with no CRLF. - return builder.ToString(); + return DecodeLine(builder, foundCRLF); } public async Task ReadLineAsync(int lengthLimit, CancellationToken cancellationToken) { CheckDisposed(); - StringBuilder builder = new StringBuilder(); + var builder = new MemoryStream(200); bool foundCR = false, foundCRLF = false; + while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) { if (builder.Length > lengthLimit) @@ -344,25 +341,20 @@ namespace Microsoft.AspNet.WebUtilities ProcessLineChar(builder, ref foundCR, ref foundCRLF); } - if (foundCRLF) - { - return builder.ToString(0, builder.Length - 2); // Drop the CRLF - } - // Stream ended with no CRLF. - return builder.ToString(); + return DecodeLine(builder, foundCRLF); } - private void ProcessLineChar(StringBuilder builder, ref bool foundCR, ref bool foundCRLF) + private void ProcessLineChar(MemoryStream builder, ref bool foundCR, ref bool foundCRLF) { - char ch = (char)_buffer[_bufferOffset]; // TODO: Encoding enforcement - builder.Append(ch); + var b = _buffer[_bufferOffset]; + builder.WriteByte(b); _bufferOffset++; _bufferCount--; - if (ch == CR) + if (b == CR) { foundCR = true; } - else if (ch == LF) + else if (b == LF) { if (foundCR) { @@ -375,6 +367,13 @@ namespace Microsoft.AspNet.WebUtilities } } + private string DecodeLine(MemoryStream builder, bool foundCRLF) + { + // Drop the final CRLF, if any + var length = foundCRLF ? builder.Length - 2 : builder.Length; + return Encoding.UTF8.GetString(builder.ToArray(), 0, (int)length); + } + private void CheckDisposed() { if (_disposed) diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs index a642511a86..49a5abedd0 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -43,6 +43,19 @@ Content-Type: text/plain Content of a.txt. +--9051914041544843365972754266-- +"; + private const string TwoPartBodyWithUnicodeFileName = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file1""; filename=""a色.txt"" +Content-Type: text/plain + +Content of a.txt. + --9051914041544843365972754266-- "; private const string ThreePartBody = @@ -147,6 +160,32 @@ Content-Type: text/html Assert.Null(await reader.ReadNextSectionAsync()); } + [Fact] + public async Task MutipartReader_ReadTwoPartBodyWithUnicodeFileName_Success() + { + var stream = MakeStream(TwoPartBodyWithUnicodeFileName); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file1\"; filename=\"a色.txt\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/plain", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.txt.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + [Fact] public async Task MutipartReader_ThreePartBody_Success() { @@ -181,5 +220,77 @@ Content-Type: text/html Assert.Null(await reader.ReadNextSectionAsync()); } + + [Fact] + public async Task MutipartReader_ReadInvalidUtf8Header_ReplacementCharacters() + { + var body1 = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" filename=""a"; + + var body2 = +@".txt"" + +text default +--9051914041544843365972754266-- +"; + var stream = new MemoryStream(); + var bytes = Encoding.UTF8.GetBytes(body1); + stream.Write(bytes, 0, bytes.Length); + + // Write an invalid utf-8 segment in the middle + stream.Write(new byte[] { 0xC1, 0x21 }, 0, 2); + + bytes = Encoding.UTF8.GetBytes(body2); + stream.Write(bytes, 0, bytes.Length); + stream.Seek(0, SeekOrigin.Begin); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\" filename=\"a\uFFFD!.txt\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadInvalidUtf8SurrogateHeader_ReplacementCharacters() + { + var body1 = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" filename=""a"; + + var body2 = +@".txt"" + +text default +--9051914041544843365972754266-- +"; + var stream = new MemoryStream(); + var bytes = Encoding.UTF8.GetBytes(body1); + stream.Write(bytes, 0, bytes.Length); + + // Write an invalid utf-8 segment in the middle + stream.Write(new byte[] { 0xED, 0xA0, 85 }, 0, 3); + + bytes = Encoding.UTF8.GetBytes(body2); + stream.Write(bytes, 0, bytes.Length); + stream.Seek(0, SeekOrigin.Begin); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\" filename=\"a\uFFFDU.txt\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } } } \ No newline at end of file From 096a0bf2989a20b6f8f8a9b13541764cd57f2444 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 27 Jan 2015 12:18:34 -0800 Subject: [PATCH 209/846] #174 - Constants for status codes, lookup for reason phrases. --- .../ReasonPhrases.cs | 65 +++++++++++++++++++ .../StatusCodes.cs | 54 +++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/StatusCodes.cs diff --git a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs new file mode 100644 index 0000000000..487437d6a3 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class ReasonPhrases + { + private static IDictionary Phrases = new Dictionary() + { + { 200, "OK" }, + { 201, "Created" }, + { 202, "Accepted" }, + { 203, "Non-Authoritative Information" }, + { 204, "No Content" }, + { 205, "Reset Content" }, + { 206, "Partial Content" }, + + { 300, "Multiple Choices" }, + { 301, "Moved Permanently" }, + { 302, "Found" }, + { 303, "See Other" }, + { 304, "Not Modified" }, + { 305, "Use Proxy" }, + { 306, "Switch Proxy" }, + { 307, "Temporary Redirect" }, + + { 400, "Bad Request" }, + { 401, "Unauthorized" }, + { 402, "Payment Required" }, + { 403, "Forbidden" }, + { 404, "Not Found" }, + { 405, "Method Not Allowed" }, + { 406, "Not Acceptable" }, + { 407, "Proxy Authentication Required" }, + { 408, "Request Timeout" }, + { 409, "Conflict" }, + { 410, "Gone" }, + { 411, "Length Required" }, + { 412, "Precondition Failed" }, + { 413, "Request Entity Too Large" }, + { 414, "Request-URI Too Long" }, + { 415, "Unsupported Media Type" }, + { 416, "Requested Range Not Satisfiable" }, + { 417, "Expectation Failed" }, + { 418, "I'm a teapot" }, + { 419, "Authentication Timeout" }, + + { 500, "Internal Server Error" }, + { 501, "Not Implemented" }, + { 502, "Bad Gateway" }, + { 503, "Service Unavailable" }, + { 504, "Gateway Timeout" }, + { 505, "HTTP Version Not Supported" }, + { 506, "Variant Also Negotiates" }, + }; + + public static string GetReasonPhrase(int statusCode) + { + string phrase; + return Phrases.TryGetValue(statusCode, out phrase) ? phrase : string.Empty; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs new file mode 100644 index 0000000000..959d9593d9 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.WebUtilities +{ + public static class StatusCodes + { + public const int Status200OK = 200; + public const int Status201Created = 201; + public const int Status202Accepted = 202; + public const int Status203NonAuthoritative = 203; + public const int Status204NoContent = 204; + public const int Status205ResetContent = 205; + public const int Status206PartialContent = 206; + + public const int Status300MultipleChoices = 300; + public const int Status301MovedPermanently = 301; + public const int Status302Found = 302; + public const int Status303SeeOther = 303; + public const int Status304NotModified = 304; + public const int Status305UseProxy = 305; + public const int Status306SwitchProxy = 306; + public const int Status307TemporaryRedirect = 307; + + public const int Status400BadRequest = 400; + public const int Status401Unauthorized = 401; + public const int Status402PaymentRequired = 402; + public const int Status403Forbidden = 403; + public const int Status404NotFound = 404; + public const int Status405MethodNotAllowed = 405; + public const int Status406NotAcceptable = 406; + public const int Status407ProxyAuthenticationRequired = 407; + public const int Status408RequestTimeout = 408; + public const int Status409Conflict = 409; + public const int Status410Gone = 410; + public const int Status411LengthRequired = 411; + public const int Status412PreconditionFailed = 412; + public const int Status413RequestEntityTooLarge = 413; + public const int Status414RequestUriTooLong = 414; + public const int Status415UnsupportedMediaType = 415; + public const int Status416RequestedRangeNotSatisfiable = 416; + public const int Status417ExpectationFailed = 417; + public const int Status418ImATeapot = 418; + public const int Status419AuthenticationTimeout = 419; + + public const int Status500InternalServerError = 500; + public const int Status501NotImplemented = 501; + public const int Status502BadGateway = 502; + public const int Status503ServiceUnavailable = 503; + public const int Status504GatewayTimeout = 504; + public const int Status505HttpVersionNotsupported = 505; + public const int Status506VariantAlsoNegotiates = 506; + } +} \ No newline at end of file From c90a4918210b8c50636e9bb372c38e0c846b35ae Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 28 Jan 2015 18:11:41 -0800 Subject: [PATCH 210/846] Update build.cmd and build.sh to use kvm --- build.cmd | 6 +++--- build.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 220a1ff561..5885abe388 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DOTNET_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\dotnetsdk use default -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index 350d7e389a..c7873ef58e 100755 --- a/build.sh +++ b/build.sh @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/dotnetsdk.sh + source packages/KoreBuild/build/kvm.sh fi if ! type k > /dev/null 2>&1; then - dotnetsdk upgrade + kvm upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From ae56486c6ac7de859063673af74f2092eac692e9 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 28 Jan 2015 18:12:37 -0800 Subject: [PATCH 211/846] Change SKIP_DOTNET_INSTALL to SKIP_KRE_INSTALL --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 5885abe388..86ca5bbbf1 100644 --- a/build.cmd +++ b/build.cmd @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_DOTNET_INSTALL%"=="1" goto run +IF "%SKIP_KRE_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 From 3416bfcc80cb2d8e0b464e0a6b4d7cc372c7b8de Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 28 Jan 2015 23:24:31 -0800 Subject: [PATCH 212/846] Fixing NuGet.config --- NuGet.Config | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGet.Config b/NuGet.Config index 53454b2000..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,6 +1,7 @@  + From 62242689531830b7e5ac3fc171bf91742fa1f5b2 Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 4 Feb 2015 14:20:22 -0800 Subject: [PATCH 213/846] Updating .kproj files --- .../Microsoft.AspNet.FeatureModel.kproj | 7 +------ .../Microsoft.AspNet.Http.Core.kproj | 7 +------ .../Microsoft.AspNet.Http.Extensions.kproj | 7 +------ .../Microsoft.AspNet.Http.Interfaces.kproj | 7 +------ src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 7 +------ src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 7 +------ .../Microsoft.AspNet.WebUtilities.kproj | 7 +------ .../Microsoft.Net.Http.Headers.kproj | 8 +------- .../Microsoft.AspNet.Http.Extensions.Tests.kproj | 7 +------ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 7 +------ .../Microsoft.Net.Http.Headers.Tests.kproj | 8 +------- 11 files changed, 11 insertions(+), 68 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 5484c20589..f75392129d 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj index 96b305e9b6..b50c4e7764 100644 --- a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj +++ b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index b431b00760..64be73c1ea 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj index 90f93a0f7b..bd80d293f8 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj +++ b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 3a68cce3bc..aead60bd2e 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 4c7801eada..e668c3289a 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index efc8a50504..77c0886660 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj index f6e3ec7676..8750df3e9b 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj @@ -7,7 +7,6 @@ 60aa2fdb-8121-4826-8d00-9a143fefaf66 - Microsoft.Net.Http.Headers ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ @@ -15,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index b3dbf90a69..3fa25da029 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index 098750fe14..2592290c21 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj index cbf789a8a0..dfb42bfc9a 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj @@ -7,7 +7,6 @@ e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 - Microsoft.Net.Http.Headers.Tests ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ @@ -15,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + From 9e7fbde9f1a221b4764a4ac2155cd64e48d08381 Mon Sep 17 00:00:00 2001 From: David Haney Date: Tue, 10 Feb 2015 17:41:06 -0500 Subject: [PATCH 214/846] Logical AND would never be true; broke into OR statement --- src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs index 7c5be8753c..3c2e9635f3 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -91,7 +91,7 @@ namespace Microsoft.Net.Http.Headers if (skipEmptyValues) { - while ((current < input.Length) && (input[current] == ',') && (input[current] == ';')) + while ((current < input.Length) && ((input[current] == ',') || (input[current] == ';'))) { current++; // skip delimiter. current = current + HttpRuleParser.GetWhitespaceLength(input, current); From 1008e1725954dd59a157722434c9f823f6160272 Mon Sep 17 00:00:00 2001 From: Levi B Date: Sat, 7 Feb 2015 16:03:40 -0800 Subject: [PATCH 215/846] Add HtmlEncoder, UrlEncoder, and JavaScriptStringEncoder Also add interfaces for abstracting each of these Unit tests are not in yet but are coming soon --- .../Encoders/CodePointFilters.cs | 2585 +++++++++++++++++ .../Encoders/EncoderCommon.cs | 37 + .../Encoders/HexUtil.cs | 48 + .../Encoders/HtmlEncoder.cs | 229 ++ .../Encoders/ICodePointFilter.cs | 19 + .../Encoders/IHtmlEncoder.cs | 25 + .../Encoders/IJavaScriptStringEncoder.cs | 21 + .../Encoders/IUrlEncoder.cs | 25 + .../Encoders/JavaScriptStringEncoder.cs | 163 ++ .../Encoders/UnicodeEncoderBase.cs | 171 ++ .../Encoders/UnicodeHelpers.cs | 228 ++ .../Encoders/UrlEncoder.cs | 161 + .../unicode-7.0.0-defined-characters.bin | Bin 0 -> 8192 bytes .../project.json | 8 +- 14 files changed, 3719 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs new file mode 100644 index 0000000000..9268062fd5 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs @@ -0,0 +1,2585 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains predefined Unicode code point filters. + /// + public static class CodePointFilters + { + /// + /// A filter which allows no characters. + /// + public static ICodePointFilter None + { + get + { + return LazyInitializer.EnsureInitialized(ref _none); + } + } + private static EmptyCodePointFilter _none; + + /// + /// A filter which allows all Unicode Basic Multilingual Plane characters. + /// + /// + /// This range spans the code points U+0000 .. U+FFFF. + /// + public static ICodePointFilter All + { + get + { + return GetFilter(ref _all, first: '\u0000', last: '\uFFFF'); + } + } + private static DefinedCharacterCodePointFilter _all; + + /// + /// A filter which allows characters in the 'Basic Latin' Unicode range. + /// + /// + /// This range spans the code points U+0000 .. U+007F. + /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BasicLatin + { + get + { + return GetFilter(ref _basicLatin, first: '\u0000', last: '\u007F'); + } + } + private static DefinedCharacterCodePointFilter _basicLatin; + + /// + /// A filter which allows characters in the 'Latin-1 Supplement' Unicode range. + /// + /// + /// This range spans the code points U+0080 .. U+00FF. + /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Latin1Supplement + { + get + { + return GetFilter(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); + } + } + private static DefinedCharacterCodePointFilter _latin1Supplement; + + /// + /// A filter which allows characters in the 'Latin Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+0100 .. U+017F. + /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedA + { + get + { + return GetFilter(ref _latinExtendedA, first: '\u0100', last: '\u017F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedA; + + /// + /// A filter which allows characters in the 'Latin Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+0180 .. U+024F. + /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedB + { + get + { + return GetFilter(ref _latinExtendedB, first: '\u0180', last: '\u024F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedB; + + /// + /// A filter which allows characters in the 'IPA Extensions' Unicode range. + /// + /// + /// This range spans the code points U+0250 .. U+02AF. + /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this range. + /// + public static ICodePointFilter IPAExtensions + { + get + { + return GetFilter(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); + } + } + private static DefinedCharacterCodePointFilter _ipaExtensions; + + /// + /// A filter which allows characters in the 'Spacing Modifier Letters' Unicode range. + /// + /// + /// This range spans the code points U+02B0 .. U+02FF. + /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SpacingModifierLetters + { + get + { + return GetFilter(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); + } + } + private static DefinedCharacterCodePointFilter _spacingModifierLetters; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks' Unicode range. + /// + /// + /// This range spans the code points U+0300 .. U+036F. + /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarks + { + get + { + return GetFilter(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarks; + + /// + /// A filter which allows characters in the 'Greek and Coptic' Unicode range. + /// + /// + /// This range spans the code points U+0370 .. U+03FF. + /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GreekandCoptic + { + get + { + return GetFilter(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); + } + } + private static DefinedCharacterCodePointFilter _greekandCoptic; + + /// + /// A filter which allows characters in the 'Cyrillic' Unicode range. + /// + /// + /// This range spans the code points U+0400 .. U+04FF. + /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Cyrillic + { + get + { + return GetFilter(ref _cyrillic, first: '\u0400', last: '\u04FF'); + } + } + private static DefinedCharacterCodePointFilter _cyrillic; + + /// + /// A filter which allows characters in the 'Cyrillic Supplement' Unicode range. + /// + /// + /// This range spans the code points U+0500 .. U+052F. + /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CyrillicSupplement + { + get + { + return GetFilter(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); + } + } + private static DefinedCharacterCodePointFilter _cyrillicSupplement; + + /// + /// A filter which allows characters in the 'Armenian' Unicode range. + /// + /// + /// This range spans the code points U+0530 .. U+058F. + /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Armenian + { + get + { + return GetFilter(ref _armenian, first: '\u0530', last: '\u058F'); + } + } + private static DefinedCharacterCodePointFilter _armenian; + + /// + /// A filter which allows characters in the 'Hebrew' Unicode range. + /// + /// + /// This range spans the code points U+0590 .. U+05FF. + /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Hebrew + { + get + { + return GetFilter(ref _hebrew, first: '\u0590', last: '\u05FF'); + } + } + private static DefinedCharacterCodePointFilter _hebrew; + + /// + /// A filter which allows characters in the 'Arabic' Unicode range. + /// + /// + /// This range spans the code points U+0600 .. U+06FF. + /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Arabic + { + get + { + return GetFilter(ref _arabic, first: '\u0600', last: '\u06FF'); + } + } + private static DefinedCharacterCodePointFilter _arabic; + + /// + /// A filter which allows characters in the 'Syriac' Unicode range. + /// + /// + /// This range spans the code points U+0700 .. U+074F. + /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Syriac + { + get + { + return GetFilter(ref _syriac, first: '\u0700', last: '\u074F'); + } + } + private static DefinedCharacterCodePointFilter _syriac; + + /// + /// A filter which allows characters in the 'Arabic Supplement' Unicode range. + /// + /// + /// This range spans the code points U+0750 .. U+077F. + /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicSupplement + { + get + { + return GetFilter(ref _arabicSupplement, first: '\u0750', last: '\u077F'); + } + } + private static DefinedCharacterCodePointFilter _arabicSupplement; + + /// + /// A filter which allows characters in the 'Thaana' Unicode range. + /// + /// + /// This range spans the code points U+0780 .. U+07BF. + /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Thaana + { + get + { + return GetFilter(ref _thaana, first: '\u0780', last: '\u07BF'); + } + } + private static DefinedCharacterCodePointFilter _thaana; + + /// + /// A filter which allows characters in the 'NKo' Unicode range. + /// + /// + /// This range spans the code points U+07C0 .. U+07FF. + /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter NKo + { + get + { + return GetFilter(ref _nKo, first: '\u07C0', last: '\u07FF'); + } + } + private static DefinedCharacterCodePointFilter _nKo; + + /// + /// A filter which allows characters in the 'Samaritan' Unicode range. + /// + /// + /// This range spans the code points U+0800 .. U+083F. + /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Samaritan + { + get + { + return GetFilter(ref _samaritan, first: '\u0800', last: '\u083F'); + } + } + private static DefinedCharacterCodePointFilter _samaritan; + + /// + /// A filter which allows characters in the 'Mandaic' Unicode range. + /// + /// + /// This range spans the code points U+0840 .. U+085F. + /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Mandaic + { + get + { + return GetFilter(ref _mandaic, first: '\u0840', last: '\u085F'); + } + } + private static DefinedCharacterCodePointFilter _mandaic; + + /// + /// A filter which allows characters in the 'Arabic Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+08A0 .. U+08FF. + /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicExtendedA + { + get + { + return GetFilter(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); + } + } + private static DefinedCharacterCodePointFilter _arabicExtendedA; + + /// + /// A filter which allows characters in the 'Devanagari' Unicode range. + /// + /// + /// This range spans the code points U+0900 .. U+097F. + /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Devanagari + { + get + { + return GetFilter(ref _devanagari, first: '\u0900', last: '\u097F'); + } + } + private static DefinedCharacterCodePointFilter _devanagari; + + /// + /// A filter which allows characters in the 'Bengali' Unicode range. + /// + /// + /// This range spans the code points U+0980 .. U+09FF. + /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Bengali + { + get + { + return GetFilter(ref _bengali, first: '\u0980', last: '\u09FF'); + } + } + private static DefinedCharacterCodePointFilter _bengali; + + /// + /// A filter which allows characters in the 'Gurmukhi' Unicode range. + /// + /// + /// This range spans the code points U+0A00 .. U+0A7F. + /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Gurmukhi + { + get + { + return GetFilter(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); + } + } + private static DefinedCharacterCodePointFilter _gurmukhi; + + /// + /// A filter which allows characters in the 'Gujarati' Unicode range. + /// + /// + /// This range spans the code points U+0A80 .. U+0AFF. + /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Gujarati + { + get + { + return GetFilter(ref _gujarati, first: '\u0A80', last: '\u0AFF'); + } + } + private static DefinedCharacterCodePointFilter _gujarati; + + /// + /// A filter which allows characters in the 'Oriya' Unicode range. + /// + /// + /// This range spans the code points U+0B00 .. U+0B7F. + /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Oriya + { + get + { + return GetFilter(ref _oriya, first: '\u0B00', last: '\u0B7F'); + } + } + private static DefinedCharacterCodePointFilter _oriya; + + /// + /// A filter which allows characters in the 'Tamil' Unicode range. + /// + /// + /// This range spans the code points U+0B80 .. U+0BFF. + /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tamil + { + get + { + return GetFilter(ref _tamil, first: '\u0B80', last: '\u0BFF'); + } + } + private static DefinedCharacterCodePointFilter _tamil; + + /// + /// A filter which allows characters in the 'Telugu' Unicode range. + /// + /// + /// This range spans the code points U+0C00 .. U+0C7F. + /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Telugu + { + get + { + return GetFilter(ref _telugu, first: '\u0C00', last: '\u0C7F'); + } + } + private static DefinedCharacterCodePointFilter _telugu; + + /// + /// A filter which allows characters in the 'Kannada' Unicode range. + /// + /// + /// This range spans the code points U+0C80 .. U+0CFF. + /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Kannada + { + get + { + return GetFilter(ref _kannada, first: '\u0C80', last: '\u0CFF'); + } + } + private static DefinedCharacterCodePointFilter _kannada; + + /// + /// A filter which allows characters in the 'Malayalam' Unicode range. + /// + /// + /// This range spans the code points U+0D00 .. U+0D7F. + /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Malayalam + { + get + { + return GetFilter(ref _malayalam, first: '\u0D00', last: '\u0D7F'); + } + } + private static DefinedCharacterCodePointFilter _malayalam; + + /// + /// A filter which allows characters in the 'Sinhala' Unicode range. + /// + /// + /// This range spans the code points U+0D80 .. U+0DFF. + /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Sinhala + { + get + { + return GetFilter(ref _sinhala, first: '\u0D80', last: '\u0DFF'); + } + } + private static DefinedCharacterCodePointFilter _sinhala; + + /// + /// A filter which allows characters in the 'Thai' Unicode range. + /// + /// + /// This range spans the code points U+0E00 .. U+0E7F. + /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Thai + { + get + { + return GetFilter(ref _thai, first: '\u0E00', last: '\u0E7F'); + } + } + private static DefinedCharacterCodePointFilter _thai; + + /// + /// A filter which allows characters in the 'Lao' Unicode range. + /// + /// + /// This range spans the code points U+0E80 .. U+0EFF. + /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Lao + { + get + { + return GetFilter(ref _lao, first: '\u0E80', last: '\u0EFF'); + } + } + private static DefinedCharacterCodePointFilter _lao; + + /// + /// A filter which allows characters in the 'Tibetan' Unicode range. + /// + /// + /// This range spans the code points U+0F00 .. U+0FFF. + /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tibetan + { + get + { + return GetFilter(ref _tibetan, first: '\u0F00', last: '\u0FFF'); + } + } + private static DefinedCharacterCodePointFilter _tibetan; + + /// + /// A filter which allows characters in the 'Myanmar' Unicode range. + /// + /// + /// This range spans the code points U+1000 .. U+109F. + /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Myanmar + { + get + { + return GetFilter(ref _myanmar, first: '\u1000', last: '\u109F'); + } + } + private static DefinedCharacterCodePointFilter _myanmar; + + /// + /// A filter which allows characters in the 'Georgian' Unicode range. + /// + /// + /// This range spans the code points U+10A0 .. U+10FF. + /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Georgian + { + get + { + return GetFilter(ref _georgian, first: '\u10A0', last: '\u10FF'); + } + } + private static DefinedCharacterCodePointFilter _georgian; + + /// + /// A filter which allows characters in the 'Hangul Jamo' Unicode range. + /// + /// + /// This range spans the code points U+1100 .. U+11FF. + /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulJamo + { + get + { + return GetFilter(ref _hangulJamo, first: '\u1100', last: '\u11FF'); + } + } + private static DefinedCharacterCodePointFilter _hangulJamo; + + /// + /// A filter which allows characters in the 'Ethiopic' Unicode range. + /// + /// + /// This range spans the code points U+1200 .. U+137F. + /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Ethiopic + { + get + { + return GetFilter(ref _ethiopic, first: '\u1200', last: '\u137F'); + } + } + private static DefinedCharacterCodePointFilter _ethiopic; + + /// + /// A filter which allows characters in the 'Ethiopic Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1380 .. U+139F. + /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EthiopicSupplement + { + get + { + return GetFilter(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); + } + } + private static DefinedCharacterCodePointFilter _ethiopicSupplement; + + /// + /// A filter which allows characters in the 'Cherokee' Unicode range. + /// + /// + /// This range spans the code points U+13A0 .. U+13FF. + /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Cherokee + { + get + { + return GetFilter(ref _cherokee, first: '\u13A0', last: '\u13FF'); + } + } + private static DefinedCharacterCodePointFilter _cherokee; + + /// + /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics' Unicode range. + /// + /// + /// This range spans the code points U+1400 .. U+167F. + /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter UnifiedCanadianAboriginalSyllabics + { + get + { + return GetFilter(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); + } + } + private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabics; + + /// + /// A filter which allows characters in the 'Ogham' Unicode range. + /// + /// + /// This range spans the code points U+1680 .. U+169F. + /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Ogham + { + get + { + return GetFilter(ref _ogham, first: '\u1680', last: '\u169F'); + } + } + private static DefinedCharacterCodePointFilter _ogham; + + /// + /// A filter which allows characters in the 'Runic' Unicode range. + /// + /// + /// This range spans the code points U+16A0 .. U+16FF. + /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Runic + { + get + { + return GetFilter(ref _runic, first: '\u16A0', last: '\u16FF'); + } + } + private static DefinedCharacterCodePointFilter _runic; + + /// + /// A filter which allows characters in the 'Tagalog' Unicode range. + /// + /// + /// This range spans the code points U+1700 .. U+171F. + /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tagalog + { + get + { + return GetFilter(ref _tagalog, first: '\u1700', last: '\u171F'); + } + } + private static DefinedCharacterCodePointFilter _tagalog; + + /// + /// A filter which allows characters in the 'Hanunoo' Unicode range. + /// + /// + /// This range spans the code points U+1720 .. U+173F. + /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Hanunoo + { + get + { + return GetFilter(ref _hanunoo, first: '\u1720', last: '\u173F'); + } + } + private static DefinedCharacterCodePointFilter _hanunoo; + + /// + /// A filter which allows characters in the 'Buhid' Unicode range. + /// + /// + /// This range spans the code points U+1740 .. U+175F. + /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Buhid + { + get + { + return GetFilter(ref _buhid, first: '\u1740', last: '\u175F'); + } + } + private static DefinedCharacterCodePointFilter _buhid; + + /// + /// A filter which allows characters in the 'Tagbanwa' Unicode range. + /// + /// + /// This range spans the code points U+1760 .. U+177F. + /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tagbanwa + { + get + { + return GetFilter(ref _tagbanwa, first: '\u1760', last: '\u177F'); + } + } + private static DefinedCharacterCodePointFilter _tagbanwa; + + /// + /// A filter which allows characters in the 'Khmer' Unicode range. + /// + /// + /// This range spans the code points U+1780 .. U+17FF. + /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Khmer + { + get + { + return GetFilter(ref _khmer, first: '\u1780', last: '\u17FF'); + } + } + private static DefinedCharacterCodePointFilter _khmer; + + /// + /// A filter which allows characters in the 'Mongolian' Unicode range. + /// + /// + /// This range spans the code points U+1800 .. U+18AF. + /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Mongolian + { + get + { + return GetFilter(ref _mongolian, first: '\u1800', last: '\u18AF'); + } + } + private static DefinedCharacterCodePointFilter _mongolian; + + /// + /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics Extended' Unicode range. + /// + /// + /// This range spans the code points U+18B0 .. U+18FF. + /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter UnifiedCanadianAboriginalSyllabicsExtended + { + get + { + return GetFilter(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); + } + } + private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabicsExtended; + + /// + /// A filter which allows characters in the 'Limbu' Unicode range. + /// + /// + /// This range spans the code points U+1900 .. U+194F. + /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Limbu + { + get + { + return GetFilter(ref _limbu, first: '\u1900', last: '\u194F'); + } + } + private static DefinedCharacterCodePointFilter _limbu; + + /// + /// A filter which allows characters in the 'Tai Le' Unicode range. + /// + /// + /// This range spans the code points U+1950 .. U+197F. + /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this range. + /// + public static ICodePointFilter TaiLe + { + get + { + return GetFilter(ref _taiLe, first: '\u1950', last: '\u197F'); + } + } + private static DefinedCharacterCodePointFilter _taiLe; + + /// + /// A filter which allows characters in the 'New Tai Lue' Unicode range. + /// + /// + /// This range spans the code points U+1980 .. U+19DF. + /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter NewTaiLue + { + get + { + return GetFilter(ref _newTaiLue, first: '\u1980', last: '\u19DF'); + } + } + private static DefinedCharacterCodePointFilter _newTaiLue; + + /// + /// A filter which allows characters in the 'Khmer Symbols' Unicode range. + /// + /// + /// This range spans the code points U+19E0 .. U+19FF. + /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KhmerSymbols + { + get + { + return GetFilter(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); + } + } + private static DefinedCharacterCodePointFilter _khmerSymbols; + + /// + /// A filter which allows characters in the 'Buginese' Unicode range. + /// + /// + /// This range spans the code points U+1A00 .. U+1A1F. + /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Buginese + { + get + { + return GetFilter(ref _buginese, first: '\u1A00', last: '\u1A1F'); + } + } + private static DefinedCharacterCodePointFilter _buginese; + + /// + /// A filter which allows characters in the 'Tai Tham' Unicode range. + /// + /// + /// This range spans the code points U+1A20 .. U+1AAF. + /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this range. + /// + public static ICodePointFilter TaiTham + { + get + { + return GetFilter(ref _taiTham, first: '\u1A20', last: '\u1AAF'); + } + } + private static DefinedCharacterCodePointFilter _taiTham; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks Extended' Unicode range. + /// + /// + /// This range spans the code points U+1AB0 .. U+1AFF. + /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarksExtended + { + get + { + return GetFilter(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksExtended; + + /// + /// A filter which allows characters in the 'Balinese' Unicode range. + /// + /// + /// This range spans the code points U+1B00 .. U+1B7F. + /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Balinese + { + get + { + return GetFilter(ref _balinese, first: '\u1B00', last: '\u1B7F'); + } + } + private static DefinedCharacterCodePointFilter _balinese; + + /// + /// A filter which allows characters in the 'Sundanese' Unicode range. + /// + /// + /// This range spans the code points U+1B80 .. U+1BBF. + /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Sundanese + { + get + { + return GetFilter(ref _sundanese, first: '\u1B80', last: '\u1BBF'); + } + } + private static DefinedCharacterCodePointFilter _sundanese; + + /// + /// A filter which allows characters in the 'Batak' Unicode range. + /// + /// + /// This range spans the code points U+1BC0 .. U+1BFF. + /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Batak + { + get + { + return GetFilter(ref _batak, first: '\u1BC0', last: '\u1BFF'); + } + } + private static DefinedCharacterCodePointFilter _batak; + + /// + /// A filter which allows characters in the 'Lepcha' Unicode range. + /// + /// + /// This range spans the code points U+1C00 .. U+1C4F. + /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Lepcha + { + get + { + return GetFilter(ref _lepcha, first: '\u1C00', last: '\u1C4F'); + } + } + private static DefinedCharacterCodePointFilter _lepcha; + + /// + /// A filter which allows characters in the 'Ol Chiki' Unicode range. + /// + /// + /// This range spans the code points U+1C50 .. U+1C7F. + /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this range. + /// + public static ICodePointFilter OlChiki + { + get + { + return GetFilter(ref _olChiki, first: '\u1C50', last: '\u1C7F'); + } + } + private static DefinedCharacterCodePointFilter _olChiki; + + /// + /// A filter which allows characters in the 'Sundanese Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1CC0 .. U+1CCF. + /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SundaneseSupplement + { + get + { + return GetFilter(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); + } + } + private static DefinedCharacterCodePointFilter _sundaneseSupplement; + + /// + /// A filter which allows characters in the 'Vedic Extensions' Unicode range. + /// + /// + /// This range spans the code points U+1CD0 .. U+1CFF. + /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter VedicExtensions + { + get + { + return GetFilter(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); + } + } + private static DefinedCharacterCodePointFilter _vedicExtensions; + + /// + /// A filter which allows characters in the 'Phonetic Extensions' Unicode range. + /// + /// + /// This range spans the code points U+1D00 .. U+1D7F. + /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter PhoneticExtensions + { + get + { + return GetFilter(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); + } + } + private static DefinedCharacterCodePointFilter _phoneticExtensions; + + /// + /// A filter which allows characters in the 'Phonetic Extensions Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1D80 .. U+1DBF. + /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter PhoneticExtensionsSupplement + { + get + { + return GetFilter(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); + } + } + private static DefinedCharacterCodePointFilter _phoneticExtensionsSupplement; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1DC0 .. U+1DFF. + /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarksSupplement + { + get + { + return GetFilter(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksSupplement; + + /// + /// A filter which allows characters in the 'Latin Extended Additional' Unicode range. + /// + /// + /// This range spans the code points U+1E00 .. U+1EFF. + /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedAdditional + { + get + { + return GetFilter(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedAdditional; + + /// + /// A filter which allows characters in the 'Greek Extended' Unicode range. + /// + /// + /// This range spans the code points U+1F00 .. U+1FFF. + /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GreekExtended + { + get + { + return GetFilter(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); + } + } + private static DefinedCharacterCodePointFilter _greekExtended; + + /// + /// A filter which allows characters in the 'General Punctuation' Unicode range. + /// + /// + /// This range spans the code points U+2000 .. U+206F. + /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GeneralPunctuation + { + get + { + return GetFilter(ref _generalPunctuation, first: '\u2000', last: '\u206F'); + } + } + private static DefinedCharacterCodePointFilter _generalPunctuation; + + /// + /// A filter which allows characters in the 'Superscripts and Subscripts' Unicode range. + /// + /// + /// This range spans the code points U+2070 .. U+209F. + /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SuperscriptsandSubscripts + { + get + { + return GetFilter(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); + } + } + private static DefinedCharacterCodePointFilter _superscriptsandSubscripts; + + /// + /// A filter which allows characters in the 'Currency Symbols' Unicode range. + /// + /// + /// This range spans the code points U+20A0 .. U+20CF. + /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CurrencySymbols + { + get + { + return GetFilter(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); + } + } + private static DefinedCharacterCodePointFilter _currencySymbols; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks for Symbols' Unicode range. + /// + /// + /// This range spans the code points U+20D0 .. U+20FF. + /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarksforSymbols + { + get + { + return GetFilter(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksforSymbols; + + /// + /// A filter which allows characters in the 'Letterlike Symbols' Unicode range. + /// + /// + /// This range spans the code points U+2100 .. U+214F. + /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LetterlikeSymbols + { + get + { + return GetFilter(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); + } + } + private static DefinedCharacterCodePointFilter _letterlikeSymbols; + + /// + /// A filter which allows characters in the 'Number Forms' Unicode range. + /// + /// + /// This range spans the code points U+2150 .. U+218F. + /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this range. + /// + public static ICodePointFilter NumberForms + { + get + { + return GetFilter(ref _numberForms, first: '\u2150', last: '\u218F'); + } + } + private static DefinedCharacterCodePointFilter _numberForms; + + /// + /// A filter which allows characters in the 'Arrows' Unicode range. + /// + /// + /// This range spans the code points U+2190 .. U+21FF. + /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Arrows + { + get + { + return GetFilter(ref _arrows, first: '\u2190', last: '\u21FF'); + } + } + private static DefinedCharacterCodePointFilter _arrows; + + /// + /// A filter which allows characters in the 'Mathematical Operators' Unicode range. + /// + /// + /// This range spans the code points U+2200 .. U+22FF. + /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MathematicalOperators + { + get + { + return GetFilter(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); + } + } + private static DefinedCharacterCodePointFilter _mathematicalOperators; + + /// + /// A filter which allows characters in the 'Miscellaneous Technical' Unicode range. + /// + /// + /// This range spans the code points U+2300 .. U+23FF. + /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousTechnical + { + get + { + return GetFilter(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousTechnical; + + /// + /// A filter which allows characters in the 'Control Pictures' Unicode range. + /// + /// + /// This range spans the code points U+2400 .. U+243F. + /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ControlPictures + { + get + { + return GetFilter(ref _controlPictures, first: '\u2400', last: '\u243F'); + } + } + private static DefinedCharacterCodePointFilter _controlPictures; + + /// + /// A filter which allows characters in the 'Optical Character Recognition' Unicode range. + /// + /// + /// This range spans the code points U+2440 .. U+245F. + /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this range. + /// + public static ICodePointFilter OpticalCharacterRecognition + { + get + { + return GetFilter(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); + } + } + private static DefinedCharacterCodePointFilter _opticalCharacterRecognition; + + /// + /// A filter which allows characters in the 'Enclosed Alphanumerics' Unicode range. + /// + /// + /// This range spans the code points U+2460 .. U+24FF. + /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EnclosedAlphanumerics + { + get + { + return GetFilter(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); + } + } + private static DefinedCharacterCodePointFilter _enclosedAlphanumerics; + + /// + /// A filter which allows characters in the 'Box Drawing' Unicode range. + /// + /// + /// This range spans the code points U+2500 .. U+257F. + /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BoxDrawing + { + get + { + return GetFilter(ref _boxDrawing, first: '\u2500', last: '\u257F'); + } + } + private static DefinedCharacterCodePointFilter _boxDrawing; + + /// + /// A filter which allows characters in the 'Block Elements' Unicode range. + /// + /// + /// This range spans the code points U+2580 .. U+259F. + /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BlockElements + { + get + { + return GetFilter(ref _blockElements, first: '\u2580', last: '\u259F'); + } + } + private static DefinedCharacterCodePointFilter _blockElements; + + /// + /// A filter which allows characters in the 'Geometric Shapes' Unicode range. + /// + /// + /// This range spans the code points U+25A0 .. U+25FF. + /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GeometricShapes + { + get + { + return GetFilter(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); + } + } + private static DefinedCharacterCodePointFilter _geometricShapes; + + /// + /// A filter which allows characters in the 'Miscellaneous Symbols' Unicode range. + /// + /// + /// This range spans the code points U+2600 .. U+26FF. + /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousSymbols + { + get + { + return GetFilter(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousSymbols; + + /// + /// A filter which allows characters in the 'Dingbats' Unicode range. + /// + /// + /// This range spans the code points U+2700 .. U+27BF. + /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Dingbats + { + get + { + return GetFilter(ref _dingbats, first: '\u2700', last: '\u27BF'); + } + } + private static DefinedCharacterCodePointFilter _dingbats; + + /// + /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-A' Unicode range. + /// + /// + /// This range spans the code points U+27C0 .. U+27EF. + /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousMathematicalSymbolsA + { + get + { + return GetFilter(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsA; + + /// + /// A filter which allows characters in the 'Supplemental Arrows-A' Unicode range. + /// + /// + /// This range spans the code points U+27F0 .. U+27FF. + /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalArrowsA + { + get + { + return GetFilter(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); + } + } + private static DefinedCharacterCodePointFilter _supplementalArrowsA; + + /// + /// A filter which allows characters in the 'Braille Patterns' Unicode range. + /// + /// + /// This range spans the code points U+2800 .. U+28FF. + /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BraillePatterns + { + get + { + return GetFilter(ref _braillePatterns, first: '\u2800', last: '\u28FF'); + } + } + private static DefinedCharacterCodePointFilter _braillePatterns; + + /// + /// A filter which allows characters in the 'Supplemental Arrows-B' Unicode range. + /// + /// + /// This range spans the code points U+2900 .. U+297F. + /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalArrowsB + { + get + { + return GetFilter(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); + } + } + private static DefinedCharacterCodePointFilter _supplementalArrowsB; + + /// + /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-B' Unicode range. + /// + /// + /// This range spans the code points U+2980 .. U+29FF. + /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousMathematicalSymbolsB + { + get + { + return GetFilter(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsB; + + /// + /// A filter which allows characters in the 'Supplemental Mathematical Operators' Unicode range. + /// + /// + /// This range spans the code points U+2A00 .. U+2AFF. + /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalMathematicalOperators + { + get + { + return GetFilter(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); + } + } + private static DefinedCharacterCodePointFilter _supplementalMathematicalOperators; + + /// + /// A filter which allows characters in the 'Miscellaneous Symbols and Arrows' Unicode range. + /// + /// + /// This range spans the code points U+2B00 .. U+2BFF. + /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousSymbolsandArrows + { + get + { + return GetFilter(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousSymbolsandArrows; + + /// + /// A filter which allows characters in the 'Glagolitic' Unicode range. + /// + /// + /// This range spans the code points U+2C00 .. U+2C5F. + /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Glagolitic + { + get + { + return GetFilter(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); + } + } + private static DefinedCharacterCodePointFilter _glagolitic; + + /// + /// A filter which allows characters in the 'Latin Extended-C' Unicode range. + /// + /// + /// This range spans the code points U+2C60 .. U+2C7F. + /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedC + { + get + { + return GetFilter(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedC; + + /// + /// A filter which allows characters in the 'Coptic' Unicode range. + /// + /// + /// This range spans the code points U+2C80 .. U+2CFF. + /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Coptic + { + get + { + return GetFilter(ref _coptic, first: '\u2C80', last: '\u2CFF'); + } + } + private static DefinedCharacterCodePointFilter _coptic; + + /// + /// A filter which allows characters in the 'Georgian Supplement' Unicode range. + /// + /// + /// This range spans the code points U+2D00 .. U+2D2F. + /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GeorgianSupplement + { + get + { + return GetFilter(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); + } + } + private static DefinedCharacterCodePointFilter _georgianSupplement; + + /// + /// A filter which allows characters in the 'Tifinagh' Unicode range. + /// + /// + /// This range spans the code points U+2D30 .. U+2D7F. + /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tifinagh + { + get + { + return GetFilter(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); + } + } + private static DefinedCharacterCodePointFilter _tifinagh; + + /// + /// A filter which allows characters in the 'Ethiopic Extended' Unicode range. + /// + /// + /// This range spans the code points U+2D80 .. U+2DDF. + /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EthiopicExtended + { + get + { + return GetFilter(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); + } + } + private static DefinedCharacterCodePointFilter _ethiopicExtended; + + /// + /// A filter which allows characters in the 'Cyrillic Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+2DE0 .. U+2DFF. + /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CyrillicExtendedA + { + get + { + return GetFilter(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); + } + } + private static DefinedCharacterCodePointFilter _cyrillicExtendedA; + + /// + /// A filter which allows characters in the 'Supplemental Punctuation' Unicode range. + /// + /// + /// This range spans the code points U+2E00 .. U+2E7F. + /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalPunctuation + { + get + { + return GetFilter(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); + } + } + private static DefinedCharacterCodePointFilter _supplementalPunctuation; + + /// + /// A filter which allows characters in the 'CJK Radicals Supplement' Unicode range. + /// + /// + /// This range spans the code points U+2E80 .. U+2EFF. + /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKRadicalsSupplement + { + get + { + return GetFilter(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); + } + } + private static DefinedCharacterCodePointFilter _cjkRadicalsSupplement; + + /// + /// A filter which allows characters in the 'Kangxi Radicals' Unicode range. + /// + /// + /// This range spans the code points U+2F00 .. U+2FDF. + /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KangxiRadicals + { + get + { + return GetFilter(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); + } + } + private static DefinedCharacterCodePointFilter _kangxiRadicals; + + /// + /// A filter which allows characters in the 'Ideographic Description Characters' Unicode range. + /// + /// + /// This range spans the code points U+2FF0 .. U+2FFF. + /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter IdeographicDescriptionCharacters + { + get + { + return GetFilter(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); + } + } + private static DefinedCharacterCodePointFilter _ideographicDescriptionCharacters; + + /// + /// A filter which allows characters in the 'CJK Symbols and Punctuation' Unicode range. + /// + /// + /// This range spans the code points U+3000 .. U+303F. + /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKSymbolsandPunctuation + { + get + { + return GetFilter(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); + } + } + private static DefinedCharacterCodePointFilter _cjkSymbolsandPunctuation; + + /// + /// A filter which allows characters in the 'Hiragana' Unicode range. + /// + /// + /// This range spans the code points U+3040 .. U+309F. + /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Hiragana + { + get + { + return GetFilter(ref _hiragana, first: '\u3040', last: '\u309F'); + } + } + private static DefinedCharacterCodePointFilter _hiragana; + + /// + /// A filter which allows characters in the 'Katakana' Unicode range. + /// + /// + /// This range spans the code points U+30A0 .. U+30FF. + /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Katakana + { + get + { + return GetFilter(ref _katakana, first: '\u30A0', last: '\u30FF'); + } + } + private static DefinedCharacterCodePointFilter _katakana; + + /// + /// A filter which allows characters in the 'Bopomofo' Unicode range. + /// + /// + /// This range spans the code points U+3100 .. U+312F. + /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Bopomofo + { + get + { + return GetFilter(ref _bopomofo, first: '\u3100', last: '\u312F'); + } + } + private static DefinedCharacterCodePointFilter _bopomofo; + + /// + /// A filter which allows characters in the 'Hangul Compatibility Jamo' Unicode range. + /// + /// + /// This range spans the code points U+3130 .. U+318F. + /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulCompatibilityJamo + { + get + { + return GetFilter(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); + } + } + private static DefinedCharacterCodePointFilter _hangulCompatibilityJamo; + + /// + /// A filter which allows characters in the 'Kanbun' Unicode range. + /// + /// + /// This range spans the code points U+3190 .. U+319F. + /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Kanbun + { + get + { + return GetFilter(ref _kanbun, first: '\u3190', last: '\u319F'); + } + } + private static DefinedCharacterCodePointFilter _kanbun; + + /// + /// A filter which allows characters in the 'Bopomofo Extended' Unicode range. + /// + /// + /// This range spans the code points U+31A0 .. U+31BF. + /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BopomofoExtended + { + get + { + return GetFilter(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); + } + } + private static DefinedCharacterCodePointFilter _bopomofoExtended; + + /// + /// A filter which allows characters in the 'CJK Strokes' Unicode range. + /// + /// + /// This range spans the code points U+31C0 .. U+31EF. + /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKStrokes + { + get + { + return GetFilter(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); + } + } + private static DefinedCharacterCodePointFilter _cjkStrokes; + + /// + /// A filter which allows characters in the 'Katakana Phonetic Extensions' Unicode range. + /// + /// + /// This range spans the code points U+31F0 .. U+31FF. + /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KatakanaPhoneticExtensions + { + get + { + return GetFilter(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); + } + } + private static DefinedCharacterCodePointFilter _katakanaPhoneticExtensions; + + /// + /// A filter which allows characters in the 'Enclosed CJK Letters and Months' Unicode range. + /// + /// + /// This range spans the code points U+3200 .. U+32FF. + /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EnclosedCJKLettersandMonths + { + get + { + return GetFilter(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); + } + } + private static DefinedCharacterCodePointFilter _enclosedCJKLettersandMonths; + + /// + /// A filter which allows characters in the 'CJK Compatibility' Unicode range. + /// + /// + /// This range spans the code points U+3300 .. U+33FF. + /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKCompatibility + { + get + { + return GetFilter(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); + } + } + private static DefinedCharacterCodePointFilter _cjkCompatibility; + + /// + /// A filter which allows characters in the 'CJK Unified Ideographs Extension A' Unicode range. + /// + /// + /// This range spans the code points U+3400 .. U+4DBF. + /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKUnifiedIdeographsExtensionA + { + get + { + return GetFilter(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); + } + } + private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographsExtensionA; + + /// + /// A filter which allows characters in the 'Yijing Hexagram Symbols' Unicode range. + /// + /// + /// This range spans the code points U+4DC0 .. U+4DFF. + /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter YijingHexagramSymbols + { + get + { + return GetFilter(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); + } + } + private static DefinedCharacterCodePointFilter _yijingHexagramSymbols; + + /// + /// A filter which allows characters in the 'CJK Unified Ideographs' Unicode range. + /// + /// + /// This range spans the code points U+4E00 .. U+9FFF. + /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKUnifiedIdeographs + { + get + { + return GetFilter(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); + } + } + private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographs; + + /// + /// A filter which allows characters in the 'Yi Syllables' Unicode range. + /// + /// + /// This range spans the code points U+A000 .. U+A48F. + /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter YiSyllables + { + get + { + return GetFilter(ref _yiSyllables, first: '\uA000', last: '\uA48F'); + } + } + private static DefinedCharacterCodePointFilter _yiSyllables; + + /// + /// A filter which allows characters in the 'Yi Radicals' Unicode range. + /// + /// + /// This range spans the code points U+A490 .. U+A4CF. + /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this range. + /// + public static ICodePointFilter YiRadicals + { + get + { + return GetFilter(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); + } + } + private static DefinedCharacterCodePointFilter _yiRadicals; + + /// + /// A filter which allows characters in the 'Lisu' Unicode range. + /// + /// + /// This range spans the code points U+A4D0 .. U+A4FF. + /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Lisu + { + get + { + return GetFilter(ref _lisu, first: '\uA4D0', last: '\uA4FF'); + } + } + private static DefinedCharacterCodePointFilter _lisu; + + /// + /// A filter which allows characters in the 'Vai' Unicode range. + /// + /// + /// This range spans the code points U+A500 .. U+A63F. + /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Vai + { + get + { + return GetFilter(ref _vai, first: '\uA500', last: '\uA63F'); + } + } + private static DefinedCharacterCodePointFilter _vai; + + /// + /// A filter which allows characters in the 'Cyrillic Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+A640 .. U+A69F. + /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CyrillicExtendedB + { + get + { + return GetFilter(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); + } + } + private static DefinedCharacterCodePointFilter _cyrillicExtendedB; + + /// + /// A filter which allows characters in the 'Bamum' Unicode range. + /// + /// + /// This range spans the code points U+A6A0 .. U+A6FF. + /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Bamum + { + get + { + return GetFilter(ref _bamum, first: '\uA6A0', last: '\uA6FF'); + } + } + private static DefinedCharacterCodePointFilter _bamum; + + /// + /// A filter which allows characters in the 'Modifier Tone Letters' Unicode range. + /// + /// + /// This range spans the code points U+A700 .. U+A71F. + /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ModifierToneLetters + { + get + { + return GetFilter(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); + } + } + private static DefinedCharacterCodePointFilter _modifierToneLetters; + + /// + /// A filter which allows characters in the 'Latin Extended-D' Unicode range. + /// + /// + /// This range spans the code points U+A720 .. U+A7FF. + /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedD + { + get + { + return GetFilter(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedD; + + /// + /// A filter which allows characters in the 'Syloti Nagri' Unicode range. + /// + /// + /// This range spans the code points U+A800 .. U+A82F. + /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SylotiNagri + { + get + { + return GetFilter(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); + } + } + private static DefinedCharacterCodePointFilter _sylotiNagri; + + /// + /// A filter which allows characters in the 'Common Indic Number Forms' Unicode range. + /// + /// + /// This range spans the code points U+A830 .. U+A83F. + /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CommonIndicNumberForms + { + get + { + return GetFilter(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); + } + } + private static DefinedCharacterCodePointFilter _commonIndicNumberForms; + + /// + /// A filter which allows characters in the 'Phags-pa' Unicode range. + /// + /// + /// This range spans the code points U+A840 .. U+A87F. + /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Phagspa + { + get + { + return GetFilter(ref _phagspa, first: '\uA840', last: '\uA87F'); + } + } + private static DefinedCharacterCodePointFilter _phagspa; + + /// + /// A filter which allows characters in the 'Saurashtra' Unicode range. + /// + /// + /// This range spans the code points U+A880 .. U+A8DF. + /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Saurashtra + { + get + { + return GetFilter(ref _saurashtra, first: '\uA880', last: '\uA8DF'); + } + } + private static DefinedCharacterCodePointFilter _saurashtra; + + /// + /// A filter which allows characters in the 'Devanagari Extended' Unicode range. + /// + /// + /// This range spans the code points U+A8E0 .. U+A8FF. + /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter DevanagariExtended + { + get + { + return GetFilter(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); + } + } + private static DefinedCharacterCodePointFilter _devanagariExtended; + + /// + /// A filter which allows characters in the 'Kayah Li' Unicode range. + /// + /// + /// This range spans the code points U+A900 .. U+A92F. + /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KayahLi + { + get + { + return GetFilter(ref _kayahLi, first: '\uA900', last: '\uA92F'); + } + } + private static DefinedCharacterCodePointFilter _kayahLi; + + /// + /// A filter which allows characters in the 'Rejang' Unicode range. + /// + /// + /// This range spans the code points U+A930 .. U+A95F. + /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Rejang + { + get + { + return GetFilter(ref _rejang, first: '\uA930', last: '\uA95F'); + } + } + private static DefinedCharacterCodePointFilter _rejang; + + /// + /// A filter which allows characters in the 'Hangul Jamo Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+A960 .. U+A97F. + /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulJamoExtendedA + { + get + { + return GetFilter(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); + } + } + private static DefinedCharacterCodePointFilter _hangulJamoExtendedA; + + /// + /// A filter which allows characters in the 'Javanese' Unicode range. + /// + /// + /// This range spans the code points U+A980 .. U+A9DF. + /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Javanese + { + get + { + return GetFilter(ref _javanese, first: '\uA980', last: '\uA9DF'); + } + } + private static DefinedCharacterCodePointFilter _javanese; + + /// + /// A filter which allows characters in the 'Myanmar Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+A9E0 .. U+A9FF. + /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MyanmarExtendedB + { + get + { + return GetFilter(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); + } + } + private static DefinedCharacterCodePointFilter _myanmarExtendedB; + + /// + /// A filter which allows characters in the 'Cham' Unicode range. + /// + /// + /// This range spans the code points U+AA00 .. U+AA5F. + /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Cham + { + get + { + return GetFilter(ref _cham, first: '\uAA00', last: '\uAA5F'); + } + } + private static DefinedCharacterCodePointFilter _cham; + + /// + /// A filter which allows characters in the 'Myanmar Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+AA60 .. U+AA7F. + /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MyanmarExtendedA + { + get + { + return GetFilter(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); + } + } + private static DefinedCharacterCodePointFilter _myanmarExtendedA; + + /// + /// A filter which allows characters in the 'Tai Viet' Unicode range. + /// + /// + /// This range spans the code points U+AA80 .. U+AADF. + /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter TaiViet + { + get + { + return GetFilter(ref _taiViet, first: '\uAA80', last: '\uAADF'); + } + } + private static DefinedCharacterCodePointFilter _taiViet; + + /// + /// A filter which allows characters in the 'Meetei Mayek Extensions' Unicode range. + /// + /// + /// This range spans the code points U+AAE0 .. U+AAFF. + /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MeeteiMayekExtensions + { + get + { + return GetFilter(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); + } + } + private static DefinedCharacterCodePointFilter _meeteiMayekExtensions; + + /// + /// A filter which allows characters in the 'Ethiopic Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+AB00 .. U+AB2F. + /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EthiopicExtendedA + { + get + { + return GetFilter(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); + } + } + private static DefinedCharacterCodePointFilter _ethiopicExtendedA; + + /// + /// A filter which allows characters in the 'Latin Extended-E' Unicode range. + /// + /// + /// This range spans the code points U+AB30 .. U+AB6F. + /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedE + { + get + { + return GetFilter(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedE; + + /// + /// A filter which allows characters in the 'Meetei Mayek' Unicode range. + /// + /// + /// This range spans the code points U+ABC0 .. U+ABFF. + /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MeeteiMayek + { + get + { + return GetFilter(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); + } + } + private static DefinedCharacterCodePointFilter _meeteiMayek; + + /// + /// A filter which allows characters in the 'Hangul Syllables' Unicode range. + /// + /// + /// This range spans the code points U+AC00 .. U+D7AF. + /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulSyllables + { + get + { + return GetFilter(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); + } + } + private static DefinedCharacterCodePointFilter _hangulSyllables; + + /// + /// A filter which allows characters in the 'Hangul Jamo Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+D7B0 .. U+D7FF. + /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulJamoExtendedB + { + get + { + return GetFilter(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); + } + } + private static DefinedCharacterCodePointFilter _hangulJamoExtendedB; + + /// + /// A filter which allows characters in the 'CJK Compatibility Ideographs' Unicode range. + /// + /// + /// This range spans the code points U+F900 .. U+FAFF. + /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKCompatibilityIdeographs + { + get + { + return GetFilter(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); + } + } + private static DefinedCharacterCodePointFilter _cjkCompatibilityIdeographs; + + /// + /// A filter which allows characters in the 'Alphabetic Presentation Forms' Unicode range. + /// + /// + /// This range spans the code points U+FB00 .. U+FB4F. + /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter AlphabeticPresentationForms + { + get + { + return GetFilter(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); + } + } + private static DefinedCharacterCodePointFilter _alphabeticPresentationForms; + + /// + /// A filter which allows characters in the 'Arabic Presentation Forms-A' Unicode range. + /// + /// + /// This range spans the code points U+FB50 .. U+FDFF. + /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicPresentationFormsA + { + get + { + return GetFilter(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); + } + } + private static DefinedCharacterCodePointFilter _arabicPresentationFormsA; + + /// + /// A filter which allows characters in the 'Variation Selectors' Unicode range. + /// + /// + /// This range spans the code points U+FE00 .. U+FE0F. + /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter VariationSelectors + { + get + { + return GetFilter(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); + } + } + private static DefinedCharacterCodePointFilter _variationSelectors; + + /// + /// A filter which allows characters in the 'Vertical Forms' Unicode range. + /// + /// + /// This range spans the code points U+FE10 .. U+FE1F. + /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this range. + /// + public static ICodePointFilter VerticalForms + { + get + { + return GetFilter(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); + } + } + private static DefinedCharacterCodePointFilter _verticalForms; + + /// + /// A filter which allows characters in the 'Combining Half Marks' Unicode range. + /// + /// + /// This range spans the code points U+FE20 .. U+FE2F. + /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningHalfMarks + { + get + { + return GetFilter(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); + } + } + private static DefinedCharacterCodePointFilter _combiningHalfMarks; + + /// + /// A filter which allows characters in the 'CJK Compatibility Forms' Unicode range. + /// + /// + /// This range spans the code points U+FE30 .. U+FE4F. + /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKCompatibilityForms + { + get + { + return GetFilter(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); + } + } + private static DefinedCharacterCodePointFilter _cjkCompatibilityForms; + + /// + /// A filter which allows characters in the 'Small Form Variants' Unicode range. + /// + /// + /// This range spans the code points U+FE50 .. U+FE6F. + /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SmallFormVariants + { + get + { + return GetFilter(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); + } + } + private static DefinedCharacterCodePointFilter _smallFormVariants; + + /// + /// A filter which allows characters in the 'Arabic Presentation Forms-B' Unicode range. + /// + /// + /// This range spans the code points U+FE70 .. U+FEFF. + /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicPresentationFormsB + { + get + { + return GetFilter(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); + } + } + private static DefinedCharacterCodePointFilter _arabicPresentationFormsB; + + /// + /// A filter which allows characters in the 'Halfwidth and Fullwidth Forms' Unicode range. + /// + /// + /// This range spans the code points U+FF00 .. U+FFEF. + /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HalfwidthandFullwidthForms + { + get + { + return GetFilter(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); + } + } + private static DefinedCharacterCodePointFilter _halfwidthandFullwidthForms; + + /// + /// A filter which allows characters in the 'Specials' Unicode range. + /// + /// + /// This range spans the code points U+FFF0 .. U+FFFF. + /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Specials + { + get + { + return GetFilter(ref _specials, first: '\uFFF0', last: '\uFFFF'); + } + } + private static DefinedCharacterCodePointFilter _specials; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static ICodePointFilter GetFilter(ref DefinedCharacterCodePointFilter filter, char first, char last) + { + // Return an existing filter if it has already been created, otherwise + // create a new filter on-demand. + return Volatile.Read(ref filter) ?? GetFilterSlow(ref filter, first, last); + } + + private static ICodePointFilter GetFilterSlow(ref DefinedCharacterCodePointFilter filter, char first, char last) + { + // If the filter hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'filter' value. + DefinedCharacterCodePointFilter newFilter = new DefinedCharacterCodePointFilter(first, last); + Volatile.Write(ref filter, newFilter); + return newFilter; + } + + /// + /// A code point filter which returns only defined characters within a certain + /// range of the Unicode specification. + /// + private sealed class DefinedCharacterCodePointFilter : ICodePointFilter + { + private readonly int _count; + private readonly int _first; + + public DefinedCharacterCodePointFilter(int first, int last) + { + Debug.Assert(0 <= first); + Debug.Assert(first <= last); + Debug.Assert(last <= 0xFFFF); + + _first = first; + _count = last - first + 1; + } + + public IEnumerable GetAllowedCodePoints() + { + for (int i = 0; i < _count; i++) + { + int thisCodePoint = _first + i; + if (UnicodeHelpers.IsCharacterDefined((char)thisCodePoint)) + { + yield return thisCodePoint; + } + } + } + } + + /// + /// A filter that allows no code points. + /// + private sealed class EmptyCodePointFilter : ICodePointFilter + { + public IEnumerable GetAllowedCodePoints() + { + return Enumerable.Empty(); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs new file mode 100644 index 0000000000..a46ae99ed2 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + internal static class EncoderCommon + { + // Gets the optimal capacity of the StringBuilder that will be used to build the output + // given a specified number of input characters and the worst-case growth. + public static int GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar) + { + // We treat 32KB byte size (16k chars) as a soft upper boundary for the length of any StringBuilder + // that we allocate. We'll try to avoid going above this boundary if we can avoid it so that we + // don't allocate objects on the LOH. + const int upperBound = 16 * 1024; + + // Once we have chosen an initial value for the StringBuilder size, the StringBuilder type will + // efficiently allocate additionally blocks if necessary. + + if (numCharsToEncode >= upperBound) + { + // We know that the output will contain at least as many characters as the input, so if the + // input length exceeds the soft upper boundary just preallocate the entire builder and hope for + // a best-case outcome. + return numCharsToEncode; + } + else + { + // Allocate the worst-case if we can, but don't exceed the soft upper boundary. + long worstCaseTotalChars = (long)numCharsToEncode * worstCaseOutputCharsPerInputChar; + return (int)Math.Min(upperBound, worstCaseTotalChars); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs new file mode 100644 index 0000000000..05fa1c5882 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains helpers for dealing with byte-hex char conversions. + /// + internal static class HexUtil + { + /// + /// Converts a number 0 - 15 to its associated hex character '0' - 'F'. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static char IntToChar(uint i) + { + Debug.Assert(i < 16); + return (i < 10) ? (char)('0' + i) : (char)('A' + (i - 10)); + } + + /// + /// Returns the integral form of this hexadecimal character. + /// + /// 0 - 15 if the character is valid, -1 if the character is invalid. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static int ParseHexCharacter(char c) + { + if ('0' <= c && c <= '9') { return c - '0'; } + else if ('A' <= c && c <= 'F') { return c - 'A' + 10; } + else if ('a' <= c && c <= 'f') { return c - 'a' + 10; } + else { return -1; } + } + + /// + /// Gets the uppercase hex-encoded form of a byte. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static void WriteHexEncodedByte(byte b, out char firstHexChar, out char secondHexChar) + { + firstHexChar = IntToChar((uint)b >> 4); + secondHexChar = IntToChar((uint)b & 0xFU); + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs new file mode 100644 index 0000000000..b0559d7219 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -0,0 +1,229 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// A class which can perform HTML encoding given an allow list of characters which + /// can be represented unencoded. + /// + /// + /// Once constructed, instances of this class are thread-safe for multiple callers. + /// + public unsafe sealed class HtmlEncoder : IHtmlEncoder + { + // The default HtmlEncoder (Basic Latin), instantiated on demand + private static HtmlEncoder _defaultEncoder; + + // A bitmap of characters which are allowed to be returned unescaped. + private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + + /// + /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// + public HtmlEncoder() + : this(CodePointFilters.BasicLatin) + { + } + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + public HtmlEncoder(params ICodePointFilter[] filters) + { + if (filters == null) + { + return; // no characters are allowed, just no-op immediately + } + + // Punch a hole for each allowed code point across all filters (this is an OR). + // We don't allow supplementary (astral) characters for now. + foreach (var filter in filters) + { + foreach (var codePoint in filter.GetAllowedCodePoints()) + { + if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) + { + AllowCharacter((char)codePoint); + } + } + } + + // Forbid characters that are special in HTML + ForbidCharacter('<'); + ForbidCharacter('>'); + ForbidCharacter('&'); + ForbidCharacter('\''); // can be used to escape attributes + ForbidCharacter('\"'); // can be used to escape attributes + ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks + + // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed + // (includes categories Cc, Cs, Co, Cn, Zl, Zp) + uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); + Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); + for (int i = 0; i < _allowedCharsBitmap.Length; i++) + { + _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; + } + } + + /// + /// A default instance of the HtmlEncoder, equivalent to allowing only + /// the 'Basic Latin' character range. + /// + public static HtmlEncoder Default + { + get + { + HtmlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); + if (defaultEncoder == null) + { + defaultEncoder = new HtmlEncoder(); + Volatile.Write(ref _defaultEncoder, defaultEncoder); + } + return defaultEncoder; + } + } + + // Marks a character as allowed (can be returned unencoded) + private void AllowCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] |= 0x1U << offset; + } + + // Marks a character as forbidden (must be returned encoded) + private void ForbidCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] &= ~(0x1U << offset); + } + + /// + /// Everybody's favorite HtmlEncode routine. + /// + public string HtmlEncode(string value) + { + if (String.IsNullOrEmpty(value)) + { + return value; + } + + // Quick check: does the string need to be encoded at all? + // If not, just return the input string as-is. + for (int i = 0; i < value.Length; i++) + { + if (!IsCharacterAllowed(value[i])) + { + return HtmlEncodeImpl(value, i); + } + } + return value; + } + + private string HtmlEncodeImpl(string input, int idxOfFirstCharWhichRequiresEncoding) + { + Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); + Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); + + // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" + // We don't need to worry about astral code points since they consume *two* input chars to + // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. + int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; + int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); + Debug.Assert(sbCapacity >= input.Length); + + // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, + // then begin encoding from the last (potentially requiring encoding) part of the input string. + StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); + fixed (char* pInput = input) + { + return HtmlEncodeImpl2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + } + } + + private string HtmlEncodeImpl2(StringBuilder builder, char* input, uint charsRemaining) + { + while (charsRemaining != 0) + { + int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); + if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) + { + // Supplementary characters should always be encoded numerically. + WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); + + // We consume two UTF-16 characters for a single supplementary character. + input += 2; + charsRemaining -= 2; + } + else + { + // Otherwise, this was a BMP character. + input++; + charsRemaining--; + char c = (char)nextScalar; + if (IsCharacterAllowed(c)) + { + builder.Append(c); + } + else + { + if (c == '<') { builder.Append("<"); } + else if (c == '>') { builder.Append(">"); } + else if (c == '&') { builder.Append("&"); } + else if (c == '\"') { builder.Append("""); } + else { WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); } + } + } + } + + return builder.ToString(); + } + + // Determines whether the given character can be returned unencoded. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private bool IsCharacterAllowed(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + } + + // Writes a scalar value as "�" + private static void WriteScalarAsHtmlEncodedEntity(StringBuilder builder, uint value) + { + // We're building the characters up in reverse + char* chars = stackalloc char[8 /* "FFFFFFFF" */]; + int numCharsWritten = 0; + do + { + Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); + // Pop off the last nibble + chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); + value >>= 4; + } while (value != 0); + + // Finally, write out the HTML-encoded scalar value. + builder.Append('&'); + builder.Append('#'); + builder.Append('x'); + Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); + do + { + builder.Append(chars[--numCharsWritten]); + } while (numCharsWritten != 0); + builder.Append(';'); + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs new file mode 100644 index 0000000000..e57b6535d2 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Represents a filter which allows only certain Unicode code points through. + /// + public interface ICodePointFilter + { + /// + /// Gets an enumeration of all allowed code points. + /// + IEnumerable GetAllowedCodePoints(); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs new file mode 100644 index 0000000000..e80fb908a7 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Provides services for HTML-encoding input. + /// + public interface IHtmlEncoder + { + /// + /// HTML-encodes a given input string. + /// + /// + /// The HTML-encoded value, or null if the input string was null. + /// + /// + /// The return value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + string HtmlEncode(string value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs new file mode 100644 index 0000000000..8a287548cf --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Provides services for JavaScript-escaping strings. + /// + public interface IJavaScriptStringEncoder + { + /// + /// JavaScript-escapes a given input string. + /// + /// + /// The JavaScript-escaped value, or null if the input string was null. + /// + string JavaScriptStringEncode(string value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs new file mode 100644 index 0000000000..0806f5f971 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Provides services for URL-escaping strings. + /// + public interface IUrlEncoder + { + /// + /// URL-escapes a given input string. + /// + /// + /// The URL-escaped value, or null if the input string was null. + /// + /// + /// The return value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + string UrlEncode(string value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs new file mode 100644 index 0000000000..671d2081b3 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs @@ -0,0 +1,163 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Text; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// A class which can perform JavaScript string escaping given an allow list of characters which + /// can be represented unescaped. + /// + /// + /// Once constructed, instances of this class are thread-safe for multiple callers. + /// + public sealed class JavaScriptStringEncoder : IJavaScriptStringEncoder + { + // The default JavaScript string encoder (Basic Latin), instantiated on demand + private static JavaScriptStringEncoder _defaultEncoder; + + // The inner encoder, responsible for the actual encoding routines + private readonly JavaScriptStringUnicodeEncoder _innerUnicodeEncoder; + + /// + /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// + public JavaScriptStringEncoder() + : this(JavaScriptStringUnicodeEncoder.BasicLatin) + { + } + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + public JavaScriptStringEncoder(params ICodePointFilter[] filters) + : this(new JavaScriptStringUnicodeEncoder(filters)) + { + } + + private JavaScriptStringEncoder(JavaScriptStringUnicodeEncoder innerEncoder) + { + Debug.Assert(innerEncoder != null); + _innerUnicodeEncoder = innerEncoder; + } + + /// + /// A default instance of the JavaScriptStringEncoder, equivalent to allowing only + /// the 'Basic Latin' character range. + /// + public static JavaScriptStringEncoder Default + { + get + { + JavaScriptStringEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); + if (defaultEncoder == null) + { + defaultEncoder = new JavaScriptStringEncoder(); + Volatile.Write(ref _defaultEncoder, defaultEncoder); + } + return defaultEncoder; + } + } + + /// + /// Everybody's favorite JavaScriptStringEncode routine. + /// + public string JavaScriptStringEncode(string value) + { + return _innerUnicodeEncoder.Encode(value); + } + + private sealed class JavaScriptStringUnicodeEncoder : UnicodeEncoderBase + { + // A singleton instance of the basic latin encoder. + private static JavaScriptStringUnicodeEncoder _basicLatinSingleton; + + // The worst case encoding is 6 output chars per input char: [input] U+FFFF -> [output] "\uFFFF" + // We don't need to worry about astral code points since they're represented as encoded + // surrogate pairs in the output. + private const int MaxOutputCharsPerInputChar = 6; + + internal JavaScriptStringUnicodeEncoder(ICodePointFilter[] filters) + : base(filters, MaxOutputCharsPerInputChar) + { + // The only interesting characters above and beyond what the base encoder + // already covers are the solidus and reverse solidus. + ForbidCharacter('\\'); + ForbidCharacter('/'); + } + + internal static JavaScriptStringUnicodeEncoder BasicLatin + { + get + { + JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); + if (encoder == null) + { + encoder = new JavaScriptStringUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + Volatile.Write(ref _basicLatinSingleton, encoder); + } + return encoder; + } + } + + // Writes a scalar value as a JavaScript-escaped character (or sequence of characters). + // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 + // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 + // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf + protected override void WriteEncodedScalar(StringBuilder builder, uint value) + { + // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. + // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". + // (In ECMA-262 this character is a NonEscape character.) + // HTML-specific characters (including apostrophe and quotes) will + // be written out as numeric entities for defense-in-depth. + // See UnicodeEncoderBase ctor comments for more info. + + if (value == (uint)'\b') { builder.Append(@"\b"); } + else if (value == (uint)'\t') { builder.Append(@"\t"); } + else if (value == (uint)'\n') { builder.Append(@"\n"); } + else if (value == (uint)'\f') { builder.Append(@"\f"); } + else if (value == (uint)'\r') { builder.Append(@"\r"); } + else if (value == (uint)'/') { builder.Append(@"\/"); } + else if (value == (uint)'\\') { builder.Append(@"\\"); } + else { WriteEncodedScalarAsNumericEntity(builder, value); } + } + + // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). + private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) + { + if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) + { + // Convert this back to UTF-16 and write out both characters. + char leadingSurrogate, trailingSurrogate; + UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); + WriteEncodedSingleCharacter(builder, leadingSurrogate); + WriteEncodedSingleCharacter(builder, trailingSurrogate); + } + else + { + // This is only a single character. + WriteEncodedSingleCharacter(builder, value); + } + } + + // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. + private static void WriteEncodedSingleCharacter(StringBuilder builder, uint value) + { + Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); + + // Encode this as 6 chars "\uFFFF". + builder.Append('\\'); + builder.Append('u'); + builder.Append(HexUtil.IntToChar(value >> 12)); + builder.Append(HexUtil.IntToChar((value >> 8) & 0xFU)); + builder.Append(HexUtil.IntToChar((value >> 4) & 0xFU)); + builder.Append(HexUtil.IntToChar(value & 0xFU)); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs new file mode 100644 index 0000000000..2f04910b30 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -0,0 +1,171 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + internal unsafe abstract class UnicodeEncoderBase + { + // A bitmap of characters which are allowed to be returned unescaped. + private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + + // The worst-case number of output chars generated for any input char. + private readonly int _maxOutputCharsPerInputChar; + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + protected UnicodeEncoderBase(ICodePointFilter[] filters, int maxOutputCharsPerInputChar) + { + _maxOutputCharsPerInputChar = maxOutputCharsPerInputChar; + + if (filters != null) + { + // Punch a hole for each allowed code point across all filters (this is an OR). + // We don't allow supplementary (astral) characters for now. + foreach (var filter in filters) + { + foreach (var codePoint in filter.GetAllowedCodePoints()) + { + if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) + { + AllowCharacter((char)codePoint); + } + } + } + } + + // Forbid characters that are special in HTML. + // Even though this is a common encoder used by everybody (including URL + // and JavaScript strings), it's unfortunately common for developers to + // forget to HTML-encode a string once it has been URL-encoded or + // JavaScript string-escaped, so this offers extra protection. + ForbidCharacter('<'); + ForbidCharacter('>'); + ForbidCharacter('&'); + ForbidCharacter('\''); // can be used to escape attributes + ForbidCharacter('\"'); // can be used to escape attributes + ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks + + // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed + // (includes categories Cc, Cs, Co, Cn, Zl, Zp) + uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); + Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); + for (int i = 0; i < _allowedCharsBitmap.Length; i++) + { + _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; + } + } + + // Marks a character as allowed (can be returned unencoded) + private void AllowCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] |= 0x1U << offset; + } + + // Marks a character as forbidden (must be returned encoded) + protected void ForbidCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] &= ~(0x1U << offset); + } + + /// + /// Entry point to the encoder. + /// + public string Encode(string value) + { + if (String.IsNullOrEmpty(value)) + { + return value; + } + + // Quick check: does the string need to be encoded at all? + // If not, just return the input string as-is. + for (int i = 0; i < value.Length; i++) + { + if (!IsCharacterAllowed(value[i])) + { + return EncodeCore(value, i); + } + } + return value; + } + + private string EncodeCore(string input, int idxOfFirstCharWhichRequiresEncoding) + { + Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); + Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); + + // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" + // We don't need to worry about astral code points since they consume *two* input chars to + // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. + int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; + int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); + Debug.Assert(sbCapacity >= input.Length); + + // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, + // then begin encoding from the last (potentially requiring encoding) part of the input string. + StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); + fixed (char* pInput = input) + { + return EncodeCore2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + } + } + + private string EncodeCore2(StringBuilder builder, char* input, uint charsRemaining) + { + while (charsRemaining != 0) + { + int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); + if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) + { + // Supplementary characters should always be encoded numerically. + WriteEncodedScalar(builder, (uint)nextScalar); + + // We consume two UTF-16 characters for a single supplementary character. + input += 2; + charsRemaining -= 2; + } + else + { + // Otherwise, this was a BMP character. + input++; + charsRemaining--; + char c = (char)nextScalar; + if (IsCharacterAllowed(c)) + { + builder.Append(c); + } + else + { + WriteEncodedScalar(builder, (uint)nextScalar); + } + } + } + + return builder.ToString(); + } + + // Determines whether the given character can be returned unencoded. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private bool IsCharacterAllowed(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + } + + protected abstract void WriteEncodedScalar(StringBuilder builder, uint value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs new file mode 100644 index 0000000000..89424a2612 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs @@ -0,0 +1,228 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains helpers for dealing with Unicode code points. + /// + internal unsafe static class UnicodeHelpers + { + /// + /// Used for invalid Unicode sequences or other unrepresentable values. + /// + private const char UNICODE_REPLACEMENT_CHAR = '\uFFFD'; + + /// + /// The last code point defined by the Unicode specification. + /// + internal const int UNICODE_LAST_CODEPOINT = 0x10FFFF; + + private static uint[] _definedCharacterBitmap; + + /// + /// Helper method which creates a bitmap of all characters which are + /// defined per version 7.0.0 of the Unicode specification. + /// + [MethodImpl(MethodImplOptions.NoInlining)] + private static uint[] CreateDefinedCharacterBitmap() + { + // The stream should be exactly 8KB in size. + var stream = typeof(UnicodeHelpers).GetTypeInfo().Assembly.GetManifestResourceStream("compiler/resources/unicode-7.0.0-defined-characters.bin"); + if (stream.Length != 8 * 1024) + { + Environment.FailFast("Corrupt data detected."); + } + + // Read everything in as raw bytes. + byte[] rawData = new byte[8 * 1024]; + for (int numBytesReadTotal = 0; numBytesReadTotal < rawData.Length;) + { + int numBytesReadThisIteration = stream.Read(rawData, numBytesReadTotal, rawData.Length - numBytesReadTotal); + if (numBytesReadThisIteration == 0) + { + Environment.FailFast("Corrupt data detected."); + } + numBytesReadTotal += numBytesReadThisIteration; + } + + // Finally, convert the byte[] to a uint[]. + // The incoming bytes are little-endian. + uint[] retVal = new uint[2 * 1024]; + for (int i = 0; i < retVal.Length; i++) + { + retVal[i] = (((uint)rawData[4 * i + 3]) << 24) + | (((uint)rawData[4 * i + 2]) << 16) + | (((uint)rawData[4 * i + 1]) << 8) + | (uint)rawData[4 * i]; + } + + // And we're done! + Volatile.Write(ref _definedCharacterBitmap, retVal); + return retVal; + } + + /// + /// Returns a bitmap of all characters which are defined per version 7.0.0 + /// of the Unicode specification. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static uint[] GetDefinedCharacterBitmap() + { + return Volatile.Read(ref _definedCharacterBitmap) ?? CreateDefinedCharacterBitmap(); + } + + /// + /// Given a UTF-16 character stream, reads the next scalar value from the stream. + /// Set 'endOfString' to true if 'pChar' points to the last character in the stream. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static int GetScalarValueFromUtf16(char* pChar, bool endOfString) + { + // This method is marked as AggressiveInlining to handle the common case of a non-surrogate + // character. The surrogate case is handled in the slower fallback code path. + char thisChar = *pChar; + return (Char.IsSurrogate(thisChar)) ? GetScalarValueFromUtf16Slow(pChar, endOfString) : thisChar; + } + + private static int GetScalarValueFromUtf16Slow(char* pChar, bool endOfString) + { + char firstChar = pChar[0]; + + if (!Char.IsSurrogate(firstChar)) + { + Debug.Fail("This case should've been handled by the fast path."); + return firstChar; + } + else if (Char.IsHighSurrogate(firstChar)) + { + if (endOfString) + { + // unmatched surrogate - substitute + return UNICODE_REPLACEMENT_CHAR; + } + else + { + char secondChar = pChar[1]; + if (Char.IsLowSurrogate(secondChar)) + { + // valid surrogate pair - extract codepoint + return GetScalarValueFromUtf16SurrogatePair(firstChar, secondChar); + } + else + { + // unmatched surrogate - substitute + return UNICODE_REPLACEMENT_CHAR; + } + } + } + else + { + // unmatched surrogate - substitute + Debug.Assert(Char.IsLowSurrogate(firstChar)); + return UNICODE_REPLACEMENT_CHAR; + } + } + + private static int GetScalarValueFromUtf16SurrogatePair(char highSurrogate, char lowSurrogate) + { + Debug.Assert(Char.IsHighSurrogate(highSurrogate)); + Debug.Assert(Char.IsLowSurrogate(lowSurrogate)); + + // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the + // details of this conversion. We don't use Char.ConvertToUtf32 because its exception + // handling shows up on the hot path, and our caller has already sanitized the inputs. + return (lowSurrogate & 0x3ff) | (((highSurrogate & 0x3ff) + (1 << 6)) << 10); + } + + internal static void GetUtf16SurrogatePairFromAstralScalarValue(int scalar, out char highSurrogate, out char lowSurrogate) + { + Debug.Assert(0x10000 <= scalar && scalar <= UNICODE_LAST_CODEPOINT); + + // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the + // details of this conversion. We don't use Char.ConvertFromUtf32 because its exception + // handling shows up on the hot path, it allocates temporary strings (which we don't want), + // and our caller has already sanitized the inputs. + + int x = scalar & 0xFFFF; + int u = scalar >> 16; + int w = u - 1; + highSurrogate = (char)(0xD800 | (w << 6) | (x >> 10)); + lowSurrogate = (char)(0xDC00 | (x & 0x3FF)); + } + + /// + /// Given a Unicode scalar value, returns the UTF-8 representation of the value. + /// The return value's bytes should be popped from the LSB. + /// + internal static int GetUtf8RepresentationForScalarValue(uint scalar) + { + Debug.Assert(scalar <= UNICODE_LAST_CODEPOINT); + + // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.6 for the + // details of this conversion. We don't use UTF8Encoding since we're encoding + // a scalar code point, not a UTF16 character sequence. + if (scalar <= 0x7f) + { + // one byte used: scalar 00000000 0xxxxxxx -> byte sequence 0xxxxxxx + byte firstByte = (byte)scalar; + return firstByte; + } + else if (scalar <= 0x7ff) + { + // two bytes used: scalar 00000yyy yyxxxxxx -> byte sequence 110yyyyy 10xxxxxx + byte firstByte = (byte)(0xc0 | (scalar >> 6)); + byte secondByteByte = (byte)(0x80 | (scalar & 0x3f)); + return ((secondByteByte << 8) | firstByte); + } + else if (scalar <= 0xffff) + { + // three bytes used: scalar zzzzyyyy yyxxxxxx -> byte sequence 1110zzzz 10yyyyyy 10xxxxxx + byte firstByte = (byte)(0xe0 | (scalar >> 12)); + byte secondByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); + byte thirdByte = (byte)(0x80 | (scalar & 0x3f)); + return ((((thirdByte << 8) | secondByte) << 8) | firstByte); + } + else + { + // four bytes used: scalar 000uuuuu zzzzyyyy yyxxxxxx -> byte sequence 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx + byte firstByte = (byte)(0xf0 | (scalar >> 18)); + byte secondByte = (byte)(0x80 | ((scalar >> 12) & 0x3f)); + byte thirdByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); + byte fourthByte = (byte)(0x80 | (scalar & 0x3f)); + return ((((((fourthByte << 8) | thirdByte) << 8) | secondByte) << 8) | firstByte); + } + } + + /// + /// Returns a value stating whether a character is defined per version 7.0.0 + /// of the Unicode specification. Certain classes of characters (control chars, + /// private use, surrogates, some whitespace) are considered "undefined" for + /// our purposes. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static bool IsCharacterDefined(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((GetDefinedCharacterBitmap()[index] >> offset) & 0x1U) != 0; + } + + /// + /// Determines whether the given scalar value is in the supplementary plane and thus + /// requires 2 characters to be represented in UTF-16 (as a surrogate pair). + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static bool IsSupplementaryCodePoint(int scalar) + { + return ((scalar & ~((int)Char.MaxValue)) != 0); + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs new file mode 100644 index 0000000000..81706559ff --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs @@ -0,0 +1,161 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Text; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// A class which can perform URL string escaping given an allow list of characters which + /// can be represented unescaped. + /// + /// + /// Once constructed, instances of this class are thread-safe for multiple callers. + /// + public sealed class UrlEncoder : IUrlEncoder + { + // The default URL string encoder (Basic Latin), instantiated on demand + private static UrlEncoder _defaultEncoder; + + // The inner encoder, responsible for the actual encoding routines + private readonly UrlUnicodeEncoder _innerUnicodeEncoder; + + /// + /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// + public UrlEncoder() + : this(UrlUnicodeEncoder.BasicLatin) + { + } + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + public UrlEncoder(params ICodePointFilter[] filters) + : this(new UrlUnicodeEncoder(filters)) + { + } + + private UrlEncoder(UrlUnicodeEncoder innerEncoder) + { + Debug.Assert(innerEncoder != null); + _innerUnicodeEncoder = innerEncoder; + } + + /// + /// A default instance of the UrlEncoder, equivalent to allowing only + /// the 'Basic Latin' character range. + /// + public static UrlEncoder Default + { + get + { + UrlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); + if (defaultEncoder == null) + { + defaultEncoder = new UrlEncoder(); + Volatile.Write(ref _defaultEncoder, defaultEncoder); + } + return defaultEncoder; + } + } + + /// + /// Everybody's favorite UrlEncode routine. + /// + public string UrlEncode(string value) + { + return _innerUnicodeEncoder.Encode(value); + } + + private sealed class UrlUnicodeEncoder : UnicodeEncoderBase + { + // A singleton instance of the basic latin encoder. + private static UrlUnicodeEncoder _basicLatinSingleton; + + // We perform UTF8 conversion of input, which means that the worst case is + // 9 output chars per input char: [input] U+FFFF -> [output] "%XX%YY%ZZ". + // We don't need to worry about astral code points since they consume 2 input + // chars to produce 12 output chars "%XX%YY%ZZ%WW", which is 6 output chars per input char. + private const int MaxOutputCharsPerInputChar = 9; + + internal UrlUnicodeEncoder(ICodePointFilter[] filters) + : base(filters, MaxOutputCharsPerInputChar) + { + // Per RFC 3987, Sec. 2.2, we want encodings that are safe for + // 'isegment', 'iquery', and 'ifragment'. The only thing these + // all have in common is 'ipchar', which is defined as such: + // + // ipchar = iunreserved / pct-encoded / sub-delims / ":" + // / "@" + // + // iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar + // + // ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF + // / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD + // / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD + // / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD + // / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD + // / %xD0000-DFFFD / %xE1000-EFFFD + // + // pct-encoded = "%" HEXDIG HEXDIG + // + // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + // / "*" / "+" / "," / ";" / "=" + // + // From this list, the base encoder blocks "&", "'", "+", + // and we'll additionally block "=" since it has special meaning + // in x-www-form-urlencoded representations. + // + // This means that the full list of allowed characters from the + // Basic Latin set is: + // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / ":" / "@" + + const string forbiddenChars = @" #%/=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder + foreach (char c in forbiddenChars) + { + ForbidCharacter(c); + } + + // Specials (U+FFF0 .. U+FFFF) are forbidden by the definition of 'ucschar' above + for (int i = 0; i < 16; i++) + { + ForbidCharacter((char)(0xFFF0 | i)); + } + + // Supplementary characters are forbidden anyway by the base encoder + } + + internal static UrlUnicodeEncoder BasicLatin + { + get + { + UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); + if (encoder == null) + { + encoder = new UrlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + Volatile.Write(ref _basicLatinSingleton, encoder); + } + return encoder; + } + } + + // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. + protected override void WriteEncodedScalar(StringBuilder builder, uint value) + { + uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); + do + { + char highNibble, lowNibble; + HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); + builder.Append('%'); + builder.Append(highNibble); + builder.Append(lowNibble); + } while ((asUtf8 >>= 8) != 0); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin new file mode 100644 index 0000000000000000000000000000000000000000..61406a9b82543917f6fa3e032461f6222f8902ba GIT binary patch literal 8192 zcmeHMy>1gh5MFZ~@6^8!2o1s)?I`3-2@Qy|{JmLlZR1rih> zT_j7SN$emO7{&JR&CLC55<(m)5sKJ3-R#Wl%--y`Kf1eh&N;4$poV%~b2ZZ9=nM1l zrQ2E|f>y%$yK-j9aw8L-<36AIMb&=jl9YYiP^)J``BeHYgod>|3PTEc+WW=4{5b2q z?0gt8r<1PeFFtj*Z#^5ZcauJPw>+HncN%WQiJPeZ;jFhk5Px?tY<|8!Mo_2s1;G5y)^SxC_$pE0wD% zv!I~{=kg4~ojT6%)_5>`WRf7wARi2Xkj)ARUUcG=(;s5@(iSMio$yd)W(=zmf%mjc z%qPKK$g034#`>>OT!;Z@5KoIP70B2_(xObZ=@<_ zlu*ty>1_tlTjq^Ae{m4HAR}{Hn=8@+mdwVrqi(FDOcgKLk9nEsP>WJ56;k;GOJ%Kc zwH7;#4xAko6uR1ur5GO9cFg&62}A6PSqUF~korNDQ_P089 zZj=)~mJxx7z?ukbRqHygpEV(iZV`cqKtv!S5D|z7Lc6q|?4AL``Ykpj8J|YkixS zF0n52Cmi)9liYj{yG`rsi7FhU$?M@IsD8sO4(k+8JxogMNa-h2nxAg57o6OLb+lM4 IHi_Kh-^J+0%>V!Z literal 0 HcmV?d00001 diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index e4e0e0cb08..57c6db035f 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods such as URL encoding.", + "compilationOptions": { + "allowUnsafe": true + }, "dependencies": { }, "frameworks": { @@ -11,8 +14,11 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*" + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Threading": "4.0.10-beta-*" } } } From fc7ed3a9cd570d6829991f2e812dbe2bd4f64471 Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 11 Feb 2015 11:37:07 -0800 Subject: [PATCH 216/846] Add TLS token binding feature --- .../ITlsTokenBindingFeature.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs new file mode 100644 index 0000000000..d9aaf0fcd5 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Http.Interfaces +{ + /// + /// Provides information regarding TLS token binding parameters. + /// + /// + /// TLS token bindings help mitigate the risk of impersonation by an attacker in the + /// event an authenticated client's bearer tokens are somehow exfiltrated from the + /// client's machine. See https://datatracker.ietf.org/doc/draft-popov-token-binding/ + /// for more information. + /// + [AssemblyNeutral] + public interface ITlsTokenBindingFeature + { + /// + /// Gets the 'provided' token binding identifier associated with the request. + /// + /// The token binding identifier, or null if the client did not + /// supply a 'provided' token binding or valid proof of possession of the + /// associated private key. The caller should treat this identifier as an + /// opaque blob and should not try to parse it. + byte[] GetProvidedTokenBindingId(); + + /// + /// Gets the 'referred' token binding identifier associated with the request. + /// + /// The token binding identifier, or null if the client did not + /// supply a 'referred' token binding or valid proof of possession of the + /// associated private key. The caller should treat this identifier as an + /// opaque blob and should not try to parse it. + byte[] GetReferredTokenBindingId(); + } +} From 14c872d981bde92d64ad05b328fe9205ae1ed967 Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 11 Feb 2015 12:03:47 -0800 Subject: [PATCH 217/846] Update HtmlEncoder to wrap UnicodeEncoderBase --- .../Encoders/HtmlEncoder.cs | 201 +++++------------- 1 file changed, 56 insertions(+), 145 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs index b0559d7219..0f205b3e43 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -3,7 +3,6 @@ using System; using System.Diagnostics; -using System.Runtime.CompilerServices; using System.Text; using System.Threading; @@ -21,14 +20,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // The default HtmlEncoder (Basic Latin), instantiated on demand private static HtmlEncoder _defaultEncoder; - // A bitmap of characters which are allowed to be returned unescaped. - private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + // The inner encoder, responsible for the actual encoding routines + private readonly HtmlUnicodeEncoder _innerUnicodeEncoder; /// /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. /// public HtmlEncoder() - : this(CodePointFilters.BasicLatin) + : this(HtmlUnicodeEncoder.BasicLatin) { } @@ -36,41 +35,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// Instantiates an encoder using a custom allow list of characters. /// public HtmlEncoder(params ICodePointFilter[] filters) + : this(new HtmlUnicodeEncoder(filters)) { - if (filters == null) - { - return; // no characters are allowed, just no-op immediately - } + } - // Punch a hole for each allowed code point across all filters (this is an OR). - // We don't allow supplementary (astral) characters for now. - foreach (var filter in filters) - { - foreach (var codePoint in filter.GetAllowedCodePoints()) - { - if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) - { - AllowCharacter((char)codePoint); - } - } - } - - // Forbid characters that are special in HTML - ForbidCharacter('<'); - ForbidCharacter('>'); - ForbidCharacter('&'); - ForbidCharacter('\''); // can be used to escape attributes - ForbidCharacter('\"'); // can be used to escape attributes - ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks - - // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zl, Zp) - uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); - Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); - for (int i = 0; i < _allowedCharsBitmap.Length; i++) - { - _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; - } + private HtmlEncoder(HtmlUnicodeEncoder innerEncoder) + { + Debug.Assert(innerEncoder != null); + _innerUnicodeEncoder = innerEncoder; } /// @@ -91,139 +63,78 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } - // Marks a character as allowed (can be returned unencoded) - private void AllowCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] |= 0x1U << offset; - } - - // Marks a character as forbidden (must be returned encoded) - private void ForbidCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] &= ~(0x1U << offset); - } - /// /// Everybody's favorite HtmlEncode routine. /// public string HtmlEncode(string value) { - if (String.IsNullOrEmpty(value)) - { - return value; - } - - // Quick check: does the string need to be encoded at all? - // If not, just return the input string as-is. - for (int i = 0; i < value.Length; i++) - { - if (!IsCharacterAllowed(value[i])) - { - return HtmlEncodeImpl(value, i); - } - } - return value; + return _innerUnicodeEncoder.Encode(value); } - private string HtmlEncodeImpl(string input, int idxOfFirstCharWhichRequiresEncoding) + private sealed class HtmlUnicodeEncoder : UnicodeEncoderBase { - Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); - Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); + // A singleton instance of the basic latin encoder. + private static HtmlUnicodeEncoder _basicLatinSingleton; // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" // We don't need to worry about astral code points since they consume *two* input chars to - // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. - int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; - int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); - Debug.Assert(sbCapacity >= input.Length); + // generate at most 10 output chars ("􏿿"), which equates to 5 output chars per input char. + private const int MaxOutputCharsPerInputChar = 8; - // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, - // then begin encoding from the last (potentially requiring encoding) part of the input string. - StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); - fixed (char* pInput = input) + internal HtmlUnicodeEncoder(ICodePointFilter[] filters) + : base(filters, MaxOutputCharsPerInputChar) { - return HtmlEncodeImpl2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); } - } - private string HtmlEncodeImpl2(StringBuilder builder, char* input, uint charsRemaining) - { - while (charsRemaining != 0) + internal static HtmlUnicodeEncoder BasicLatin { - int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); - if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) + get { - // Supplementary characters should always be encoded numerically. - WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); - - // We consume two UTF-16 characters for a single supplementary character. - input += 2; - charsRemaining -= 2; - } - else - { - // Otherwise, this was a BMP character. - input++; - charsRemaining--; - char c = (char)nextScalar; - if (IsCharacterAllowed(c)) + HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); + if (encoder == null) { - builder.Append(c); - } - else - { - if (c == '<') { builder.Append("<"); } - else if (c == '>') { builder.Append(">"); } - else if (c == '&') { builder.Append("&"); } - else if (c == '\"') { builder.Append("""); } - else { WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); } + encoder = new HtmlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + Volatile.Write(ref _basicLatinSingleton, encoder); } + return encoder; } } - return builder.ToString(); - } - - // Determines whether the given character can be returned unencoded. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private bool IsCharacterAllowed(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; - } - - // Writes a scalar value as "�" - private static void WriteScalarAsHtmlEncodedEntity(StringBuilder builder, uint value) - { - // We're building the characters up in reverse - char* chars = stackalloc char[8 /* "FFFFFFFF" */]; - int numCharsWritten = 0; - do + // Writes a scalar value as an HTML-encoded entity. + protected override void WriteEncodedScalar(StringBuilder builder, uint value) { - Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); - // Pop off the last nibble - chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); - value >>= 4; - } while (value != 0); + if (value == (uint)'\"') { builder.Append("""); } + else if (value == (uint)'&') { builder.Append("&"); } + else if (value == (uint)'<') { builder.Append("<"); } + else if (value == (uint)'>') { builder.Append(">"); } + else { WriteEncodedScalarAsNumericEntity(builder, value); } + } - // Finally, write out the HTML-encoded scalar value. - builder.Append('&'); - builder.Append('#'); - builder.Append('x'); - Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); - do + // Writes a scalar value as an HTML-encoded numeric entity. + private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) { - builder.Append(chars[--numCharsWritten]); - } while (numCharsWritten != 0); - builder.Append(';'); + // We're building the characters up in reverse + char* chars = stackalloc char[8 /* "FFFFFFFF" */]; + int numCharsWritten = 0; + do + { + Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); + // Pop off the last nibble + chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); + value >>= 4; + } while (value != 0); + + // Finally, write out the HTML-encoded scalar value. + builder.Append('&'); + builder.Append('#'); + builder.Append('x'); + Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); + do + { + builder.Append(chars[--numCharsWritten]); + } while (numCharsWritten != 0); + builder.Append(';'); + } } } } From e5c6fd401fac99d93d4c4d1c9b93eaab70740baf Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 11 Feb 2015 17:39:39 -0800 Subject: [PATCH 218/846] Add TextWriter-based overloads to the encoding routines These make the core implementations slightly slower but provide the benefit of reducing allocations, which is useful when these methods are called frequently by Razor. --- .../Encoders/EncoderExtensions.cs | 55 ++++++ .../Encoders/HtmlEncoder.cs | 42 +++-- .../Encoders/IHtmlEncoder.cs | 24 ++- .../Encoders/IJavaScriptStringEncoder.cs | 13 ++ .../Encoders/IUrlEncoder.cs | 20 +++ .../Encoders/JavaScriptStringEncoder.cs | 58 ++++--- .../Encoders/UnicodeEncoderBase.cs | 164 ++++++++++++++++-- .../Encoders/UrlEncoder.cs | 26 ++- 8 files changed, 350 insertions(+), 52 deletions(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs new file mode 100644 index 0000000000..57c3b59ba7 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Helpful extension methods for the encoder classes. + /// + public static class EncoderExtensions + { + /// + /// HTML-encodes a string and writes the result to the supplied output. + /// + /// + /// The encoded value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + public static void HtmlEncode([NotNull] this IHtmlEncoder htmlEncoder, string value, [NotNull] TextWriter output) + { + if (!String.IsNullOrEmpty(value)) + { + htmlEncoder.HtmlEncode(value, 0, value.Length, output); + } + } + + /// + /// JavaScript-escapes a string and writes the result to the supplied output. + /// + public static void JavaScriptStringEncode([NotNull] this IJavaScriptStringEncoder javaScriptStringEncoder, string value, [NotNull] TextWriter output) + { + if (!String.IsNullOrEmpty(value)) + { + javaScriptStringEncoder.JavaScriptStringEncode(value, 0, value.Length, output); + } + } + + /// + /// URL-encodes a string and writes the result to the supplied output. + /// + /// + /// The encoded value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + public static void UrlEncode([NotNull] this IUrlEncoder urlEncoder, string value, [NotNull] TextWriter output) + { + if (!String.IsNullOrEmpty(value)) + { + urlEncoder.UrlEncode(value, 0, value.Length, output); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs index 0f205b3e43..30a3da320e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -3,7 +3,7 @@ using System; using System.Diagnostics; -using System.Text; +using System.IO; using System.Threading; namespace Microsoft.AspNet.WebUtilities.Encoders @@ -63,6 +63,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } + /// + /// Everybody's favorite HtmlEncode routine. + /// + public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + /// /// Everybody's favorite HtmlEncode routine. /// @@ -71,6 +79,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return _innerUnicodeEncoder.Encode(value); } + /// + /// Everybody's favorite HtmlEncode routine. + /// + public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + private sealed class HtmlUnicodeEncoder : UnicodeEncoderBase { // A singleton instance of the basic latin encoder. @@ -101,17 +117,17 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as an HTML-encoded entity. - protected override void WriteEncodedScalar(StringBuilder builder, uint value) + protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) { - if (value == (uint)'\"') { builder.Append("""); } - else if (value == (uint)'&') { builder.Append("&"); } - else if (value == (uint)'<') { builder.Append("<"); } - else if (value == (uint)'>') { builder.Append(">"); } - else { WriteEncodedScalarAsNumericEntity(builder, value); } + if (value == (uint)'\"') { writeString(output, """); } + else if (value == (uint)'&') { writeString(output, "&"); } + else if (value == (uint)'<') { writeString(output, "<"); } + else if (value == (uint)'>') { writeString(output, ">"); } + else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } } // Writes a scalar value as an HTML-encoded numeric entity. - private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) + private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class { // We're building the characters up in reverse char* chars = stackalloc char[8 /* "FFFFFFFF" */]; @@ -125,15 +141,15 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } while (value != 0); // Finally, write out the HTML-encoded scalar value. - builder.Append('&'); - builder.Append('#'); - builder.Append('x'); + writeChar(output, '&'); + writeChar(output, '#'); + writeChar(output, 'x'); Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); do { - builder.Append(chars[--numCharsWritten]); + writeChar(output, chars[--numCharsWritten]); } while (numCharsWritten != 0); - builder.Append(';'); + writeChar(output, ';'); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs index e80fb908a7..89947567ce 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs @@ -1,7 +1,9 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +using System; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; namespace Microsoft.AspNet.WebUtilities.Encoders { @@ -10,6 +12,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// public interface IHtmlEncoder { + /// + /// HTML-encodes a character array and writes the result to the supplied + /// output. + /// + /// + /// The encoded value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + void HtmlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + /// /// HTML-encodes a given input string. /// @@ -21,5 +33,15 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// as long as the attribute value is surrounded by single or double quotes. /// string HtmlEncode(string value); + + /// + /// HTML-encodes a given input string and writes the result to the + /// supplied output. + /// + /// + /// The encoded value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + void HtmlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs index 8a287548cf..502c699ac4 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; namespace Microsoft.AspNet.WebUtilities.Encoders { @@ -10,6 +11,12 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// public interface IJavaScriptStringEncoder { + /// + /// JavaScript-escapes a character array and writes the result to the + /// supplied output. + /// + void JavaScriptStringEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + /// /// JavaScript-escapes a given input string. /// @@ -17,5 +24,11 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// The JavaScript-escaped value, or null if the input string was null. /// string JavaScriptStringEncode(string value); + + /// + /// JavaScript-escapes a given input string and writes the + /// result to the supplied output. + /// + void JavaScriptStringEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs index 0806f5f971..c04014570e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; namespace Microsoft.AspNet.WebUtilities.Encoders { @@ -10,6 +11,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// public interface IUrlEncoder { + /// + /// URL-escapes a character array and writes the result to the supplied + /// output. + /// + /// + /// The encoded value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + void UrlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + /// /// URL-escapes a given input string. /// @@ -21,5 +32,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// fragment portion of a URI. /// string UrlEncode(string value); + + /// + /// URL-escapes a string and writes the result to the supplied output. + /// + /// + /// The encoded value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + void UrlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs index 671d2081b3..460cae57cd 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs @@ -3,7 +3,7 @@ using System; using System.Diagnostics; -using System.Text; +using System.IO; using System.Threading; namespace Microsoft.AspNet.WebUtilities.Encoders @@ -63,6 +63,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } + /// + /// Everybody's favorite JavaScriptStringEncode routine. + /// + public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + /// /// Everybody's favorite JavaScriptStringEncode routine. /// @@ -71,6 +79,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return _innerUnicodeEncoder.Encode(value); } + /// + /// Everybody's favorite JavaScriptStringEncode routine. + /// + public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + private sealed class JavaScriptStringUnicodeEncoder : UnicodeEncoderBase { // A singleton instance of the basic latin encoder. @@ -108,7 +124,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf - protected override void WriteEncodedScalar(StringBuilder builder, uint value) + protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) { // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". @@ -117,46 +133,46 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // be written out as numeric entities for defense-in-depth. // See UnicodeEncoderBase ctor comments for more info. - if (value == (uint)'\b') { builder.Append(@"\b"); } - else if (value == (uint)'\t') { builder.Append(@"\t"); } - else if (value == (uint)'\n') { builder.Append(@"\n"); } - else if (value == (uint)'\f') { builder.Append(@"\f"); } - else if (value == (uint)'\r') { builder.Append(@"\r"); } - else if (value == (uint)'/') { builder.Append(@"\/"); } - else if (value == (uint)'\\') { builder.Append(@"\\"); } - else { WriteEncodedScalarAsNumericEntity(builder, value); } + if (value == (uint)'\b') { writeString(output, @"\b"); } + else if (value == (uint)'\t') { writeString(output, @"\t"); } + else if (value == (uint)'\n') { writeString(output, @"\n"); } + else if (value == (uint)'\f') { writeString(output, @"\f"); } + else if (value == (uint)'\r') { writeString(output, @"\r"); } + else if (value == (uint)'/') { writeString(output, @"\/"); } + else if (value == (uint)'\\') { writeString(output, @"\\"); } + else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } } // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). - private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) + private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class { if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) { // Convert this back to UTF-16 and write out both characters. char leadingSurrogate, trailingSurrogate; UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); - WriteEncodedSingleCharacter(builder, leadingSurrogate); - WriteEncodedSingleCharacter(builder, trailingSurrogate); + WriteEncodedSingleCharacter(output, writeChar, leadingSurrogate); + WriteEncodedSingleCharacter(output, writeChar, trailingSurrogate); } else { // This is only a single character. - WriteEncodedSingleCharacter(builder, value); + WriteEncodedSingleCharacter(output, writeChar, value); } } // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. - private static void WriteEncodedSingleCharacter(StringBuilder builder, uint value) + private static void WriteEncodedSingleCharacter(T output, Action writeChar, uint value) where T : class { Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); // Encode this as 6 chars "\uFFFF". - builder.Append('\\'); - builder.Append('u'); - builder.Append(HexUtil.IntToChar(value >> 12)); - builder.Append(HexUtil.IntToChar((value >> 8) & 0xFU)); - builder.Append(HexUtil.IntToChar((value >> 4) & 0xFU)); - builder.Append(HexUtil.IntToChar(value & 0xFU)); + writeChar(output, '\\'); + writeChar(output, 'u'); + writeChar(output, HexUtil.IntToChar(value >> 12)); + writeChar(output, HexUtil.IntToChar((value >> 8) & 0xFU)); + writeChar(output, HexUtil.IntToChar((value >> 4) & 0xFU)); + writeChar(output, HexUtil.IntToChar(value & 0xFU)); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs index 2f04910b30..d370fbe4f6 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using System.IO; using System.Runtime.CompilerServices; using System.Text; @@ -10,6 +11,12 @@ namespace Microsoft.AspNet.WebUtilities.Encoders { internal unsafe abstract class UnicodeEncoderBase { + // Stubs for appending data to a TextWriter or StringBuilder + private static readonly Action _appendCharToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); + private static readonly Action _appendCharToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); + private static readonly Action _appendStringToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); + private static readonly Action _appendStringToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); + // A bitmap of characters which are allowed to be returned unescaped. private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; @@ -70,6 +77,26 @@ namespace Microsoft.AspNet.WebUtilities.Encoders _allowedCharsBitmap[index] |= 0x1U << offset; } + private static void AppendToStringBuilder(StringBuilder builder, char value) + { + builder.Append(value); + } + + private static void AppendToStringBuilder(StringBuilder builder, string value) + { + builder.Append(value); + } + + private static void AppendToTextWriter(TextWriter writer, char value) + { + writer.Write(value); + } + + private static void AppendToTextWriter(TextWriter writer, string value) + { + writer.Write(value); + } + // Marks a character as forbidden (must be returned encoded) protected void ForbidCharacter(char c) { @@ -79,6 +106,37 @@ namespace Microsoft.AspNet.WebUtilities.Encoders _allowedCharsBitmap[index] &= ~(0x1U << offset); } + /// + /// Entry point to the encoder. + /// + public void Encode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output) + { + // Input checking + ValidateInputs(startIndex, charCount, actualInputLength: value.Length); + + if (charCount != 0) + { + fixed (char* pChars = value) + { + int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(&pChars[startIndex], charCount); + if (indexOfFirstCharWhichRequiresEncoding < 0) + { + // All chars are valid - just copy the buffer as-is. + output.Write(value, startIndex, charCount); + } + else + { + // Flush all chars which are known to be valid, then encode the remainder individually + if (indexOfFirstCharWhichRequiresEncoding > 0) + { + output.Write(value, startIndex, indexOfFirstCharWhichRequiresEncoding); + } + EncodeCore(&pChars[startIndex + indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); + } + } + } + } + /// /// Entry point to the encoder. /// @@ -95,22 +153,60 @@ namespace Microsoft.AspNet.WebUtilities.Encoders { if (!IsCharacterAllowed(value[i])) { - return EncodeCore(value, i); + return EncodeCore(value, idxOfFirstCharWhichRequiresEncoding: i); } } return value; } + /// + /// Entry point to the encoder. + /// + public void Encode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output) + { + // Input checking + ValidateInputs(startIndex, charCount, actualInputLength: value.Length); + + if (charCount != 0) + { + fixed (char* pChars = value) + { + if (charCount == value.Length) + { + // Optimize for the common case: we're being asked to encode the entire input string + // (not just a subset). If all characters are safe, we can just spit it out as-is. + int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(pChars, charCount); + if (indexOfFirstCharWhichRequiresEncoding < 0) + { + output.Write(value); + } + else + { + // Flush all chars which are known to be valid, then encode the remainder individually + for (int i = 0; i < indexOfFirstCharWhichRequiresEncoding; i++) + { + output.Write(pChars[i]); + } + EncodeCore(&pChars[indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); + } + } + else + { + // We're being asked to encode a subset, so we need to go through the slow path of appending + // each character individually. + EncodeCore(&pChars[startIndex], (uint)charCount, output); + } + } + } + } + private string EncodeCore(string input, int idxOfFirstCharWhichRequiresEncoding) { Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); - // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" - // We don't need to worry about astral code points since they consume *two* input chars to - // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; - int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); + int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, _maxOutputCharsPerInputChar)); Debug.Assert(sbCapacity >= input.Length); // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, @@ -118,11 +214,17 @@ namespace Microsoft.AspNet.WebUtilities.Encoders StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); fixed (char* pInput = input) { - return EncodeCore2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + EncodeCore(builder, _appendStringToStringBuilderStub, _appendCharToStringBuilderStub, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); } + return builder.ToString(); } - private string EncodeCore2(StringBuilder builder, char* input, uint charsRemaining) + private void EncodeCore(char* input, uint charsRemaining, TextWriter output) + { + EncodeCore(output, _appendStringToTextWriterStub, _appendCharToTextWriterStub, input, charsRemaining); + } + + private void EncodeCore(T output, Action writeString, Action writeChar, char* input, uint charsRemaining) where T : class { while (charsRemaining != 0) { @@ -130,7 +232,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) { // Supplementary characters should always be encoded numerically. - WriteEncodedScalar(builder, (uint)nextScalar); + WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); // We consume two UTF-16 characters for a single supplementary character. input += 2; @@ -144,16 +246,26 @@ namespace Microsoft.AspNet.WebUtilities.Encoders char c = (char)nextScalar; if (IsCharacterAllowed(c)) { - builder.Append(c); + writeChar(output, c); } else { - WriteEncodedScalar(builder, (uint)nextScalar); + WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); } } } + } - return builder.ToString(); + private int GetIndexOfFirstCharWhichRequiresEncoding(char* input, int inputLength) + { + for (int i = 0; i < inputLength; i++) + { + if (!IsCharacterAllowed(input[i])) + { + return i; + } + } + return -1; // no characters require encoding } // Determines whether the given character can be returned unencoded. @@ -166,6 +278,34 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; } - protected abstract void WriteEncodedScalar(StringBuilder builder, uint value); + private static T PrepareDelegate(T @del) where T : class + { +#if ASPNETCORE50 + // RuntimeHelpers.PrepareMethod doesn't exist on CoreCLR, so we'll depend + // on cross-gen for performance optimizations. + return del; +#else + // We prepare the method ahead of time to ensure that it's JITted before + // the delegate is constructed; this allows the delegate to point straight + // to the processor code rather than to the prestub dispatch code. + Delegate castDel = (Delegate)(object)del; + RuntimeHelpers.PrepareMethod(castDel.Method.MethodHandle); + return (T)(object)castDel.Method.CreateDelegate(typeof(T)); +#endif + } + + private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) + { + if (startIndex < 0 || startIndex > actualInputLength) + { + throw new ArgumentOutOfRangeException(nameof(startIndex)); + } + if (charCount < 0 || charCount > (actualInputLength - startIndex)) + { + throw new ArgumentOutOfRangeException(nameof(charCount)); + } + } + + protected abstract void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) where T : class; } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs index 81706559ff..2eda7cb52e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs @@ -3,7 +3,7 @@ using System; using System.Diagnostics; -using System.Text; +using System.IO; using System.Threading; namespace Microsoft.AspNet.WebUtilities.Encoders @@ -63,6 +63,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } + /// + /// Everybody's favorite UrlEncode routine. + /// + public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + /// /// Everybody's favorite UrlEncode routine. /// @@ -71,6 +79,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return _innerUnicodeEncoder.Encode(value); } + /// + /// Everybody's favorite UrlEncode routine. + /// + public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + private sealed class UrlUnicodeEncoder : UnicodeEncoderBase { // A singleton instance of the basic latin encoder. @@ -144,16 +160,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. - protected override void WriteEncodedScalar(StringBuilder builder, uint value) + protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) { uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); do { char highNibble, lowNibble; HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); - builder.Append('%'); - builder.Append(highNibble); - builder.Append(lowNibble); + writeChar(output, '%'); + writeChar(output, highNibble); + writeChar(output, lowNibble); } while ((asUtf8 >>= 8) != 0); } } From 26cd8d51b68578ede39366987a8230c075e93d3f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 12 Feb 2015 09:07:47 -0800 Subject: [PATCH 219/846] Removing ANIs --- src/Microsoft.AspNet.Http.Core/IFormFeature.cs | 2 -- .../AssemblyNeutralAttribute.cs | 13 ------------- .../IHttpApplicationFeature.cs | 2 -- .../IHttpBufferingFeature.cs | 3 --- .../IHttpClientCertificateFeature.cs | 2 -- .../IHttpConnectionFeature.cs | 2 -- .../IHttpRequestFeature.cs | 3 --- .../IHttpRequestLifetimeFeature.cs | 2 -- .../IHttpResponseFeature.cs | 2 -- .../IHttpSendFileFeature.cs | 2 -- .../IHttpUpgradeFeature.cs | 2 -- .../IHttpWebSocketFeature.cs | 2 -- src/Microsoft.AspNet.Http.Interfaces/ISession.cs | 2 -- .../ISessionFactory.cs | 4 ---- .../ISessionFeature.cs | 3 --- .../ITlsTokenBindingFeature.cs | 4 ---- .../IWebSocketAcceptContext.cs | 3 --- .../Security/IAuthTypeContext.cs | 2 -- .../Security/IAuthenticateContext.cs | 2 -- .../Security/IAuthenticationHandler.cs | 3 --- .../Security/IChallengeContext.cs | 2 -- .../Security/IHttpAuthenticationFeature.cs | 2 -- .../Security/ISignInContext.cs | 2 -- .../Security/ISignOutContext .cs | 2 -- src/Microsoft.AspNet.Http.Interfaces/project.json | 6 +----- src/Microsoft.AspNet.Http/IServerInformation.cs | 1 - 26 files changed, 1 insertion(+), 74 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs b/src/Microsoft.AspNet.Http.Core/IFormFeature.cs index 00f2645118..2447a8a3fe 100644 --- a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/IFormFeature.cs @@ -3,8 +3,6 @@ using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs deleted file mode 100644 index e1d35fbf25..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Framework.Runtime -{ - [AssemblyNeutralAttribute] - [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] - public sealed class AssemblyNeutralAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs index 2a885ecbbb..1548e74397 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpApplicationFeature { string AppName { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs index 83a6be21d0..d78b7e6e8c 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs @@ -1,11 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpBufferingFeature { void DisableRequestBuffering(); diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs index 556265c165..c49de2b9e2 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs @@ -4,11 +4,9 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpClientCertificateFeature { /// diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs index 51940f3709..dc1f8bd0ac 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpConnectionFeature { IPAddress RemoteIpAddress { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs index ca178a7dfa..9f2d3d3c06 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs @@ -1,14 +1,11 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpRequestFeature { string Protocol { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs index 498463dbc3..351e6eb5be 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpRequestLifetimeFeature { CancellationToken RequestAborted { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index b28700df9c..ecdbd93c2f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -4,11 +4,9 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpResponseFeature { int StatusCode { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs index dcb598e6ce..76e9b832e8 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs @@ -3,11 +3,9 @@ using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpSendFileFeature { Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs index 98d4e60cba..6441c8915a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs @@ -3,11 +3,9 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpUpgradeFeature { bool IsUpgradableRequest { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index d3aeaae642..8b79bde6d7 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -3,11 +3,9 @@ using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpWebSocketFeature { bool IsWebSocketRequest { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs index d18fca3e99..90d4e15566 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs @@ -3,11 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface ISession { void Load(); diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs index e8917db76d..ff162b8491 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs @@ -1,12 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface ISessionFactory { bool IsAvailable { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs index 360e407c65..ffe6e91eac 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs @@ -1,12 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { // TODO: Is there any reason not to flatten the Factory down into the Feature? - [AssemblyNeutral] public interface ISessionFeature { ISessionFactory Factory { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs index d9aaf0fcd5..d5211d9464 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs @@ -1,9 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { /// @@ -15,7 +12,6 @@ namespace Microsoft.AspNet.Http.Interfaces /// client's machine. See https://datatracker.ietf.org/doc/draft-popov-token-binding/ /// for more information. /// - [AssemblyNeutral] public interface ITlsTokenBindingFeature { /// diff --git a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs index 80becb585a..1ae4306712 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs @@ -1,11 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IWebSocketAcceptContext { string SubProtocol { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs index d3308720c9..ef952847b0 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IAuthTypeContext { void Accept(IDictionary description); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 1e354a8149..3e09a1aa5e 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -3,11 +3,9 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IAuthenticateContext { IEnumerable AuthenticationTypes { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index ca68c40668..32ed5f2cf8 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -1,13 +1,10 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IAuthenticationHandler { void GetDescriptions(IAuthTypeContext context); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index 94d64b6257..cb44dc300b 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IChallengeContext { IEnumerable AuthenticationTypes {get;} diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index 74605995a9..183ebe9d2f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IHttpAuthenticationFeature { ClaimsPrincipal User { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index eea09aa055..c6d1b4efc0 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -3,11 +3,9 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface ISignInContext { IEnumerable Identities { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs index fd4fe89b11..426c601e24 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface ISignOutContext { IEnumerable AuthenticationTypes { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index b2d2d6f3e0..3b6666ff83 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -6,14 +6,10 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.IO": "4.0.10-beta-*", "System.Net.Primitives": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Security.Principal": "4.0.0-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs index f7f267996c..e99042e637 100644 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -3,7 +3,6 @@ namespace Microsoft.AspNet.Builder { - // TODO: [AssemblyNeutral] public interface IServerInformation { string Name { get; } From 0dd3a494638a50de0fc302e234215ba60ac8857a Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 12 Feb 2015 11:13:44 -0800 Subject: [PATCH 220/846] Perf: Eliminate chatty virtual dispatches This gives a speedup of approx. 20% (for overloads which take TextWriter) to 40% (for overloads which don't take TextWriter) for inputs in which at least one character requires encoding. --- .../Encoders/HtmlEncoder.cs | 24 ++-- .../Encoders/JavaScriptStringEncoder.cs | 40 +++---- .../Encoders/UnicodeEncoderBase.cs | 107 ++++++++++-------- .../Encoders/UrlEncoder.cs | 8 +- 4 files changed, 94 insertions(+), 85 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs index 30a3da320e..14af7db2c6 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -117,17 +117,17 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as an HTML-encoded entity. - protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) + protected override void WriteEncodedScalar(ref Writer writer, uint value) { - if (value == (uint)'\"') { writeString(output, """); } - else if (value == (uint)'&') { writeString(output, "&"); } - else if (value == (uint)'<') { writeString(output, "<"); } - else if (value == (uint)'>') { writeString(output, ">"); } - else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } + if (value == (uint)'\"') { writer.Write("""); } + else if (value == (uint)'&') { writer.Write("&"); } + else if (value == (uint)'<') { writer.Write("<"); } + else if (value == (uint)'>') { writer.Write(">"); } + else { WriteEncodedScalarAsNumericEntity(ref writer, value); } } // Writes a scalar value as an HTML-encoded numeric entity. - private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class + private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) { // We're building the characters up in reverse char* chars = stackalloc char[8 /* "FFFFFFFF" */]; @@ -141,15 +141,15 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } while (value != 0); // Finally, write out the HTML-encoded scalar value. - writeChar(output, '&'); - writeChar(output, '#'); - writeChar(output, 'x'); + writer.Write('&'); + writer.Write('#'); + writer.Write('x'); Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); do { - writeChar(output, chars[--numCharsWritten]); + writer.Write(chars[--numCharsWritten]); } while (numCharsWritten != 0); - writeChar(output, ';'); + writer.Write(';'); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs index 460cae57cd..39d7cef34f 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf - protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) + protected override void WriteEncodedScalar(ref Writer writer, uint value) { // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". @@ -133,46 +133,46 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // be written out as numeric entities for defense-in-depth. // See UnicodeEncoderBase ctor comments for more info. - if (value == (uint)'\b') { writeString(output, @"\b"); } - else if (value == (uint)'\t') { writeString(output, @"\t"); } - else if (value == (uint)'\n') { writeString(output, @"\n"); } - else if (value == (uint)'\f') { writeString(output, @"\f"); } - else if (value == (uint)'\r') { writeString(output, @"\r"); } - else if (value == (uint)'/') { writeString(output, @"\/"); } - else if (value == (uint)'\\') { writeString(output, @"\\"); } - else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } + if (value == (uint)'\b') { writer.Write(@"\b"); } + else if (value == (uint)'\t') { writer.Write(@"\t"); } + else if (value == (uint)'\n') { writer.Write(@"\n"); } + else if (value == (uint)'\f') { writer.Write(@"\f"); } + else if (value == (uint)'\r') { writer.Write(@"\r"); } + else if (value == (uint)'/') { writer.Write(@"\/"); } + else if (value == (uint)'\\') { writer.Write(@"\\"); } + else { WriteEncodedScalarAsNumericEntity(ref writer, value); } } // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). - private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class + private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) { if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) { // Convert this back to UTF-16 and write out both characters. char leadingSurrogate, trailingSurrogate; UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); - WriteEncodedSingleCharacter(output, writeChar, leadingSurrogate); - WriteEncodedSingleCharacter(output, writeChar, trailingSurrogate); + WriteEncodedSingleCharacter(ref writer, leadingSurrogate); + WriteEncodedSingleCharacter(ref writer, trailingSurrogate); } else { // This is only a single character. - WriteEncodedSingleCharacter(output, writeChar, value); + WriteEncodedSingleCharacter(ref writer, value); } } // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. - private static void WriteEncodedSingleCharacter(T output, Action writeChar, uint value) where T : class + private static void WriteEncodedSingleCharacter(ref Writer writer, uint value) { Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); // Encode this as 6 chars "\uFFFF". - writeChar(output, '\\'); - writeChar(output, 'u'); - writeChar(output, HexUtil.IntToChar(value >> 12)); - writeChar(output, HexUtil.IntToChar((value >> 8) & 0xFU)); - writeChar(output, HexUtil.IntToChar((value >> 4) & 0xFU)); - writeChar(output, HexUtil.IntToChar(value & 0xFU)); + writer.Write('\\'); + writer.Write('u'); + writer.Write(HexUtil.IntToChar(value >> 12)); + writer.Write(HexUtil.IntToChar((value >> 8) & 0xFU)); + writer.Write(HexUtil.IntToChar((value >> 4) & 0xFU)); + writer.Write(HexUtil.IntToChar(value & 0xFU)); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs index d370fbe4f6..7b6c0ae50e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -11,12 +11,6 @@ namespace Microsoft.AspNet.WebUtilities.Encoders { internal unsafe abstract class UnicodeEncoderBase { - // Stubs for appending data to a TextWriter or StringBuilder - private static readonly Action _appendCharToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); - private static readonly Action _appendCharToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); - private static readonly Action _appendStringToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); - private static readonly Action _appendStringToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); - // A bitmap of characters which are allowed to be returned unescaped. private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; @@ -77,26 +71,6 @@ namespace Microsoft.AspNet.WebUtilities.Encoders _allowedCharsBitmap[index] |= 0x1U << offset; } - private static void AppendToStringBuilder(StringBuilder builder, char value) - { - builder.Append(value); - } - - private static void AppendToStringBuilder(StringBuilder builder, string value) - { - builder.Append(value); - } - - private static void AppendToTextWriter(TextWriter writer, char value) - { - writer.Write(value); - } - - private static void AppendToTextWriter(TextWriter writer, string value) - { - writer.Write(value); - } - // Marks a character as forbidden (must be returned encoded) protected void ForbidCharacter(char c) { @@ -212,19 +186,21 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, // then begin encoding from the last (potentially requiring encoding) part of the input string. StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); + Writer writer = new Writer(builder); fixed (char* pInput = input) { - EncodeCore(builder, _appendStringToStringBuilderStub, _appendCharToStringBuilderStub, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + EncodeCore(ref writer, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); } return builder.ToString(); } private void EncodeCore(char* input, uint charsRemaining, TextWriter output) { - EncodeCore(output, _appendStringToTextWriterStub, _appendCharToTextWriterStub, input, charsRemaining); + Writer writer = new Writer(output); + EncodeCore(ref writer, input, charsRemaining); } - private void EncodeCore(T output, Action writeString, Action writeChar, char* input, uint charsRemaining) where T : class + private void EncodeCore(ref Writer writer, char* input, uint charsRemaining) { while (charsRemaining != 0) { @@ -232,7 +208,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) { // Supplementary characters should always be encoded numerically. - WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); + WriteEncodedScalar(ref writer, (uint)nextScalar); // We consume two UTF-16 characters for a single supplementary character. input += 2; @@ -246,11 +222,11 @@ namespace Microsoft.AspNet.WebUtilities.Encoders char c = (char)nextScalar; if (IsCharacterAllowed(c)) { - writeChar(output, c); + writer.Write(c); } else { - WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); + WriteEncodedScalar(ref writer, (uint)nextScalar); } } } @@ -278,22 +254,6 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; } - private static T PrepareDelegate(T @del) where T : class - { -#if ASPNETCORE50 - // RuntimeHelpers.PrepareMethod doesn't exist on CoreCLR, so we'll depend - // on cross-gen for performance optimizations. - return del; -#else - // We prepare the method ahead of time to ensure that it's JITted before - // the delegate is constructed; this allows the delegate to point straight - // to the processor code rather than to the prestub dispatch code. - Delegate castDel = (Delegate)(object)del; - RuntimeHelpers.PrepareMethod(castDel.Method.MethodHandle); - return (T)(object)castDel.Method.CreateDelegate(typeof(T)); -#endif - } - private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) { if (startIndex < 0 || startIndex > actualInputLength) @@ -306,6 +266,55 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } - protected abstract void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) where T : class; + protected abstract void WriteEncodedScalar(ref Writer writer, uint value); + + /// + /// Provides an abstraction over both StringBuilder and TextWriter. + /// Declared as a struct so we can allocate on the stack and pass by + /// reference. Eliminates chatty virtual dispatches on hot paths. + /// + protected struct Writer + { + private readonly StringBuilder _innerBuilder; + private readonly TextWriter _innerWriter; + + public Writer(StringBuilder innerBuilder) + { + _innerBuilder = innerBuilder; + _innerWriter = null; + } + + public Writer(TextWriter innerWriter) + { + _innerBuilder = null; + _innerWriter = innerWriter; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Write(char value) + { + if (_innerBuilder != null) + { + _innerBuilder.Append(value); + } + else + { + _innerWriter.Write(value); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Write(string value) + { + if (_innerBuilder != null) + { + _innerBuilder.Append(value); + } + else + { + _innerWriter.Write(value); + } + } + } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs index 2eda7cb52e..1a7b71799c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs @@ -160,16 +160,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. - protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) + protected override void WriteEncodedScalar(ref Writer writer, uint value) { uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); do { char highNibble, lowNibble; HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); - writeChar(output, '%'); - writeChar(output, highNibble); - writeChar(output, lowNibble); + writer.Write('%'); + writer.Write(highNibble); + writer.Write(lowNibble); } while ((asUtf8 >>= 8) != 0); } } From fc524872940ad3f8de6befe2272fd003f925ff45 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 13 Feb 2015 14:12:40 -0800 Subject: [PATCH 221/846] Encoders should forbid Zs (space separator) characters except U+0020 SPACE --- .../Encoders/UnicodeEncoderBase.cs | 2 +- .../unicode-7.0.0-defined-characters.bin | Bin 8192 -> 8192 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs index 7b6c0ae50e..19b5ddd90a 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zl, Zp) + // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); for (int i = 0; i < _allowedCharsBitmap.Length; i++) diff --git a/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin index 61406a9b82543917f6fa3e032461f6222f8902ba..c9b36c871d6146d5c25044cd405807c15641d3f3 100644 GIT binary patch delta 48 zcmZp0XmFSy!uW6UM3$(H`H4)7|2AJ_(r4sh`0@Y${~93v|G$1S56c%upadh^e@Ory C&lg?* delta 46 vcmZp0XmFSyGI=6P^v3)|CdU7pFEZ&f^85#ZKVb6zW*(L=j6exSw*Qg<8h{vR From d0543305f007b2826f395595b8871f2642ad54c6 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 16 Feb 2015 13:30:36 -0800 Subject: [PATCH 222/846] Add project.lock.json to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 08e21e25bf..ac82da7568 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ nuget.exe *.ncrunchsolution *.*sdf *.ipch -*.sln.ide \ No newline at end of file +*.sln.ide +project.lock.json From 3f9423eda9ab8e227970592815b29146f892a305 Mon Sep 17 00:00:00 2001 From: Levi B Date: Mon, 16 Feb 2015 14:54:59 -0800 Subject: [PATCH 223/846] Provide a facility for registering encoder services --- .../Encoders/EncoderOptions.cs | 21 ++++++++++ .../EncoderServiceCollectionExtensions.cs | 25 ++++++++++++ .../Encoders/EncoderServices.cs | 39 +++++++++++++++++++ .../project.json | 2 + 4 files changed, 87 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs new file mode 100644 index 0000000000..5cc6097284 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). + /// + public sealed class EncoderOptions + { + /// + /// Specifies code point tables which do not require escaping by the encoders. + /// + /// + /// By default, only Basic Latin is allowed. + /// + public ICodePointFilter[] CodePointFilters { get; set; } = new[] { Microsoft.AspNet.WebUtilities.Encoders.CodePointFilters.BasicLatin }; + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs new file mode 100644 index 0000000000..5e501e27a4 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.WebUtilities.Encoders; +using Microsoft.Framework.ConfigurationModel; + +namespace Microsoft.Framework.DependencyInjection +{ + public static class EncoderServiceCollectionExtensions + { + public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services) + { + return AddEncoders(services, configuration: null); + } + + public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) + { + services.AddOptions(configuration); + services.TryAdd(EncoderServices.GetDefaultServices(configuration)); + return services; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs new file mode 100644 index 0000000000..d6590d8731 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.OptionsModel; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + public static class EncoderServices + { + public static IEnumerable GetDefaultServices() + { + return GetDefaultServices(configuration: null); + } + + public static IEnumerable GetDefaultServices(IConfiguration configuration) + { + var describe = new ServiceDescriber(configuration); + + // Register the default encoders + // We want to call the 'Default' property getters lazily since they perform static caching + yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filters => new HtmlEncoder(filters))); + yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filters => new JavaScriptStringEncoder(filters))); + yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filters => new UrlEncoder(filters))); + } + + private static Func CreateFactory(Func parameterlessCtor, Func parameterfulCtor) + { + return serviceProvider => + { + var codePointFilters = serviceProvider?.GetService>()?.Options?.CodePointFilters; + return (codePointFilters != null) ? parameterfulCtor(codePointFilters) : parameterlessCtor(); + }; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index be234399ec..a5cf55cd04 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,9 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { From fa18a8fb30629382c907f20b8544bf7c2496ea44 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 17 Feb 2015 10:50:07 -0800 Subject: [PATCH 224/846] Rename HttpRequest.IsSecure -> HttpRequest.IsHttps --- src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 46fa1907b7..4c89f0f457 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Http.Core set { HttpRequestFeature.Scheme = value; } } - public override bool IsSecure + public override bool IsHttps { get { return string.Equals("https", Scheme, StringComparison.OrdinalIgnoreCase); } } diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 5ab2010a59..7465c30638 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Http /// Returns true if the owin.RequestScheme is https. /// /// true if this request is using https; otherwise, false. - public abstract bool IsSecure { get; } + public abstract bool IsHttps { get; } /// /// Gets or set the Host header. May include the port. diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 4a97095eda..148d80fcc0 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -99,7 +99,7 @@ namespace Microsoft.AspNet.Owin _context.Items[OwinConstants.OwinVersion] = "1.0"; } - if (context.Request.IsSecure) + if (context.Request.IsHttps) { _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); From c551ec24909f2b6b9102d25cd314b97bacc97143 Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 19 Feb 2015 14:14:04 -0800 Subject: [PATCH 225/846] Add encoder extension methods --- .../Encoders/EncoderExtensions.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs new file mode 100644 index 0000000000..65dbc541aa --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains extension methods for fetching encoders from a service provider. + /// + public static class EncoderExtensions + { + /// + /// Retrieves an IHtmlEncoder from a service provider. + /// + /// + /// This method is guaranteed never to return null. + /// It will return a default encoder instance if the service provider does not contain one. + /// + public static IHtmlEncoder GetHtmlEncoder([NotNull] this IServiceProvider serviceProvider) + { + return serviceProvider.GetService() ?? HtmlEncoder.Default; + } + + /// + /// Retrieves an IJavaScriptStringEncoder from a service provider. + /// + /// + /// This method is guaranteed never to return null. + /// It will return a default encoder instance if the service provider does not contain one. + /// + public static IJavaScriptStringEncoder GetJavaScriptStringEncoder([NotNull] this IServiceProvider serviceProvider) + { + return serviceProvider.GetService() ?? JavaScriptStringEncoder.Default; + } + + /// + /// Retrieves an IUrlEncoder from a service provider. + /// + /// + /// This method is guaranteed never to return null. + /// It will return a default encoder instance if the service provider does not contain one. + /// + public static IUrlEncoder GetUrlEncoder([NotNull] this IServiceProvider serviceProvider) + { + return serviceProvider.GetService() ?? UrlEncoder.Default; + } + } +} From 8d98d7620902fecb41fe11b5475414941bbfac60 Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 19 Feb 2015 14:42:20 -0800 Subject: [PATCH 226/846] Code comment clarifications --- src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs | 6 +++--- src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs index 89947567ce..b48aa2ddcf 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// output. /// /// - /// The encoded value is also safe for inclusion inside an HTML attribute + /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// void HtmlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// The HTML-encoded value, or null if the input string was null. /// /// - /// The return value is also safe for inclusion inside an HTML attribute + /// The return value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// string HtmlEncode(string value); @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// supplied output. /// /// - /// The encoded value is also safe for inclusion inside an HTML attribute + /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// void HtmlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs index c04014570e..464a92ba0e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// output. /// /// - /// The encoded value is safe for use in the segment, query, or + /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// void UrlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); @@ -28,7 +28,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// The URL-escaped value, or null if the input string was null. /// /// - /// The return value is safe for use in the segment, query, or + /// The return value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// string UrlEncode(string value); @@ -37,7 +37,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// URL-escapes a string and writes the result to the supplied output. /// /// - /// The encoded value is safe for use in the segment, query, or + /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// void UrlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); From 204fb08e01966bbbe0fc6d54848b222aa7a41e0b Mon Sep 17 00:00:00 2001 From: Levi B Date: Sun, 22 Feb 2015 12:19:22 -0800 Subject: [PATCH 227/846] Refactor Encoders into their own package --- HttpAbstractions.sln | 17 ++++++++++++- .../Encoders/EncoderExtensions.cs | 2 +- .../Encoders/EncoderOptions.cs | 7 ++--- .../EncoderServiceCollectionExtensions.cs | 2 +- .../Encoders/EncoderServices.cs | 2 +- .../project.json | 2 +- .../project.json | 10 ++------ .../CodePointFilters.cs | 7 ++--- .../EncoderCommon.cs | 2 +- .../EncoderExtensions.cs | 3 ++- .../HexUtil.cs | 2 +- .../HtmlEncoder.cs | 2 +- .../ICodePointFilter.cs | 2 +- .../IHtmlEncoder.cs | 3 ++- .../IJavaScriptStringEncoder.cs | 3 ++- .../IUrlEncoder.cs | 3 ++- .../JavaScriptStringEncoder.cs | 2 +- .../Microsoft.Framework.WebEncoders.kproj | 17 +++++++++++++ .../UnicodeEncoderBase.cs | 3 ++- .../UnicodeHelpers.cs | 2 +- .../UrlEncoder.cs | 2 +- .../unicode-7.0.0-defined-characters.bin | Bin .../project.json | 24 ++++++++++++++++++ 23 files changed, 88 insertions(+), 31 deletions(-) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/CodePointFilters.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/EncoderCommon.cs (97%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/EncoderExtensions.cs (96%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/HexUtil.cs (97%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/HtmlEncoder.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/ICodePointFilter.cs (92%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/IHtmlEncoder.cs (95%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/IJavaScriptStringEncoder.cs (93%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/IUrlEncoder.cs (95%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/JavaScriptStringEncoder.cs (99%) create mode 100644 src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/UnicodeEncoderBase.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/UnicodeHelpers.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/UrlEncoder.cs (99%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.Framework.WebEncoders}/compiler/resources/unicode-7.0.0-defined-characters.bin (100%) create mode 100644 src/Microsoft.Framework.WebEncoders/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 7a857f0800..40feee2b00 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22513.0 +VisualStudioVersion = 14.0.22609.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -37,6 +37,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.kproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.kproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -201,6 +203,18 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.ActiveCfg = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.Build.0 = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.Build.0 = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.Build.0 = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.ActiveCfg = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -221,5 +235,6 @@ Global {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs index 65dbc541aa..6437376d08 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs @@ -5,7 +5,7 @@ using System; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains extension methods for fetching encoders from a service provider. diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs index 5cc6097284..828455651a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). @@ -14,8 +14,9 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// Specifies code point tables which do not require escaping by the encoders. /// /// - /// By default, only Basic Latin is allowed. + /// If this property is set to a null array, then by default only the 'Basic Latin' + /// code point filter is active. /// - public ICodePointFilter[] CodePointFilters { get; set; } = new[] { Microsoft.AspNet.WebUtilities.Encoders.CodePointFilters.BasicLatin }; + public ICodePointFilter[] CodePointFilters { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs index 5e501e27a4..7cd52e384f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs @@ -3,7 +3,7 @@ using System; using Microsoft.AspNet.Http; -using Microsoft.AspNet.WebUtilities.Encoders; +using Microsoft.Framework.WebEncoders; using Microsoft.Framework.ConfigurationModel; namespace Microsoft.Framework.DependencyInjection diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs index d6590d8731..8bac20cae8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs @@ -7,7 +7,7 @@ using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { public static class EncoderServices { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index a5cf55cd04..cb0f113bcd 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Framework.WebEncoders": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 57c6db035f..3a4c42267f 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,9 +1,6 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 common helper methods such as URL encoding.", - "compilationOptions": { - "allowUnsafe": true - }, + "description": "ASP.NET 5 common helper methods.", "dependencies": { }, "frameworks": { @@ -14,11 +11,8 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Threading": "4.0.10-beta-*" + "System.Runtime.Extensions": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs rename to src/Microsoft.Framework.WebEncoders/CodePointFilters.cs index 9268062fd5..781636916c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs @@ -4,11 +4,10 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains predefined Unicode code point filters. @@ -2576,9 +2575,11 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// private sealed class EmptyCodePointFilter : ICodePointFilter { + private static readonly int[] _emptyArray = new int[0]; // immutable since empty + public IEnumerable GetAllowedCodePoints() { - return Enumerable.Empty(); + return _emptyArray; } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs b/src/Microsoft.Framework.WebEncoders/EncoderCommon.cs similarity index 97% rename from src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs rename to src/Microsoft.Framework.WebEncoders/EncoderCommon.cs index a46ae99ed2..5bb405240a 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderCommon.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { internal static class EncoderCommon { diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs index 57c3b59ba7..6312387609 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs @@ -3,8 +3,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Helpful extension methods for the encoder classes. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs b/src/Microsoft.Framework.WebEncoders/HexUtil.cs similarity index 97% rename from src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs rename to src/Microsoft.Framework.WebEncoders/HexUtil.cs index 05fa1c5882..e4b512d1a5 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs +++ b/src/Microsoft.Framework.WebEncoders/HexUtil.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains helpers for dealing with byte-hex char conversions. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 14af7db2c6..7bcf12f1e3 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// A class which can perform HTML encoding given an allow list of characters which diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs similarity index 92% rename from src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs rename to src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs index e57b6535d2..1a4fc58774 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Represents a filter which allows only certain Unicode code points through. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs similarity index 95% rename from src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs index b48aa2ddcf..0456285b23 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs @@ -4,8 +4,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Provides services for HTML-encoding input. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs similarity index 93% rename from src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs index 502c699ac4..487c1ca35c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs @@ -3,8 +3,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Provides services for JavaScript-escaping strings. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs similarity index 95% rename from src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs index 464a92ba0e..2b4a8cbd57 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs @@ -3,8 +3,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Provides services for URL-escaping strings. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 39d7cef34f..0d61898614 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// A class which can perform JavaScript string escaping given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj new file mode 100644 index 0000000000..9a3c5e9646 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj @@ -0,0 +1,17 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + dd2ce416-765e-4000-a03e-c2ff165da1b6 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs rename to src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs index 19b5ddd90a..45ba58e02b 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs @@ -6,8 +6,9 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Text; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { internal unsafe abstract class UnicodeEncoderBase { diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs rename to src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs index 89424a2612..549f912e1a 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs @@ -7,7 +7,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains helpers for dealing with Unicode code points. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 1a7b71799c..8df2b5bce5 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// A class which can perform URL string escaping given an allow list of characters which diff --git a/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin rename to src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json new file mode 100644 index 0000000000..e61fe47605 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -0,0 +1,24 @@ +{ + "version": "1.0.0-*", + "description": "Contains encoders for HTML, JavaScript, and URLs.", + "compilationOptions": { + "allowUnsafe": true + }, + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, + "frameworks": { + "net45": { }, + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Reflection": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Threading": "4.0.10-beta-*" + } + } + } +} From 024c72b05a4d619fe1f35e34e75211fe49f608d3 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 24 Feb 2015 14:09:55 -0800 Subject: [PATCH 228/846] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ba75cfaa8..e9ec88786b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ HttpAbstractions ================ -Contains HTTP abstractions for ASP.NET vNext such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. +Contains HTTP abstractions for ASP.NET 5 such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. -This project is part of ASP.NET vNext. You can find samples, documentation and getting started instructions for ASP.NET vNext at the [Home](https://github.com/aspnet/home) repo. +This project is part of ASP.NET 5. You can find samples, documentation and getting started instructions for ASP.NET 5 at the [Home](https://github.com/aspnet/home) repo. From c5dc9abff6bac10da4154382e1a9b8b256525174 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 24 Feb 2015 11:51:41 -0800 Subject: [PATCH 229/846] Doc comment cleanup, API refactorings Rename CodePointFilters -> UnicodeBlocks Rework allowed / disallowed code point APIs for ease of use Move service registration APIs into WebEncoders project --- .../project.json | 2 - .../AllowedCharsBitmap.cs | 65 + .../CodePointFilter.cs | 273 ++ .../CodePointFilters.cs | 2586 ----------------- .../EncoderExtensions.cs | 22 +- .../EncoderOptions.cs | 7 +- .../EncoderServiceCollectionExtensions.cs | 4 +- .../EncoderServiceProviderExtensions.cs} | 4 +- .../EncoderServices.cs | 12 +- .../HtmlEncoder.cs | 23 +- .../IHtmlEncoder.cs | 3 +- .../IJavaScriptStringEncoder.cs | 7 + .../JavaScriptStringEncoder.cs | 23 +- .../UnicodeBlock.cs | 66 + .../UnicodeBlocks.cs | 64 + .../UnicodeBlocks.generated.cs | 2336 +++++++++++++++ .../UnicodeEncoderBase.cs | 70 +- .../UrlEncoder.cs | 23 +- .../project.json | 3 + 19 files changed, 2922 insertions(+), 2671 deletions(-) create mode 100644 src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs create mode 100644 src/Microsoft.Framework.WebEncoders/CodePointFilter.cs delete mode 100644 src/Microsoft.Framework.WebEncoders/CodePointFilters.cs rename src/{Microsoft.AspNet.Http.Extensions/Encoders => Microsoft.Framework.WebEncoders}/EncoderOptions.cs (65%) rename src/{Microsoft.AspNet.Http.Extensions/Encoders => Microsoft.Framework.WebEncoders}/EncoderServiceCollectionExtensions.cs (96%) rename src/{Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs => Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs} (95%) rename src/{Microsoft.AspNet.Http.Extensions/Encoders => Microsoft.Framework.WebEncoders}/EncoderServices.cs (73%) create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index cb0f113bcd..be234399ec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,9 +3,7 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.WebEncoders": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs new file mode 100644 index 0000000000..475c47a2b0 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; + +namespace Microsoft.Framework.WebEncoders +{ + internal struct AllowedCharsBitmap + { + private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); + private uint[] _allowedCharsBitmap; + + public AllowedCharsBitmap() + { + _allowedCharsBitmap = new uint[ALLOWED_CHARS_BITMAP_LENGTH]; + } + + // Marks a character as allowed (can be returned unencoded) + public void AllowCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] |= 0x1U << offset; + } + + public AllowedCharsBitmap Clone() + { + AllowedCharsBitmap retVal; + retVal._allowedCharsBitmap = (uint[])this._allowedCharsBitmap.Clone(); + return retVal; + } + + // Marks a character as forbidden (must be returned encoded) + public void ForbidCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] &= ~(0x1U << offset); + } + + public void ForbidUndefinedCharacters() + { + // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed + // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) + uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); + Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); + for (int i = 0; i < _allowedCharsBitmap.Length; i++) + { + _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; + } + } + + // Determines whether the given character can be returned unencoded. + public bool IsCharacterAllowed(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs new file mode 100644 index 0000000000..97a43b803b --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -0,0 +1,273 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Framework.Internal; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Represents a filter which allows only certain Unicode code points through. + /// + public sealed class CodePointFilter : ICodePointFilter + { + private AllowedCharsBitmap _allowedCharsBitmap; + + /// + /// Instantiates the filter allowing only the 'Basic Latin' block of characters through. + /// + public CodePointFilter() + { + _allowedCharsBitmap = new AllowedCharsBitmap(); + AllowBlock(UnicodeBlocks.BasicLatin); + } + + /// + /// Instantiates the filter by cloning the allow list of another filter. + /// + public CodePointFilter([NotNull] ICodePointFilter other) + { + CodePointFilter otherAsCodePointFilter = other as CodePointFilter; + if (otherAsCodePointFilter != null) + { + _allowedCharsBitmap = otherAsCodePointFilter.GetAllowedCharsBitmap(); + } + else + { + _allowedCharsBitmap = new AllowedCharsBitmap(); + AllowFilter(other); + } + } + + /// + /// Instantiates the filter where only the provided Unicode character blocks are + /// allowed by the filter. + /// + /// + public CodePointFilter(params UnicodeBlock[] allowedBlocks) + { + _allowedCharsBitmap = new AllowedCharsBitmap(); + AllowBlocks(allowedBlocks); + } + + /// + /// Allows all characters in the specified Unicode character block through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowBlock([NotNull] UnicodeBlock block) + { + int firstCodePoint = block.FirstCodePoint; + int blockSize = block.BlockSize; + for (int i = 0; i < blockSize; i++) + { + _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Allows all characters in the specified Unicode character blocks through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowBlocks(params UnicodeBlock[] blocks) + { + if (blocks != null) + { + for (int i = 0; i < blocks.Length; i++) + { + AllowBlock(blocks[i]); + } + } + return this; + } + + /// + /// Allows the specified character through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowChar(char c) + { + _allowedCharsBitmap.AllowCharacter(c); + return this; + } + + /// + /// Allows the specified characters through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowChars(params char[] chars) + { + if (chars != null) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.AllowCharacter(chars[i]); + } + } + return this; + } + + /// + /// Allows all characters in the specified string through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowChars([NotNull] string chars) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.AllowCharacter(chars[i]); + } + return this; + } + + /// + /// Allows all characters approved by the specified filter through this filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowFilter([NotNull] ICodePointFilter filter) + { + foreach (var allowedCodePoint in filter.GetAllowedCodePoints()) + { + // If the code point can't be represented as a BMP character, skip it. + char codePointAsChar = (char)allowedCodePoint; + if (allowedCodePoint == codePointAsChar) + { + _allowedCharsBitmap.AllowCharacter(codePointAsChar); + } + } + return this; + } + + /// + /// Disallows all characters in the specified Unicode character block through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidBlock([NotNull] UnicodeBlock block) + { + int firstCodePoint = block.FirstCodePoint; + int blockSize = block.BlockSize; + for (int i = 0; i < blockSize; i++) + { + _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Disallows all characters in the specified Unicode character blocks through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidBlocks(params UnicodeBlock[] blocks) + { + if (blocks != null) + { + for (int i = 0; i < blocks.Length; i++) + { + ForbidBlock(blocks[i]); + } + } + return this; + } + + /// + /// Disallows the specified character through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidChar(char c) + { + _allowedCharsBitmap.ForbidCharacter(c); + return this; + } + + /// + /// Disallows the specified characters through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidChars(params char[] chars) + { + if (chars != null) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.ForbidCharacter(chars[i]); + } + } + return this; + } + + /// + /// Disallows all characters in the specified string through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidChars([NotNull] string chars) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.ForbidCharacter(chars[i]); + } + return this; + } + + /// + /// Retrieves the bitmap of allowed characters from this filter. + /// The returned bitmap is a clone of the original bitmap to avoid unintentional modification. + /// + internal AllowedCharsBitmap GetAllowedCharsBitmap() + { + return _allowedCharsBitmap.Clone(); + } + + /// + /// Gets an enumeration of all allowed code points. + /// + public IEnumerable GetAllowedCodePoints() + { + for (int i = 0; i < 0x10000; i++) + { + if (_allowedCharsBitmap.IsCharacterAllowed((char)i)) + { + yield return i; + } + } + } + + /// + /// Returns a value stating whether the given character is allowed through the filter. + /// + public bool IsCharacterAllowed(char c) + { + return _allowedCharsBitmap.IsCharacterAllowed(c); + } + + /// + /// Wraps the provided filter as a CodePointFilter, avoiding the clone if possible. + /// + internal static CodePointFilter Wrap(ICodePointFilter filter) + { + return (filter as CodePointFilter) ?? new CodePointFilter(filter); + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs deleted file mode 100644 index 781636916c..0000000000 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs +++ /dev/null @@ -1,2586 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Contains predefined Unicode code point filters. - /// - public static class CodePointFilters - { - /// - /// A filter which allows no characters. - /// - public static ICodePointFilter None - { - get - { - return LazyInitializer.EnsureInitialized(ref _none); - } - } - private static EmptyCodePointFilter _none; - - /// - /// A filter which allows all Unicode Basic Multilingual Plane characters. - /// - /// - /// This range spans the code points U+0000 .. U+FFFF. - /// - public static ICodePointFilter All - { - get - { - return GetFilter(ref _all, first: '\u0000', last: '\uFFFF'); - } - } - private static DefinedCharacterCodePointFilter _all; - - /// - /// A filter which allows characters in the 'Basic Latin' Unicode range. - /// - /// - /// This range spans the code points U+0000 .. U+007F. - /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BasicLatin - { - get - { - return GetFilter(ref _basicLatin, first: '\u0000', last: '\u007F'); - } - } - private static DefinedCharacterCodePointFilter _basicLatin; - - /// - /// A filter which allows characters in the 'Latin-1 Supplement' Unicode range. - /// - /// - /// This range spans the code points U+0080 .. U+00FF. - /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Latin1Supplement - { - get - { - return GetFilter(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); - } - } - private static DefinedCharacterCodePointFilter _latin1Supplement; - - /// - /// A filter which allows characters in the 'Latin Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+0100 .. U+017F. - /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedA - { - get - { - return GetFilter(ref _latinExtendedA, first: '\u0100', last: '\u017F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedA; - - /// - /// A filter which allows characters in the 'Latin Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+0180 .. U+024F. - /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedB - { - get - { - return GetFilter(ref _latinExtendedB, first: '\u0180', last: '\u024F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedB; - - /// - /// A filter which allows characters in the 'IPA Extensions' Unicode range. - /// - /// - /// This range spans the code points U+0250 .. U+02AF. - /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this range. - /// - public static ICodePointFilter IPAExtensions - { - get - { - return GetFilter(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); - } - } - private static DefinedCharacterCodePointFilter _ipaExtensions; - - /// - /// A filter which allows characters in the 'Spacing Modifier Letters' Unicode range. - /// - /// - /// This range spans the code points U+02B0 .. U+02FF. - /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SpacingModifierLetters - { - get - { - return GetFilter(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); - } - } - private static DefinedCharacterCodePointFilter _spacingModifierLetters; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks' Unicode range. - /// - /// - /// This range spans the code points U+0300 .. U+036F. - /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarks - { - get - { - return GetFilter(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarks; - - /// - /// A filter which allows characters in the 'Greek and Coptic' Unicode range. - /// - /// - /// This range spans the code points U+0370 .. U+03FF. - /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GreekandCoptic - { - get - { - return GetFilter(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); - } - } - private static DefinedCharacterCodePointFilter _greekandCoptic; - - /// - /// A filter which allows characters in the 'Cyrillic' Unicode range. - /// - /// - /// This range spans the code points U+0400 .. U+04FF. - /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Cyrillic - { - get - { - return GetFilter(ref _cyrillic, first: '\u0400', last: '\u04FF'); - } - } - private static DefinedCharacterCodePointFilter _cyrillic; - - /// - /// A filter which allows characters in the 'Cyrillic Supplement' Unicode range. - /// - /// - /// This range spans the code points U+0500 .. U+052F. - /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CyrillicSupplement - { - get - { - return GetFilter(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); - } - } - private static DefinedCharacterCodePointFilter _cyrillicSupplement; - - /// - /// A filter which allows characters in the 'Armenian' Unicode range. - /// - /// - /// This range spans the code points U+0530 .. U+058F. - /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Armenian - { - get - { - return GetFilter(ref _armenian, first: '\u0530', last: '\u058F'); - } - } - private static DefinedCharacterCodePointFilter _armenian; - - /// - /// A filter which allows characters in the 'Hebrew' Unicode range. - /// - /// - /// This range spans the code points U+0590 .. U+05FF. - /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Hebrew - { - get - { - return GetFilter(ref _hebrew, first: '\u0590', last: '\u05FF'); - } - } - private static DefinedCharacterCodePointFilter _hebrew; - - /// - /// A filter which allows characters in the 'Arabic' Unicode range. - /// - /// - /// This range spans the code points U+0600 .. U+06FF. - /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Arabic - { - get - { - return GetFilter(ref _arabic, first: '\u0600', last: '\u06FF'); - } - } - private static DefinedCharacterCodePointFilter _arabic; - - /// - /// A filter which allows characters in the 'Syriac' Unicode range. - /// - /// - /// This range spans the code points U+0700 .. U+074F. - /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Syriac - { - get - { - return GetFilter(ref _syriac, first: '\u0700', last: '\u074F'); - } - } - private static DefinedCharacterCodePointFilter _syriac; - - /// - /// A filter which allows characters in the 'Arabic Supplement' Unicode range. - /// - /// - /// This range spans the code points U+0750 .. U+077F. - /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicSupplement - { - get - { - return GetFilter(ref _arabicSupplement, first: '\u0750', last: '\u077F'); - } - } - private static DefinedCharacterCodePointFilter _arabicSupplement; - - /// - /// A filter which allows characters in the 'Thaana' Unicode range. - /// - /// - /// This range spans the code points U+0780 .. U+07BF. - /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Thaana - { - get - { - return GetFilter(ref _thaana, first: '\u0780', last: '\u07BF'); - } - } - private static DefinedCharacterCodePointFilter _thaana; - - /// - /// A filter which allows characters in the 'NKo' Unicode range. - /// - /// - /// This range spans the code points U+07C0 .. U+07FF. - /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter NKo - { - get - { - return GetFilter(ref _nKo, first: '\u07C0', last: '\u07FF'); - } - } - private static DefinedCharacterCodePointFilter _nKo; - - /// - /// A filter which allows characters in the 'Samaritan' Unicode range. - /// - /// - /// This range spans the code points U+0800 .. U+083F. - /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Samaritan - { - get - { - return GetFilter(ref _samaritan, first: '\u0800', last: '\u083F'); - } - } - private static DefinedCharacterCodePointFilter _samaritan; - - /// - /// A filter which allows characters in the 'Mandaic' Unicode range. - /// - /// - /// This range spans the code points U+0840 .. U+085F. - /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Mandaic - { - get - { - return GetFilter(ref _mandaic, first: '\u0840', last: '\u085F'); - } - } - private static DefinedCharacterCodePointFilter _mandaic; - - /// - /// A filter which allows characters in the 'Arabic Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+08A0 .. U+08FF. - /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicExtendedA - { - get - { - return GetFilter(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); - } - } - private static DefinedCharacterCodePointFilter _arabicExtendedA; - - /// - /// A filter which allows characters in the 'Devanagari' Unicode range. - /// - /// - /// This range spans the code points U+0900 .. U+097F. - /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Devanagari - { - get - { - return GetFilter(ref _devanagari, first: '\u0900', last: '\u097F'); - } - } - private static DefinedCharacterCodePointFilter _devanagari; - - /// - /// A filter which allows characters in the 'Bengali' Unicode range. - /// - /// - /// This range spans the code points U+0980 .. U+09FF. - /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Bengali - { - get - { - return GetFilter(ref _bengali, first: '\u0980', last: '\u09FF'); - } - } - private static DefinedCharacterCodePointFilter _bengali; - - /// - /// A filter which allows characters in the 'Gurmukhi' Unicode range. - /// - /// - /// This range spans the code points U+0A00 .. U+0A7F. - /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Gurmukhi - { - get - { - return GetFilter(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); - } - } - private static DefinedCharacterCodePointFilter _gurmukhi; - - /// - /// A filter which allows characters in the 'Gujarati' Unicode range. - /// - /// - /// This range spans the code points U+0A80 .. U+0AFF. - /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Gujarati - { - get - { - return GetFilter(ref _gujarati, first: '\u0A80', last: '\u0AFF'); - } - } - private static DefinedCharacterCodePointFilter _gujarati; - - /// - /// A filter which allows characters in the 'Oriya' Unicode range. - /// - /// - /// This range spans the code points U+0B00 .. U+0B7F. - /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Oriya - { - get - { - return GetFilter(ref _oriya, first: '\u0B00', last: '\u0B7F'); - } - } - private static DefinedCharacterCodePointFilter _oriya; - - /// - /// A filter which allows characters in the 'Tamil' Unicode range. - /// - /// - /// This range spans the code points U+0B80 .. U+0BFF. - /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tamil - { - get - { - return GetFilter(ref _tamil, first: '\u0B80', last: '\u0BFF'); - } - } - private static DefinedCharacterCodePointFilter _tamil; - - /// - /// A filter which allows characters in the 'Telugu' Unicode range. - /// - /// - /// This range spans the code points U+0C00 .. U+0C7F. - /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Telugu - { - get - { - return GetFilter(ref _telugu, first: '\u0C00', last: '\u0C7F'); - } - } - private static DefinedCharacterCodePointFilter _telugu; - - /// - /// A filter which allows characters in the 'Kannada' Unicode range. - /// - /// - /// This range spans the code points U+0C80 .. U+0CFF. - /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Kannada - { - get - { - return GetFilter(ref _kannada, first: '\u0C80', last: '\u0CFF'); - } - } - private static DefinedCharacterCodePointFilter _kannada; - - /// - /// A filter which allows characters in the 'Malayalam' Unicode range. - /// - /// - /// This range spans the code points U+0D00 .. U+0D7F. - /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Malayalam - { - get - { - return GetFilter(ref _malayalam, first: '\u0D00', last: '\u0D7F'); - } - } - private static DefinedCharacterCodePointFilter _malayalam; - - /// - /// A filter which allows characters in the 'Sinhala' Unicode range. - /// - /// - /// This range spans the code points U+0D80 .. U+0DFF. - /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Sinhala - { - get - { - return GetFilter(ref _sinhala, first: '\u0D80', last: '\u0DFF'); - } - } - private static DefinedCharacterCodePointFilter _sinhala; - - /// - /// A filter which allows characters in the 'Thai' Unicode range. - /// - /// - /// This range spans the code points U+0E00 .. U+0E7F. - /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Thai - { - get - { - return GetFilter(ref _thai, first: '\u0E00', last: '\u0E7F'); - } - } - private static DefinedCharacterCodePointFilter _thai; - - /// - /// A filter which allows characters in the 'Lao' Unicode range. - /// - /// - /// This range spans the code points U+0E80 .. U+0EFF. - /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Lao - { - get - { - return GetFilter(ref _lao, first: '\u0E80', last: '\u0EFF'); - } - } - private static DefinedCharacterCodePointFilter _lao; - - /// - /// A filter which allows characters in the 'Tibetan' Unicode range. - /// - /// - /// This range spans the code points U+0F00 .. U+0FFF. - /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tibetan - { - get - { - return GetFilter(ref _tibetan, first: '\u0F00', last: '\u0FFF'); - } - } - private static DefinedCharacterCodePointFilter _tibetan; - - /// - /// A filter which allows characters in the 'Myanmar' Unicode range. - /// - /// - /// This range spans the code points U+1000 .. U+109F. - /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Myanmar - { - get - { - return GetFilter(ref _myanmar, first: '\u1000', last: '\u109F'); - } - } - private static DefinedCharacterCodePointFilter _myanmar; - - /// - /// A filter which allows characters in the 'Georgian' Unicode range. - /// - /// - /// This range spans the code points U+10A0 .. U+10FF. - /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Georgian - { - get - { - return GetFilter(ref _georgian, first: '\u10A0', last: '\u10FF'); - } - } - private static DefinedCharacterCodePointFilter _georgian; - - /// - /// A filter which allows characters in the 'Hangul Jamo' Unicode range. - /// - /// - /// This range spans the code points U+1100 .. U+11FF. - /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulJamo - { - get - { - return GetFilter(ref _hangulJamo, first: '\u1100', last: '\u11FF'); - } - } - private static DefinedCharacterCodePointFilter _hangulJamo; - - /// - /// A filter which allows characters in the 'Ethiopic' Unicode range. - /// - /// - /// This range spans the code points U+1200 .. U+137F. - /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Ethiopic - { - get - { - return GetFilter(ref _ethiopic, first: '\u1200', last: '\u137F'); - } - } - private static DefinedCharacterCodePointFilter _ethiopic; - - /// - /// A filter which allows characters in the 'Ethiopic Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1380 .. U+139F. - /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EthiopicSupplement - { - get - { - return GetFilter(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); - } - } - private static DefinedCharacterCodePointFilter _ethiopicSupplement; - - /// - /// A filter which allows characters in the 'Cherokee' Unicode range. - /// - /// - /// This range spans the code points U+13A0 .. U+13FF. - /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Cherokee - { - get - { - return GetFilter(ref _cherokee, first: '\u13A0', last: '\u13FF'); - } - } - private static DefinedCharacterCodePointFilter _cherokee; - - /// - /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics' Unicode range. - /// - /// - /// This range spans the code points U+1400 .. U+167F. - /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter UnifiedCanadianAboriginalSyllabics - { - get - { - return GetFilter(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); - } - } - private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabics; - - /// - /// A filter which allows characters in the 'Ogham' Unicode range. - /// - /// - /// This range spans the code points U+1680 .. U+169F. - /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Ogham - { - get - { - return GetFilter(ref _ogham, first: '\u1680', last: '\u169F'); - } - } - private static DefinedCharacterCodePointFilter _ogham; - - /// - /// A filter which allows characters in the 'Runic' Unicode range. - /// - /// - /// This range spans the code points U+16A0 .. U+16FF. - /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Runic - { - get - { - return GetFilter(ref _runic, first: '\u16A0', last: '\u16FF'); - } - } - private static DefinedCharacterCodePointFilter _runic; - - /// - /// A filter which allows characters in the 'Tagalog' Unicode range. - /// - /// - /// This range spans the code points U+1700 .. U+171F. - /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tagalog - { - get - { - return GetFilter(ref _tagalog, first: '\u1700', last: '\u171F'); - } - } - private static DefinedCharacterCodePointFilter _tagalog; - - /// - /// A filter which allows characters in the 'Hanunoo' Unicode range. - /// - /// - /// This range spans the code points U+1720 .. U+173F. - /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Hanunoo - { - get - { - return GetFilter(ref _hanunoo, first: '\u1720', last: '\u173F'); - } - } - private static DefinedCharacterCodePointFilter _hanunoo; - - /// - /// A filter which allows characters in the 'Buhid' Unicode range. - /// - /// - /// This range spans the code points U+1740 .. U+175F. - /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Buhid - { - get - { - return GetFilter(ref _buhid, first: '\u1740', last: '\u175F'); - } - } - private static DefinedCharacterCodePointFilter _buhid; - - /// - /// A filter which allows characters in the 'Tagbanwa' Unicode range. - /// - /// - /// This range spans the code points U+1760 .. U+177F. - /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tagbanwa - { - get - { - return GetFilter(ref _tagbanwa, first: '\u1760', last: '\u177F'); - } - } - private static DefinedCharacterCodePointFilter _tagbanwa; - - /// - /// A filter which allows characters in the 'Khmer' Unicode range. - /// - /// - /// This range spans the code points U+1780 .. U+17FF. - /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Khmer - { - get - { - return GetFilter(ref _khmer, first: '\u1780', last: '\u17FF'); - } - } - private static DefinedCharacterCodePointFilter _khmer; - - /// - /// A filter which allows characters in the 'Mongolian' Unicode range. - /// - /// - /// This range spans the code points U+1800 .. U+18AF. - /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Mongolian - { - get - { - return GetFilter(ref _mongolian, first: '\u1800', last: '\u18AF'); - } - } - private static DefinedCharacterCodePointFilter _mongolian; - - /// - /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics Extended' Unicode range. - /// - /// - /// This range spans the code points U+18B0 .. U+18FF. - /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter UnifiedCanadianAboriginalSyllabicsExtended - { - get - { - return GetFilter(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); - } - } - private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabicsExtended; - - /// - /// A filter which allows characters in the 'Limbu' Unicode range. - /// - /// - /// This range spans the code points U+1900 .. U+194F. - /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Limbu - { - get - { - return GetFilter(ref _limbu, first: '\u1900', last: '\u194F'); - } - } - private static DefinedCharacterCodePointFilter _limbu; - - /// - /// A filter which allows characters in the 'Tai Le' Unicode range. - /// - /// - /// This range spans the code points U+1950 .. U+197F. - /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this range. - /// - public static ICodePointFilter TaiLe - { - get - { - return GetFilter(ref _taiLe, first: '\u1950', last: '\u197F'); - } - } - private static DefinedCharacterCodePointFilter _taiLe; - - /// - /// A filter which allows characters in the 'New Tai Lue' Unicode range. - /// - /// - /// This range spans the code points U+1980 .. U+19DF. - /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter NewTaiLue - { - get - { - return GetFilter(ref _newTaiLue, first: '\u1980', last: '\u19DF'); - } - } - private static DefinedCharacterCodePointFilter _newTaiLue; - - /// - /// A filter which allows characters in the 'Khmer Symbols' Unicode range. - /// - /// - /// This range spans the code points U+19E0 .. U+19FF. - /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KhmerSymbols - { - get - { - return GetFilter(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); - } - } - private static DefinedCharacterCodePointFilter _khmerSymbols; - - /// - /// A filter which allows characters in the 'Buginese' Unicode range. - /// - /// - /// This range spans the code points U+1A00 .. U+1A1F. - /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Buginese - { - get - { - return GetFilter(ref _buginese, first: '\u1A00', last: '\u1A1F'); - } - } - private static DefinedCharacterCodePointFilter _buginese; - - /// - /// A filter which allows characters in the 'Tai Tham' Unicode range. - /// - /// - /// This range spans the code points U+1A20 .. U+1AAF. - /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this range. - /// - public static ICodePointFilter TaiTham - { - get - { - return GetFilter(ref _taiTham, first: '\u1A20', last: '\u1AAF'); - } - } - private static DefinedCharacterCodePointFilter _taiTham; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks Extended' Unicode range. - /// - /// - /// This range spans the code points U+1AB0 .. U+1AFF. - /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarksExtended - { - get - { - return GetFilter(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksExtended; - - /// - /// A filter which allows characters in the 'Balinese' Unicode range. - /// - /// - /// This range spans the code points U+1B00 .. U+1B7F. - /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Balinese - { - get - { - return GetFilter(ref _balinese, first: '\u1B00', last: '\u1B7F'); - } - } - private static DefinedCharacterCodePointFilter _balinese; - - /// - /// A filter which allows characters in the 'Sundanese' Unicode range. - /// - /// - /// This range spans the code points U+1B80 .. U+1BBF. - /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Sundanese - { - get - { - return GetFilter(ref _sundanese, first: '\u1B80', last: '\u1BBF'); - } - } - private static DefinedCharacterCodePointFilter _sundanese; - - /// - /// A filter which allows characters in the 'Batak' Unicode range. - /// - /// - /// This range spans the code points U+1BC0 .. U+1BFF. - /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Batak - { - get - { - return GetFilter(ref _batak, first: '\u1BC0', last: '\u1BFF'); - } - } - private static DefinedCharacterCodePointFilter _batak; - - /// - /// A filter which allows characters in the 'Lepcha' Unicode range. - /// - /// - /// This range spans the code points U+1C00 .. U+1C4F. - /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Lepcha - { - get - { - return GetFilter(ref _lepcha, first: '\u1C00', last: '\u1C4F'); - } - } - private static DefinedCharacterCodePointFilter _lepcha; - - /// - /// A filter which allows characters in the 'Ol Chiki' Unicode range. - /// - /// - /// This range spans the code points U+1C50 .. U+1C7F. - /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this range. - /// - public static ICodePointFilter OlChiki - { - get - { - return GetFilter(ref _olChiki, first: '\u1C50', last: '\u1C7F'); - } - } - private static DefinedCharacterCodePointFilter _olChiki; - - /// - /// A filter which allows characters in the 'Sundanese Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1CC0 .. U+1CCF. - /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SundaneseSupplement - { - get - { - return GetFilter(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); - } - } - private static DefinedCharacterCodePointFilter _sundaneseSupplement; - - /// - /// A filter which allows characters in the 'Vedic Extensions' Unicode range. - /// - /// - /// This range spans the code points U+1CD0 .. U+1CFF. - /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter VedicExtensions - { - get - { - return GetFilter(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); - } - } - private static DefinedCharacterCodePointFilter _vedicExtensions; - - /// - /// A filter which allows characters in the 'Phonetic Extensions' Unicode range. - /// - /// - /// This range spans the code points U+1D00 .. U+1D7F. - /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter PhoneticExtensions - { - get - { - return GetFilter(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); - } - } - private static DefinedCharacterCodePointFilter _phoneticExtensions; - - /// - /// A filter which allows characters in the 'Phonetic Extensions Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1D80 .. U+1DBF. - /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter PhoneticExtensionsSupplement - { - get - { - return GetFilter(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); - } - } - private static DefinedCharacterCodePointFilter _phoneticExtensionsSupplement; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1DC0 .. U+1DFF. - /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarksSupplement - { - get - { - return GetFilter(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksSupplement; - - /// - /// A filter which allows characters in the 'Latin Extended Additional' Unicode range. - /// - /// - /// This range spans the code points U+1E00 .. U+1EFF. - /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedAdditional - { - get - { - return GetFilter(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedAdditional; - - /// - /// A filter which allows characters in the 'Greek Extended' Unicode range. - /// - /// - /// This range spans the code points U+1F00 .. U+1FFF. - /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GreekExtended - { - get - { - return GetFilter(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); - } - } - private static DefinedCharacterCodePointFilter _greekExtended; - - /// - /// A filter which allows characters in the 'General Punctuation' Unicode range. - /// - /// - /// This range spans the code points U+2000 .. U+206F. - /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GeneralPunctuation - { - get - { - return GetFilter(ref _generalPunctuation, first: '\u2000', last: '\u206F'); - } - } - private static DefinedCharacterCodePointFilter _generalPunctuation; - - /// - /// A filter which allows characters in the 'Superscripts and Subscripts' Unicode range. - /// - /// - /// This range spans the code points U+2070 .. U+209F. - /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SuperscriptsandSubscripts - { - get - { - return GetFilter(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); - } - } - private static DefinedCharacterCodePointFilter _superscriptsandSubscripts; - - /// - /// A filter which allows characters in the 'Currency Symbols' Unicode range. - /// - /// - /// This range spans the code points U+20A0 .. U+20CF. - /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CurrencySymbols - { - get - { - return GetFilter(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); - } - } - private static DefinedCharacterCodePointFilter _currencySymbols; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks for Symbols' Unicode range. - /// - /// - /// This range spans the code points U+20D0 .. U+20FF. - /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarksforSymbols - { - get - { - return GetFilter(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksforSymbols; - - /// - /// A filter which allows characters in the 'Letterlike Symbols' Unicode range. - /// - /// - /// This range spans the code points U+2100 .. U+214F. - /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LetterlikeSymbols - { - get - { - return GetFilter(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); - } - } - private static DefinedCharacterCodePointFilter _letterlikeSymbols; - - /// - /// A filter which allows characters in the 'Number Forms' Unicode range. - /// - /// - /// This range spans the code points U+2150 .. U+218F. - /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this range. - /// - public static ICodePointFilter NumberForms - { - get - { - return GetFilter(ref _numberForms, first: '\u2150', last: '\u218F'); - } - } - private static DefinedCharacterCodePointFilter _numberForms; - - /// - /// A filter which allows characters in the 'Arrows' Unicode range. - /// - /// - /// This range spans the code points U+2190 .. U+21FF. - /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Arrows - { - get - { - return GetFilter(ref _arrows, first: '\u2190', last: '\u21FF'); - } - } - private static DefinedCharacterCodePointFilter _arrows; - - /// - /// A filter which allows characters in the 'Mathematical Operators' Unicode range. - /// - /// - /// This range spans the code points U+2200 .. U+22FF. - /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MathematicalOperators - { - get - { - return GetFilter(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); - } - } - private static DefinedCharacterCodePointFilter _mathematicalOperators; - - /// - /// A filter which allows characters in the 'Miscellaneous Technical' Unicode range. - /// - /// - /// This range spans the code points U+2300 .. U+23FF. - /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousTechnical - { - get - { - return GetFilter(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousTechnical; - - /// - /// A filter which allows characters in the 'Control Pictures' Unicode range. - /// - /// - /// This range spans the code points U+2400 .. U+243F. - /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ControlPictures - { - get - { - return GetFilter(ref _controlPictures, first: '\u2400', last: '\u243F'); - } - } - private static DefinedCharacterCodePointFilter _controlPictures; - - /// - /// A filter which allows characters in the 'Optical Character Recognition' Unicode range. - /// - /// - /// This range spans the code points U+2440 .. U+245F. - /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this range. - /// - public static ICodePointFilter OpticalCharacterRecognition - { - get - { - return GetFilter(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); - } - } - private static DefinedCharacterCodePointFilter _opticalCharacterRecognition; - - /// - /// A filter which allows characters in the 'Enclosed Alphanumerics' Unicode range. - /// - /// - /// This range spans the code points U+2460 .. U+24FF. - /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EnclosedAlphanumerics - { - get - { - return GetFilter(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); - } - } - private static DefinedCharacterCodePointFilter _enclosedAlphanumerics; - - /// - /// A filter which allows characters in the 'Box Drawing' Unicode range. - /// - /// - /// This range spans the code points U+2500 .. U+257F. - /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BoxDrawing - { - get - { - return GetFilter(ref _boxDrawing, first: '\u2500', last: '\u257F'); - } - } - private static DefinedCharacterCodePointFilter _boxDrawing; - - /// - /// A filter which allows characters in the 'Block Elements' Unicode range. - /// - /// - /// This range spans the code points U+2580 .. U+259F. - /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BlockElements - { - get - { - return GetFilter(ref _blockElements, first: '\u2580', last: '\u259F'); - } - } - private static DefinedCharacterCodePointFilter _blockElements; - - /// - /// A filter which allows characters in the 'Geometric Shapes' Unicode range. - /// - /// - /// This range spans the code points U+25A0 .. U+25FF. - /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GeometricShapes - { - get - { - return GetFilter(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); - } - } - private static DefinedCharacterCodePointFilter _geometricShapes; - - /// - /// A filter which allows characters in the 'Miscellaneous Symbols' Unicode range. - /// - /// - /// This range spans the code points U+2600 .. U+26FF. - /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousSymbols - { - get - { - return GetFilter(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousSymbols; - - /// - /// A filter which allows characters in the 'Dingbats' Unicode range. - /// - /// - /// This range spans the code points U+2700 .. U+27BF. - /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Dingbats - { - get - { - return GetFilter(ref _dingbats, first: '\u2700', last: '\u27BF'); - } - } - private static DefinedCharacterCodePointFilter _dingbats; - - /// - /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-A' Unicode range. - /// - /// - /// This range spans the code points U+27C0 .. U+27EF. - /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousMathematicalSymbolsA - { - get - { - return GetFilter(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsA; - - /// - /// A filter which allows characters in the 'Supplemental Arrows-A' Unicode range. - /// - /// - /// This range spans the code points U+27F0 .. U+27FF. - /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalArrowsA - { - get - { - return GetFilter(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); - } - } - private static DefinedCharacterCodePointFilter _supplementalArrowsA; - - /// - /// A filter which allows characters in the 'Braille Patterns' Unicode range. - /// - /// - /// This range spans the code points U+2800 .. U+28FF. - /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BraillePatterns - { - get - { - return GetFilter(ref _braillePatterns, first: '\u2800', last: '\u28FF'); - } - } - private static DefinedCharacterCodePointFilter _braillePatterns; - - /// - /// A filter which allows characters in the 'Supplemental Arrows-B' Unicode range. - /// - /// - /// This range spans the code points U+2900 .. U+297F. - /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalArrowsB - { - get - { - return GetFilter(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); - } - } - private static DefinedCharacterCodePointFilter _supplementalArrowsB; - - /// - /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-B' Unicode range. - /// - /// - /// This range spans the code points U+2980 .. U+29FF. - /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousMathematicalSymbolsB - { - get - { - return GetFilter(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsB; - - /// - /// A filter which allows characters in the 'Supplemental Mathematical Operators' Unicode range. - /// - /// - /// This range spans the code points U+2A00 .. U+2AFF. - /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalMathematicalOperators - { - get - { - return GetFilter(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); - } - } - private static DefinedCharacterCodePointFilter _supplementalMathematicalOperators; - - /// - /// A filter which allows characters in the 'Miscellaneous Symbols and Arrows' Unicode range. - /// - /// - /// This range spans the code points U+2B00 .. U+2BFF. - /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousSymbolsandArrows - { - get - { - return GetFilter(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousSymbolsandArrows; - - /// - /// A filter which allows characters in the 'Glagolitic' Unicode range. - /// - /// - /// This range spans the code points U+2C00 .. U+2C5F. - /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Glagolitic - { - get - { - return GetFilter(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); - } - } - private static DefinedCharacterCodePointFilter _glagolitic; - - /// - /// A filter which allows characters in the 'Latin Extended-C' Unicode range. - /// - /// - /// This range spans the code points U+2C60 .. U+2C7F. - /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedC - { - get - { - return GetFilter(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedC; - - /// - /// A filter which allows characters in the 'Coptic' Unicode range. - /// - /// - /// This range spans the code points U+2C80 .. U+2CFF. - /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Coptic - { - get - { - return GetFilter(ref _coptic, first: '\u2C80', last: '\u2CFF'); - } - } - private static DefinedCharacterCodePointFilter _coptic; - - /// - /// A filter which allows characters in the 'Georgian Supplement' Unicode range. - /// - /// - /// This range spans the code points U+2D00 .. U+2D2F. - /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GeorgianSupplement - { - get - { - return GetFilter(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); - } - } - private static DefinedCharacterCodePointFilter _georgianSupplement; - - /// - /// A filter which allows characters in the 'Tifinagh' Unicode range. - /// - /// - /// This range spans the code points U+2D30 .. U+2D7F. - /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tifinagh - { - get - { - return GetFilter(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); - } - } - private static DefinedCharacterCodePointFilter _tifinagh; - - /// - /// A filter which allows characters in the 'Ethiopic Extended' Unicode range. - /// - /// - /// This range spans the code points U+2D80 .. U+2DDF. - /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EthiopicExtended - { - get - { - return GetFilter(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); - } - } - private static DefinedCharacterCodePointFilter _ethiopicExtended; - - /// - /// A filter which allows characters in the 'Cyrillic Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+2DE0 .. U+2DFF. - /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CyrillicExtendedA - { - get - { - return GetFilter(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); - } - } - private static DefinedCharacterCodePointFilter _cyrillicExtendedA; - - /// - /// A filter which allows characters in the 'Supplemental Punctuation' Unicode range. - /// - /// - /// This range spans the code points U+2E00 .. U+2E7F. - /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalPunctuation - { - get - { - return GetFilter(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); - } - } - private static DefinedCharacterCodePointFilter _supplementalPunctuation; - - /// - /// A filter which allows characters in the 'CJK Radicals Supplement' Unicode range. - /// - /// - /// This range spans the code points U+2E80 .. U+2EFF. - /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKRadicalsSupplement - { - get - { - return GetFilter(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); - } - } - private static DefinedCharacterCodePointFilter _cjkRadicalsSupplement; - - /// - /// A filter which allows characters in the 'Kangxi Radicals' Unicode range. - /// - /// - /// This range spans the code points U+2F00 .. U+2FDF. - /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KangxiRadicals - { - get - { - return GetFilter(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); - } - } - private static DefinedCharacterCodePointFilter _kangxiRadicals; - - /// - /// A filter which allows characters in the 'Ideographic Description Characters' Unicode range. - /// - /// - /// This range spans the code points U+2FF0 .. U+2FFF. - /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter IdeographicDescriptionCharacters - { - get - { - return GetFilter(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); - } - } - private static DefinedCharacterCodePointFilter _ideographicDescriptionCharacters; - - /// - /// A filter which allows characters in the 'CJK Symbols and Punctuation' Unicode range. - /// - /// - /// This range spans the code points U+3000 .. U+303F. - /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKSymbolsandPunctuation - { - get - { - return GetFilter(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); - } - } - private static DefinedCharacterCodePointFilter _cjkSymbolsandPunctuation; - - /// - /// A filter which allows characters in the 'Hiragana' Unicode range. - /// - /// - /// This range spans the code points U+3040 .. U+309F. - /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Hiragana - { - get - { - return GetFilter(ref _hiragana, first: '\u3040', last: '\u309F'); - } - } - private static DefinedCharacterCodePointFilter _hiragana; - - /// - /// A filter which allows characters in the 'Katakana' Unicode range. - /// - /// - /// This range spans the code points U+30A0 .. U+30FF. - /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Katakana - { - get - { - return GetFilter(ref _katakana, first: '\u30A0', last: '\u30FF'); - } - } - private static DefinedCharacterCodePointFilter _katakana; - - /// - /// A filter which allows characters in the 'Bopomofo' Unicode range. - /// - /// - /// This range spans the code points U+3100 .. U+312F. - /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Bopomofo - { - get - { - return GetFilter(ref _bopomofo, first: '\u3100', last: '\u312F'); - } - } - private static DefinedCharacterCodePointFilter _bopomofo; - - /// - /// A filter which allows characters in the 'Hangul Compatibility Jamo' Unicode range. - /// - /// - /// This range spans the code points U+3130 .. U+318F. - /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulCompatibilityJamo - { - get - { - return GetFilter(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); - } - } - private static DefinedCharacterCodePointFilter _hangulCompatibilityJamo; - - /// - /// A filter which allows characters in the 'Kanbun' Unicode range. - /// - /// - /// This range spans the code points U+3190 .. U+319F. - /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Kanbun - { - get - { - return GetFilter(ref _kanbun, first: '\u3190', last: '\u319F'); - } - } - private static DefinedCharacterCodePointFilter _kanbun; - - /// - /// A filter which allows characters in the 'Bopomofo Extended' Unicode range. - /// - /// - /// This range spans the code points U+31A0 .. U+31BF. - /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BopomofoExtended - { - get - { - return GetFilter(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); - } - } - private static DefinedCharacterCodePointFilter _bopomofoExtended; - - /// - /// A filter which allows characters in the 'CJK Strokes' Unicode range. - /// - /// - /// This range spans the code points U+31C0 .. U+31EF. - /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKStrokes - { - get - { - return GetFilter(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); - } - } - private static DefinedCharacterCodePointFilter _cjkStrokes; - - /// - /// A filter which allows characters in the 'Katakana Phonetic Extensions' Unicode range. - /// - /// - /// This range spans the code points U+31F0 .. U+31FF. - /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KatakanaPhoneticExtensions - { - get - { - return GetFilter(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); - } - } - private static DefinedCharacterCodePointFilter _katakanaPhoneticExtensions; - - /// - /// A filter which allows characters in the 'Enclosed CJK Letters and Months' Unicode range. - /// - /// - /// This range spans the code points U+3200 .. U+32FF. - /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EnclosedCJKLettersandMonths - { - get - { - return GetFilter(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); - } - } - private static DefinedCharacterCodePointFilter _enclosedCJKLettersandMonths; - - /// - /// A filter which allows characters in the 'CJK Compatibility' Unicode range. - /// - /// - /// This range spans the code points U+3300 .. U+33FF. - /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKCompatibility - { - get - { - return GetFilter(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); - } - } - private static DefinedCharacterCodePointFilter _cjkCompatibility; - - /// - /// A filter which allows characters in the 'CJK Unified Ideographs Extension A' Unicode range. - /// - /// - /// This range spans the code points U+3400 .. U+4DBF. - /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKUnifiedIdeographsExtensionA - { - get - { - return GetFilter(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); - } - } - private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographsExtensionA; - - /// - /// A filter which allows characters in the 'Yijing Hexagram Symbols' Unicode range. - /// - /// - /// This range spans the code points U+4DC0 .. U+4DFF. - /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter YijingHexagramSymbols - { - get - { - return GetFilter(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); - } - } - private static DefinedCharacterCodePointFilter _yijingHexagramSymbols; - - /// - /// A filter which allows characters in the 'CJK Unified Ideographs' Unicode range. - /// - /// - /// This range spans the code points U+4E00 .. U+9FFF. - /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKUnifiedIdeographs - { - get - { - return GetFilter(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); - } - } - private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographs; - - /// - /// A filter which allows characters in the 'Yi Syllables' Unicode range. - /// - /// - /// This range spans the code points U+A000 .. U+A48F. - /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter YiSyllables - { - get - { - return GetFilter(ref _yiSyllables, first: '\uA000', last: '\uA48F'); - } - } - private static DefinedCharacterCodePointFilter _yiSyllables; - - /// - /// A filter which allows characters in the 'Yi Radicals' Unicode range. - /// - /// - /// This range spans the code points U+A490 .. U+A4CF. - /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this range. - /// - public static ICodePointFilter YiRadicals - { - get - { - return GetFilter(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); - } - } - private static DefinedCharacterCodePointFilter _yiRadicals; - - /// - /// A filter which allows characters in the 'Lisu' Unicode range. - /// - /// - /// This range spans the code points U+A4D0 .. U+A4FF. - /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Lisu - { - get - { - return GetFilter(ref _lisu, first: '\uA4D0', last: '\uA4FF'); - } - } - private static DefinedCharacterCodePointFilter _lisu; - - /// - /// A filter which allows characters in the 'Vai' Unicode range. - /// - /// - /// This range spans the code points U+A500 .. U+A63F. - /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Vai - { - get - { - return GetFilter(ref _vai, first: '\uA500', last: '\uA63F'); - } - } - private static DefinedCharacterCodePointFilter _vai; - - /// - /// A filter which allows characters in the 'Cyrillic Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+A640 .. U+A69F. - /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CyrillicExtendedB - { - get - { - return GetFilter(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); - } - } - private static DefinedCharacterCodePointFilter _cyrillicExtendedB; - - /// - /// A filter which allows characters in the 'Bamum' Unicode range. - /// - /// - /// This range spans the code points U+A6A0 .. U+A6FF. - /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Bamum - { - get - { - return GetFilter(ref _bamum, first: '\uA6A0', last: '\uA6FF'); - } - } - private static DefinedCharacterCodePointFilter _bamum; - - /// - /// A filter which allows characters in the 'Modifier Tone Letters' Unicode range. - /// - /// - /// This range spans the code points U+A700 .. U+A71F. - /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ModifierToneLetters - { - get - { - return GetFilter(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); - } - } - private static DefinedCharacterCodePointFilter _modifierToneLetters; - - /// - /// A filter which allows characters in the 'Latin Extended-D' Unicode range. - /// - /// - /// This range spans the code points U+A720 .. U+A7FF. - /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedD - { - get - { - return GetFilter(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedD; - - /// - /// A filter which allows characters in the 'Syloti Nagri' Unicode range. - /// - /// - /// This range spans the code points U+A800 .. U+A82F. - /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SylotiNagri - { - get - { - return GetFilter(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); - } - } - private static DefinedCharacterCodePointFilter _sylotiNagri; - - /// - /// A filter which allows characters in the 'Common Indic Number Forms' Unicode range. - /// - /// - /// This range spans the code points U+A830 .. U+A83F. - /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CommonIndicNumberForms - { - get - { - return GetFilter(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); - } - } - private static DefinedCharacterCodePointFilter _commonIndicNumberForms; - - /// - /// A filter which allows characters in the 'Phags-pa' Unicode range. - /// - /// - /// This range spans the code points U+A840 .. U+A87F. - /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Phagspa - { - get - { - return GetFilter(ref _phagspa, first: '\uA840', last: '\uA87F'); - } - } - private static DefinedCharacterCodePointFilter _phagspa; - - /// - /// A filter which allows characters in the 'Saurashtra' Unicode range. - /// - /// - /// This range spans the code points U+A880 .. U+A8DF. - /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Saurashtra - { - get - { - return GetFilter(ref _saurashtra, first: '\uA880', last: '\uA8DF'); - } - } - private static DefinedCharacterCodePointFilter _saurashtra; - - /// - /// A filter which allows characters in the 'Devanagari Extended' Unicode range. - /// - /// - /// This range spans the code points U+A8E0 .. U+A8FF. - /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter DevanagariExtended - { - get - { - return GetFilter(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); - } - } - private static DefinedCharacterCodePointFilter _devanagariExtended; - - /// - /// A filter which allows characters in the 'Kayah Li' Unicode range. - /// - /// - /// This range spans the code points U+A900 .. U+A92F. - /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KayahLi - { - get - { - return GetFilter(ref _kayahLi, first: '\uA900', last: '\uA92F'); - } - } - private static DefinedCharacterCodePointFilter _kayahLi; - - /// - /// A filter which allows characters in the 'Rejang' Unicode range. - /// - /// - /// This range spans the code points U+A930 .. U+A95F. - /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Rejang - { - get - { - return GetFilter(ref _rejang, first: '\uA930', last: '\uA95F'); - } - } - private static DefinedCharacterCodePointFilter _rejang; - - /// - /// A filter which allows characters in the 'Hangul Jamo Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+A960 .. U+A97F. - /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulJamoExtendedA - { - get - { - return GetFilter(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); - } - } - private static DefinedCharacterCodePointFilter _hangulJamoExtendedA; - - /// - /// A filter which allows characters in the 'Javanese' Unicode range. - /// - /// - /// This range spans the code points U+A980 .. U+A9DF. - /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Javanese - { - get - { - return GetFilter(ref _javanese, first: '\uA980', last: '\uA9DF'); - } - } - private static DefinedCharacterCodePointFilter _javanese; - - /// - /// A filter which allows characters in the 'Myanmar Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+A9E0 .. U+A9FF. - /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MyanmarExtendedB - { - get - { - return GetFilter(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); - } - } - private static DefinedCharacterCodePointFilter _myanmarExtendedB; - - /// - /// A filter which allows characters in the 'Cham' Unicode range. - /// - /// - /// This range spans the code points U+AA00 .. U+AA5F. - /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Cham - { - get - { - return GetFilter(ref _cham, first: '\uAA00', last: '\uAA5F'); - } - } - private static DefinedCharacterCodePointFilter _cham; - - /// - /// A filter which allows characters in the 'Myanmar Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+AA60 .. U+AA7F. - /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MyanmarExtendedA - { - get - { - return GetFilter(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); - } - } - private static DefinedCharacterCodePointFilter _myanmarExtendedA; - - /// - /// A filter which allows characters in the 'Tai Viet' Unicode range. - /// - /// - /// This range spans the code points U+AA80 .. U+AADF. - /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter TaiViet - { - get - { - return GetFilter(ref _taiViet, first: '\uAA80', last: '\uAADF'); - } - } - private static DefinedCharacterCodePointFilter _taiViet; - - /// - /// A filter which allows characters in the 'Meetei Mayek Extensions' Unicode range. - /// - /// - /// This range spans the code points U+AAE0 .. U+AAFF. - /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MeeteiMayekExtensions - { - get - { - return GetFilter(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); - } - } - private static DefinedCharacterCodePointFilter _meeteiMayekExtensions; - - /// - /// A filter which allows characters in the 'Ethiopic Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+AB00 .. U+AB2F. - /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EthiopicExtendedA - { - get - { - return GetFilter(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); - } - } - private static DefinedCharacterCodePointFilter _ethiopicExtendedA; - - /// - /// A filter which allows characters in the 'Latin Extended-E' Unicode range. - /// - /// - /// This range spans the code points U+AB30 .. U+AB6F. - /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedE - { - get - { - return GetFilter(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedE; - - /// - /// A filter which allows characters in the 'Meetei Mayek' Unicode range. - /// - /// - /// This range spans the code points U+ABC0 .. U+ABFF. - /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MeeteiMayek - { - get - { - return GetFilter(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); - } - } - private static DefinedCharacterCodePointFilter _meeteiMayek; - - /// - /// A filter which allows characters in the 'Hangul Syllables' Unicode range. - /// - /// - /// This range spans the code points U+AC00 .. U+D7AF. - /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulSyllables - { - get - { - return GetFilter(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); - } - } - private static DefinedCharacterCodePointFilter _hangulSyllables; - - /// - /// A filter which allows characters in the 'Hangul Jamo Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+D7B0 .. U+D7FF. - /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulJamoExtendedB - { - get - { - return GetFilter(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); - } - } - private static DefinedCharacterCodePointFilter _hangulJamoExtendedB; - - /// - /// A filter which allows characters in the 'CJK Compatibility Ideographs' Unicode range. - /// - /// - /// This range spans the code points U+F900 .. U+FAFF. - /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKCompatibilityIdeographs - { - get - { - return GetFilter(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); - } - } - private static DefinedCharacterCodePointFilter _cjkCompatibilityIdeographs; - - /// - /// A filter which allows characters in the 'Alphabetic Presentation Forms' Unicode range. - /// - /// - /// This range spans the code points U+FB00 .. U+FB4F. - /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter AlphabeticPresentationForms - { - get - { - return GetFilter(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); - } - } - private static DefinedCharacterCodePointFilter _alphabeticPresentationForms; - - /// - /// A filter which allows characters in the 'Arabic Presentation Forms-A' Unicode range. - /// - /// - /// This range spans the code points U+FB50 .. U+FDFF. - /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicPresentationFormsA - { - get - { - return GetFilter(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); - } - } - private static DefinedCharacterCodePointFilter _arabicPresentationFormsA; - - /// - /// A filter which allows characters in the 'Variation Selectors' Unicode range. - /// - /// - /// This range spans the code points U+FE00 .. U+FE0F. - /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter VariationSelectors - { - get - { - return GetFilter(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); - } - } - private static DefinedCharacterCodePointFilter _variationSelectors; - - /// - /// A filter which allows characters in the 'Vertical Forms' Unicode range. - /// - /// - /// This range spans the code points U+FE10 .. U+FE1F. - /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this range. - /// - public static ICodePointFilter VerticalForms - { - get - { - return GetFilter(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); - } - } - private static DefinedCharacterCodePointFilter _verticalForms; - - /// - /// A filter which allows characters in the 'Combining Half Marks' Unicode range. - /// - /// - /// This range spans the code points U+FE20 .. U+FE2F. - /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningHalfMarks - { - get - { - return GetFilter(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); - } - } - private static DefinedCharacterCodePointFilter _combiningHalfMarks; - - /// - /// A filter which allows characters in the 'CJK Compatibility Forms' Unicode range. - /// - /// - /// This range spans the code points U+FE30 .. U+FE4F. - /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKCompatibilityForms - { - get - { - return GetFilter(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); - } - } - private static DefinedCharacterCodePointFilter _cjkCompatibilityForms; - - /// - /// A filter which allows characters in the 'Small Form Variants' Unicode range. - /// - /// - /// This range spans the code points U+FE50 .. U+FE6F. - /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SmallFormVariants - { - get - { - return GetFilter(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); - } - } - private static DefinedCharacterCodePointFilter _smallFormVariants; - - /// - /// A filter which allows characters in the 'Arabic Presentation Forms-B' Unicode range. - /// - /// - /// This range spans the code points U+FE70 .. U+FEFF. - /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicPresentationFormsB - { - get - { - return GetFilter(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); - } - } - private static DefinedCharacterCodePointFilter _arabicPresentationFormsB; - - /// - /// A filter which allows characters in the 'Halfwidth and Fullwidth Forms' Unicode range. - /// - /// - /// This range spans the code points U+FF00 .. U+FFEF. - /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HalfwidthandFullwidthForms - { - get - { - return GetFilter(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); - } - } - private static DefinedCharacterCodePointFilter _halfwidthandFullwidthForms; - - /// - /// A filter which allows characters in the 'Specials' Unicode range. - /// - /// - /// This range spans the code points U+FFF0 .. U+FFFF. - /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Specials - { - get - { - return GetFilter(ref _specials, first: '\uFFF0', last: '\uFFFF'); - } - } - private static DefinedCharacterCodePointFilter _specials; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static ICodePointFilter GetFilter(ref DefinedCharacterCodePointFilter filter, char first, char last) - { - // Return an existing filter if it has already been created, otherwise - // create a new filter on-demand. - return Volatile.Read(ref filter) ?? GetFilterSlow(ref filter, first, last); - } - - private static ICodePointFilter GetFilterSlow(ref DefinedCharacterCodePointFilter filter, char first, char last) - { - // If the filter hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'filter' value. - DefinedCharacterCodePointFilter newFilter = new DefinedCharacterCodePointFilter(first, last); - Volatile.Write(ref filter, newFilter); - return newFilter; - } - - /// - /// A code point filter which returns only defined characters within a certain - /// range of the Unicode specification. - /// - private sealed class DefinedCharacterCodePointFilter : ICodePointFilter - { - private readonly int _count; - private readonly int _first; - - public DefinedCharacterCodePointFilter(int first, int last) - { - Debug.Assert(0 <= first); - Debug.Assert(first <= last); - Debug.Assert(last <= 0xFFFF); - - _first = first; - _count = last - first + 1; - } - - public IEnumerable GetAllowedCodePoints() - { - for (int i = 0; i < _count; i++) - { - int thisCodePoint = _first + i; - if (UnicodeHelpers.IsCharacterDefined((char)thisCodePoint)) - { - yield return thisCodePoint; - } - } - } - } - - /// - /// A filter that allows no code points. - /// - private sealed class EmptyCodePointFilter : ICodePointFilter - { - private static readonly int[] _emptyArray = new int[0]; // immutable since empty - - public IEnumerable GetAllowedCodePoints() - { - return _emptyArray; - } - } - } -} diff --git a/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs index 6312387609..e8ed2cdcf1 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs @@ -3,7 +3,6 @@ using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -19,8 +18,13 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is also safe for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// - public static void HtmlEncode([NotNull] this IHtmlEncoder htmlEncoder, string value, [NotNull] TextWriter output) + public static void HtmlEncode(this IHtmlEncoder htmlEncoder, string value, TextWriter output) { + if (htmlEncoder == null) + { + throw new ArgumentNullException(nameof(htmlEncoder)); + } + if (!String.IsNullOrEmpty(value)) { htmlEncoder.HtmlEncode(value, 0, value.Length, output); @@ -30,8 +34,13 @@ namespace Microsoft.Framework.WebEncoders /// /// JavaScript-escapes a string and writes the result to the supplied output. /// - public static void JavaScriptStringEncode([NotNull] this IJavaScriptStringEncoder javaScriptStringEncoder, string value, [NotNull] TextWriter output) + public static void JavaScriptStringEncode(this IJavaScriptStringEncoder javaScriptStringEncoder, string value, TextWriter output) { + if (javaScriptStringEncoder == null) + { + throw new ArgumentNullException(nameof(javaScriptStringEncoder)); + } + if (!String.IsNullOrEmpty(value)) { javaScriptStringEncoder.JavaScriptStringEncode(value, 0, value.Length, output); @@ -45,8 +54,13 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is safe for use in the segment, query, or /// fragment portion of a URI. /// - public static void UrlEncode([NotNull] this IUrlEncoder urlEncoder, string value, [NotNull] TextWriter output) + public static void UrlEncode(this IUrlEncoder urlEncoder, string value, TextWriter output) { + if (urlEncoder == null) + { + throw new ArgumentNullException(nameof(urlEncoder)); + } + if (!String.IsNullOrEmpty(value)) { urlEncoder.UrlEncode(value, 0, value.Length, output); diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs b/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs similarity index 65% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderOptions.cs index 828455651a..e2547359cf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs @@ -11,12 +11,11 @@ namespace Microsoft.Framework.WebEncoders public sealed class EncoderOptions { /// - /// Specifies code point tables which do not require escaping by the encoders. + /// Specifies which code points are allowed to be represented unescaped by the encoders. /// /// - /// If this property is set to a null array, then by default only the 'Basic Latin' - /// code point filter is active. + /// If this property is null, then the encoders will use their default allow lists. /// - public ICodePointFilter[] CodePointFilters { get; set; } + public ICodePointFilter CodePointFilter { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 7cd52e384f..9b8a84b98e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using Microsoft.Framework.WebEncoders; using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Internal; +using Microsoft.Framework.WebEncoders; namespace Microsoft.Framework.DependencyInjection { diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs similarity index 95% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs index 6437376d08..a7982bdf7a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs @@ -2,15 +2,15 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { /// /// Contains extension methods for fetching encoders from a service provider. /// - public static class EncoderExtensions + public static class EncoderServiceProviderExtensions { /// /// Retrieves an IHtmlEncoder from a service provider. diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs similarity index 73% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs rename to src/Microsoft.Framework.WebEncoders/EncoderServices.cs index 8bac20cae8..0b9d6820d3 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -22,17 +22,17 @@ namespace Microsoft.Framework.WebEncoders // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filters => new HtmlEncoder(filters))); - yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filters => new JavaScriptStringEncoder(filters))); - yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filters => new UrlEncoder(filters))); + yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); + yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); + yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); } - private static Func CreateFactory(Func parameterlessCtor, Func parameterfulCtor) + private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) { return serviceProvider => { - var codePointFilters = serviceProvider?.GetService>()?.Options?.CodePointFilters; - return (codePointFilters != null) ? parameterfulCtor(codePointFilters) : parameterlessCtor(); + var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; + return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); }; } } diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 7bcf12f1e3..20a504d38d 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -13,6 +13,8 @@ namespace Microsoft.Framework.WebEncoders /// can be represented unencoded. /// /// + /// Instances of this type will always encode a certain set of characters (such as < + /// and >), even if the filter provided in the constructor allows such characters. /// Once constructed, instances of this class are thread-safe for multiple callers. /// public unsafe sealed class HtmlEncoder : IHtmlEncoder @@ -32,10 +34,19 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom allow list of characters. + /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// pass through the encoder unescaped. /// - public HtmlEncoder(params ICodePointFilter[] filters) - : this(new HtmlUnicodeEncoder(filters)) + public HtmlEncoder(params UnicodeBlock[] allowedBlocks) + : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + { + } + + /// + /// Instantiates an encoder using a custom code point filter. + /// + public HtmlEncoder(ICodePointFilter filter) + : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } @@ -97,8 +108,8 @@ namespace Microsoft.Framework.WebEncoders // generate at most 10 output chars ("􏿿"), which equates to 5 output chars per input char. private const int MaxOutputCharsPerInputChar = 8; - internal HtmlUnicodeEncoder(ICodePointFilter[] filters) - : base(filters, MaxOutputCharsPerInputChar) + internal HtmlUnicodeEncoder(CodePointFilter filter) + : base(filter, MaxOutputCharsPerInputChar) { } @@ -109,7 +120,7 @@ namespace Microsoft.Framework.WebEncoders HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new HtmlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + encoder = new HtmlUnicodeEncoder(new CodePointFilter()); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs index 0456285b23..4a24158263 100644 --- a/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs @@ -1,5 +1,4 @@ -using System; -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs index 487c1ca35c..99f011ff9a 100644 --- a/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs @@ -16,6 +16,9 @@ namespace Microsoft.Framework.WebEncoders /// JavaScript-escapes a character array and writes the result to the /// supplied output. /// + /// + /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. + /// void JavaScriptStringEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); /// @@ -23,6 +26,7 @@ namespace Microsoft.Framework.WebEncoders /// /// /// The JavaScript-escaped value, or null if the input string was null. + /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. /// string JavaScriptStringEncode(string value); @@ -30,6 +34,9 @@ namespace Microsoft.Framework.WebEncoders /// JavaScript-escapes a given input string and writes the /// result to the supplied output. /// + /// + /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. + /// void JavaScriptStringEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 0d61898614..eb6ba16dae 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -13,6 +13,8 @@ namespace Microsoft.Framework.WebEncoders /// can be represented unescaped. /// /// + /// Instances of this type will always encode a certain set of characters (such as ' + /// and "), even if the filter provided in the constructor allows such characters. /// Once constructed, instances of this class are thread-safe for multiple callers. /// public sealed class JavaScriptStringEncoder : IJavaScriptStringEncoder @@ -32,10 +34,19 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom allow list of characters. + /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// pass through the encoder unescaped. /// - public JavaScriptStringEncoder(params ICodePointFilter[] filters) - : this(new JavaScriptStringUnicodeEncoder(filters)) + public JavaScriptStringEncoder(params UnicodeBlock[] allowedBlocks) + : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedBlocks))) + { + } + + /// + /// Instantiates an encoder using a custom code point filter. + /// + public JavaScriptStringEncoder(ICodePointFilter filter) + : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) { } @@ -97,8 +108,8 @@ namespace Microsoft.Framework.WebEncoders // surrogate pairs in the output. private const int MaxOutputCharsPerInputChar = 6; - internal JavaScriptStringUnicodeEncoder(ICodePointFilter[] filters) - : base(filters, MaxOutputCharsPerInputChar) + internal JavaScriptStringUnicodeEncoder(CodePointFilter filter) + : base(filter, MaxOutputCharsPerInputChar) { // The only interesting characters above and beyond what the base encoder // already covers are the solidus and reverse solidus. @@ -113,7 +124,7 @@ namespace Microsoft.Framework.WebEncoders JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new JavaScriptStringUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter()); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs new file mode 100644 index 0000000000..26f84d86a0 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Represents a range of Unicode code points. + /// + /// + /// Currently only the Basic Multilingual Plane is supported. + /// + public sealed class UnicodeBlock + { + /// + /// Creates a new representation of a Unicode block given the first code point + /// in the block and the number of code points in the block. + /// + public UnicodeBlock(int firstCodePoint, int blockSize) + { + // Parameter checking: the first code point must be U+nnn0, the block size must + // be a multiple of 16 bytes, and we can't span planes. + // See http://unicode.org/faq/blocks_ranges.html for more info. + if (firstCodePoint < 0 || firstCodePoint > 0xFFFF || ((firstCodePoint & 0xF) != 0)) + { + throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); + } + if (blockSize < 0 || (blockSize % 16 != 0) || ((long)firstCodePoint + (long)blockSize > 0x10000)) + { + throw new ArgumentOutOfRangeException(nameof(blockSize)); + } + + FirstCodePoint = firstCodePoint; + BlockSize = blockSize; + } + + /// + /// The number of code points in this block. + /// + public int BlockSize { get; } + + /// + /// The first code point in this block. + /// + public int FirstCodePoint { get; } + + public static UnicodeBlock FromCharacterRange(char firstChar, char lastChar) + { + // Parameter checking: the first code point must be U+nnn0 and the last + // code point must be U+nnnF. We already can't span planes since 'char' + // allows only Basic Multilingual Plane characters. + // See http://unicode.org/faq/blocks_ranges.html for more info. + if ((firstChar & 0xF) != 0) + { + throw new ArgumentOutOfRangeException(nameof(firstChar)); + } + if (lastChar < firstChar || (lastChar & 0xF) != 0xF) + { + throw new ArgumentOutOfRangeException(nameof(lastChar)); + } + + return new UnicodeBlock(firstChar, 1 + (int)(lastChar - firstChar)); + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs new file mode 100644 index 0000000000..2217e2db93 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Contains predefined Unicode code point filters. + /// + public static partial class UnicodeBlocks + { + /// + /// Represents an empty Unicode block. + /// + /// + /// This block contains no code points. + /// + public static UnicodeBlock None + { + get + { + return Volatile.Read(ref _none) ?? CreateEmptyBlock(ref _none); + } + } + private static UnicodeBlock _none; + + /// + /// Represents a block containing all characters in the Unicode Basic Multilingual Plane (U+0000..U+FFFF). + /// + public static UnicodeBlock All + { + get + { + return Volatile.Read(ref _all) ?? CreateBlock(ref _all, '\u0000', '\uFFFF'); + } + } + private static UnicodeBlock _all; + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeBlock CreateBlock(ref UnicodeBlock block, char first, char last) + { + // If the block hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'block' value. + Debug.Assert(last > first, "Code points were specified out of order."); + var newBlock = UnicodeBlock.FromCharacterRange(first, last); + Volatile.Write(ref block, newBlock); + return newBlock; + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeBlock CreateEmptyBlock(ref UnicodeBlock block) + { + // If the block hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'block' value. + var newBlock = new UnicodeBlock(0, 0); + Volatile.Write(ref block, newBlock); + return newBlock; + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs new file mode 100644 index 0000000000..d3404759c5 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs @@ -0,0 +1,2336 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + public static partial class UnicodeBlocks + { + /// + /// Represents the 'Basic Latin' Unicode block (U+0000..U+007F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BasicLatin + { + get + { + return Volatile.Read(ref _basicLatin) ?? CreateBlock(ref _basicLatin, first: '\u0000', last: '\u007F'); + } + } + private static UnicodeBlock _basicLatin; + + /// + /// Represents the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Latin1Supplement + { + get + { + return Volatile.Read(ref _latin1Supplement) ?? CreateBlock(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); + } + } + private static UnicodeBlock _latin1Supplement; + + /// + /// Represents the 'Latin Extended-A' Unicode block (U+0100..U+017F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedA + { + get + { + return Volatile.Read(ref _latinExtendedA) ?? CreateBlock(ref _latinExtendedA, first: '\u0100', last: '\u017F'); + } + } + private static UnicodeBlock _latinExtendedA; + + /// + /// Represents the 'Latin Extended-B' Unicode block (U+0180..U+024F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedB + { + get + { + return Volatile.Read(ref _latinExtendedB) ?? CreateBlock(ref _latinExtendedB, first: '\u0180', last: '\u024F'); + } + } + private static UnicodeBlock _latinExtendedB; + + /// + /// Represents the 'IPA Extensions' Unicode block (U+0250..U+02AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. + /// + public static UnicodeBlock IPAExtensions + { + get + { + return Volatile.Read(ref _ipaExtensions) ?? CreateBlock(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); + } + } + private static UnicodeBlock _ipaExtensions; + + /// + /// Represents the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SpacingModifierLetters + { + get + { + return Volatile.Read(ref _spacingModifierLetters) ?? CreateBlock(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); + } + } + private static UnicodeBlock _spacingModifierLetters; + + /// + /// Represents the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarks + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateBlock(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); + } + } + private static UnicodeBlock _combiningDiacriticalMarks; + + /// + /// Represents the 'Greek and Coptic' Unicode block (U+0370..U+03FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GreekandCoptic + { + get + { + return Volatile.Read(ref _greekandCoptic) ?? CreateBlock(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); + } + } + private static UnicodeBlock _greekandCoptic; + + /// + /// Represents the 'Cyrillic' Unicode block (U+0400..U+04FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Cyrillic + { + get + { + return Volatile.Read(ref _cyrillic) ?? CreateBlock(ref _cyrillic, first: '\u0400', last: '\u04FF'); + } + } + private static UnicodeBlock _cyrillic; + + /// + /// Represents the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CyrillicSupplement + { + get + { + return Volatile.Read(ref _cyrillicSupplement) ?? CreateBlock(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); + } + } + private static UnicodeBlock _cyrillicSupplement; + + /// + /// Represents the 'Armenian' Unicode block (U+0530..U+058F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Armenian + { + get + { + return Volatile.Read(ref _armenian) ?? CreateBlock(ref _armenian, first: '\u0530', last: '\u058F'); + } + } + private static UnicodeBlock _armenian; + + /// + /// Represents the 'Hebrew' Unicode block (U+0590..U+05FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Hebrew + { + get + { + return Volatile.Read(ref _hebrew) ?? CreateBlock(ref _hebrew, first: '\u0590', last: '\u05FF'); + } + } + private static UnicodeBlock _hebrew; + + /// + /// Represents the 'Arabic' Unicode block (U+0600..U+06FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Arabic + { + get + { + return Volatile.Read(ref _arabic) ?? CreateBlock(ref _arabic, first: '\u0600', last: '\u06FF'); + } + } + private static UnicodeBlock _arabic; + + /// + /// Represents the 'Syriac' Unicode block (U+0700..U+074F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Syriac + { + get + { + return Volatile.Read(ref _syriac) ?? CreateBlock(ref _syriac, first: '\u0700', last: '\u074F'); + } + } + private static UnicodeBlock _syriac; + + /// + /// Represents the 'Arabic Supplement' Unicode block (U+0750..U+077F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicSupplement + { + get + { + return Volatile.Read(ref _arabicSupplement) ?? CreateBlock(ref _arabicSupplement, first: '\u0750', last: '\u077F'); + } + } + private static UnicodeBlock _arabicSupplement; + + /// + /// Represents the 'Thaana' Unicode block (U+0780..U+07BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Thaana + { + get + { + return Volatile.Read(ref _thaana) ?? CreateBlock(ref _thaana, first: '\u0780', last: '\u07BF'); + } + } + private static UnicodeBlock _thaana; + + /// + /// Represents the 'NKo' Unicode block (U+07C0..U+07FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock NKo + { + get + { + return Volatile.Read(ref _nKo) ?? CreateBlock(ref _nKo, first: '\u07C0', last: '\u07FF'); + } + } + private static UnicodeBlock _nKo; + + /// + /// Represents the 'Samaritan' Unicode block (U+0800..U+083F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Samaritan + { + get + { + return Volatile.Read(ref _samaritan) ?? CreateBlock(ref _samaritan, first: '\u0800', last: '\u083F'); + } + } + private static UnicodeBlock _samaritan; + + /// + /// Represents the 'Mandaic' Unicode block (U+0840..U+085F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Mandaic + { + get + { + return Volatile.Read(ref _mandaic) ?? CreateBlock(ref _mandaic, first: '\u0840', last: '\u085F'); + } + } + private static UnicodeBlock _mandaic; + + /// + /// Represents the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicExtendedA + { + get + { + return Volatile.Read(ref _arabicExtendedA) ?? CreateBlock(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); + } + } + private static UnicodeBlock _arabicExtendedA; + + /// + /// Represents the 'Devanagari' Unicode block (U+0900..U+097F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Devanagari + { + get + { + return Volatile.Read(ref _devanagari) ?? CreateBlock(ref _devanagari, first: '\u0900', last: '\u097F'); + } + } + private static UnicodeBlock _devanagari; + + /// + /// Represents the 'Bengali' Unicode block (U+0980..U+09FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Bengali + { + get + { + return Volatile.Read(ref _bengali) ?? CreateBlock(ref _bengali, first: '\u0980', last: '\u09FF'); + } + } + private static UnicodeBlock _bengali; + + /// + /// Represents the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Gurmukhi + { + get + { + return Volatile.Read(ref _gurmukhi) ?? CreateBlock(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); + } + } + private static UnicodeBlock _gurmukhi; + + /// + /// Represents the 'Gujarati' Unicode block (U+0A80..U+0AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Gujarati + { + get + { + return Volatile.Read(ref _gujarati) ?? CreateBlock(ref _gujarati, first: '\u0A80', last: '\u0AFF'); + } + } + private static UnicodeBlock _gujarati; + + /// + /// Represents the 'Oriya' Unicode block (U+0B00..U+0B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Oriya + { + get + { + return Volatile.Read(ref _oriya) ?? CreateBlock(ref _oriya, first: '\u0B00', last: '\u0B7F'); + } + } + private static UnicodeBlock _oriya; + + /// + /// Represents the 'Tamil' Unicode block (U+0B80..U+0BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tamil + { + get + { + return Volatile.Read(ref _tamil) ?? CreateBlock(ref _tamil, first: '\u0B80', last: '\u0BFF'); + } + } + private static UnicodeBlock _tamil; + + /// + /// Represents the 'Telugu' Unicode block (U+0C00..U+0C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Telugu + { + get + { + return Volatile.Read(ref _telugu) ?? CreateBlock(ref _telugu, first: '\u0C00', last: '\u0C7F'); + } + } + private static UnicodeBlock _telugu; + + /// + /// Represents the 'Kannada' Unicode block (U+0C80..U+0CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Kannada + { + get + { + return Volatile.Read(ref _kannada) ?? CreateBlock(ref _kannada, first: '\u0C80', last: '\u0CFF'); + } + } + private static UnicodeBlock _kannada; + + /// + /// Represents the 'Malayalam' Unicode block (U+0D00..U+0D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Malayalam + { + get + { + return Volatile.Read(ref _malayalam) ?? CreateBlock(ref _malayalam, first: '\u0D00', last: '\u0D7F'); + } + } + private static UnicodeBlock _malayalam; + + /// + /// Represents the 'Sinhala' Unicode block (U+0D80..U+0DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Sinhala + { + get + { + return Volatile.Read(ref _sinhala) ?? CreateBlock(ref _sinhala, first: '\u0D80', last: '\u0DFF'); + } + } + private static UnicodeBlock _sinhala; + + /// + /// Represents the 'Thai' Unicode block (U+0E00..U+0E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Thai + { + get + { + return Volatile.Read(ref _thai) ?? CreateBlock(ref _thai, first: '\u0E00', last: '\u0E7F'); + } + } + private static UnicodeBlock _thai; + + /// + /// Represents the 'Lao' Unicode block (U+0E80..U+0EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Lao + { + get + { + return Volatile.Read(ref _lao) ?? CreateBlock(ref _lao, first: '\u0E80', last: '\u0EFF'); + } + } + private static UnicodeBlock _lao; + + /// + /// Represents the 'Tibetan' Unicode block (U+0F00..U+0FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tibetan + { + get + { + return Volatile.Read(ref _tibetan) ?? CreateBlock(ref _tibetan, first: '\u0F00', last: '\u0FFF'); + } + } + private static UnicodeBlock _tibetan; + + /// + /// Represents the 'Myanmar' Unicode block (U+1000..U+109F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Myanmar + { + get + { + return Volatile.Read(ref _myanmar) ?? CreateBlock(ref _myanmar, first: '\u1000', last: '\u109F'); + } + } + private static UnicodeBlock _myanmar; + + /// + /// Represents the 'Georgian' Unicode block (U+10A0..U+10FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Georgian + { + get + { + return Volatile.Read(ref _georgian) ?? CreateBlock(ref _georgian, first: '\u10A0', last: '\u10FF'); + } + } + private static UnicodeBlock _georgian; + + /// + /// Represents the 'Hangul Jamo' Unicode block (U+1100..U+11FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulJamo + { + get + { + return Volatile.Read(ref _hangulJamo) ?? CreateBlock(ref _hangulJamo, first: '\u1100', last: '\u11FF'); + } + } + private static UnicodeBlock _hangulJamo; + + /// + /// Represents the 'Ethiopic' Unicode block (U+1200..U+137F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Ethiopic + { + get + { + return Volatile.Read(ref _ethiopic) ?? CreateBlock(ref _ethiopic, first: '\u1200', last: '\u137F'); + } + } + private static UnicodeBlock _ethiopic; + + /// + /// Represents the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EthiopicSupplement + { + get + { + return Volatile.Read(ref _ethiopicSupplement) ?? CreateBlock(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); + } + } + private static UnicodeBlock _ethiopicSupplement; + + /// + /// Represents the 'Cherokee' Unicode block (U+13A0..U+13FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Cherokee + { + get + { + return Volatile.Read(ref _cherokee) ?? CreateBlock(ref _cherokee, first: '\u13A0', last: '\u13FF'); + } + } + private static UnicodeBlock _cherokee; + + /// + /// Represents the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock UnifiedCanadianAboriginalSyllabics + { + get + { + return Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); + } + } + private static UnicodeBlock _unifiedCanadianAboriginalSyllabics; + + /// + /// Represents the 'Ogham' Unicode block (U+1680..U+169F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Ogham + { + get + { + return Volatile.Read(ref _ogham) ?? CreateBlock(ref _ogham, first: '\u1680', last: '\u169F'); + } + } + private static UnicodeBlock _ogham; + + /// + /// Represents the 'Runic' Unicode block (U+16A0..U+16FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Runic + { + get + { + return Volatile.Read(ref _runic) ?? CreateBlock(ref _runic, first: '\u16A0', last: '\u16FF'); + } + } + private static UnicodeBlock _runic; + + /// + /// Represents the 'Tagalog' Unicode block (U+1700..U+171F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tagalog + { + get + { + return Volatile.Read(ref _tagalog) ?? CreateBlock(ref _tagalog, first: '\u1700', last: '\u171F'); + } + } + private static UnicodeBlock _tagalog; + + /// + /// Represents the 'Hanunoo' Unicode block (U+1720..U+173F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Hanunoo + { + get + { + return Volatile.Read(ref _hanunoo) ?? CreateBlock(ref _hanunoo, first: '\u1720', last: '\u173F'); + } + } + private static UnicodeBlock _hanunoo; + + /// + /// Represents the 'Buhid' Unicode block (U+1740..U+175F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Buhid + { + get + { + return Volatile.Read(ref _buhid) ?? CreateBlock(ref _buhid, first: '\u1740', last: '\u175F'); + } + } + private static UnicodeBlock _buhid; + + /// + /// Represents the 'Tagbanwa' Unicode block (U+1760..U+177F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tagbanwa + { + get + { + return Volatile.Read(ref _tagbanwa) ?? CreateBlock(ref _tagbanwa, first: '\u1760', last: '\u177F'); + } + } + private static UnicodeBlock _tagbanwa; + + /// + /// Represents the 'Khmer' Unicode block (U+1780..U+17FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Khmer + { + get + { + return Volatile.Read(ref _khmer) ?? CreateBlock(ref _khmer, first: '\u1780', last: '\u17FF'); + } + } + private static UnicodeBlock _khmer; + + /// + /// Represents the 'Mongolian' Unicode block (U+1800..U+18AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Mongolian + { + get + { + return Volatile.Read(ref _mongolian) ?? CreateBlock(ref _mongolian, first: '\u1800', last: '\u18AF'); + } + } + private static UnicodeBlock _mongolian; + + /// + /// Represents the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock UnifiedCanadianAboriginalSyllabicsExtended + { + get + { + return Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); + } + } + private static UnicodeBlock _unifiedCanadianAboriginalSyllabicsExtended; + + /// + /// Represents the 'Limbu' Unicode block (U+1900..U+194F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Limbu + { + get + { + return Volatile.Read(ref _limbu) ?? CreateBlock(ref _limbu, first: '\u1900', last: '\u194F'); + } + } + private static UnicodeBlock _limbu; + + /// + /// Represents the 'Tai Le' Unicode block (U+1950..U+197F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. + /// + public static UnicodeBlock TaiLe + { + get + { + return Volatile.Read(ref _taiLe) ?? CreateBlock(ref _taiLe, first: '\u1950', last: '\u197F'); + } + } + private static UnicodeBlock _taiLe; + + /// + /// Represents the 'New Tai Lue' Unicode block (U+1980..U+19DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock NewTaiLue + { + get + { + return Volatile.Read(ref _newTaiLue) ?? CreateBlock(ref _newTaiLue, first: '\u1980', last: '\u19DF'); + } + } + private static UnicodeBlock _newTaiLue; + + /// + /// Represents the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KhmerSymbols + { + get + { + return Volatile.Read(ref _khmerSymbols) ?? CreateBlock(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); + } + } + private static UnicodeBlock _khmerSymbols; + + /// + /// Represents the 'Buginese' Unicode block (U+1A00..U+1A1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Buginese + { + get + { + return Volatile.Read(ref _buginese) ?? CreateBlock(ref _buginese, first: '\u1A00', last: '\u1A1F'); + } + } + private static UnicodeBlock _buginese; + + /// + /// Represents the 'Tai Tham' Unicode block (U+1A20..U+1AAF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. + /// + public static UnicodeBlock TaiTham + { + get + { + return Volatile.Read(ref _taiTham) ?? CreateBlock(ref _taiTham, first: '\u1A20', last: '\u1AAF'); + } + } + private static UnicodeBlock _taiTham; + + /// + /// Represents the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarksExtended + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateBlock(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); + } + } + private static UnicodeBlock _combiningDiacriticalMarksExtended; + + /// + /// Represents the 'Balinese' Unicode block (U+1B00..U+1B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Balinese + { + get + { + return Volatile.Read(ref _balinese) ?? CreateBlock(ref _balinese, first: '\u1B00', last: '\u1B7F'); + } + } + private static UnicodeBlock _balinese; + + /// + /// Represents the 'Sundanese' Unicode block (U+1B80..U+1BBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Sundanese + { + get + { + return Volatile.Read(ref _sundanese) ?? CreateBlock(ref _sundanese, first: '\u1B80', last: '\u1BBF'); + } + } + private static UnicodeBlock _sundanese; + + /// + /// Represents the 'Batak' Unicode block (U+1BC0..U+1BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Batak + { + get + { + return Volatile.Read(ref _batak) ?? CreateBlock(ref _batak, first: '\u1BC0', last: '\u1BFF'); + } + } + private static UnicodeBlock _batak; + + /// + /// Represents the 'Lepcha' Unicode block (U+1C00..U+1C4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Lepcha + { + get + { + return Volatile.Read(ref _lepcha) ?? CreateBlock(ref _lepcha, first: '\u1C00', last: '\u1C4F'); + } + } + private static UnicodeBlock _lepcha; + + /// + /// Represents the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. + /// + public static UnicodeBlock OlChiki + { + get + { + return Volatile.Read(ref _olChiki) ?? CreateBlock(ref _olChiki, first: '\u1C50', last: '\u1C7F'); + } + } + private static UnicodeBlock _olChiki; + + /// + /// Represents the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SundaneseSupplement + { + get + { + return Volatile.Read(ref _sundaneseSupplement) ?? CreateBlock(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); + } + } + private static UnicodeBlock _sundaneseSupplement; + + /// + /// Represents the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock VedicExtensions + { + get + { + return Volatile.Read(ref _vedicExtensions) ?? CreateBlock(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); + } + } + private static UnicodeBlock _vedicExtensions; + + /// + /// Represents the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock PhoneticExtensions + { + get + { + return Volatile.Read(ref _phoneticExtensions) ?? CreateBlock(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); + } + } + private static UnicodeBlock _phoneticExtensions; + + /// + /// Represents the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock PhoneticExtensionsSupplement + { + get + { + return Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateBlock(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); + } + } + private static UnicodeBlock _phoneticExtensionsSupplement; + + /// + /// Represents the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarksSupplement + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateBlock(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); + } + } + private static UnicodeBlock _combiningDiacriticalMarksSupplement; + + /// + /// Represents the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedAdditional + { + get + { + return Volatile.Read(ref _latinExtendedAdditional) ?? CreateBlock(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); + } + } + private static UnicodeBlock _latinExtendedAdditional; + + /// + /// Represents the 'Greek Extended' Unicode block (U+1F00..U+1FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GreekExtended + { + get + { + return Volatile.Read(ref _greekExtended) ?? CreateBlock(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); + } + } + private static UnicodeBlock _greekExtended; + + /// + /// Represents the 'General Punctuation' Unicode block (U+2000..U+206F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GeneralPunctuation + { + get + { + return Volatile.Read(ref _generalPunctuation) ?? CreateBlock(ref _generalPunctuation, first: '\u2000', last: '\u206F'); + } + } + private static UnicodeBlock _generalPunctuation; + + /// + /// Represents the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SuperscriptsandSubscripts + { + get + { + return Volatile.Read(ref _superscriptsandSubscripts) ?? CreateBlock(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); + } + } + private static UnicodeBlock _superscriptsandSubscripts; + + /// + /// Represents the 'Currency Symbols' Unicode block (U+20A0..U+20CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CurrencySymbols + { + get + { + return Volatile.Read(ref _currencySymbols) ?? CreateBlock(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); + } + } + private static UnicodeBlock _currencySymbols; + + /// + /// Represents the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarksforSymbols + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateBlock(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); + } + } + private static UnicodeBlock _combiningDiacriticalMarksforSymbols; + + /// + /// Represents the 'Letterlike Symbols' Unicode block (U+2100..U+214F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LetterlikeSymbols + { + get + { + return Volatile.Read(ref _letterlikeSymbols) ?? CreateBlock(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); + } + } + private static UnicodeBlock _letterlikeSymbols; + + /// + /// Represents the 'Number Forms' Unicode block (U+2150..U+218F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. + /// + public static UnicodeBlock NumberForms + { + get + { + return Volatile.Read(ref _numberForms) ?? CreateBlock(ref _numberForms, first: '\u2150', last: '\u218F'); + } + } + private static UnicodeBlock _numberForms; + + /// + /// Represents the 'Arrows' Unicode block (U+2190..U+21FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Arrows + { + get + { + return Volatile.Read(ref _arrows) ?? CreateBlock(ref _arrows, first: '\u2190', last: '\u21FF'); + } + } + private static UnicodeBlock _arrows; + + /// + /// Represents the 'Mathematical Operators' Unicode block (U+2200..U+22FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MathematicalOperators + { + get + { + return Volatile.Read(ref _mathematicalOperators) ?? CreateBlock(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); + } + } + private static UnicodeBlock _mathematicalOperators; + + /// + /// Represents the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousTechnical + { + get + { + return Volatile.Read(ref _miscellaneousTechnical) ?? CreateBlock(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); + } + } + private static UnicodeBlock _miscellaneousTechnical; + + /// + /// Represents the 'Control Pictures' Unicode block (U+2400..U+243F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ControlPictures + { + get + { + return Volatile.Read(ref _controlPictures) ?? CreateBlock(ref _controlPictures, first: '\u2400', last: '\u243F'); + } + } + private static UnicodeBlock _controlPictures; + + /// + /// Represents the 'Optical Character Recognition' Unicode block (U+2440..U+245F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. + /// + public static UnicodeBlock OpticalCharacterRecognition + { + get + { + return Volatile.Read(ref _opticalCharacterRecognition) ?? CreateBlock(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); + } + } + private static UnicodeBlock _opticalCharacterRecognition; + + /// + /// Represents the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EnclosedAlphanumerics + { + get + { + return Volatile.Read(ref _enclosedAlphanumerics) ?? CreateBlock(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); + } + } + private static UnicodeBlock _enclosedAlphanumerics; + + /// + /// Represents the 'Box Drawing' Unicode block (U+2500..U+257F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BoxDrawing + { + get + { + return Volatile.Read(ref _boxDrawing) ?? CreateBlock(ref _boxDrawing, first: '\u2500', last: '\u257F'); + } + } + private static UnicodeBlock _boxDrawing; + + /// + /// Represents the 'Block Elements' Unicode block (U+2580..U+259F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BlockElements + { + get + { + return Volatile.Read(ref _blockElements) ?? CreateBlock(ref _blockElements, first: '\u2580', last: '\u259F'); + } + } + private static UnicodeBlock _blockElements; + + /// + /// Represents the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GeometricShapes + { + get + { + return Volatile.Read(ref _geometricShapes) ?? CreateBlock(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); + } + } + private static UnicodeBlock _geometricShapes; + + /// + /// Represents the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousSymbols + { + get + { + return Volatile.Read(ref _miscellaneousSymbols) ?? CreateBlock(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); + } + } + private static UnicodeBlock _miscellaneousSymbols; + + /// + /// Represents the 'Dingbats' Unicode block (U+2700..U+27BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Dingbats + { + get + { + return Volatile.Read(ref _dingbats) ?? CreateBlock(ref _dingbats, first: '\u2700', last: '\u27BF'); + } + } + private static UnicodeBlock _dingbats; + + /// + /// Represents the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousMathematicalSymbolsA + { + get + { + return Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); + } + } + private static UnicodeBlock _miscellaneousMathematicalSymbolsA; + + /// + /// Represents the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalArrowsA + { + get + { + return Volatile.Read(ref _supplementalArrowsA) ?? CreateBlock(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); + } + } + private static UnicodeBlock _supplementalArrowsA; + + /// + /// Represents the 'Braille Patterns' Unicode block (U+2800..U+28FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BraillePatterns + { + get + { + return Volatile.Read(ref _braillePatterns) ?? CreateBlock(ref _braillePatterns, first: '\u2800', last: '\u28FF'); + } + } + private static UnicodeBlock _braillePatterns; + + /// + /// Represents the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalArrowsB + { + get + { + return Volatile.Read(ref _supplementalArrowsB) ?? CreateBlock(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); + } + } + private static UnicodeBlock _supplementalArrowsB; + + /// + /// Represents the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousMathematicalSymbolsB + { + get + { + return Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); + } + } + private static UnicodeBlock _miscellaneousMathematicalSymbolsB; + + /// + /// Represents the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalMathematicalOperators + { + get + { + return Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateBlock(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); + } + } + private static UnicodeBlock _supplementalMathematicalOperators; + + /// + /// Represents the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousSymbolsandArrows + { + get + { + return Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateBlock(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); + } + } + private static UnicodeBlock _miscellaneousSymbolsandArrows; + + /// + /// Represents the 'Glagolitic' Unicode block (U+2C00..U+2C5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Glagolitic + { + get + { + return Volatile.Read(ref _glagolitic) ?? CreateBlock(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); + } + } + private static UnicodeBlock _glagolitic; + + /// + /// Represents the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedC + { + get + { + return Volatile.Read(ref _latinExtendedC) ?? CreateBlock(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); + } + } + private static UnicodeBlock _latinExtendedC; + + /// + /// Represents the 'Coptic' Unicode block (U+2C80..U+2CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Coptic + { + get + { + return Volatile.Read(ref _coptic) ?? CreateBlock(ref _coptic, first: '\u2C80', last: '\u2CFF'); + } + } + private static UnicodeBlock _coptic; + + /// + /// Represents the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GeorgianSupplement + { + get + { + return Volatile.Read(ref _georgianSupplement) ?? CreateBlock(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); + } + } + private static UnicodeBlock _georgianSupplement; + + /// + /// Represents the 'Tifinagh' Unicode block (U+2D30..U+2D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tifinagh + { + get + { + return Volatile.Read(ref _tifinagh) ?? CreateBlock(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); + } + } + private static UnicodeBlock _tifinagh; + + /// + /// Represents the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EthiopicExtended + { + get + { + return Volatile.Read(ref _ethiopicExtended) ?? CreateBlock(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); + } + } + private static UnicodeBlock _ethiopicExtended; + + /// + /// Represents the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CyrillicExtendedA + { + get + { + return Volatile.Read(ref _cyrillicExtendedA) ?? CreateBlock(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); + } + } + private static UnicodeBlock _cyrillicExtendedA; + + /// + /// Represents the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalPunctuation + { + get + { + return Volatile.Read(ref _supplementalPunctuation) ?? CreateBlock(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); + } + } + private static UnicodeBlock _supplementalPunctuation; + + /// + /// Represents the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKRadicalsSupplement + { + get + { + return Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateBlock(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); + } + } + private static UnicodeBlock _cjkRadicalsSupplement; + + /// + /// Represents the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KangxiRadicals + { + get + { + return Volatile.Read(ref _kangxiRadicals) ?? CreateBlock(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); + } + } + private static UnicodeBlock _kangxiRadicals; + + /// + /// Represents the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock IdeographicDescriptionCharacters + { + get + { + return Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateBlock(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); + } + } + private static UnicodeBlock _ideographicDescriptionCharacters; + + /// + /// Represents the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKSymbolsandPunctuation + { + get + { + return Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateBlock(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); + } + } + private static UnicodeBlock _cjkSymbolsandPunctuation; + + /// + /// Represents the 'Hiragana' Unicode block (U+3040..U+309F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Hiragana + { + get + { + return Volatile.Read(ref _hiragana) ?? CreateBlock(ref _hiragana, first: '\u3040', last: '\u309F'); + } + } + private static UnicodeBlock _hiragana; + + /// + /// Represents the 'Katakana' Unicode block (U+30A0..U+30FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Katakana + { + get + { + return Volatile.Read(ref _katakana) ?? CreateBlock(ref _katakana, first: '\u30A0', last: '\u30FF'); + } + } + private static UnicodeBlock _katakana; + + /// + /// Represents the 'Bopomofo' Unicode block (U+3100..U+312F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Bopomofo + { + get + { + return Volatile.Read(ref _bopomofo) ?? CreateBlock(ref _bopomofo, first: '\u3100', last: '\u312F'); + } + } + private static UnicodeBlock _bopomofo; + + /// + /// Represents the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulCompatibilityJamo + { + get + { + return Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateBlock(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); + } + } + private static UnicodeBlock _hangulCompatibilityJamo; + + /// + /// Represents the 'Kanbun' Unicode block (U+3190..U+319F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Kanbun + { + get + { + return Volatile.Read(ref _kanbun) ?? CreateBlock(ref _kanbun, first: '\u3190', last: '\u319F'); + } + } + private static UnicodeBlock _kanbun; + + /// + /// Represents the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BopomofoExtended + { + get + { + return Volatile.Read(ref _bopomofoExtended) ?? CreateBlock(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); + } + } + private static UnicodeBlock _bopomofoExtended; + + /// + /// Represents the 'CJK Strokes' Unicode block (U+31C0..U+31EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKStrokes + { + get + { + return Volatile.Read(ref _cjkStrokes) ?? CreateBlock(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); + } + } + private static UnicodeBlock _cjkStrokes; + + /// + /// Represents the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KatakanaPhoneticExtensions + { + get + { + return Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateBlock(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); + } + } + private static UnicodeBlock _katakanaPhoneticExtensions; + + /// + /// Represents the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EnclosedCJKLettersandMonths + { + get + { + return Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateBlock(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); + } + } + private static UnicodeBlock _enclosedCJKLettersandMonths; + + /// + /// Represents the 'CJK Compatibility' Unicode block (U+3300..U+33FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKCompatibility + { + get + { + return Volatile.Read(ref _cjkCompatibility) ?? CreateBlock(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); + } + } + private static UnicodeBlock _cjkCompatibility; + + /// + /// Represents the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKUnifiedIdeographsExtensionA + { + get + { + return Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateBlock(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); + } + } + private static UnicodeBlock _cjkUnifiedIdeographsExtensionA; + + /// + /// Represents the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock YijingHexagramSymbols + { + get + { + return Volatile.Read(ref _yijingHexagramSymbols) ?? CreateBlock(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); + } + } + private static UnicodeBlock _yijingHexagramSymbols; + + /// + /// Represents the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKUnifiedIdeographs + { + get + { + return Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateBlock(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); + } + } + private static UnicodeBlock _cjkUnifiedIdeographs; + + /// + /// Represents the 'Yi Syllables' Unicode block (U+A000..U+A48F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock YiSyllables + { + get + { + return Volatile.Read(ref _yiSyllables) ?? CreateBlock(ref _yiSyllables, first: '\uA000', last: '\uA48F'); + } + } + private static UnicodeBlock _yiSyllables; + + /// + /// Represents the 'Yi Radicals' Unicode block (U+A490..U+A4CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. + /// + public static UnicodeBlock YiRadicals + { + get + { + return Volatile.Read(ref _yiRadicals) ?? CreateBlock(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); + } + } + private static UnicodeBlock _yiRadicals; + + /// + /// Represents the 'Lisu' Unicode block (U+A4D0..U+A4FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Lisu + { + get + { + return Volatile.Read(ref _lisu) ?? CreateBlock(ref _lisu, first: '\uA4D0', last: '\uA4FF'); + } + } + private static UnicodeBlock _lisu; + + /// + /// Represents the 'Vai' Unicode block (U+A500..U+A63F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Vai + { + get + { + return Volatile.Read(ref _vai) ?? CreateBlock(ref _vai, first: '\uA500', last: '\uA63F'); + } + } + private static UnicodeBlock _vai; + + /// + /// Represents the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CyrillicExtendedB + { + get + { + return Volatile.Read(ref _cyrillicExtendedB) ?? CreateBlock(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); + } + } + private static UnicodeBlock _cyrillicExtendedB; + + /// + /// Represents the 'Bamum' Unicode block (U+A6A0..U+A6FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Bamum + { + get + { + return Volatile.Read(ref _bamum) ?? CreateBlock(ref _bamum, first: '\uA6A0', last: '\uA6FF'); + } + } + private static UnicodeBlock _bamum; + + /// + /// Represents the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ModifierToneLetters + { + get + { + return Volatile.Read(ref _modifierToneLetters) ?? CreateBlock(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); + } + } + private static UnicodeBlock _modifierToneLetters; + + /// + /// Represents the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedD + { + get + { + return Volatile.Read(ref _latinExtendedD) ?? CreateBlock(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); + } + } + private static UnicodeBlock _latinExtendedD; + + /// + /// Represents the 'Syloti Nagri' Unicode block (U+A800..U+A82F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SylotiNagri + { + get + { + return Volatile.Read(ref _sylotiNagri) ?? CreateBlock(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); + } + } + private static UnicodeBlock _sylotiNagri; + + /// + /// Represents the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CommonIndicNumberForms + { + get + { + return Volatile.Read(ref _commonIndicNumberForms) ?? CreateBlock(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); + } + } + private static UnicodeBlock _commonIndicNumberForms; + + /// + /// Represents the 'Phags-pa' Unicode block (U+A840..U+A87F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Phagspa + { + get + { + return Volatile.Read(ref _phagspa) ?? CreateBlock(ref _phagspa, first: '\uA840', last: '\uA87F'); + } + } + private static UnicodeBlock _phagspa; + + /// + /// Represents the 'Saurashtra' Unicode block (U+A880..U+A8DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Saurashtra + { + get + { + return Volatile.Read(ref _saurashtra) ?? CreateBlock(ref _saurashtra, first: '\uA880', last: '\uA8DF'); + } + } + private static UnicodeBlock _saurashtra; + + /// + /// Represents the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock DevanagariExtended + { + get + { + return Volatile.Read(ref _devanagariExtended) ?? CreateBlock(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); + } + } + private static UnicodeBlock _devanagariExtended; + + /// + /// Represents the 'Kayah Li' Unicode block (U+A900..U+A92F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KayahLi + { + get + { + return Volatile.Read(ref _kayahLi) ?? CreateBlock(ref _kayahLi, first: '\uA900', last: '\uA92F'); + } + } + private static UnicodeBlock _kayahLi; + + /// + /// Represents the 'Rejang' Unicode block (U+A930..U+A95F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Rejang + { + get + { + return Volatile.Read(ref _rejang) ?? CreateBlock(ref _rejang, first: '\uA930', last: '\uA95F'); + } + } + private static UnicodeBlock _rejang; + + /// + /// Represents the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulJamoExtendedA + { + get + { + return Volatile.Read(ref _hangulJamoExtendedA) ?? CreateBlock(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); + } + } + private static UnicodeBlock _hangulJamoExtendedA; + + /// + /// Represents the 'Javanese' Unicode block (U+A980..U+A9DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Javanese + { + get + { + return Volatile.Read(ref _javanese) ?? CreateBlock(ref _javanese, first: '\uA980', last: '\uA9DF'); + } + } + private static UnicodeBlock _javanese; + + /// + /// Represents the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MyanmarExtendedB + { + get + { + return Volatile.Read(ref _myanmarExtendedB) ?? CreateBlock(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); + } + } + private static UnicodeBlock _myanmarExtendedB; + + /// + /// Represents the 'Cham' Unicode block (U+AA00..U+AA5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Cham + { + get + { + return Volatile.Read(ref _cham) ?? CreateBlock(ref _cham, first: '\uAA00', last: '\uAA5F'); + } + } + private static UnicodeBlock _cham; + + /// + /// Represents the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MyanmarExtendedA + { + get + { + return Volatile.Read(ref _myanmarExtendedA) ?? CreateBlock(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); + } + } + private static UnicodeBlock _myanmarExtendedA; + + /// + /// Represents the 'Tai Viet' Unicode block (U+AA80..U+AADF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock TaiViet + { + get + { + return Volatile.Read(ref _taiViet) ?? CreateBlock(ref _taiViet, first: '\uAA80', last: '\uAADF'); + } + } + private static UnicodeBlock _taiViet; + + /// + /// Represents the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MeeteiMayekExtensions + { + get + { + return Volatile.Read(ref _meeteiMayekExtensions) ?? CreateBlock(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); + } + } + private static UnicodeBlock _meeteiMayekExtensions; + + /// + /// Represents the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EthiopicExtendedA + { + get + { + return Volatile.Read(ref _ethiopicExtendedA) ?? CreateBlock(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); + } + } + private static UnicodeBlock _ethiopicExtendedA; + + /// + /// Represents the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedE + { + get + { + return Volatile.Read(ref _latinExtendedE) ?? CreateBlock(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); + } + } + private static UnicodeBlock _latinExtendedE; + + /// + /// Represents the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MeeteiMayek + { + get + { + return Volatile.Read(ref _meeteiMayek) ?? CreateBlock(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); + } + } + private static UnicodeBlock _meeteiMayek; + + /// + /// Represents the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulSyllables + { + get + { + return Volatile.Read(ref _hangulSyllables) ?? CreateBlock(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); + } + } + private static UnicodeBlock _hangulSyllables; + + /// + /// Represents the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulJamoExtendedB + { + get + { + return Volatile.Read(ref _hangulJamoExtendedB) ?? CreateBlock(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); + } + } + private static UnicodeBlock _hangulJamoExtendedB; + + /// + /// Represents the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKCompatibilityIdeographs + { + get + { + return Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateBlock(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); + } + } + private static UnicodeBlock _cjkCompatibilityIdeographs; + + /// + /// Represents the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock AlphabeticPresentationForms + { + get + { + return Volatile.Read(ref _alphabeticPresentationForms) ?? CreateBlock(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); + } + } + private static UnicodeBlock _alphabeticPresentationForms; + + /// + /// Represents the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicPresentationFormsA + { + get + { + return Volatile.Read(ref _arabicPresentationFormsA) ?? CreateBlock(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); + } + } + private static UnicodeBlock _arabicPresentationFormsA; + + /// + /// Represents the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock VariationSelectors + { + get + { + return Volatile.Read(ref _variationSelectors) ?? CreateBlock(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); + } + } + private static UnicodeBlock _variationSelectors; + + /// + /// Represents the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. + /// + public static UnicodeBlock VerticalForms + { + get + { + return Volatile.Read(ref _verticalForms) ?? CreateBlock(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); + } + } + private static UnicodeBlock _verticalForms; + + /// + /// Represents the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningHalfMarks + { + get + { + return Volatile.Read(ref _combiningHalfMarks) ?? CreateBlock(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); + } + } + private static UnicodeBlock _combiningHalfMarks; + + /// + /// Represents the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKCompatibilityForms + { + get + { + return Volatile.Read(ref _cjkCompatibilityForms) ?? CreateBlock(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); + } + } + private static UnicodeBlock _cjkCompatibilityForms; + + /// + /// Represents the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SmallFormVariants + { + get + { + return Volatile.Read(ref _smallFormVariants) ?? CreateBlock(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); + } + } + private static UnicodeBlock _smallFormVariants; + + /// + /// Represents the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicPresentationFormsB + { + get + { + return Volatile.Read(ref _arabicPresentationFormsB) ?? CreateBlock(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); + } + } + private static UnicodeBlock _arabicPresentationFormsB; + + /// + /// Represents the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HalfwidthandFullwidthForms + { + get + { + return Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateBlock(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); + } + } + private static UnicodeBlock _halfwidthandFullwidthForms; + + /// + /// Represents the 'Specials' Unicode block (U+FFF0..U+FFFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Specials + { + get + { + return Volatile.Read(ref _specials) ?? CreateBlock(ref _specials, first: '\uFFF0', last: '\uFFFF'); + } + } + private static UnicodeBlock _specials; + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs index 45ba58e02b..6a382b8a4d 100644 --- a/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs @@ -6,14 +6,13 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Text; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { internal unsafe abstract class UnicodeEncoderBase { // A bitmap of characters which are allowed to be returned unescaped. - private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + private AllowedCharsBitmap _allowedCharsBitmap; // The worst-case number of output chars generated for any input char. private readonly int _maxOutputCharsPerInputChar; @@ -21,25 +20,10 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using a custom allow list of characters. /// - protected UnicodeEncoderBase(ICodePointFilter[] filters, int maxOutputCharsPerInputChar) + protected UnicodeEncoderBase(CodePointFilter filter, int maxOutputCharsPerInputChar) { _maxOutputCharsPerInputChar = maxOutputCharsPerInputChar; - - if (filters != null) - { - // Punch a hole for each allowed code point across all filters (this is an OR). - // We don't allow supplementary (astral) characters for now. - foreach (var filter in filters) - { - foreach (var codePoint in filter.GetAllowedCodePoints()) - { - if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) - { - AllowCharacter((char)codePoint); - } - } - } - } + _allowedCharsBitmap = filter.GetAllowedCharsBitmap(); // Forbid characters that are special in HTML. // Even though this is a common encoder used by everybody (including URL @@ -55,38 +39,29 @@ namespace Microsoft.Framework.WebEncoders // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) - uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); - Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); - for (int i = 0; i < _allowedCharsBitmap.Length; i++) - { - _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; - } - } - - // Marks a character as allowed (can be returned unencoded) - private void AllowCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] |= 0x1U << offset; + _allowedCharsBitmap.ForbidUndefinedCharacters(); } // Marks a character as forbidden (must be returned encoded) protected void ForbidCharacter(char c) { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] &= ~(0x1U << offset); + _allowedCharsBitmap.ForbidCharacter(c); } - + /// /// Entry point to the encoder. /// - public void Encode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output) + public void Encode(char[] value, int startIndex, int charCount, TextWriter output) { // Input checking + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } ValidateInputs(startIndex, charCount, actualInputLength: value.Length); if (charCount != 0) @@ -137,9 +112,17 @@ namespace Microsoft.Framework.WebEncoders /// /// Entry point to the encoder. /// - public void Encode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output) + public void Encode(string value, int startIndex, int charCount, TextWriter output) { // Input checking + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } ValidateInputs(startIndex, charCount, actualInputLength: value.Length); if (charCount != 0) @@ -249,10 +232,7 @@ namespace Microsoft.Framework.WebEncoders [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool IsCharacterAllowed(char c) { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + return _allowedCharsBitmap.IsCharacterAllowed(c); } private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 8df2b5bce5..d3c66a26b3 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -13,6 +13,8 @@ namespace Microsoft.Framework.WebEncoders /// can be represented unescaped. /// /// + /// Instances of this type will always encode a certain set of characters (such as + + /// and ?), even if the filter provided in the constructor allows such characters. /// Once constructed, instances of this class are thread-safe for multiple callers. /// public sealed class UrlEncoder : IUrlEncoder @@ -32,10 +34,19 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom allow list of characters. + /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// pass through the encoder unescaped. /// - public UrlEncoder(params ICodePointFilter[] filters) - : this(new UrlUnicodeEncoder(filters)) + public UrlEncoder(params UnicodeBlock[] allowedBlocks) + : this(new UrlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + { + } + + /// + /// Instantiates an encoder using a custom code point filter. + /// + public UrlEncoder(ICodePointFilter filter) + : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } @@ -98,8 +109,8 @@ namespace Microsoft.Framework.WebEncoders // chars to produce 12 output chars "%XX%YY%ZZ%WW", which is 6 output chars per input char. private const int MaxOutputCharsPerInputChar = 9; - internal UrlUnicodeEncoder(ICodePointFilter[] filters) - : base(filters, MaxOutputCharsPerInputChar) + internal UrlUnicodeEncoder(CodePointFilter filter) + : base(filter, MaxOutputCharsPerInputChar) { // Per RFC 3987, Sec. 2.2, we want encodings that are safe for // 'isegment', 'iquery', and 'ifragment'. The only thing these @@ -152,7 +163,7 @@ namespace Microsoft.Framework.WebEncoders UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new UrlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + encoder = new UrlUnicodeEncoder(new CodePointFilter()); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index e61fe47605..15a2417f33 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,6 +5,9 @@ "allowUnsafe": true }, "dependencies": { + "Microsoft.Framework.ConfigurationModel": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { From 0ca24147a0ac6b6c30170ed13e160f58f91bd493 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 11:06:31 -0800 Subject: [PATCH 230/846] Add unit tests and code generation routines --- HttpAbstractions.sln | 15 + .../AllowedCharsBitmap.cs | 7 + .../CodePointFilter.cs | 12 + .../Properties/AssemblyInfo.cs | 7 + .../AllowedCharsBitmapTests.cs | 125 + .../CodePointFilterTests.cs | 369 + .../EncoderCommonTests.cs | 21 + .../EncoderExtensionsTests.cs | 72 + .../Entities.cs | 38 + .../Extensions.cs | 27 + .../HtmlEncoderTests.cs | 269 + .../JavaScriptStringEncoderTests.cs | 331 + ...icrosoft.Framework.WebEncoders.Tests.kproj | 17 + .../ParsedEntity.cs | 17 + .../UnicodeBlockTests.cs | 86 + .../UnicodeBlocksTests.cs | 210 + .../UnicodeEncoderBaseTests.cs | 406 + .../UnicodeHelpersTests.cs | 184 + .../UrlEncoderTests.cs | 302 + .../project.json | 18 + unicode/Blocks.txt | 283 + .../DefinedCharListGenerator/App.config | 6 + .../DefinedCharListGenerator.csproj | 61 + .../DefinedCharListGenerator/Program.cs | 107 + .../Properties/AssemblyInfo.cs | 36 + unicode/Generators/Generators.sln | 28 + .../UnicodeTablesGenerator/App.config | 6 + .../UnicodeTablesGenerator/Program.cs | 109 + .../Properties/AssemblyInfo.cs | 36 + .../UnicodeTablesGenerator.csproj | 61 + unicode/UnicodeData.txt | 27268 ++++++++++++++++ unicode/unicode-copyright.txt | 47 + 32 files changed, 30581 insertions(+) create mode 100644 src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/Entities.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/project.json create mode 100644 unicode/Blocks.txt create mode 100644 unicode/Generators/DefinedCharListGenerator/App.config create mode 100644 unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj create mode 100644 unicode/Generators/DefinedCharListGenerator/Program.cs create mode 100644 unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs create mode 100644 unicode/Generators/Generators.sln create mode 100644 unicode/Generators/UnicodeTablesGenerator/App.config create mode 100644 unicode/Generators/UnicodeTablesGenerator/Program.cs create mode 100644 unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs create mode 100644 unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj create mode 100644 unicode/UnicodeData.txt create mode 100644 unicode/unicode-copyright.txt diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 40feee2b00..042139d424 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -39,6 +39,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers. EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.kproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.kproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -215,6 +217,18 @@ Global {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.ActiveCfg = Release|Any CPU {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.Build.0 = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.ActiveCfg = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.Build.0 = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.Build.0 = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -236,5 +250,6 @@ Global {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs index 475c47a2b0..67918e5122 100644 --- a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -25,6 +25,13 @@ namespace Microsoft.Framework.WebEncoders _allowedCharsBitmap[index] |= 0x1U << offset; } + // Marks all characters as forbidden (must be returned encoded) + public void Clear() + { + Array.Clear(_allowedCharsBitmap, 0, _allowedCharsBitmap.Length); + } + + // Creates a deep copy of this bitmap public AllowedCharsBitmap Clone() { AllowedCharsBitmap retVal; diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index 97a43b803b..7fd1201b4b 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -151,6 +151,18 @@ namespace Microsoft.Framework.WebEncoders return this; } + /// + /// Disallows all characters through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter Clear() + { + _allowedCharsBitmap.Clear(); + return this; + } + /// /// Disallows all characters in the specified Unicode character block through the filter. /// diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..9ee9efbfa5 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs new file mode 100644 index 0000000000..0810fb82d8 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class AllowedCharsBitmapTests + { + [Fact] + public void Ctor_EmptyByDefault() + { + // Act + var bitmap = new AllowedCharsBitmap(); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.False(bitmap.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Allow_Forbid_ZigZag() + { + // Arrange + var bitmap = new AllowedCharsBitmap(); + + // Act + // The only chars which are allowed are those whose code points are multiples of 3 or 7 + // who aren't also multiples of 5. Exception: multiples of 35 are allowed. + for (int i = 0; i <= Char.MaxValue; i += 3) + { + bitmap.AllowCharacter((char)i); + } + for (int i = 0; i <= Char.MaxValue; i += 5) + { + bitmap.ForbidCharacter((char)i); + } + for (int i = 0; i <= Char.MaxValue; i += 7) + { + bitmap.AllowCharacter((char)i); + } + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + bool isAllowed = false; + if (i % 3 == 0) { isAllowed = true; } + if (i % 5 == 0) { isAllowed = false; } + if (i % 7 == 0) { isAllowed = true; } + Assert.Equal(isAllowed, bitmap.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Clear_ForbidsEverything() + { + // Arrange + var bitmap = new AllowedCharsBitmap(); + for (int i = 1; i <= Char.MaxValue; i++) + { + bitmap.AllowCharacter((char)i); + } + + // Act + bitmap.Clear(); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.False(bitmap.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Clone_MakesDeepCopy() + { + // Arrange + var originalBitmap = new AllowedCharsBitmap(); + originalBitmap.AllowCharacter('x'); + + // Act + var clonedBitmap = originalBitmap.Clone(); + clonedBitmap.AllowCharacter('y'); + + // Assert + Assert.True(originalBitmap.IsCharacterAllowed('x')); + Assert.False(originalBitmap.IsCharacterAllowed('y')); + Assert.True(clonedBitmap.IsCharacterAllowed('x')); + Assert.True(clonedBitmap.IsCharacterAllowed('y')); + } + + [Fact] + public void ForbidUndefinedCharacters_RemovesUndefinedChars() + { + // Arrange + // We only allow odd-numbered characters in this test so that + // we can validate that we properly merged the two bitmaps together + // rather than simply overwriting the target. + var bitmap = new AllowedCharsBitmap(); + for (int i = 1; i <= Char.MaxValue; i += 2) + { + bitmap.AllowCharacter((char)i); + } + + // Act + bitmap.ForbidUndefinedCharacters(); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (i % 2 == 0) + { + Assert.False(bitmap.IsCharacterAllowed((char)i)); // these chars were never allowed in the original description + } + else + { + Assert.Equal(UnicodeHelpers.IsCharacterDefined((char)i), bitmap.IsCharacterAllowed((char)i)); + } + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs new file mode 100644 index 0000000000..e0dfbfb92a --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -0,0 +1,369 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class CodePointFilterTests + { + [Fact] + public void Ctor_Parameterless_DefaultsToBasicLatin() + { + // Act + var filter = new CodePointFilter(); + + // Assert + for (int i = 0; i <= 0x007F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0080; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Ctor_OtherCodePointFilterAsInterface() + { + // Arrange + var originalFilter = new OddCodePointFilter(); + + // Act + var newFilter = new CodePointFilter(originalFilter); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.Equal((i % 2) == 1, newFilter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Ctor_OtherCodePointFilterAsConcreteType_Clones() + { + // Arrange + var originalFilter = new CodePointFilter(UnicodeBlocks.None).AllowChar('x'); + + // Act + var newFilter = new CodePointFilter(originalFilter).AllowChar('y'); + + // Assert + Assert.True(originalFilter.IsCharacterAllowed('x')); + Assert.False(originalFilter.IsCharacterAllowed('y')); + Assert.True(newFilter.IsCharacterAllowed('x')); + Assert.True(newFilter.IsCharacterAllowed('y')); + } + + [Fact] + public void Ctor_UnicodeBlocks() + { + // Act + var filter = new CodePointFilter(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); + + // Assert + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i < 0x2C60; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C60; i <= 0x2C7F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C80; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowBlock() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None); + + // Act + var retVal = filter.AllowBlock(UnicodeBlocks.LatinExtendedA); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowBlocks() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None); + + // Act + var retVal = filter.AllowBlocks(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i < 0x2C60; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C60; i <= 0x2C7F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C80; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowChar() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowChar('\u0100'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('\u0100')); + Assert.False(filter.IsCharacterAllowed('\u0101')); + } + + [Fact] + public void AllowChars_Array() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowChars('\u0100', '\u0102'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('\u0100')); + Assert.False(filter.IsCharacterAllowed('\u0101')); + Assert.True(filter.IsCharacterAllowed('\u0102')); + Assert.False(filter.IsCharacterAllowed('\u0103')); + } + + [Fact] + public void AllowChars_String() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowChars("\u0100\u0102"); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('\u0100')); + Assert.False(filter.IsCharacterAllowed('\u0101')); + Assert.True(filter.IsCharacterAllowed('\u0102')); + Assert.False(filter.IsCharacterAllowed('\u0103')); + } + + [Fact] + public void AllowFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.AllowFilter(new OddCodePointFilter()); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= 0x007F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0080; i <= Char.MaxValue; i++) + { + Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Clear() + { + // Arrange + var filter = new CodePointFilter(); + for (int i = 1; i <= Char.MaxValue; i++) + { + filter.AllowChar((char)i); + } + + // Act + var retVal = filter.Clear(); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void ForbidBlock() + { + // Arrange + var filter = new CodePointFilter(new OddCodePointFilter()); + + // Act + var retVal = filter.ForbidBlock(UnicodeBlocks.Specials); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= 0xFFEF; i++) + { + Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); + } + for (int i = 0xFFF0; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void ForbidBlocks() + { + // Arrange + var filter = new CodePointFilter(new OddCodePointFilter()); + + // Act + var retVal = filter.ForbidBlocks(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= 0x007F; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0080; i <= 0xFFEF; i++) + { + Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); + } + for (int i = 0xFFF0; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void ForbidChar() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.ForbidChar('x'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.True(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_Array() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.ForbidChars('x', 'z'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_String() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.ForbidChars("xz"); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void GetAllowedCodePoints() + { + // Arrange + var expected = Enumerable.Range(UnicodeBlocks.BasicLatin.FirstCodePoint, UnicodeBlocks.BasicLatin.BlockSize) + .Concat(Enumerable.Range(UnicodeBlocks.Specials.FirstCodePoint, UnicodeBlocks.Specials.BlockSize)) + .Except(new int[] { 'x' }) + .OrderBy(i => i) + .ToArray(); + + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + filter.ForbidChar('x'); + + // Act + var retVal = filter.GetAllowedCodePoints().OrderBy(i => i).ToArray(); + + // Assert + Assert.Equal(expected, retVal); + } + + // a code point filter which allows only odd code points through + private sealed class OddCodePointFilter : ICodePointFilter + { + public IEnumerable GetAllowedCodePoints() + { + for (int i = 1; i <= Char.MaxValue; i += 2) + { + yield return i; + } + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs new file mode 100644 index 0000000000..5e3e9f3817 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderCommonTests + { + [Theory] + [InlineData(10000, 3, 16 * 1024)] // we cap at 16k chars + [InlineData(5000, 3, 15000)] // haven't exceeded the 16k cap + [InlineData(40000, 3, 40000)] // if we spill over the LOH, we still allocate an output buffer equivalent in length to the input buffer + [InlineData(512, Int32.MaxValue, 16 * 1024)] // make sure we can handle numeric overflow + public void GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar, int expectedResult) + { + Assert.Equal(expectedResult, EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsToEncode, worstCaseOutputCharsPerInputChar)); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs new file mode 100644 index 0000000000..d4351a169e --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderExtensionsTests + { + [Fact] + public void HtmlEncode_ParameterChecks() + { + Assert.Throws(() => EncoderExtensions.HtmlEncode(null, "Hello!", new StringWriter())); + } + + [Fact] + public void HtmlEncode_PositiveTestCase() + { + // Arrange + IHtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + StringWriter writer = new StringWriter(); + + // Act + encoder.HtmlEncode("Hello+there!", writer); + + // Assert + Assert.Equal("Hello+there!", writer.ToString()); + } + + [Fact] + public void JavaScriptStringEncode_ParameterChecks() + { + Assert.Throws(() => EncoderExtensions.JavaScriptStringEncode(null, "Hello!", new StringWriter())); + } + + [Fact] + public void JavaScriptStringEncode_PositiveTestCase() + { + // Arrange + IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + StringWriter writer = new StringWriter(); + + // Act + encoder.JavaScriptStringEncode("Hello+there!", writer); + + // Assert + Assert.Equal(@"Hello\u002Bthere!", writer.ToString()); + } + + [Fact] + public void UrlEncode_ParameterChecks() + { + Assert.Throws(() => EncoderExtensions.UrlEncode(null, "Hello!", new StringWriter())); + } + + [Fact] + public void UrlEncode_PositiveTestCase() + { + // Arrange + IUrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + StringWriter writer = new StringWriter(); + + // Act + encoder.UrlEncode("Hello+there!", writer); + + // Assert + Assert.Equal("Hello%2Bthere!", writer.ToString()); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs new file mode 100644 index 0000000000..e46df90876 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Newtonsoft.Json; + +namespace Microsoft.Framework.WebEncoders +{ + internal static class Entities + { + public static readonly IDictionary ParsedEntities = GetParsedEntities(); + + private static IDictionary GetParsedEntities() + { + // read all entries + string allEntitiesText = ReadEntitiesJsonFile(); + var deserializedRawData = new JsonSerializer().Deserialize>(new JsonTextReader(new StringReader(allEntitiesText))); + + // strip out all entries which aren't of the form "&entity;" + foreach (var key in deserializedRawData.Keys.ToArray() /* dupe since we're mutating original structure */) + { + if (!key.StartsWith("&", StringComparison.Ordinal) || !key.EndsWith(";", StringComparison.Ordinal)) + { + deserializedRawData.Remove(key); + } + } + return deserializedRawData; + } + + private static string ReadEntitiesJsonFile() + { + return File.ReadAllText("entities.json"); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs new file mode 100644 index 0000000000..4c9ec94198 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Microsoft.Framework.WebEncoders +{ + public static class Extensions + { + public static string[] ReadAllLines(this TextReader reader) + { + return ReadAllLinesImpl(reader).ToArray(); + } + + private static IEnumerable ReadAllLinesImpl(TextReader reader) + { + string line; + while ((line = reader.ReadLine()) != null) + { + yield return line; + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs new file mode 100644 index 0000000000..6da944dc07 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs @@ -0,0 +1,269 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class HtmlEncoderTests + { + [Fact] + public void Ctor_WithCodePointFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + HtmlEncoder encoder = new HtmlEncoder(filter); + + // Act & assert + Assert.Equal("a", encoder.HtmlEncode("a")); + Assert.Equal("b", encoder.HtmlEncode("b")); + Assert.Equal("c", encoder.HtmlEncode("c")); + Assert.Equal("d", encoder.HtmlEncode("d")); + Assert.Equal("�", encoder.HtmlEncode("\0")); // we still always encode control chars + Assert.Equal("&", encoder.HtmlEncode("&")); // we still always encode HTML-special chars + Assert.Equal("￿", encoder.HtmlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + + // Act & assert + Assert.Equal("a", encoder.HtmlEncode("a")); + Assert.Equal("\u00E9", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.HtmlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Ctor_WithNoParameters_DefaultsToBasicLatin() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + + // Act & assert + Assert.Equal("a", encoder.HtmlEncode("a")); + Assert.Equal("é", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("☁", encoder.HtmlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Default_EquivalentToBasicLatin() + { + // Arrange + HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeBlocks.BasicLatin); + HtmlEncoder testEncoder = HtmlEncoder.Default; + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (!IsSurrogateCodePoint(i)) + { + string input = new String((char)i, 1); + Assert.Equal(controlEncoder.HtmlEncode(input), testEncoder.HtmlEncode(input)); + } + } + } + + [Fact] + public void Default_ReturnsSingletonInstance() + { + // Act + HtmlEncoder encoder1 = HtmlEncoder.Default; + HtmlEncoder encoder2 = HtmlEncoder.Default; + + // Assert + Assert.Same(encoder1, encoder2); + } + + [Theory] + [InlineData("<", "<")] + [InlineData(">", ">")] + [InlineData("&", "&")] + [InlineData("'", "'")] + [InlineData("\"", """)] + [InlineData("+", "+")] + public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act + string retVal = encoder.HtmlEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char + } + else + { + if (input == "<") { expected = "<"; } + else if (input == ">") { expected = ">"; } + else if (input == "&") { expected = "&"; } + else if (input == "\"") { expected = """; } + else + { + bool mustEncode = false; + if (i == '\'' || i == '+') + { + mustEncode = true; // apostrophe, plus + } + else if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) + { + mustEncode = true; // control char + } + else if (!UnicodeHelpers.IsCharacterDefined((char)i)) + { + mustEncode = true; // undefined (or otherwise disallowed) char + } + + if (mustEncode) + { + expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); + } + else + { + expected = input; // no encoding + } + } + } + + string retVal = encoder.HtmlEncode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); + string retVal = encoder.HtmlEncode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void HtmlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD𐏿e\uFFFD"; + + // Act + string retVal = encoder.HtmlEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void HtmlEncode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + + // Act & assert + Assert.Equal("", encoder.HtmlEncode("")); + } + + [Fact] + public void HtmlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + string input = "Hello, there!"; + + // Act & assert + Assert.Same(input, encoder.HtmlEncode(input)); + } + + [Fact] + public void HtmlEncode_NullInput_ReturnsNull() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + + // Act & assert + Assert.Null(encoder.HtmlEncode(null)); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal("&Hello, there!", new HtmlEncoder().HtmlEncode("&Hello, there!")); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal("Hello, there!&", new HtmlEncoder().HtmlEncode("Hello, there!&")); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal("Hello, &there!", new HtmlEncoder().HtmlEncode("Hello, &there!")); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal("Hello, <there>!", new HtmlEncoder().HtmlEncode("Hello, !")); + } + + [Fact] + public void HtmlEncode_CharArray() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + var output = new StringWriter(); + + // Act + encoder.HtmlEncode("Hello+world!".ToCharArray(), 3, 5, output); + + // Assert + Assert.Equal("lo+wo", output.ToString()); + } + + [Fact] + public void HtmlEncode_StringSubstring() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + var output = new StringWriter(); + + // Act + encoder.HtmlEncode("Hello+world!", 3, 5, output); + + // Assert + Assert.Equal("lo+wo", output.ToString()); + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs new file mode 100644 index 0000000000..470a5b2311 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -0,0 +1,331 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class JavaScriptStringEncoderTests + { + [Fact] + public void Ctor_WithCodePointFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(filter); + + // Act & assert + Assert.Equal("a", encoder.JavaScriptStringEncode("a")); + Assert.Equal("b", encoder.JavaScriptStringEncode("b")); + Assert.Equal(@"\u0063", encoder.JavaScriptStringEncode("c")); + Assert.Equal("d", encoder.JavaScriptStringEncode("d")); + Assert.Equal(@"\u0000", encoder.JavaScriptStringEncode("\0")); // we still always encode control chars + Assert.Equal(@"\u0026", encoder.JavaScriptStringEncode("&")); // we still always encode HTML-special chars + Assert.Equal(@"\uFFFF", encoder.JavaScriptStringEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + + // Act & assert + Assert.Equal(@"\u0061", encoder.JavaScriptStringEncode("a")); + Assert.Equal("\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Ctor_WithNoParameters_DefaultsToBasicLatin() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + + // Act & assert + Assert.Equal("a", encoder.JavaScriptStringEncode("a")); + Assert.Equal(@"\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal(@"\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Default_EquivalentToBasicLatin() + { + // Arrange + JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeBlocks.BasicLatin); + JavaScriptStringEncoder testEncoder = JavaScriptStringEncoder.Default; + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (!IsSurrogateCodePoint(i)) + { + string input = new String((char)i, 1); + Assert.Equal(controlEncoder.JavaScriptStringEncode(input), testEncoder.JavaScriptStringEncode(input)); + } + } + } + + [Fact] + public void Default_ReturnsSingletonInstance() + { + // Act + JavaScriptStringEncoder encoder1 = JavaScriptStringEncoder.Default; + JavaScriptStringEncoder encoder2 = JavaScriptStringEncoder.Default; + + // Assert + Assert.Same(encoder1, encoder2); + } + + [Theory] + [InlineData("<", @"\u003C")] + [InlineData(">", @"\u003E")] + [InlineData("&", @"\u0026")] + [InlineData("'", @"\u0027")] + [InlineData("\"", @"\u0022")] + [InlineData("+", @"\u002B")] + [InlineData("\\", @"\\")] + [InlineData("/", @"\/")] + [InlineData("\b", @"\b")] + [InlineData("\f", @"\f")] + [InlineData("\n", @"\n")] + [InlineData("\t", @"\t")] + [InlineData("\r", @"\r")] + public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + + // Act + string retVal = encoder.JavaScriptStringEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char + } + else + { + if (input == "\b") { expected = @"\b"; } + else if (input == "\t") { expected = @"\t"; } + else if (input == "\n") { expected = @"\n"; } + else if (input == "\f") { expected = @"\f"; } + else if (input == "\r") { expected = @"\r"; } + else if (input == "\\") { expected = @"\\"; } + else if (input == "/") { expected = @"\/"; } + else + { + bool mustEncode = false; + switch (i) + { + case '<': + case '>': + case '&': + case '\"': + case '\'': + case '+': + mustEncode = true; + break; + } + + if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) + { + mustEncode = true; // control char + } + else if (!UnicodeHelpers.IsCharacterDefined((char)i)) + { + mustEncode = true; // undefined (or otherwise disallowed) char + } + + if (mustEncode) + { + expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}", i); + } + else + { + expected = input; // no encoding + } + } + } + + string retVal = encoder.JavaScriptStringEncode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}\u{1:X4}", (uint)input[0], (uint)input[1]); + string retVal = encoder.JavaScriptStringEncode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void JavaScriptStringEncode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD\\uD800\\uDFFFe\uFFFD"; // 'D800' 'DFFF' was preserved since it's valid + + // Act + string retVal = encoder.JavaScriptStringEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void JavaScriptStringEncode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + + // Act & assert + Assert.Equal("", encoder.JavaScriptStringEncode("")); + } + + [Fact] + public void JavaScriptStringEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + string input = "Hello, there!"; + + // Act & assert + Assert.Same(input, encoder.JavaScriptStringEncode(input)); + } + + [Fact] + public void JavaScriptStringEncode_NullInput_ReturnsNull() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + + // Act & assert + Assert.Null(encoder.JavaScriptStringEncode(null)); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal(@"\u0026Hello, there!", new JavaScriptStringEncoder().JavaScriptStringEncode("&Hello, there!")); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal(@"Hello, there!\u0026", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, there!&")); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal(@"Hello, \u0026there!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, &there!")); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal(@"Hello, \u003Cthere\u003E!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, !")); + } + + [Fact] + public void JavaScriptStringEncode_CharArray() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + var output = new StringWriter(); + + // Act + encoder.JavaScriptStringEncode("Hello+world!".ToCharArray(), 3, 5, output); + + // Assert + Assert.Equal(@"lo\u002Bwo", output.ToString()); + } + + [Fact] + public void JavaScriptStringEncode_StringSubstring() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + var output = new StringWriter(); + + // Act + encoder.JavaScriptStringEncode("Hello+world!", 3, 5, output); + + // Assert + Assert.Equal(@"lo\u002Bwo", output.ToString()); + } + + [Theory] + [InlineData("\"", @"\u0022")] + [InlineData("'", @"\u0027")] + public void JavaScriptStringEncode_Quotes(string input, string expected) + { + // Per the design document, we provide additional defense-in-depth + // against breaking out of HTML attributes by having the encoders + // never emit the ' or " characters. This means that we want to + // \u-escape these characters instead of using \' and \". + + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + + // Act + string retVal = encoder.JavaScriptStringEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void JavaScriptStringEncode_DoesNotOutputHtmlSensitiveCharacters() + { + // Per the design document, we provide additional defense-in-depth + // by never emitting HTML-sensitive characters unescaped. + + // Arrange + JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act & assert + for (int i = 0; i <= 0x10FFFF; i++) + { + if (IsSurrogateCodePoint(i)) + { + continue; // surrogates don't matter here + } + + string javaScriptStringEncoded = javaScriptStringEncoder.JavaScriptStringEncode(Char.ConvertFromUtf32(i)); + string thenHtmlEncoded = htmlEncoder.HtmlEncode(javaScriptStringEncoded); + Assert.Equal(javaScriptStringEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters + } + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj new file mode 100644 index 0000000000..f91eeecab2 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj @@ -0,0 +1,17 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 7ae2731d-43cd-4cf8-850a-4914de2ce930 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + diff --git a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs new file mode 100644 index 0000000000..b8c36b57ad --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Newtonsoft.Json; + +namespace Microsoft.Framework.WebEncoders +{ + internal sealed class ParsedEntity + { + [JsonProperty("codepoints")] + public int[] Codepoints { get; set; } + + [JsonProperty("characters")] + public string DecodedString { get; set; } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs new file mode 100644 index 0000000000..5dee8d76bb --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeBlockTests + { + [Theory] + [InlineData(-1, 16)] + [InlineData(1, 16)] + [InlineData(0x10000, 16)] + public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int blockSize) + { + var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); + Assert.Equal("firstCodePoint", ex.ParamName); + } + + [Theory] + [InlineData(0x0100, -1)] + [InlineData(0x0100, 15)] + [InlineData(0x0100, 0x10000)] + public void Ctor_FailureCase_BlockSize(int firstCodePoint, int blockSize) + { + var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); + Assert.Equal("blockSize", ex.ParamName); + } + + [Fact] + public void Ctor_SuccessCase() + { + // Act + var block = new UnicodeBlock(0x0100, 128); // Latin Extended-A + + // Assert + Assert.Equal(0x0100, block.FirstCodePoint); + Assert.Equal(128, block.BlockSize); + } + + [Theory] + [InlineData('\u0001', '\u0002')] + public void FromCharacterRange_FailureCases_FirstChar(char firstChar, char lastChar) + { + var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); + Assert.Equal("firstChar", ex.ParamName); + } + + [Theory] + [InlineData('\u0100', '\u007F')] + [InlineData('\u0100', '\u0100')] + [InlineData('\u0100', '\u010E')] + public void FromCharacterRange_FailureCases_LastChar(char firstChar, char lastChar) + { + var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); + Assert.Equal("lastChar", ex.ParamName); + } + + [Fact] + public void FromCharacterRange_SuccessCase() + { + // Act + var block = UnicodeBlock.FromCharacterRange('\u0180', '\u024F'); // Latin Extended-B + + // Assert + Assert.Equal(0x0180, block.FirstCodePoint); + Assert.Equal(208, block.BlockSize); + } + + [Fact] + public void FromCharacterRange_SuccessCase_All() + { + // Act + var block = UnicodeBlock.FromCharacterRange('\u0000', '\uFFFF'); + + // Assert + Assert.Equal(0, block.FirstCodePoint); + Assert.Equal(0x10000, block.BlockSize); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs new file mode 100644 index 0000000000..c4eb4591e3 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs @@ -0,0 +1,210 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeBlocksTests + { + [Fact] + public void Block_None() + { + UnicodeBlock block = UnicodeBlocks.None; + Assert.NotNull(block); + + // Test 1: the block should be empty + Assert.Equal(0, block.FirstCodePoint); + Assert.Equal(0, block.BlockSize); + + // Test 2: calling the property multiple times should cache and return the same block instance + UnicodeBlock block2 = UnicodeBlocks.None; + Assert.Same(block, block2); + } + + [Fact] + public void Block_All() + { + Block_Unicode('\u0000', '\uFFFF', nameof(UnicodeBlocks.All)); + } + + [Theory] + [InlineData('\u0000', '\u007F', nameof(UnicodeBlocks.BasicLatin))] + [InlineData('\u0080', '\u00FF', nameof(UnicodeBlocks.Latin1Supplement))] + [InlineData('\u0100', '\u017F', nameof(UnicodeBlocks.LatinExtendedA))] + [InlineData('\u0180', '\u024F', nameof(UnicodeBlocks.LatinExtendedB))] + [InlineData('\u0250', '\u02AF', nameof(UnicodeBlocks.IPAExtensions))] + [InlineData('\u02B0', '\u02FF', nameof(UnicodeBlocks.SpacingModifierLetters))] + [InlineData('\u0300', '\u036F', nameof(UnicodeBlocks.CombiningDiacriticalMarks))] + [InlineData('\u0370', '\u03FF', nameof(UnicodeBlocks.GreekandCoptic))] + [InlineData('\u0400', '\u04FF', nameof(UnicodeBlocks.Cyrillic))] + [InlineData('\u0500', '\u052F', nameof(UnicodeBlocks.CyrillicSupplement))] + [InlineData('\u0530', '\u058F', nameof(UnicodeBlocks.Armenian))] + [InlineData('\u0590', '\u05FF', nameof(UnicodeBlocks.Hebrew))] + [InlineData('\u0600', '\u06FF', nameof(UnicodeBlocks.Arabic))] + [InlineData('\u0700', '\u074F', nameof(UnicodeBlocks.Syriac))] + [InlineData('\u0750', '\u077F', nameof(UnicodeBlocks.ArabicSupplement))] + [InlineData('\u0780', '\u07BF', nameof(UnicodeBlocks.Thaana))] + [InlineData('\u07C0', '\u07FF', nameof(UnicodeBlocks.NKo))] + [InlineData('\u0800', '\u083F', nameof(UnicodeBlocks.Samaritan))] + [InlineData('\u0840', '\u085F', nameof(UnicodeBlocks.Mandaic))] + [InlineData('\u08A0', '\u08FF', nameof(UnicodeBlocks.ArabicExtendedA))] + [InlineData('\u0900', '\u097F', nameof(UnicodeBlocks.Devanagari))] + [InlineData('\u0980', '\u09FF', nameof(UnicodeBlocks.Bengali))] + [InlineData('\u0A00', '\u0A7F', nameof(UnicodeBlocks.Gurmukhi))] + [InlineData('\u0A80', '\u0AFF', nameof(UnicodeBlocks.Gujarati))] + [InlineData('\u0B00', '\u0B7F', nameof(UnicodeBlocks.Oriya))] + [InlineData('\u0B80', '\u0BFF', nameof(UnicodeBlocks.Tamil))] + [InlineData('\u0C00', '\u0C7F', nameof(UnicodeBlocks.Telugu))] + [InlineData('\u0C80', '\u0CFF', nameof(UnicodeBlocks.Kannada))] + [InlineData('\u0D00', '\u0D7F', nameof(UnicodeBlocks.Malayalam))] + [InlineData('\u0D80', '\u0DFF', nameof(UnicodeBlocks.Sinhala))] + [InlineData('\u0E00', '\u0E7F', nameof(UnicodeBlocks.Thai))] + [InlineData('\u0E80', '\u0EFF', nameof(UnicodeBlocks.Lao))] + [InlineData('\u0F00', '\u0FFF', nameof(UnicodeBlocks.Tibetan))] + [InlineData('\u1000', '\u109F', nameof(UnicodeBlocks.Myanmar))] + [InlineData('\u10A0', '\u10FF', nameof(UnicodeBlocks.Georgian))] + [InlineData('\u1100', '\u11FF', nameof(UnicodeBlocks.HangulJamo))] + [InlineData('\u1200', '\u137F', nameof(UnicodeBlocks.Ethiopic))] + [InlineData('\u1380', '\u139F', nameof(UnicodeBlocks.EthiopicSupplement))] + [InlineData('\u13A0', '\u13FF', nameof(UnicodeBlocks.Cherokee))] + [InlineData('\u1400', '\u167F', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabics))] + [InlineData('\u1680', '\u169F', nameof(UnicodeBlocks.Ogham))] + [InlineData('\u16A0', '\u16FF', nameof(UnicodeBlocks.Runic))] + [InlineData('\u1700', '\u171F', nameof(UnicodeBlocks.Tagalog))] + [InlineData('\u1720', '\u173F', nameof(UnicodeBlocks.Hanunoo))] + [InlineData('\u1740', '\u175F', nameof(UnicodeBlocks.Buhid))] + [InlineData('\u1760', '\u177F', nameof(UnicodeBlocks.Tagbanwa))] + [InlineData('\u1780', '\u17FF', nameof(UnicodeBlocks.Khmer))] + [InlineData('\u1800', '\u18AF', nameof(UnicodeBlocks.Mongolian))] + [InlineData('\u18B0', '\u18FF', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabicsExtended))] + [InlineData('\u1900', '\u194F', nameof(UnicodeBlocks.Limbu))] + [InlineData('\u1950', '\u197F', nameof(UnicodeBlocks.TaiLe))] + [InlineData('\u1980', '\u19DF', nameof(UnicodeBlocks.NewTaiLue))] + [InlineData('\u19E0', '\u19FF', nameof(UnicodeBlocks.KhmerSymbols))] + [InlineData('\u1A00', '\u1A1F', nameof(UnicodeBlocks.Buginese))] + [InlineData('\u1A20', '\u1AAF', nameof(UnicodeBlocks.TaiTham))] + [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksExtended))] + [InlineData('\u1B00', '\u1B7F', nameof(UnicodeBlocks.Balinese))] + [InlineData('\u1B80', '\u1BBF', nameof(UnicodeBlocks.Sundanese))] + [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeBlocks.Batak))] + [InlineData('\u1C00', '\u1C4F', nameof(UnicodeBlocks.Lepcha))] + [InlineData('\u1C50', '\u1C7F', nameof(UnicodeBlocks.OlChiki))] + [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeBlocks.SundaneseSupplement))] + [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeBlocks.VedicExtensions))] + [InlineData('\u1D00', '\u1D7F', nameof(UnicodeBlocks.PhoneticExtensions))] + [InlineData('\u1D80', '\u1DBF', nameof(UnicodeBlocks.PhoneticExtensionsSupplement))] + [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksSupplement))] + [InlineData('\u1E00', '\u1EFF', nameof(UnicodeBlocks.LatinExtendedAdditional))] + [InlineData('\u1F00', '\u1FFF', nameof(UnicodeBlocks.GreekExtended))] + [InlineData('\u2000', '\u206F', nameof(UnicodeBlocks.GeneralPunctuation))] + [InlineData('\u2070', '\u209F', nameof(UnicodeBlocks.SuperscriptsandSubscripts))] + [InlineData('\u20A0', '\u20CF', nameof(UnicodeBlocks.CurrencySymbols))] + [InlineData('\u20D0', '\u20FF', nameof(UnicodeBlocks.CombiningDiacriticalMarksforSymbols))] + [InlineData('\u2100', '\u214F', nameof(UnicodeBlocks.LetterlikeSymbols))] + [InlineData('\u2150', '\u218F', nameof(UnicodeBlocks.NumberForms))] + [InlineData('\u2190', '\u21FF', nameof(UnicodeBlocks.Arrows))] + [InlineData('\u2200', '\u22FF', nameof(UnicodeBlocks.MathematicalOperators))] + [InlineData('\u2300', '\u23FF', nameof(UnicodeBlocks.MiscellaneousTechnical))] + [InlineData('\u2400', '\u243F', nameof(UnicodeBlocks.ControlPictures))] + [InlineData('\u2440', '\u245F', nameof(UnicodeBlocks.OpticalCharacterRecognition))] + [InlineData('\u2460', '\u24FF', nameof(UnicodeBlocks.EnclosedAlphanumerics))] + [InlineData('\u2500', '\u257F', nameof(UnicodeBlocks.BoxDrawing))] + [InlineData('\u2580', '\u259F', nameof(UnicodeBlocks.BlockElements))] + [InlineData('\u25A0', '\u25FF', nameof(UnicodeBlocks.GeometricShapes))] + [InlineData('\u2600', '\u26FF', nameof(UnicodeBlocks.MiscellaneousSymbols))] + [InlineData('\u2700', '\u27BF', nameof(UnicodeBlocks.Dingbats))] + [InlineData('\u27C0', '\u27EF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsA))] + [InlineData('\u27F0', '\u27FF', nameof(UnicodeBlocks.SupplementalArrowsA))] + [InlineData('\u2800', '\u28FF', nameof(UnicodeBlocks.BraillePatterns))] + [InlineData('\u2900', '\u297F', nameof(UnicodeBlocks.SupplementalArrowsB))] + [InlineData('\u2980', '\u29FF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsB))] + [InlineData('\u2A00', '\u2AFF', nameof(UnicodeBlocks.SupplementalMathematicalOperators))] + [InlineData('\u2B00', '\u2BFF', nameof(UnicodeBlocks.MiscellaneousSymbolsandArrows))] + [InlineData('\u2C00', '\u2C5F', nameof(UnicodeBlocks.Glagolitic))] + [InlineData('\u2C60', '\u2C7F', nameof(UnicodeBlocks.LatinExtendedC))] + [InlineData('\u2C80', '\u2CFF', nameof(UnicodeBlocks.Coptic))] + [InlineData('\u2D00', '\u2D2F', nameof(UnicodeBlocks.GeorgianSupplement))] + [InlineData('\u2D30', '\u2D7F', nameof(UnicodeBlocks.Tifinagh))] + [InlineData('\u2D80', '\u2DDF', nameof(UnicodeBlocks.EthiopicExtended))] + [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeBlocks.CyrillicExtendedA))] + [InlineData('\u2E00', '\u2E7F', nameof(UnicodeBlocks.SupplementalPunctuation))] + [InlineData('\u2E80', '\u2EFF', nameof(UnicodeBlocks.CJKRadicalsSupplement))] + [InlineData('\u2F00', '\u2FDF', nameof(UnicodeBlocks.KangxiRadicals))] + [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeBlocks.IdeographicDescriptionCharacters))] + [InlineData('\u3000', '\u303F', nameof(UnicodeBlocks.CJKSymbolsandPunctuation))] + [InlineData('\u3040', '\u309F', nameof(UnicodeBlocks.Hiragana))] + [InlineData('\u30A0', '\u30FF', nameof(UnicodeBlocks.Katakana))] + [InlineData('\u3100', '\u312F', nameof(UnicodeBlocks.Bopomofo))] + [InlineData('\u3130', '\u318F', nameof(UnicodeBlocks.HangulCompatibilityJamo))] + [InlineData('\u3190', '\u319F', nameof(UnicodeBlocks.Kanbun))] + [InlineData('\u31A0', '\u31BF', nameof(UnicodeBlocks.BopomofoExtended))] + [InlineData('\u31C0', '\u31EF', nameof(UnicodeBlocks.CJKStrokes))] + [InlineData('\u31F0', '\u31FF', nameof(UnicodeBlocks.KatakanaPhoneticExtensions))] + [InlineData('\u3200', '\u32FF', nameof(UnicodeBlocks.EnclosedCJKLettersandMonths))] + [InlineData('\u3300', '\u33FF', nameof(UnicodeBlocks.CJKCompatibility))] + [InlineData('\u3400', '\u4DBF', nameof(UnicodeBlocks.CJKUnifiedIdeographsExtensionA))] + [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeBlocks.YijingHexagramSymbols))] + [InlineData('\u4E00', '\u9FFF', nameof(UnicodeBlocks.CJKUnifiedIdeographs))] + [InlineData('\uA000', '\uA48F', nameof(UnicodeBlocks.YiSyllables))] + [InlineData('\uA490', '\uA4CF', nameof(UnicodeBlocks.YiRadicals))] + [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeBlocks.Lisu))] + [InlineData('\uA500', '\uA63F', nameof(UnicodeBlocks.Vai))] + [InlineData('\uA640', '\uA69F', nameof(UnicodeBlocks.CyrillicExtendedB))] + [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeBlocks.Bamum))] + [InlineData('\uA700', '\uA71F', nameof(UnicodeBlocks.ModifierToneLetters))] + [InlineData('\uA720', '\uA7FF', nameof(UnicodeBlocks.LatinExtendedD))] + [InlineData('\uA800', '\uA82F', nameof(UnicodeBlocks.SylotiNagri))] + [InlineData('\uA830', '\uA83F', nameof(UnicodeBlocks.CommonIndicNumberForms))] + [InlineData('\uA840', '\uA87F', nameof(UnicodeBlocks.Phagspa))] + [InlineData('\uA880', '\uA8DF', nameof(UnicodeBlocks.Saurashtra))] + [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeBlocks.DevanagariExtended))] + [InlineData('\uA900', '\uA92F', nameof(UnicodeBlocks.KayahLi))] + [InlineData('\uA930', '\uA95F', nameof(UnicodeBlocks.Rejang))] + [InlineData('\uA960', '\uA97F', nameof(UnicodeBlocks.HangulJamoExtendedA))] + [InlineData('\uA980', '\uA9DF', nameof(UnicodeBlocks.Javanese))] + [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeBlocks.MyanmarExtendedB))] + [InlineData('\uAA00', '\uAA5F', nameof(UnicodeBlocks.Cham))] + [InlineData('\uAA60', '\uAA7F', nameof(UnicodeBlocks.MyanmarExtendedA))] + [InlineData('\uAA80', '\uAADF', nameof(UnicodeBlocks.TaiViet))] + [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeBlocks.MeeteiMayekExtensions))] + [InlineData('\uAB00', '\uAB2F', nameof(UnicodeBlocks.EthiopicExtendedA))] + [InlineData('\uAB30', '\uAB6F', nameof(UnicodeBlocks.LatinExtendedE))] + [InlineData('\uABC0', '\uABFF', nameof(UnicodeBlocks.MeeteiMayek))] + [InlineData('\uAC00', '\uD7AF', nameof(UnicodeBlocks.HangulSyllables))] + [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeBlocks.HangulJamoExtendedB))] + [InlineData('\uF900', '\uFAFF', nameof(UnicodeBlocks.CJKCompatibilityIdeographs))] + [InlineData('\uFB00', '\uFB4F', nameof(UnicodeBlocks.AlphabeticPresentationForms))] + [InlineData('\uFB50', '\uFDFF', nameof(UnicodeBlocks.ArabicPresentationFormsA))] + [InlineData('\uFE00', '\uFE0F', nameof(UnicodeBlocks.VariationSelectors))] + [InlineData('\uFE10', '\uFE1F', nameof(UnicodeBlocks.VerticalForms))] + [InlineData('\uFE20', '\uFE2F', nameof(UnicodeBlocks.CombiningHalfMarks))] + [InlineData('\uFE30', '\uFE4F', nameof(UnicodeBlocks.CJKCompatibilityForms))] + [InlineData('\uFE50', '\uFE6F', nameof(UnicodeBlocks.SmallFormVariants))] + [InlineData('\uFE70', '\uFEFF', nameof(UnicodeBlocks.ArabicPresentationFormsB))] + [InlineData('\uFF00', '\uFFEF', nameof(UnicodeBlocks.HalfwidthandFullwidthForms))] + [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeBlocks.Specials))] + public void Block_Unicode(char first, char last, string blockName) + { + Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 + Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF + Assert.True(first < last); // code point ranges should be ordered + + var propInfo = typeof(UnicodeBlocks).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(propInfo); + + UnicodeBlock block = (UnicodeBlock)propInfo.GetValue(null); + Assert.NotNull(block); + + // Test 1: the block should span the range first..last + Assert.Equal(first, block.FirstCodePoint); + Assert.Equal(last, block.FirstCodePoint + block.BlockSize - 1); + + // Test 2: calling the property multiple times should cache and return the same block instance + UnicodeBlock block2 = (UnicodeBlock)propInfo.GetValue(null); + Assert.Same(block, block2); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs new file mode 100644 index 0000000000..06e2fc0c73 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -0,0 +1,406 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Moq; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeEncoderBaseTests + { + [Fact] + public void Ctor_WithCustomFilters() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(filter); + + // Act & assert + Assert.Equal("a", encoder.Encode("a")); + Assert.Equal("b", encoder.Encode("b")); + Assert.Equal("[U+0063]", encoder.Encode("c")); + Assert.Equal("d", encoder.Encode("d")); + Assert.Equal("[U+0000]", encoder.Encode("\0")); // we still always encode control chars + Assert.Equal("[U+0026]", encoder.Encode("&")); // we still always encode HTML-special chars + Assert.Equal("[U+FFFF]", encoder.Encode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols)); + + // Act & assert + Assert.Equal("[U+0061]", encoder.Encode("a")); + Assert.Equal("\u00E9", encoder.Encode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.Encode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Simple() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + const string input = "Hello <>&\'\"+ there!"; + const string expected = "Hello [U+003C][U+003E][U+0026][U+0027][U+0022][U+002B] there!"; + + // Act & assert + Assert.Equal(expected, encoder.Encode(input)); + } + + [Fact] + public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char + } + else + { + bool mustEncode = false; + switch (i) + { + case '<': + case '>': + case '&': + case '\"': + case '\'': + case '+': + mustEncode = true; + break; + } + + if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) + { + mustEncode = true; // control char + } + else if (!UnicodeHelpers.IsCharacterDefined((char)i)) + { + mustEncode = true; // undefined (or otherwise disallowed) char + } + + if (mustEncode) + { + expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", i); + } + else + { + expected = input; // no encoding + } + } + + string retVal = encoder.Encode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X}]", i); + string retVal = encoder.Encode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void Encode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD[U+103FF]e\uFFFD"; + + // Act + string retVal = encoder.Encode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void Encode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + + // Act & assert + Assert.Equal("", encoder.Encode("")); + } + + [Fact] + public void Encode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + string input = "Hello, there!"; + + // Act & assert + Assert.Same(input, encoder.Encode(input)); + } + + [Fact] + public void Encode_NullInput_ReturnsNull() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + + // Act & assert + Assert.Null(encoder.Encode(null)); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("&Hello, there!")); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, there!&")); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, &there!")); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, !")); + } + + [Fact] + public void Encode_CharArray_ParameterChecking_NegativeTestCases() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + + // Act & assert + Assert.Throws(() => encoder.Encode((char[])null, 0, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 0, 3, null)); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), -1, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 4, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, -1, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 1, 3, new StringWriter())); + } + + [Fact] + public void Encode_CharArray_ZeroCount_DoesNotCallIntoTextWriter() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + TextWriter output = new Mock(MockBehavior.Strict).Object; + + // Act + encoder.Encode("abc".ToCharArray(), 2, 0, output); + + // Assert + // If we got this far (without TextWriter throwing), success! + } + + [Fact] + public void Encode_CharArray_AllCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); + + // Assert + Assert.Equal("xy", output.ToString()); + } + + [Fact] + public void Encode_CharArray_AllCharsInvalid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); + + // Assert + Assert.Equal("[U+0078][U+0079]", output.ToString()); + } + + [Fact] + public void Encode_CharArray_SomeCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz".ToCharArray(), 2, 3, output); + + // Assert + Assert.Equal("c[U+0026]x", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_ParameterChecking_NegativeTestCases() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + + // Act & assert + Assert.Throws(() => encoder.Encode((string)null, 0, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 0, 3, null)); + Assert.Throws(() => encoder.Encode("abc", -1, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 2, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 4, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 2, -1, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 1, 3, new StringWriter())); + } + + [Fact] + public void Encode_StringSubstring_ZeroCount_DoesNotCallIntoTextWriter() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + TextWriter output = new Mock(MockBehavior.Strict).Object; + + // Act + encoder.Encode("abc", 2, 0, output); + + // Assert + // If we got this far (without TextWriter throwing), success! + } + + [Fact] + public void Encode_StringSubstring_AllCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz", 4, 2, output); + + // Assert + Assert.Equal("xy", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_EntireString_AllCharsValid_ForwardDirectlyToOutput() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + var mockWriter = new Mock(MockBehavior.Strict); + mockWriter.Setup(o => o.Write("abc")).Verifiable(); + + // Act + encoder.Encode("abc", 0, 3, mockWriter.Object); + + // Assert + mockWriter.Verify(); + } + + [Fact] + public void Encode_StringSubstring_AllCharsInvalid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz", 4, 2, output); + + // Assert + Assert.Equal("[U+0078][U+0079]", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_SomeCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz", 2, 3, output); + + // Assert + Assert.Equal("c[U+0026]x", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_EntireString_SomeCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + const string input = "abc&xyz"; + encoder.Encode(input, 0, input.Length, output); + + // Assert + Assert.Equal("abc[U+0026]xyz", output.ToString()); + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + + private sealed class CustomCodePointFilter : ICodePointFilter + { + private readonly int[] _allowedCodePoints; + + public CustomCodePointFilter(params int[] allowedCodePoints) + { + _allowedCodePoints = allowedCodePoints; + } + + public IEnumerable GetAllowedCodePoints() + { + return _allowedCodePoints; + } + } + + private sealed class CustomUnicodeEncoderBase : UnicodeEncoderBase + { + // We pass a (known bad) value of 1 for 'max output chars per input char', + // which also tests that the code behaves properly even if the original + // estimate is incorrect. + public CustomUnicodeEncoderBase(CodePointFilter filter) + : base(filter, maxOutputCharsPerInputChar: 1) + { + } + + public CustomUnicodeEncoderBase(params UnicodeBlock[] allowedBlocks) + : this(new CodePointFilter(allowedBlocks)) + { + } + + protected override void WriteEncodedScalar(ref Writer writer, uint value) + { + writer.Write(String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", value)); + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs new file mode 100644 index 0000000000..9a2671023a --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -0,0 +1,184 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public unsafe class UnicodeHelpersTests + { + private const int UnicodeReplacementChar = '\uFFFD'; + + private static readonly UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); + + [Fact] + public void GetDefinedCharacterBitmap_ReturnsSingletonInstance() + { + // Act + uint[] retVal1 = UnicodeHelpers.GetDefinedCharacterBitmap(); + uint[] retVal2 = UnicodeHelpers.GetDefinedCharacterBitmap(); + + // Assert + Assert.Same(retVal1, retVal2); + } + + [Theory] + [InlineData(1, "a", (int)'a')] // normal BMP char, end of string + [InlineData(2, "ab", (int)'a')] // normal BMP char, not end of string + [InlineData(3, "\uDFFF", UnicodeReplacementChar)] // trailing surrogate, end of string + [InlineData(4, "\uDFFFx", UnicodeReplacementChar)] // trailing surrogate, not end of string + [InlineData(5, "\uD800", UnicodeReplacementChar)] // leading surrogate, end of string + [InlineData(6, "\uD800x", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by non-surrogate + [InlineData(7, "\uD800\uD800", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by leading surrogate + [InlineData(8, "\uD800\uDFFF", 0x103FF)] // leading surrogate, not end of string, followed by trailing surrogate + public void GetScalarValueFromUtf16(int unused, string input, int expectedResult) + { + // The 'unused' parameter exists because the xunit runner can't distinguish + // the individual malformed data test cases from each other without this + // additional identifier. + + fixed (char* pInput = input) + { + Assert.Equal(expectedResult, UnicodeHelpers.GetScalarValueFromUtf16(pInput, endOfString: (input.Length == 1))); + } + } + + [Fact] + public void GetUtf8RepresentationForScalarValue() + { + for (int i = 0; i <= 0x10FFFF; i++) + { + if (i <= 0xFFFF && Char.IsSurrogate((char)i)) + { + continue; // no surrogates + } + + // Arrange + byte[] expectedUtf8Bytes = _utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(i)); + + // Act + List actualUtf8Bytes = new List(4); + uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue((uint)i); + do + { + actualUtf8Bytes.Add((byte)asUtf8); + } while ((asUtf8 >>= 8) != 0); + + // Assert + Assert.Equal(expectedUtf8Bytes, actualUtf8Bytes); + } + } + + [Fact] + public void IsCharacterDefined() + { + // Arrange + bool[] definedChars = ReadListOfDefinedCharacters(); + List errors = new List(); + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + bool expected = definedChars[i]; + bool actual = UnicodeHelpers.IsCharacterDefined((char)i); + if (expected != actual) + { + string message = String.Format(CultureInfo.InvariantCulture, "Character U+{0:X4}: expected = {1}, actual = {2}", i, expected, actual); + errors.Add(message); + } + } + + if (errors.Count > 0) + { + Assert.True(false, String.Join(Environment.NewLine, errors)); + } + } + + private static bool[] ReadListOfDefinedCharacters() + { + HashSet allowedCategories = new HashSet(); + + // Letters + allowedCategories.Add("Lu"); + allowedCategories.Add("Ll"); + allowedCategories.Add("Lt"); + allowedCategories.Add("Lm"); + allowedCategories.Add("Lo"); + + // Marks + allowedCategories.Add("Mn"); + allowedCategories.Add("Mc"); + allowedCategories.Add("Me"); + + // Numbers + allowedCategories.Add("Nd"); + allowedCategories.Add("Nl"); + allowedCategories.Add("No"); + + // Punctuation + allowedCategories.Add("Pc"); + allowedCategories.Add("Pd"); + allowedCategories.Add("Ps"); + allowedCategories.Add("Pe"); + allowedCategories.Add("Pi"); + allowedCategories.Add("Pf"); + allowedCategories.Add("Po"); + + // Symbols + allowedCategories.Add("Sm"); + allowedCategories.Add("Sc"); + allowedCategories.Add("Sk"); + allowedCategories.Add("So"); + + // Separators + // With the exception of U+0020 SPACE, these aren't allowed + + // Other + // We only allow one category of 'other' characters + allowedCategories.Add("Cf"); + + HashSet seenCategories = new HashSet(); + + bool[] retVal = new bool[0x10000]; + string[] allLines = new StreamReader(typeof(UnicodeHelpersTests).GetTypeInfo().Assembly.GetManifestResourceStream("../../unicode/UnicodeData.txt")).ReadAllLines(); + + foreach (string line in allLines) + { + string[] splitLine = line.Split(';'); + uint codePoint = UInt32.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); + if (codePoint >= retVal.Length) + { + continue; // don't care about supplementary chars + } + + if (codePoint == (uint)' ') + { + retVal[codePoint] = true; // we allow U+0020 SPACE as our only valid Zs (whitespace) char + } + else + { + string category = splitLine[2]; + if (allowedCategories.Contains(category)) + { + retVal[codePoint] = true; // chars in this category are allowable + seenCategories.Add(category); + } + } + } + + // Finally, we need to make sure we've seen every category which contains + // allowed characters. This provides extra defense against having a typo + // in the list of categories. + Assert.Equal(allowedCategories.OrderBy(c => c), seenCategories.OrderBy(c => c)); + + return retVal; + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs new file mode 100644 index 0000000000..fd649ffc08 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -0,0 +1,302 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UrlEncoderTests + { + private static UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); + + [Fact] + public void Ctor_WithCodePointFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + UrlEncoder encoder = new UrlEncoder(filter); + + // Act & assert + Assert.Equal("a", encoder.UrlEncode("a")); + Assert.Equal("b", encoder.UrlEncode("b")); + Assert.Equal("%63", encoder.UrlEncode("c")); + Assert.Equal("d", encoder.UrlEncode("d")); + Assert.Equal("%00", encoder.UrlEncode("\0")); // we still always encode control chars + Assert.Equal("%26", encoder.UrlEncode("&")); // we still always encode HTML-special chars + Assert.Equal("%EF%BF%BF", encoder.UrlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + + // Act & assert + Assert.Equal("%61", encoder.UrlEncode("a")); + Assert.Equal("\u00E9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.UrlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Ctor_WithNoParameters_DefaultsToBasicLatin() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + + // Act & assert + Assert.Equal("a", encoder.UrlEncode("a")); + Assert.Equal("%C3%A9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("%E2%98%81", encoder.UrlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Default_EquivalentToBasicLatin() + { + // Arrange + UrlEncoder controlEncoder = new UrlEncoder(UnicodeBlocks.BasicLatin); + UrlEncoder testEncoder = UrlEncoder.Default; + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (!IsSurrogateCodePoint(i)) + { + string input = new String((char)i, 1); + Assert.Equal(controlEncoder.UrlEncode(input), testEncoder.UrlEncode(input)); + } + } + } + + [Fact] + public void Default_ReturnsSingletonInstance() + { + // Act + UrlEncoder encoder1 = UrlEncoder.Default; + UrlEncoder encoder2 = UrlEncoder.Default; + + // Assert + Assert.Same(encoder1, encoder2); + } + + [Fact] + public void UrlEncode_AllRangesAllowed_StillEncodesForbiddenChars() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "%EF%BF%BD"; // unpaired surrogate -> Unicode replacement char + } + else + { + bool mustEncode = true; + + // RFC 3987, Sec. 2.2 gives the list of allowed chars + // (We allow 'ipchar' except for "'", "&", "+", "%", and "=" + if (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z') || ('0' <= i && i <= '9')) + { + mustEncode = false; // ALPHA / DIGIT + } + else if ((0x00A0 <= i && i <= 0xD7FF) | (0xF900 <= i && i <= 0xFDCF) | (0xFDF0 <= i && i <= 0xFFEF)) + { + mustEncode = !UnicodeHelpers.IsCharacterDefined((char)i); // 'ucschar' + } + else + { + switch (i) + { + // iunreserved + case '-': + case '.': + case '_': + case '~': + + // ipchar + case ':': + case '@': + + // sub-delims + case '!': + case '$': + case '(': + case ')': + case '*': + case ',': + case ';': + mustEncode = false; + break; + } + } + + if (mustEncode) + { + expected = GetKnownGoodPercentEncodedValue(i); + } + else + { + expected = input; // no encoding + } + } + + string retVal = encoder.UrlEncode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = GetKnownGoodPercentEncodedValue(i); + string retVal = encoder.UrlEncode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void UrlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a%EF%BF%BDb%EF%BF%BDc%EF%BF%BD%EF%BF%BDd%EF%BF%BD%F0%90%8F%BFe%EF%BF%BD"; // 'D800' 'DFFF' was preserved since it's valid + + // Act + string retVal = encoder.UrlEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void UrlEncode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + + // Act & assert + Assert.Equal("", encoder.UrlEncode("")); + } + + [Fact] + public void UrlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + string input = "Hello,there!"; + + // Act & assert + Assert.Same(input, encoder.UrlEncode(input)); + } + + [Fact] + public void UrlEncode_NullInput_ReturnsNull() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + + // Act & assert + Assert.Null(encoder.UrlEncode(null)); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal(@"%26Hello,there!", new UrlEncoder().UrlEncode("&Hello,there!")); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal(@"Hello,there!%26", new UrlEncoder().UrlEncode("Hello,there!&")); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal(@"Hello,%20%26there!", new UrlEncoder().UrlEncode("Hello, &there!")); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal(@"Hello,%20%3Cthere%3E!", new UrlEncoder().UrlEncode("Hello, !")); + } + + [Fact] + public void UrlEncode_CharArray() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + var output = new StringWriter(); + + // Act + encoder.UrlEncode("Hello+world!".ToCharArray(), 3, 5, output); + + // Assert + Assert.Equal("lo%2Bwo", output.ToString()); + } + + [Fact] + public void UrlEncode_StringSubstring() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + var output = new StringWriter(); + + // Act + encoder.UrlEncode("Hello+world!", 3, 5, output); + + // Assert + Assert.Equal("lo%2Bwo", output.ToString()); + } + + [Fact] + public void UrlEncode_DoesNotOutputHtmlSensitiveCharacters() + { + // Per the design document, we provide additional defense-in-depth + // by never emitting HTML-sensitive characters unescaped. + + // Arrange + UrlEncoder urlEncoder = new UrlEncoder(UnicodeBlocks.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act & assert + for (int i = 0; i <= 0x10FFFF; i++) + { + if (IsSurrogateCodePoint(i)) + { + continue; // surrogates don't matter here + } + + string urlEncoded = urlEncoder.UrlEncode(Char.ConvertFromUtf32(i)); + string thenHtmlEncoded = htmlEncoder.HtmlEncode(urlEncoded); + Assert.Equal(urlEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters + } + } + + private static string GetKnownGoodPercentEncodedValue(int codePoint) + { + // Convert the code point to UTF16, then call Encoding.UTF8.GetBytes, then hex-encode everything + return String.Concat(_utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(codePoint)).Select(b => String.Format(CultureInfo.InvariantCulture, "%{0:X2}", b))); + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json new file mode 100644 index 0000000000..e4e4d9f445 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -0,0 +1,18 @@ +{ + "dependencies": { + "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Moq": "4.2.1312.1622", + "Newtonsoft.Json": "6.0.6", + "xunit.runner.kre": "1.0.0-*" + }, + "commands": { + "test": "xunit.runner.kre" + }, + "compilationOptions": { + "allowUnsafe": true + }, + "frameworks": { + "aspnet50": { } + }, + "resources": "..\\..\\unicode\\UnicodeData.txt" +} diff --git a/unicode/Blocks.txt b/unicode/Blocks.txt new file mode 100644 index 0000000000..3653af7a47 --- /dev/null +++ b/unicode/Blocks.txt @@ -0,0 +1,283 @@ +# Blocks-7.0.0.txt +# Date: 2014-04-03, 23:23:00 GMT [RP, KW] +# +# Unicode Character Database +# Copyright (c) 1991-2014 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Note: The casing of block names is not normative. +# For example, "Basic Latin" and "BASIC LATIN" are equivalent. +# +# Format: +# Start Code..End Code; Block Name + +# ================================================ + +# Note: When comparing block names, casing, whitespace, hyphens, +# and underbars are ignored. +# For example, "Latin Extended-A" and "latin extended a" are equivalent. +# For more information on the comparison of property values, +# see UAX #44: http://www.unicode.org/reports/tr44/ +# +# All code points not explicitly listed for Block +# have the value No_Block. + +# Property: Block +# +# @missing: 0000..10FFFF; No_Block + +0000..007F; Basic Latin +0080..00FF; Latin-1 Supplement +0100..017F; Latin Extended-A +0180..024F; Latin Extended-B +0250..02AF; IPA Extensions +02B0..02FF; Spacing Modifier Letters +0300..036F; Combining Diacritical Marks +0370..03FF; Greek and Coptic +0400..04FF; Cyrillic +0500..052F; Cyrillic Supplement +0530..058F; Armenian +0590..05FF; Hebrew +0600..06FF; Arabic +0700..074F; Syriac +0750..077F; Arabic Supplement +0780..07BF; Thaana +07C0..07FF; NKo +0800..083F; Samaritan +0840..085F; Mandaic +08A0..08FF; Arabic Extended-A +0900..097F; Devanagari +0980..09FF; Bengali +0A00..0A7F; Gurmukhi +0A80..0AFF; Gujarati +0B00..0B7F; Oriya +0B80..0BFF; Tamil +0C00..0C7F; Telugu +0C80..0CFF; Kannada +0D00..0D7F; Malayalam +0D80..0DFF; Sinhala +0E00..0E7F; Thai +0E80..0EFF; Lao +0F00..0FFF; Tibetan +1000..109F; Myanmar +10A0..10FF; Georgian +1100..11FF; Hangul Jamo +1200..137F; Ethiopic +1380..139F; Ethiopic Supplement +13A0..13FF; Cherokee +1400..167F; Unified Canadian Aboriginal Syllabics +1680..169F; Ogham +16A0..16FF; Runic +1700..171F; Tagalog +1720..173F; Hanunoo +1740..175F; Buhid +1760..177F; Tagbanwa +1780..17FF; Khmer +1800..18AF; Mongolian +18B0..18FF; Unified Canadian Aboriginal Syllabics Extended +1900..194F; Limbu +1950..197F; Tai Le +1980..19DF; New Tai Lue +19E0..19FF; Khmer Symbols +1A00..1A1F; Buginese +1A20..1AAF; Tai Tham +1AB0..1AFF; Combining Diacritical Marks Extended +1B00..1B7F; Balinese +1B80..1BBF; Sundanese +1BC0..1BFF; Batak +1C00..1C4F; Lepcha +1C50..1C7F; Ol Chiki +1CC0..1CCF; Sundanese Supplement +1CD0..1CFF; Vedic Extensions +1D00..1D7F; Phonetic Extensions +1D80..1DBF; Phonetic Extensions Supplement +1DC0..1DFF; Combining Diacritical Marks Supplement +1E00..1EFF; Latin Extended Additional +1F00..1FFF; Greek Extended +2000..206F; General Punctuation +2070..209F; Superscripts and Subscripts +20A0..20CF; Currency Symbols +20D0..20FF; Combining Diacritical Marks for Symbols +2100..214F; Letterlike Symbols +2150..218F; Number Forms +2190..21FF; Arrows +2200..22FF; Mathematical Operators +2300..23FF; Miscellaneous Technical +2400..243F; Control Pictures +2440..245F; Optical Character Recognition +2460..24FF; Enclosed Alphanumerics +2500..257F; Box Drawing +2580..259F; Block Elements +25A0..25FF; Geometric Shapes +2600..26FF; Miscellaneous Symbols +2700..27BF; Dingbats +27C0..27EF; Miscellaneous Mathematical Symbols-A +27F0..27FF; Supplemental Arrows-A +2800..28FF; Braille Patterns +2900..297F; Supplemental Arrows-B +2980..29FF; Miscellaneous Mathematical Symbols-B +2A00..2AFF; Supplemental Mathematical Operators +2B00..2BFF; Miscellaneous Symbols and Arrows +2C00..2C5F; Glagolitic +2C60..2C7F; Latin Extended-C +2C80..2CFF; Coptic +2D00..2D2F; Georgian Supplement +2D30..2D7F; Tifinagh +2D80..2DDF; Ethiopic Extended +2DE0..2DFF; Cyrillic Extended-A +2E00..2E7F; Supplemental Punctuation +2E80..2EFF; CJK Radicals Supplement +2F00..2FDF; Kangxi Radicals +2FF0..2FFF; Ideographic Description Characters +3000..303F; CJK Symbols and Punctuation +3040..309F; Hiragana +30A0..30FF; Katakana +3100..312F; Bopomofo +3130..318F; Hangul Compatibility Jamo +3190..319F; Kanbun +31A0..31BF; Bopomofo Extended +31C0..31EF; CJK Strokes +31F0..31FF; Katakana Phonetic Extensions +3200..32FF; Enclosed CJK Letters and Months +3300..33FF; CJK Compatibility +3400..4DBF; CJK Unified Ideographs Extension A +4DC0..4DFF; Yijing Hexagram Symbols +4E00..9FFF; CJK Unified Ideographs +A000..A48F; Yi Syllables +A490..A4CF; Yi Radicals +A4D0..A4FF; Lisu +A500..A63F; Vai +A640..A69F; Cyrillic Extended-B +A6A0..A6FF; Bamum +A700..A71F; Modifier Tone Letters +A720..A7FF; Latin Extended-D +A800..A82F; Syloti Nagri +A830..A83F; Common Indic Number Forms +A840..A87F; Phags-pa +A880..A8DF; Saurashtra +A8E0..A8FF; Devanagari Extended +A900..A92F; Kayah Li +A930..A95F; Rejang +A960..A97F; Hangul Jamo Extended-A +A980..A9DF; Javanese +A9E0..A9FF; Myanmar Extended-B +AA00..AA5F; Cham +AA60..AA7F; Myanmar Extended-A +AA80..AADF; Tai Viet +AAE0..AAFF; Meetei Mayek Extensions +AB00..AB2F; Ethiopic Extended-A +AB30..AB6F; Latin Extended-E +ABC0..ABFF; Meetei Mayek +AC00..D7AF; Hangul Syllables +D7B0..D7FF; Hangul Jamo Extended-B +D800..DB7F; High Surrogates +DB80..DBFF; High Private Use Surrogates +DC00..DFFF; Low Surrogates +E000..F8FF; Private Use Area +F900..FAFF; CJK Compatibility Ideographs +FB00..FB4F; Alphabetic Presentation Forms +FB50..FDFF; Arabic Presentation Forms-A +FE00..FE0F; Variation Selectors +FE10..FE1F; Vertical Forms +FE20..FE2F; Combining Half Marks +FE30..FE4F; CJK Compatibility Forms +FE50..FE6F; Small Form Variants +FE70..FEFF; Arabic Presentation Forms-B +FF00..FFEF; Halfwidth and Fullwidth Forms +FFF0..FFFF; Specials +10000..1007F; Linear B Syllabary +10080..100FF; Linear B Ideograms +10100..1013F; Aegean Numbers +10140..1018F; Ancient Greek Numbers +10190..101CF; Ancient Symbols +101D0..101FF; Phaistos Disc +10280..1029F; Lycian +102A0..102DF; Carian +102E0..102FF; Coptic Epact Numbers +10300..1032F; Old Italic +10330..1034F; Gothic +10350..1037F; Old Permic +10380..1039F; Ugaritic +103A0..103DF; Old Persian +10400..1044F; Deseret +10450..1047F; Shavian +10480..104AF; Osmanya +10500..1052F; Elbasan +10530..1056F; Caucasian Albanian +10600..1077F; Linear A +10800..1083F; Cypriot Syllabary +10840..1085F; Imperial Aramaic +10860..1087F; Palmyrene +10880..108AF; Nabataean +10900..1091F; Phoenician +10920..1093F; Lydian +10980..1099F; Meroitic Hieroglyphs +109A0..109FF; Meroitic Cursive +10A00..10A5F; Kharoshthi +10A60..10A7F; Old South Arabian +10A80..10A9F; Old North Arabian +10AC0..10AFF; Manichaean +10B00..10B3F; Avestan +10B40..10B5F; Inscriptional Parthian +10B60..10B7F; Inscriptional Pahlavi +10B80..10BAF; Psalter Pahlavi +10C00..10C4F; Old Turkic +10E60..10E7F; Rumi Numeral Symbols +11000..1107F; Brahmi +11080..110CF; Kaithi +110D0..110FF; Sora Sompeng +11100..1114F; Chakma +11150..1117F; Mahajani +11180..111DF; Sharada +111E0..111FF; Sinhala Archaic Numbers +11200..1124F; Khojki +112B0..112FF; Khudawadi +11300..1137F; Grantha +11480..114DF; Tirhuta +11580..115FF; Siddham +11600..1165F; Modi +11680..116CF; Takri +118A0..118FF; Warang Citi +11AC0..11AFF; Pau Cin Hau +12000..123FF; Cuneiform +12400..1247F; Cuneiform Numbers and Punctuation +13000..1342F; Egyptian Hieroglyphs +16800..16A3F; Bamum Supplement +16A40..16A6F; Mro +16AD0..16AFF; Bassa Vah +16B00..16B8F; Pahawh Hmong +16F00..16F9F; Miao +1B000..1B0FF; Kana Supplement +1BC00..1BC9F; Duployan +1BCA0..1BCAF; Shorthand Format Controls +1D000..1D0FF; Byzantine Musical Symbols +1D100..1D1FF; Musical Symbols +1D200..1D24F; Ancient Greek Musical Notation +1D300..1D35F; Tai Xuan Jing Symbols +1D360..1D37F; Counting Rod Numerals +1D400..1D7FF; Mathematical Alphanumeric Symbols +1E800..1E8DF; Mende Kikakui +1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols +1F000..1F02F; Mahjong Tiles +1F030..1F09F; Domino Tiles +1F0A0..1F0FF; Playing Cards +1F100..1F1FF; Enclosed Alphanumeric Supplement +1F200..1F2FF; Enclosed Ideographic Supplement +1F300..1F5FF; Miscellaneous Symbols and Pictographs +1F600..1F64F; Emoticons +1F650..1F67F; Ornamental Dingbats +1F680..1F6FF; Transport and Map Symbols +1F700..1F77F; Alchemical Symbols +1F780..1F7FF; Geometric Shapes Extended +1F800..1F8FF; Supplemental Arrows-C +20000..2A6DF; CJK Unified Ideographs Extension B +2A700..2B73F; CJK Unified Ideographs Extension C +2B740..2B81F; CJK Unified Ideographs Extension D +2F800..2FA1F; CJK Compatibility Ideographs Supplement +E0000..E007F; Tags +E0100..E01EF; Variation Selectors Supplement +F0000..FFFFF; Supplementary Private Use Area-A +100000..10FFFF; Supplementary Private Use Area-B + +# EOF diff --git a/unicode/Generators/DefinedCharListGenerator/App.config b/unicode/Generators/DefinedCharListGenerator/App.config new file mode 100644 index 0000000000..9c05822ff5 --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj b/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj new file mode 100644 index 0000000000..b1e3df2dc8 --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4} + Exe + Properties + DefinedCharListGenerator + DefinedCharListGenerator + v4.5.1 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + UnicodeData.txt + PreserveNewest + + + + + \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/Program.cs b/unicode/Generators/DefinedCharListGenerator/Program.cs new file mode 100644 index 0000000000..f98dd32f5b --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/Program.cs @@ -0,0 +1,107 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; + +namespace DefinedCharListGenerator +{ + /// + /// This program outputs the 'unicode-defined-chars.bin' bitmap file. + /// + class Program + { + static void Main(string[] args) + { + // The input file should be UnicodeData.txt from the UCD corresponding to the + // version of the Unicode spec we're consuming. + // More info: http://www.unicode.org/reports/tr44/tr44-14.html#UCD_Files + // Latest UnicodeData.txt: http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt + + const uint MAX_UNICODE_CHAR = 0x10FFFF; // Unicode range is U+0000 .. U+10FFFF + bool[] definedChars = new bool[MAX_UNICODE_CHAR + 1]; + + // Read all defined characters from the input file. + string[] allLines = File.ReadAllLines("UnicodeData.txt"); + + // Each line is a semicolon-delimited list of information: + // ;;;... + foreach (string line in allLines) + { + string[] splitLine = line.Split(new char[] { ';' }, 4); + + // We only allow certain categories of code points. + // Zs (space separators) aren't included, but we allow U+0020 SPACE as a special case + uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); + string category = splitLine[2]; + if (!(codepoint == (uint)' ' || IsAllowedUnicodeCategory(category))) + { + continue; + } + + Debug.Assert(codepoint <= MAX_UNICODE_CHAR); + definedChars[codepoint] = true; + } + + // Finally, write the list of defined characters out as a bitmap. + // Each consecutive block of 8 chars is written as a single byte. + // For instance, the first byte of the output file contains the + // bitmap for the following codepoints: + // - (bit 7) U+0007 [MSB] + // - (bit 6) U+0006 + // - (bit 5) U+0005 + // - (bit 4) U+0004 + // - (bit 3) U+0003 + // - (bit 2) U+0002 + // - (bit 1) U+0001 + // - (bit 0) U+0000 [LSB] + // The next byte will contain the bitmap for U+000F to U+0008, + // and so on until the last byte, which is U+FFFF to U+FFF8. + // The bytes are written out in little-endian order. + // We're only concerned about the BMP (U+0000 .. U+FFFF) for now. + MemoryStream outBuffer = new MemoryStream(); + for (int i = 0; i < 0x10000; i += 8) + { + int thisByte = 0; + for (int j = 7; j >= 0; j--) + { + thisByte <<= 1; + if (definedChars[i + j]) + { + thisByte |= 0x1; + } + } + outBuffer.WriteByte((byte)thisByte); + } + + File.WriteAllBytes("unicode-defined-chars.bin", outBuffer.ToArray()); + } + + private static bool IsAllowedUnicodeCategory(string category) + { + // We only allow certain classes of characters + return category == "Lu" /* letters */ + || category == "Ll" + || category == "Lt" + || category == "Lm" + || category == "Lo" + || category == "Mn" /* marks */ + || category == "Mc" + || category == "Me" + || category == "Nd" /* numbers */ + || category == "Nl" + || category == "No" + || category == "Pc" /* punctuation */ + || category == "Pd" + || category == "Ps" + || category == "Pe" + || category == "Pi" + || category == "Pf" + || category == "Po" + || category == "Sm" /* symbols */ + || category == "Sc" + || category == "Sk" + || category == "So" + || category == "Cf"; /* other */ + } + } +} diff --git a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..693c041be1 --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("DefinedCharListGenerator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DefinedCharListGenerator")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5089f890-38f7-413c-87b0-d8eb1e238ef5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/unicode/Generators/Generators.sln b/unicode/Generators/Generators.sln new file mode 100644 index 0000000000..acfaad9b24 --- /dev/null +++ b/unicode/Generators/Generators.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DefinedCharListGenerator", "DefinedCharListGenerator\DefinedCharListGenerator.csproj", "{0E87CEC9-46CE-4B6B-A613-93AA773C10A4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnicodeTablesGenerator", "UnicodeTablesGenerator\UnicodeTablesGenerator.csproj", "{3D181114-6946-4D34-A3B9-0F83B6B8FEAE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.Build.0 = Release|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/unicode/Generators/UnicodeTablesGenerator/App.config b/unicode/Generators/UnicodeTablesGenerator/App.config new file mode 100644 index 0000000000..9c05822ff5 --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/unicode/Generators/UnicodeTablesGenerator/Program.cs b/unicode/Generators/UnicodeTablesGenerator/Program.cs new file mode 100644 index 0000000000..02c740a785 --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/Program.cs @@ -0,0 +1,109 @@ +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace UnicodeTablesGenerator +{ + /// + /// This program outputs the 'UnicodeBlocks.generated.txt' and + /// 'UnicodeBlocksTests.generated.txt' source files. + /// + /// + /// The generated files require some hand-tweaking. For instance, you'll need + /// to remove surrogates and private use blocks. The files can then be merged + /// into the *.generated.cs files as appropriate. + /// + class Program + { + private const string _codePointFiltersGeneratedFormat = @" +/// +/// Represents the '{0}' Unicode block (U+{1}..U+{2}). +/// +/// +/// See http://www.unicode.org/charts/PDF/U{1}.pdf for the full set of characters in this block. +/// +public static UnicodeBlock {3} +{{ + get + {{ + return Volatile.Read(ref _{4}) ?? CreateBlock(ref _{4}, first: '\u{1}', last: '\u{2}'); + }} +}} +private static UnicodeBlock _{4}; +"; + + private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeBlocks.{0}))]"; + + private static void Main() + { + // The input file should be Blocks.txt from the UCD corresponding to the + // version of the Unicode spec we're consuming. + // More info: http://www.unicode.org/reports/tr44/ + // Latest Blocks.txt: http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt + + StringBuilder runtimeCodeBuilder = new StringBuilder(); + StringBuilder testCodeBuilder = new StringBuilder(); + string[] allLines = File.ReadAllLines("Blocks.txt"); + + Regex regex = new Regex(@"^(?[0-9A-F]{4})\.\.(?[0-9A-F]{4}); (?.+)$"); + + foreach (var line in allLines) + { + // We only care about lines of the form "XXXX..XXXX; Block name" + var match = regex.Match(line); + if (match == null || !match.Success) + { + continue; + } + + string startCode = match.Groups["startCode"].Value; + string endCode = match.Groups["endCode"].Value; + string blockName = match.Groups["blockName"].Value; + string blockNameAsProperty = RemoveAllNonAlphanumeric(blockName); + string blockNameAsField = WithDotNetFieldCasing(blockNameAsProperty); + + runtimeCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersGeneratedFormat, + blockName, startCode, endCode, blockNameAsProperty, blockNameAsField); + + testCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersTestsGeneratedFormat, + blockNameAsProperty, startCode, endCode); + testCodeBuilder.AppendLine(); + } + + File.WriteAllText("UnicodeBlocks.generated.txt", runtimeCodeBuilder.ToString()); + File.WriteAllText("UnicodeBlocksTests.generated.txt", testCodeBuilder.ToString()); + } + + private static string RemoveAllNonAlphanumeric(string blockName) + { + // Allow only A-Z 0-9 + return new String(blockName.ToCharArray().Where(c => ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9')).ToArray()); + } + + private static string WithDotNetFieldCasing(string input) + { + char[] chars = input.ToCharArray(); + for (int i = 0; i < chars.Length; i++) + { + if (Char.IsLower(chars[i])) + { + if (i > 1) + { + // restore original casing for the previous char unless the previous + // char was at the front of the string + chars[i - 1] = input[i - 1]; + } + break; + } + else + { + chars[i] = Char.ToLowerInvariant(chars[i]); + } + } + return new String(chars); + } + } +} diff --git a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b7fc3fb222 --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +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: AssemblyTitle("UnicodeTablesGenerator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnicodeTablesGenerator")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c9286457-3d25-4143-9458-028aabedc4f5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj b/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj new file mode 100644 index 0000000000..2821a1533c --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE} + Exe + Properties + UnicodeTablesGenerator + UnicodeTablesGenerator + v4.5.1 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Blocks.txt + PreserveNewest + + + + + \ No newline at end of file diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt new file mode 100644 index 0000000000..31c8a7eaa0 --- /dev/null +++ b/unicode/UnicodeData.txt @@ -0,0 +1,27268 @@ +0000;;Cc;0;BN;;;;;N;NULL;;;; +0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;;Cc;0;BN;;;;;N;BELL;;;; +0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;;Cc;0;BN;;;;;N;CANCEL;;;; +0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;;Cc;0;BN;;;;;N;DELETE;;;; +0080;;Cc;0;BN;;;;;N;;;;; +0081;;Cc;0;BN;;;;;N;;;;; +0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;;Cc;0;BN;;;;;N;;;;; +0085;;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;;Cc;0;BN;;;;;N;;;;; +009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Lo;0;L; 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L; 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 +01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB +01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3;01F2 +01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;;;; +02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 +037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; +037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; +0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; +03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L; 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 +0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; +0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 +0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; +0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 +0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; +0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 +052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; +052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A +052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; +052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C +052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; +052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; +0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; +065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; +0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; +0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; +0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; +0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; +0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; +0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; +0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; +0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; +0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; +0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; +080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; +080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; +080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; +080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; +080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; +080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; +0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; +0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; +0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; +0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; +0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; +0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; +0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; +0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; +0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; +0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; +081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; +081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; +081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; +081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; +081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; +0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; +0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; +0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; +0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; +0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; +0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; +0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; +0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; +0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; +0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; +082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; +082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; +082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; +0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; +0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; +0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; +0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; +0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; +0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; +0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; +0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; +0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; +0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; +083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; +083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; +083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; +083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; +083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; +0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; +0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; +0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; +0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; +0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; +0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; +0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; +0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; +0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; +0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; +084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; +084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; +084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; +084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; +084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; +084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; +0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; +0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; +0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; +0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; +0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; +0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; +0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; +0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; +0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; +0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; +085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; +085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; +08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; +08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; +08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; +08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; +08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; +08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; +08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; +08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; +08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; +08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; +08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; +08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; +08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; +08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; +08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; +08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; +08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; +08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; +08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; +08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; +08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; +08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; +0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; +0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; +0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; +0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; +0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; +0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; +0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; +097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; +0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; +0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; +0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; +0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; +0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; +0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; +0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; +0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; +0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; +109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; +109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; +109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; +10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; +10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; +10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; +10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; +10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; +10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; +10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; +10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; +10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; +10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; +10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; +10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; +10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; +10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; +10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; +10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; +10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; +10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; +10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; +10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; +10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; +10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; +10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; +10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; +10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; +10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; +10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; +10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; +10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; +10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; +10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; +10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; +10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; +10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; +10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; +10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; +10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; +10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; +10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; +10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; +10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; +10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; +10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; +10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; +10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L; 10DC;;;;N;;;;; +10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;; +10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;; +10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;; +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; +115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; +11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; +11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; +11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; +11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; +11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; +11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; +11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; +11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; +13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; +13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; +13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; +13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; +13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; +13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; +13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; +13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; +13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; +13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; +13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; +13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; +13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; +13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; +13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; +13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; +13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; +13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; +13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; +13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; +13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; +13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; +13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; +13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; +13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; +13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; +13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; +13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; +13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; +13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; +13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; +13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; +13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; +13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; +13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; +13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; +13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; +13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; +13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; +13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; +13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; +13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; +13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; +13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; +13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; +13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; +13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; +13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; +13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; +13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; +13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; +13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; +13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; +13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; +13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; +13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; +13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; +13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; +13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; +13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; +13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; +13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; +13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; +13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; +13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; +13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; +13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; +13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; +13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; +13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; +13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; +13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; +13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; +13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; +13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; +13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; +13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; +13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; +13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; +13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; +13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; +13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; +13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; +13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; +1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; +1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; +1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; +167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; +167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; +167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; +167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; +167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; +167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; +16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; +16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; +16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; +16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; +16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; +16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; +16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; +16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; +18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; +18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; +18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; +18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; +18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; +18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; +18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; +18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; +18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; +18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; +18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; +18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; +18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; +18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; +18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; +18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; +18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; +18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; +18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; +18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; +18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; +18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; +18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; +18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; +18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; +18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; +18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; +18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; +18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; +18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; +18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; +18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; +18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; +18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; +18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; +18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; +18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; +18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; +18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; +18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; +18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; +18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; +18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; +18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; +18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; +18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; +18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; +18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; +18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; +18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; +18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; +18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; +18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; +18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; +18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; +18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; +18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; +18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; +18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; +18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; +18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; +18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; +18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; +18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; +18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; +18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; +18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; +18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; +18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; +18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; +191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; +19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; +19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; +1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; +1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; +1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; +1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; +1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; +1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; +1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; +1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; +1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; +1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; +1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; +1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; +1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; +1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; +1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; +1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; +1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; +1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; +1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; +1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; +1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; +1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; +1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; +1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; +1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; +1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; +1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; +1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; +1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; +1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; +1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; +1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; +1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; +1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; +1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; +1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; +1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; +1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; +1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; +1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; +1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; +1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; +1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; +1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; +1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; +1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; +1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; +1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; +1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; +1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; +1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; +1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; +1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; +1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; +1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; +1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; +1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; +1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; +1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; +1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; +1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; +1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; +1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; +1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; +1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; +1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; +1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; +1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; +1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; +1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; +1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; +1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; +1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; +1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; +1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; +1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; +1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; +1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; +1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; +1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; +1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; +1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; +1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; +1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; +1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; +1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; +1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; +1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; +1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; +1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; +1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; +1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; +1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; +1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; +1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; +1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; +1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; +1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; +1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; +1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; +1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; +1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; +1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; +1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; +1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; +1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; +1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; +1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; +1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; +1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; +1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; +1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; +1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; +1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; +1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; +1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; +1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; +1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; +1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; +1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; +1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; +1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; +1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; +1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; +1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; +1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; +1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; +1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; +1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; +1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; +1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; +1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; +1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; +1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; +1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; +1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; +1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; +1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; +1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; +1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; +1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; +1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; +1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; +1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; +1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; +1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; +1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; +1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; +1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; +1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; +1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; +1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; +1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; +1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; +1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; +1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; +1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; +1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;; +1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;; +1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L; 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L; 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L; 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L; 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L; 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L; 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L; 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L; 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L; 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L; 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L; 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L; 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L; 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L; 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L; 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L; 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L; 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L; 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L; 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L; 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L; 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L; 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L; 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L; 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L; 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L; 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L; 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L; 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L; 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L; 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L; 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L; 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L; 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L; 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L; 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L; 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L; 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L; 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L; 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L; 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L; 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L; 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L; 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L; 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L; 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L; 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L; 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L; 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L; 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L; 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L; 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L; 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L; 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L; 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L; 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L; 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L; 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L; 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L; 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L; 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L; 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L; 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L; 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L; 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L; 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L; 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L; 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L; 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L; 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L; 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L; 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L; 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L; 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L; 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L; 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L; 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L; 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L; 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L; 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L; 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L; 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L; 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L; 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L; 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L; 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L; 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L; 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L; 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L; 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L; 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L; 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L; 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L; 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; +1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; +1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; +1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; +1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; +1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; +1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; +1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; +1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; +1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON; 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON; 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS; 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; +2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; +2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; +2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; +2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L; 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L; 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L; 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L; 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L; 0259;;;;N;;;;; +2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L; 0068;;;;N;;;;; +2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L; 006B;;;;N;;;;; +2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L; 006C;;;;N;;;;; +2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L; 006D;;;;N;;;;; +2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L; 0070;;;;N;;;;; +209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L; 0073;;;;N;;;;; +209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L; 0074;;;;N;;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; +20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; +20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; +20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; +20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; +20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; +20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; +2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213B;FACSIMILE SIGN;So;0;ON; 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON; 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; +2150;VULGAR FRACTION ONE SEVENTH;No;0;ON; 0031 2044 0037;;;1/7;N;;;;; +2151;VULGAR FRACTION ONE NINTH;No;0;ON; 0031 2044 0039;;;1/9;N;;;;; +2152;VULGAR FRACTION ONE TENTH;No;0;ON; 0031 2044 0031 0030;;;1/10;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; +2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; +23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; +23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; +23F1;STOPWATCH;So;0;ON;;;;;N;;;;; +23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; +23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; +23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; +23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON; 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON; 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON; 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON; 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON; 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON; 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON; 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON; 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON; 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON; 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON; 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON; 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON; 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON; 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON; 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON; 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON; 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON; 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON; 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON; 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON; 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON; 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON; 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON; 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON; 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON; 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON; 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON; 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON; 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON; 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON; 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON; 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON; 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON; 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON; 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON; 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON; 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON; 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON; 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;ON; 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; +269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; +26BE;BASEBALL;So;0;ON;;;;;N;;;;; +26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; +26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +26C6;RAIN;So;0;ON;;;;;N;;;;; +26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; +26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; +26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; +26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; +26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; +26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; +26CF;PICK;So;0;ON;;;;;N;;;;; +26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; +26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; +26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; +26D3;CHAINS;So;0;ON;;;;;N;;;;; +26D4;NO ENTRY;So;0;ON;;;;;N;;;;; +26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; +26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; +26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; +26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; +26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; +26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; +26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; +26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; +26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; +26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; +26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; +26EA;CHURCH;So;0;ON;;;;;N;;;;; +26EB;CASTLE;So;0;ON;;;;;N;;;;; +26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; +26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; +26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; +26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; +26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; +26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; +26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; +26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; +26F4;FERRY;So;0;ON;;;;;N;;;;; +26F5;SAILBOAT;So;0;ON;;;;;N;;;;; +26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; +26F7;SKIER;So;0;ON;;;;;N;;;;; +26F8;ICE SKATE;So;0;ON;;;;;N;;;;; +26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; +26FA;TENT;So;0;ON;;;;;N;;;;; +26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; +26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; +26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; +26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; +26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; +2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270A;RAISED FIST;So;0;ON;;;;;N;;;;; +270B;RAISED HAND;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2728;SPARKLES;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274C;CROSS MARK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; +2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; +2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; +27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; +27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON; 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON; 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; +2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; +2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; +2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; +2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; +2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; +2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; +2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; +2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; +2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; +2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; +2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; +2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; +2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; +2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; +2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; +2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; +2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; +2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; +2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; +2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; +2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; +2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; +2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; +2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; +2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; +2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; +2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; +2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; +2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L; 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L; 0056;;;;N;;;;; +2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; +2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; +2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB +2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; +2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED +2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; +2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; +2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; +2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; +2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 +2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 +2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; +2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L; 2D61;;;;N;;;;; +2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; +2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; +2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; +2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; +2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; +2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; +2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; +2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; +2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; +2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; +2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; +2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; +2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; +2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; +2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; +2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; +2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L; 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L; 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; +31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; +31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON; 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON; 0028 110B 1169 1112 116E 0029;;;;N;;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; +3244;CIRCLED IDEOGRAPH QUESTION;So;0;L; 554F;;;;N;;;;; +3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L; 5E7C;;;;N;;;;; +3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L; 6587;;;;N;;;;; +3247;CIRCLED IDEOGRAPH KOTO;So;0;L; 7B8F;;;;N;;;;; +3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; +3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; +324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; +324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; +324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; +324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; +324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; +324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; +3250;PARTNERSHIP SIGN;So;0;ON; 0050 0054 0045;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON; 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON; 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON; 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON; 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON; 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON; 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON; 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON; 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON; 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON; 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON; 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON; 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON; 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON; 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON; 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON; 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON; 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON; 110B 116E;;;;N;;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON; 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON; 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON; 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON; 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON; 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON; 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON; 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON; 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON; 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON; 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON; 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON; 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON; 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON; 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON; 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; +32CC;SQUARE HG;So;0;ON; 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON; 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON; 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON; 004C 0054 0044;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; +3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; +3377;SQUARE DM;So;0;ON; 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON; 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON; 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON; 0049 0055;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; +33DE;SQUARE V OVER M;So;0;ON; 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON; 0041 2215 006D;;;;N;;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; +33FF;SQUARE GAL;So;0;ON; 0067 0061 006C;;;;N;;;;; +3400;;Lo;0;L;;;;;N;;;;; +4DB5;;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; +4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; +4E00;;Lo;0;L;;;;;N;;;;; +9FCC;;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; +A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; +A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; +A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; +A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; +A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; +A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; +A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; +A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; +A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; +A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; +A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; +A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; +A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; +A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; +A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; +A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; +A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; +A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; +A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; +A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; +A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; +A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; +A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; +A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; +A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; +A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; +A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; +A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; +A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; +A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; +A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; +A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; +A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; +A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; +A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; +A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; +A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; +A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; +A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; +A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; +A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; +A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; +A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; +A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; +A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; +A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; +A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; +A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; +A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; +A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; +A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; +A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; +A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; +A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; +A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 +A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; +A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A +A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; +A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; +A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; +A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; +A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; +A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; +A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; +A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; +A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; +A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; +A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; +A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; +A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; +A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; +A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; +A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; +A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; +A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; +A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; +A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; +A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; +A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; +A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; +A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; +A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; +A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; +A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; +A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; +A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; +A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; +A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; +A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; +A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; +A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; +A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; +A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; +A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; +A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; +A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; +A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; +A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; +A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; +A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; +A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; +A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; +A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; +A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; +A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; +A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; +A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; +A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; +A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; +A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; +A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; +A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; +A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; +A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; +A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; +A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; +A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; +A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; +A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; +A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; +A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; +A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; +A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; +A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; +A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; +A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; +A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; +A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; +A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; +A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; +A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; +A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; +A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; +A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; +A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; +A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; +A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; +A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; +A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; +A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; +A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; +A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; +A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; +A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; +A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; +A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; +A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; +A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L; A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; +A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; +A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 +A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; +A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 +A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; +A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 +A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; +A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 +A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; +A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A +A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; +A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C +A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; +A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E +A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; +A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 +A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; +A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 +A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; +A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 +A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; +A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 +A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; +A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 +A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; +A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; +A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; +A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; +A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; +A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; +A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; +A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; +A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; +A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; +A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; +A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; +A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; +A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; +A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; +A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; +A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; +A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; +A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; +A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; +A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; +A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; +A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; +A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; +A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; +A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; +A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; +A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; +A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; +A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; +A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; +A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; +A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; +A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; +A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; +A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; +A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; +A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; +A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; +A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; +A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; +A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; +A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; +A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; +A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; +A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; +A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; +A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; +A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; +A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; +A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; +A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; +A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; +A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; +A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; +A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; +A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; +A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; +A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; +A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; +A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; +A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; +A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; +A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; +A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; +A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; +A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; +A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; +A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; +A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; +A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; +A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; +A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; +A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; +A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; +A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; +A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; +A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; +A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; +A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; +A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; +A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; +A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; +A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; +A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; +A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; +A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; +A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; +A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; +A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; +A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;; +A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; +A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; +A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; +A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; +A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; +A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; +A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; +A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; +A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; +A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; +A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; +A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; +A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; +A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; +A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; +A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; +A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; +A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; +A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; +A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; +A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; +A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; +A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; +A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; +A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; +A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; +A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; +A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; +A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; +A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; +A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; +A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; +A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; +A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; +A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; +A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; +AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; +AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; +AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; +AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; +AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; +AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; +AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; +AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; +AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; +AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; +AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; +AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; +AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; +AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; +AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; +AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; +AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; +AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; +AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; +AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; +AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; +AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; +AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; +AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; +AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; +AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; +AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; +AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; +AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; +AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; +AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; +AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; +AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; +AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; +AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; +AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; +AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; +AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; +AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; +AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; +AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; +AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; +AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; +AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; +AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; +AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; +AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; +AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; +AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; +AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; +AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; +AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; +AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; +AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; +AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; +AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; +AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; +AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; +AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; +AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; +AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; +AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; +AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; +AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; +AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; +AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; +AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; +AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; +AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; +AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; +AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; +AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; +AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; +AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; +AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; +AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; +AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; +AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; +AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; +AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; +AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; +AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; +AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; +AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; +AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; +AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; +AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; +AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; +AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; +AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; +AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; +AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; +AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; +AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; +AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; +AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; +AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; +AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; +AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; +AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; +AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; +AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; +AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; +AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; +AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; +AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; +AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; +AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; +AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; +AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; +AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; +AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; +AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; +AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; +AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; +AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; +AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; +AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; +AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; +AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; +AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; +AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; +AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; +AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; +AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; +AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; +AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; +AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; +AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; +AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; +AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; +AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; +AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; +AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; +AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; +AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; +AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; +AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; +AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; +AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; +AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; +AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; +AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; +AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; +AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; +AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; +AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; +AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; +AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; +AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; +AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; +AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; +AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; +AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; +AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; +AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; +AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; +AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; +AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; +AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; +AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; +AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;;; +AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; +AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; +AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; +AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; +AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; +AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; +AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; +AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; +AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; +AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; +ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; +ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; +ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; +ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; +ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; +ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; +ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; +ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; +ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; +ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; +ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; +ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; +ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; +ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; +ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; +ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; +ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; +ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; +ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; +ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; +ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; +ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; +ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; +ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; +ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; +ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; +ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; +ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; +ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; +ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; +ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; +ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; +ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; +ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; +ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; +ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; +ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; +ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; +ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; +ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; +ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; +ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; +ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; +ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; +ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; +ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;;Lo;0;L;;;;;N;;;;; +D7A3;;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; +D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; +D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; +D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; +D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; +D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; +D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; +D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; +D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; +D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; +D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; +D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; +D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; +D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; +D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; +D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; +D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; +D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; +D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; +D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; +D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; +D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; +D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; +D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; +D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; +D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; +D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; +D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; +D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; +D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; +D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; +D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; +D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; +D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; +D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; +D800;;Cs;0;L;;;;;N;;;;; +DB7F;;Cs;0;L;;;;;N;;;;; +DB80;;Cs;0;L;;;;;N;;;;; +DBFF;;Cs;0;L;;;;;N;;;;; +DC00;;Cs;0;L;;;;;N;;;;; +DFFF;;Cs;0;L;;;;;N;;;;; +E000;;Co;0;L;;;;;N;;;;; +F8FF;;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; +FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; +FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; +FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; +FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; +FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; +FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; +FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; +FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; +FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; +FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; +FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL; 0631 06CC 0627 0644;;;;N;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON; 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON; 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON; 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON; 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON; 2026;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; +FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS; 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON; 2985;;;;Y;;;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON; 2986;;;;Y;;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON; 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; +1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; +102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; +102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; +102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; +102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; +102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; +102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; +102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; +102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; +102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; +102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; +102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; +102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; +102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; +102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; +102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; +102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; +102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; +102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; +102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; +102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; +102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; +102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; +102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; +102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; +102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; +102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; +102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; +102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; +1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; +10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; +10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; +10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; +10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; +10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; +10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; +10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; +10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; +10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; +10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; +10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; +10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; +10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; +10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; +10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; +1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; +1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; +1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; +1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; +1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; +1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; +10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; +10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; +10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; +10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; +10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; +10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; +10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; +10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; +10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; +10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; +1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; +1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; +1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; +1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; +1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; +1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; +10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; +10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; +10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; +10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; +10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; +10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; +10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; +10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; +10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; +10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; +1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; +10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; +10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; +10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; +10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; +10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; +10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; +10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; +10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; +10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; +1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; +1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; +1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; +1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; +1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; +1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; +10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; +10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; +10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; +10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; +10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; +10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; +10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; +10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; +10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; +10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; +1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; +1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; +1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; +1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; +1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; +1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; +10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; +10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; +10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; +10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; +10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; +10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; +10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; +10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; +10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; +10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; +10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; +10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; +10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; +10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; +10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; +10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; +10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; +10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; +1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; +1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; +1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; +10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; +10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; +10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; +10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; +10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; +10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; +10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; +10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; +10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; +10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; +1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; +1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; +1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; +1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; +1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; +10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; +10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; +10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; +10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; +10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; +10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; +10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; +10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; +10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; +10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; +1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; +1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; +1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; +1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; +1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; +1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; +10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; +10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; +10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; +10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; +1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; +10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; +10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; +10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; +10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; +10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; +10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; +10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; +10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; +10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; +10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; +1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; +1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; +1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; +1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; +1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; +1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; +10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; +10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; +10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; +10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; +10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; +10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; +10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; +10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; +10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; +10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; +1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; +1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; +1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; +1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; +1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; +1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; +10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; +10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; +10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; +10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; +10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; +10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; +10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; +10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; +10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; +10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; +1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; +1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; +1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; +1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; +1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; +1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; +10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; +10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; +10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; +10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; +10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; +10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; +10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; +10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; +10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; +10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; +1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; +1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; +1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; +1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; +1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; +1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; +10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; +10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; +10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; +10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; +10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; +10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; +10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; +10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; +10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; +10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; +1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; +1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; +1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; +1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; +1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; +1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; +10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; +10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; +10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; +10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; +10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; +10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; +10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; +10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; +10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; +10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; +1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; +1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; +1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; +1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; +1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; +1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; +10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; +10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; +10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; +10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; +10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; +10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; +10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; +10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; +10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; +10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; +1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; +1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; +1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; +1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; +1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; +1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; +10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; +10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; +10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; +10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; +10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; +10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; +10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; +10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; +10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; +10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; +1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; +1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; +1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; +1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; +1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; +1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; +10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; +10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; +10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; +10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; +10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; +10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; +10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; +10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; +10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; +10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; +1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; +1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; +1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; +1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; +1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; +1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; +10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; +10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; +10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; +10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; +10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; +10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; +10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; +10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; +10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; +10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; +1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; +1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; +1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; +1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; +1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; +1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; +106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; +106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; +106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; +106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; +106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; +106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; +106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; +106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; +106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; +106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; +106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; +106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; +106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; +106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; +106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; +106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; +106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; +106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; +106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; +106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; +106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; +106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; +106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; +106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; +106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; +106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; +106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; +106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; +106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; +106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; +106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; +106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; +106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; +106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; +106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; +106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; +106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; +106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; +106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; +106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; +106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; +106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; +106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; +106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; +106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; +106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; +106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; +106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; +106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; +106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; +106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; +106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; +106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; +106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; +106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; +106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; +106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; +106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; +106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; +106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; +106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; +106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; +106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; +106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; +106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; +106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; +106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; +106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; +106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; +106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; +106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; +106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; +106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; +106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; +106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; +106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; +106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; +106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; +106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; +106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; +106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; +106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; +106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; +106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; +106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; +106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; +106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; +106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; +106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; +106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; +106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; +106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; +106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; +106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; +106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; +106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; +10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; +10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; +10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; +10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; +10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; +10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; +10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; +10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; +10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; +10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; +1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; +1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; +1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; +1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; +1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; +1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; +10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; +10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; +10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; +10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; +10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; +10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; +10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; +10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; +10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; +10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; +1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; +1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; +1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; +1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; +1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; +1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; +10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; +10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; +10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; +10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; +10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; +10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; +10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; +10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; +10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; +10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; +1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; +1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; +1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; +1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; +1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; +1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; +10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; +10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; +10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; +10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; +10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; +10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; +10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; +10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; +10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; +10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; +10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; +10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; +10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; +10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; +10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; +10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; +10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; +1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; +1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; +1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; +1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; +1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; +1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; +10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; +10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; +10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; +10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; +10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; +10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; +10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; +10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; +10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; +10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; +10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; +10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; +10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; +10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; +10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; +10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; +1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; +1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; +1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; +1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; +10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; +10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; +10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; +10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; +10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; +10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; +1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; +1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; +1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; +1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; +10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; +10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; +10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; +10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; +10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; +10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; +10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; +1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; +1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; +1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; +1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; +1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; +1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; +1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; +1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; +10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; +1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; +108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; +108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; +10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; +10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; +10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; +10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; +10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; +10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; +10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; +10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; +10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; +1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; +1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; +1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; +1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; +1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; +1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; +10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; +10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; +10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; +10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; +10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; +10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; +10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; +10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; +10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; +10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; +1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; +1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; +1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; +1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; +1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; +1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; +109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; +109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; +109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; +109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; +109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; +109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; +109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; +109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; +109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; +109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; +109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; +109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; +109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; +109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; +109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; +109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; +109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; +109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; +109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; +109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; +109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; +109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; +109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; +109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; +109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; +10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; +10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; +10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; +10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; +10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; +10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; +10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; +10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; +10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; +10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; +10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; +10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; +10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; +10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; +10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; +10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; +10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; +10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; +10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; +10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; +10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; +10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; +10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; +10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; +10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; +10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; +10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; +10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; +10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; +10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; +10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; +10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; +10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; +10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; +10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; +10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; +10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; +10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; +10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; +10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; +10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; +10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; +10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; +10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; +10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; +10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; +10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; +10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; +10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; +10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; +10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; +10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; +10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; +10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; +10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; +10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; +10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; +10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; +10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; +10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; +10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; +10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; +10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; +10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; +10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; +10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; +10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; +10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; +10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; +10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; +10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; +10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; +10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; +10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; +10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; +10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; +10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; +10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; +10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; +10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; +10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; +10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; +10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; +10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; +10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; +10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; +10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; +10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; +10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; +10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; +10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; +10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; +10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; +10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; +10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; +10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; +10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; +10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; +10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; +10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; +10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; +10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; +10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; +10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; +10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; +10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; +10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; +10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; +10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; +10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; +10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; +10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; +10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; +10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; +10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; +10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; +10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; +10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; +10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; +10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; +10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; +10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; +10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; +10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; +10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; +10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; +10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; +10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; +10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; +10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; +10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; +10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; +10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; +10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; +10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; +10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; +10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; +10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; +10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; +10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; +10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; +10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; +10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; +10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; +10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; +10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; +10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; +10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; +10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; +10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; +10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; +10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; +10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; +10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; +10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; +10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; +10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; +10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; +10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; +10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; +10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; +10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; +10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; +10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; +10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; +10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; +10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; +10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; +10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; +10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; +10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; +10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; +10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; +10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; +10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; +10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; +10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; +10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; +10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; +10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; +10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; +10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; +10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; +10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; +10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; +10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; +10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; +10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; +10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; +10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; +10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; +10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; +10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; +10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; +10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; +10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; +10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; +10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; +10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; +10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; +10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; +10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; +10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; +10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; +10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; +10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; +10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; +10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; +10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; +10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; +10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; +10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; +10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; +10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; +10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; +11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; +11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; +11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; +11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; +11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; +1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; +1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; +11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; +11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; +11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; +11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; +11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; +11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; +11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; +11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; +11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; +11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; +1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; +1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; +1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; +1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; +1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; +11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; +11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; +11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; +11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; +11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; +11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; +11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; +11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; +11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; +1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; +1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; +1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; +1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; +1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; +1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; +11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; +11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; +11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; +11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; +11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; +11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; +11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; +11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; +11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; +1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; +11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; +1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; +1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; +11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; +11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; +11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; +11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; +11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; +11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; +11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; +11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; +1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; +1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; +1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; +1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; +1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; +11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; +11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; +11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; +11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; +11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; +11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; +11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; +11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; +11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; +11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; +11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; +11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; +11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; +11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; +1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; +1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; +1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; +1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; +1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; +1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; +11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; +11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; +11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; +11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; +11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; +11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; +11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; +11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; +11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; +1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; +1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; +1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; +1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; +1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; +110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; +110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; +110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; +110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; +110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; +110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; +110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; +110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; +110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; +110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; +110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; +110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; +110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; +110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; +110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; +110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; +110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; +110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; +110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; +110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; +110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; +110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; +110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; +110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; +110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; +110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; +110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; +110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; +110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; +110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; +110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; +110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; +110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; +110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; +110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; +110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; +110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; +110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; +110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; +110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; +110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; +110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; +110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; +110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; +110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; +110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; +11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; +11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; +11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; +11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; +11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; +11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; +11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; +11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; +1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; +1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; +1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; +1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; +1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; +1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; +11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; +11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; +11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; +11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; +11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; +11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; +11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; +11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; +11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; +11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; +1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; +1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; +1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; +1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; +1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; +1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; +11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; +11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; +11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; +11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; +11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; +11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; +11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; +11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; +1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; +11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; +11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; +11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; +11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; +11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; +11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; +11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; +11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; +11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; +11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; +11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; +11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; +11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; +11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; +11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; +11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; +11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; +1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; +1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; +1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; +1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; +1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; +11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; +11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; +11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; +11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; +11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; +11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; +1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; +1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; +1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; +1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; +1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; +11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; +11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; +11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; +11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; +11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; +11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; +11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; +11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; +11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; +11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; +11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; +11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; +1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; +1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; +11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; +11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; +11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; +11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; +11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; +11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; +11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; +11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; +11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; +11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; +1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; +1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; +1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; +1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; +111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; +111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; +111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; +111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; +111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; +111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; +111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; +111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; +111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; +111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; +111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; +111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; +111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; +111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; +111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; +111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; +111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; +111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; +111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; +111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; +111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; +111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; +111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; +111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; +111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; +111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; +111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; +111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; +111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; +111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; +111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; +111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; +111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; +11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; +11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; +11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; +11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; +11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; +11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; +11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; +11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; +11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; +1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; +1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; +1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; +1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; +1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; +1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; +11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; +11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; +1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; +1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; +1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; +1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; +1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; +1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; +11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; +11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; +11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; +11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; +11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; +11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; +11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; +11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; +1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; +1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; +1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; +11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; +1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; +112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; +112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; +112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; +112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; +112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; +112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; +112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; +112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; +112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; +112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; +112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; +112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; +112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; +112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; +112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; +112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; +112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; +112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; +112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; +112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; +112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; +112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; +112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; +112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; +112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; +112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; +112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; +112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; +112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; +112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; +112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; +112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; +112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; +112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; +112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; +112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; +112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; +112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; +112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; +112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; +112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; +112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; +112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; +112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; +112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; +112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; +112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; +11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; +11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; +11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; +11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; +1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; +1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; +11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; +11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; +11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; +11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; +11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; +11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; +11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; +11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; +1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; +1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; +1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; +11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; +11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; +11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; +11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; +11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; +11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; +11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; +1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; +1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; +1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; +1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; +1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; +11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; +11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; +11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; +11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; +11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; +11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; +11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; +11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; +1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; +1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; +1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; +1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; +11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; +11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; +11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; +11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; +11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; +11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; +11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; +11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; +11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; +11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; +11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; +11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; +11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; +1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; +1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; +1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; +1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; +11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; +11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; +11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; +11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; +11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; +11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; +11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; +11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; +11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; +11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; +1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; +1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; +1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; +1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; +114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; +114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; +114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; +114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; +114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; +114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; +114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; +114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; +114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; +114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; +114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; +114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; +114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; +114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; +114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; +114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; +114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; +114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; +114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; +114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; +114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; +114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; +11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; +11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; +11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; +11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; +11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; +11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; +1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; +1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; +1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; +1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; +1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; +11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; +11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; +11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; +11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; +11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; +1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; +1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; +1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; +115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; +115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; +115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; +115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; +115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; +115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; +115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; +115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; +115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; +115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; +115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; +115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; +115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; +115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; +115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; +115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; +115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; +115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; +115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; +115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; +115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; +11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; +11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; +11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; +11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; +11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; +11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; +1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; +1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; +1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; +1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; +1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; +11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; +11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; +11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; +11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; +11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; +11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; +11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; +11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; +11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; +11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; +1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; +1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; +1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; +1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; +11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; +11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; +11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; +11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; +11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; +11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; +11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; +11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; +11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; +11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; +1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; +1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; +1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; +1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; +1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; +1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; +11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; +11641;MODI DANDA;Po;0;L;;;;;N;;;;; +11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; +11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; +11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; +11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; +11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; +11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; +11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; +11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; +11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; +11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; +11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; +1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; +1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; +1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; +1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; +1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; +1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; +11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; +11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; +11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; +11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; +11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; +11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; +11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; +11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; +1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; +1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; +1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; +1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; +1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; +1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; +116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; +116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; +116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; +116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; +116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; +116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; +116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; +116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; +116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; +116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; +116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; +116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; +118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; +118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; +118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; +118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; +118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; +118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; +118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; +118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; +118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; +118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; +118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; +118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; +118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; +118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; +118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; +118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; +118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; +118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; +118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; +118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; +118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; +118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; +118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; +118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; +118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; +118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; +118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; +118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; +118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; +118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; +118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; +118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 +118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 +118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 +118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 +118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 +118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 +118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 +118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 +118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 +118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 +118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA +118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB +118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC +118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD +118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE +118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF +118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 +118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 +118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 +118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 +118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 +118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 +118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 +118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 +118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 +118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 +118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA +118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB +118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC +118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD +118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE +118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF +118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; +118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; +118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; +118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; +11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; +11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; +11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; +11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; +11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; +11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; +11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; +11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; +11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; +11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; +11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; +11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; +11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; +11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; +11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; +11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; +11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; +11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; +11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; +11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; +11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; +11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; +11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; +11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; +11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; +11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; +11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; +11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; +11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; +11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; +11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; +11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; +11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; +11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; +11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; +11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; +11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; +11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; +11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; +11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; +11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; +11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; +11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; +11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; +12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; +12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; +12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; +12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; +12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; +12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; +12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; +12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; +12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; +12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; +1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; +1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; +1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; +1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; +1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; +12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; +12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; +12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; +12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; +12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; +12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; +12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; +12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; +12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; +1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; +1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; +1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; +1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; +1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; +12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; +12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; +12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; +12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; +12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; +12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; +12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; +12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; +12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; +12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; +12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; +12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; +12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; +1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; +1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; +1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; +1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; +1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; +12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; +13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; +13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; +13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; +13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; +13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; +13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; +1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; +13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; +13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; +13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; +13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; +13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; +13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; +13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; +13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; +13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; +13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; +13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; +1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; +1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; +1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; +1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; +1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; +1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; +13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; +13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; +13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; +13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; +13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; +13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; +13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; +13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; +13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; +13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; +1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; +1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; +1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; +1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; +1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; +1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; +13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; +13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; +13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; +13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; +13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; +13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; +13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; +13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; +13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; +13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; +1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; +1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; +1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; +1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; +1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; +1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; +13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; +13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; +13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; +13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; +13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; +13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; +13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; +13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; +13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; +13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; +1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; +1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; +1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; +1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; +1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; +1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; +13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; +13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; +13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; +13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; +13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; +13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; +13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; +13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; +13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; +13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; +1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; +1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; +1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; +1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; +1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; +1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; +130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; +130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; +130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; +130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; +130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; +130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; +130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; +130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; +130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; +130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; +130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; +130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; +130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; +130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; +130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; +130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; +130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; +130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; +130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; +130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; +130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; +130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; +130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; +130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; +130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; +130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; +130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; +130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; +130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; +130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; +130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; +130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; +130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; +130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; +130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; +130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; +130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; +130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; +130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; +130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; +130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; +130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; +130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; +130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; +130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; +130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; +130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; +130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; +130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; +130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; +130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; +130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; +130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; +130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; +130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; +130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; +130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; +130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; +130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; +130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; +130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; +130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; +130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; +130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; +130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; +130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; +130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; +130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; +130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; +130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; +130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; +130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; +130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; +130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; +130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; +130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; +130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; +130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; +130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; +130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; +130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; +130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; +130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; +130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; +130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; +130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; +130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; +130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; +130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; +130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; +130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; +130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; +130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; +130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; +130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; +130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; +13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; +13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; +13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; +13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; +13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; +13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; +13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; +13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; +13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; +13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; +1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; +1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; +1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; +1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; +1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; +1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; +13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; +13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; +13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; +13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; +13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; +13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; +13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; +13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; +13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; +13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; +1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; +1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; +1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; +1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; +1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; +1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; +13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; +13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; +13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; +13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; +13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; +13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; +13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; +13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; +13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; +13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; +1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; +1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; +1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; +1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; +1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; +1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; +13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; +13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; +13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; +13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; +13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; +13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; +13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; +13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; +13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; +13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; +1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; +1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; +1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; +1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; +1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; +1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; +13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; +13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; +13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; +13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; +13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; +13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; +13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; +13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; +13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; +13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; +1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; +1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; +1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; +1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; +1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; +1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; +13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; +13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; +13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; +13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; +13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; +13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; +13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; +13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; +13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; +13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; +1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; +1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; +1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; +1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; +1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; +1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; +13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; +13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; +13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; +13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; +13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; +13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; +13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; +13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; +13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; +13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; +1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; +1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; +1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; +1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; +1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; +1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; +13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; +13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; +13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; +13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; +13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; +13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; +13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; +13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; +13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; +13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; +1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; +1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; +1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; +1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; +1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; +1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; +13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; +13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; +13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; +13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; +13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; +13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; +13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; +13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; +13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; +13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; +1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; +1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; +1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; +1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; +1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; +1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; +13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; +13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; +13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; +13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; +13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; +13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; +13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; +13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; +13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; +13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; +1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; +1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; +1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; +1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; +1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; +1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; +131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; +131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; +131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; +131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; +131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; +131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; +131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; +131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; +131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; +131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; +131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; +131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; +131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; +131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; +131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; +131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; +131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; +131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; +131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; +131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; +131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; +131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; +131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; +131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; +131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; +131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; +131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; +131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; +131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; +131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; +131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; +131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; +131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; +131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; +131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; +131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; +131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; +131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; +131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; +131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; +131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; +131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; +131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; +131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; +131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; +131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; +131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; +131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; +131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; +131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; +131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; +131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; +131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; +131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; +131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; +131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; +131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; +131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; +131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; +131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; +131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; +131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; +131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; +131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; +131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; +131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; +131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; +131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; +131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; +131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; +131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; +131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; +131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; +131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; +131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; +131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; +131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; +131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; +131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; +131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; +131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; +131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; +131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; +131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; +131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; +131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; +131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; +131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; +131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; +131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; +131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; +131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; +131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; +131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; +131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; +131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; +13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; +13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; +13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; +13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; +13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; +13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; +13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; +13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; +13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; +13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; +1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; +1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; +1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; +1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; +1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; +1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; +13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; +13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; +13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; +13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; +13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; +13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; +13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; +13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; +13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; +13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; +1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; +1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; +1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; +1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; +1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; +1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; +13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; +13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; +13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; +13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; +13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; +13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; +13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; +13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; +13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; +13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; +1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; +1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; +1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; +1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; +1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; +1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; +13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; +13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; +13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; +13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; +13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; +13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; +13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; +13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; +13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; +13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; +1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; +1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; +1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; +1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; +1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; +1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; +13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; +13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; +13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; +13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; +13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; +13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; +13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; +13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; +13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; +13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; +1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; +1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; +1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; +1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; +1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; +1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; +13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; +13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; +13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; +13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; +13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; +13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; +13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; +13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; +13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; +13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; +1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; +1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; +1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; +1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; +1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; +1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; +13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; +13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; +13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; +13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; +13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; +13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; +13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; +13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; +13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; +13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; +1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; +1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; +1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; +1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; +1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; +1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; +13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; +13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; +13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; +13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; +13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; +13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; +13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; +13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; +13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; +13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; +1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; +1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; +1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; +1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; +1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; +1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; +13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; +13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; +13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; +13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; +13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; +13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; +13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; +13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; +13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; +13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; +1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; +1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; +1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; +1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; +1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; +1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; +13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; +13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; +13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; +13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; +13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; +13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; +13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; +13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; +13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; +13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; +1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; +1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; +1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; +1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; +1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; +1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; +132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; +132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; +132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; +132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; +132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; +132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; +132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; +132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; +132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; +132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; +132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; +132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; +132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; +132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; +132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; +132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; +132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; +132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; +132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; +132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; +132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; +132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; +132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; +132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; +132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; +132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; +132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; +132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; +132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; +132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; +132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; +132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; +132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; +132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; +132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; +132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; +132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; +132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; +132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; +132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; +132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; +132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; +132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; +132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; +132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; +132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; +132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; +132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; +132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; +132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; +132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; +132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; +132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; +132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; +132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; +132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; +132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; +132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; +132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; +132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; +132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; +132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; +132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; +132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; +132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; +132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; +132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; +132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; +132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; +132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; +132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; +132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; +132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; +132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; +132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; +132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; +132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; +132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; +132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; +132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; +132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; +132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; +132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; +132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; +132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; +132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; +132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; +132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; +132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; +132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; +132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; +132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; +132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; +132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; +132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; +132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; +13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; +13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; +13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; +13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; +13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; +13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; +13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; +13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; +13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; +13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; +1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; +1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; +1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; +1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; +1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; +1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; +13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; +13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; +13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; +13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; +13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; +13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; +13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; +13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; +13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; +13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; +1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; +1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; +1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; +1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; +1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; +1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; +13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; +13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; +13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; +13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; +13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; +13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; +13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; +13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; +13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; +13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; +1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; +1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; +1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; +1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; +1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; +1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; +13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; +13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; +13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; +13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; +13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; +13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; +13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; +13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; +13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; +13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; +1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; +1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; +1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; +1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; +1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; +1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; +13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; +13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; +13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; +13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; +13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; +13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; +13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; +13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; +13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; +13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; +1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; +1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; +1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; +1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; +1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; +1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; +13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; +13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; +13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; +13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; +13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; +13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; +13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; +13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; +13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; +13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; +1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; +1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; +1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; +1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; +1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; +1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; +13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; +13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; +13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; +13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; +13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; +13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; +13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; +13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; +13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; +13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; +1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; +1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; +1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; +1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; +1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; +1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; +13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; +13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; +13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; +13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; +13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; +13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; +13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; +13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; +13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; +13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; +1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; +1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; +1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; +1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; +1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; +1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; +13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; +13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; +13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; +13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; +13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; +13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; +13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; +13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; +13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; +13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; +1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; +1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; +1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; +1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; +1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; +1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; +13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; +13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; +13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; +13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; +13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; +13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; +13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; +13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; +13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; +13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; +1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; +1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; +1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; +1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; +1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; +1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; +133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; +133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; +133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; +133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; +133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; +133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; +133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; +133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; +133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; +133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; +133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; +133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; +133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; +133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; +133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; +133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; +133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; +133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; +133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; +133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; +133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; +133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; +133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; +133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; +133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; +133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; +133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; +133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; +133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; +133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; +133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; +133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; +133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; +133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; +133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; +133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; +133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; +133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; +133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; +133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; +133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; +133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; +133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; +133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; +133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; +133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; +133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; +133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; +133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; +133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; +133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; +133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; +133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; +133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; +133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; +133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; +133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; +133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; +133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; +133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; +133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; +133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; +133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; +133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; +133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; +133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; +133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; +133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; +133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; +133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; +133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; +133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; +133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; +133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; +133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; +133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; +133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; +133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; +133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; +133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; +133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; +133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; +133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; +133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; +133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; +133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; +133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; +133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; +133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; +133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; +133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; +133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; +133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; +133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; +133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; +133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; +13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; +13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; +13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; +13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; +13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; +13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; +13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; +13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; +13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; +13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; +1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; +1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; +1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; +1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; +1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; +1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; +13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; +13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; +13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; +13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; +13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; +13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; +13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; +13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; +13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; +13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; +1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; +1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; +1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; +1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; +1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; +1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; +13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; +13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; +13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; +13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; +13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; +13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; +13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; +13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; +13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; +13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; +1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; +1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; +1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; +1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; +1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; +16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; +16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; +16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; +16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; +16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; +16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; +16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; +16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; +1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; +1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; +1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; +1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; +1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; +16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; +16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; +16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; +16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; +16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; +16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; +16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; +16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; +16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; +16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; +1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; +1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; +1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; +1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; +1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; +1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; +16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; +16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; +16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; +16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; +16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; +16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; +16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; +16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; +16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; +16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; +1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; +1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; +1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; +1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; +1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; +1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; +16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; +16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; +16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; +16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; +16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; +16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; +16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; +16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; +16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; +16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; +1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; +1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; +1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; +1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; +1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; +1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; +16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; +16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; +16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; +16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; +16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; +16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; +16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; +16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; +16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; +16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; +1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; +1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; +1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; +1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; +1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; +1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; +16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; +16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; +16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; +16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; +16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; +16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; +16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; +16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; +16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; +16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; +1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; +1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; +1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; +1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; +1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; +1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; +16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; +16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; +16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; +16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; +16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; +16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; +16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; +16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; +16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; +16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; +1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; +1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; +1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; +1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; +1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; +1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; +16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; +16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; +16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; +16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; +16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; +16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; +16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; +16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; +16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; +16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; +1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; +1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; +1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; +1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; +1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; +1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; +16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; +16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; +16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; +16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; +16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; +16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; +16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; +16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; +16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; +16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; +1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; +1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; +1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; +1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; +1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; +1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; +16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; +16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; +16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; +16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; +16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; +16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; +16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; +16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; +16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; +16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; +1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; +1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; +1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; +1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; +1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; +1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; +168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; +168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; +168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; +168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; +168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; +168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; +168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; +168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; +168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; +168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; +168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; +168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; +168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; +168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; +168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; +168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; +168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; +168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; +168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; +168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; +168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; +168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; +168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; +168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; +168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; +168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; +168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; +168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; +168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; +168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; +168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; +168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; +168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; +168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; +168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; +168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; +168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; +168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; +168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; +168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; +168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; +168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; +168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; +168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; +168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; +168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; +168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; +168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; +168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; +168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; +168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; +168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; +168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; +168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; +168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; +168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; +168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; +168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; +168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; +168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; +168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; +168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; +168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; +168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; +168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; +168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; +168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; +168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; +168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; +168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; +168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; +168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; +168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; +168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; +168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; +168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; +168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; +168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; +168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; +168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; +168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; +168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; +168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; +168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; +168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; +168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; +168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; +168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; +168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; +168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; +168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; +168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; +168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; +168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; +168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; +168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; +16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; +16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; +16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; +16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; +16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; +16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; +16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; +16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; +16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; +16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; +1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; +1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; +1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; +1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; +1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; +1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; +16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; +16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; +16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; +16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; +16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; +16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; +16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; +16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; +16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; +16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; +1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; +1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; +1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; +1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; +1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; +1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; +16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; +16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; +16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; +16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; +16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; +16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; +16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; +16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; +16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; +16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; +1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; +1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; +1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; +1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; +1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; +1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; +16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; +16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; +16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; +16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; +16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; +16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; +16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; +16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; +16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; +16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; +1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; +1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; +1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; +1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; +1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; +1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; +16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; +16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; +16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; +16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; +16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; +16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; +16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; +16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; +16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; +16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; +1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; +1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; +1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; +1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; +1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; +1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; +16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; +16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; +16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; +16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; +16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; +16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; +16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; +16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; +16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; +16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; +1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; +1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; +1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; +1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; +1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; +1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; +16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; +16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; +16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; +16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; +16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; +16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; +16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; +16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; +16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; +16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; +1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; +1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; +1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; +1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; +1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; +1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; +16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; +16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; +16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; +16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; +16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; +16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; +16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; +16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; +16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; +16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; +1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; +1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; +1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; +1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; +1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; +1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; +16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; +16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; +16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; +16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; +16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; +16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; +16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; +16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; +16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; +16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; +1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; +1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; +1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; +1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; +1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; +1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; +16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; +16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; +16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; +16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; +16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; +16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; +16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; +16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; +16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; +16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; +1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; +1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; +1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; +1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; +1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; +1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; +169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; +169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; +169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; +169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; +169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; +169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; +169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; +169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; +169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; +169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; +169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; +169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; +169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; +169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; +169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; +169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; +169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; +169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; +169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; +169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; +169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; +169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; +169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; +169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; +169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; +169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; +169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; +169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; +169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; +169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; +169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; +169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; +169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; +169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; +169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; +169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; +169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; +169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; +169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; +169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; +169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; +169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; +169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; +169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; +169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; +169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; +169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; +169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; +169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; +169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; +169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; +169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; +169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; +169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; +169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; +169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; +169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; +169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; +169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; +169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; +169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; +169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; +169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; +169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; +169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; +169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; +169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; +169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; +169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; +169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; +169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; +169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; +169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; +169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; +169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; +169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; +169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; +169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; +169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; +169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; +169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; +169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; +169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; +169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; +169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; +169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; +169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; +169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; +169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; +169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; +169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; +169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; +169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; +169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; +169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; +169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; +16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; +16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; +16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; +16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; +16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; +16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; +16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; +16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; +16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; +16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; +16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; +16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; +16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; +16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; +16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; +16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; +16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; +16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; +16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; +16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; +16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; +16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; +16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; +16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; +16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; +16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; +16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; +16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; +16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; +16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; +16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; +16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; +16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; +16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; +16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; +16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; +16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; +16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; +16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; +16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; +16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; +16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; +16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; +16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; +16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; +16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; +16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; +16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; +16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; +16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; +16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; +16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; +16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; +16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; +16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; +16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; +16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; +16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; +16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; +16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; +16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; +16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; +16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; +16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; +16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; +16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; +16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; +16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; +16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; +16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; +16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; +16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; +16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; +16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; +16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; +16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; +16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; +16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; +16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; +16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; +16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; +16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; +16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; +16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; +16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; +16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; +16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; +16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; +16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; +16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; +16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; +16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; +16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; +16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; +16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; +16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; +16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; +16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; +16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; +16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; +16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; +16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; +16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; +16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; +16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; +16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; +16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; +16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; +16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; +16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; +16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; +16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; +16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; +16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; +16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; +16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; +16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; +16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; +16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; +16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; +16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; +16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; +16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; +16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; +16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; +16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; +16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; +16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; +16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; +16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; +16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; +16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; +16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; +16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; +16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; +16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; +16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; +16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; +16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; +16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; +16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; +16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; +16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; +16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; +16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; +16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; +16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; +16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; +16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; +16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; +16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; +16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; +16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; +16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; +16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; +16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; +16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; +16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; +16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; +16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; +16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; +16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; +16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; +16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; +16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; +16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; +16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; +16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; +16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; +16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; +16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; +16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; +16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; +16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; +16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; +16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; +16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; +16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; +16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; +16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; +16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; +16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; +16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; +16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; +16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; +16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; +16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; +16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; +16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; +16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; +16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; +16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; +16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; +16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; +16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; +16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; +16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; +16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; +16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; +16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; +16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; +16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; +16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; +16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; +16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; +16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; +16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; +16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; +16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; +16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; +16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; +16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; +16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; +16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; +16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; +16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; +16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; +16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; +16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; +16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; +16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; +16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; +16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; +16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; +16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; +16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; +16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; +16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; +16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; +16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; +16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; +16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; +16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; +16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; +16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; +16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; +16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; +16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; +16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; +16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; +16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; +16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; +16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; +16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; +16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; +16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; +16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; +16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; +16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; +16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; +16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; +16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; +16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; +16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; +16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; +16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; +16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; +16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; +16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; +16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; +16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; +16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; +16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; +16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; +16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; +16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; +16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; +16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; +16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; +16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; +16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; +16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; +16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; +16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; +16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; +16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; +16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; +16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; +16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; +16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; +16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; +16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; +16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; +16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; +16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; +16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; +16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; +16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; +16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; +16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; +16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; +16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; +16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; +16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; +16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; +16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; +16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; +16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; +16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; +16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; +16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; +16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; +16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; +16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; +16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; +16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; +16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; +16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; +16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; +16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; +16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; +16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; +16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; +16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; +16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; +16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; +16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; +16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; +16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; +16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; +16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; +16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; +16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; +16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; +16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; +16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; +16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; +16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; +16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; +16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; +16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; +16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; +16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; +16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; +16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; +16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; +16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; +16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; +16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; +16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; +16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; +16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; +16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; +16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; +16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; +16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; +16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; +16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; +16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; +16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; +16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; +16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; +16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; +16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; +16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; +16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; +16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; +1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; +1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; +1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; +1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; +1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; +1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; +1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; +1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; +1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; +1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; +1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; +1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; +1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; +1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; +1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; +1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; +1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; +1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; +1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; +1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; +1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; +1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; +1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; +1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; +1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; +1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; +1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; +1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; +1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; +1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; +1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; +1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; +1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; +1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; +1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; +1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; +1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; +1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; +1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; +1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; +1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; +1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; +1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; +1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; +1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; +1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; +1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; +1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; +1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; +1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; +1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; +1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; +1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; +1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; +1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; +1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; +1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; +1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; +1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; +1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; +1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; +1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; +1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; +1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; +1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; +1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; +1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; +1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; +1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; +1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; +1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; +1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; +1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; +1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; +1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; +1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; +1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; +1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; +1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; +1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; +1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; +1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; +1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; +1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; +1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; +1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; +1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; +1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; +1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; +1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; +1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; +1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; +1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; +1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; +1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; +1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; +1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; +1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; +1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; +1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; +1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; +1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; +1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; +1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; +1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; +1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; +1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; +1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; +1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; +1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; +1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; +1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; +1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; +1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; +1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; +1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; +1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; +1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; +1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; +1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; +1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; +1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; +1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; +1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; +1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; +1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; +1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; +1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; +1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; +1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; +1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; +1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; +1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; +1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L; 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L; 0237;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L; 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L; 03DD;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; +1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; +1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; +1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; +1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; +1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; +1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; +1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; +1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; +1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; +1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; +1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; +1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; +1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; +1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; +1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; +1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; +1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; +1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; +1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; +1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; +1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; +1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; +1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; +1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; +1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; +1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; +1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; +1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; +1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; +1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; +1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; +1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; +1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; +1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; +1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; +1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; +1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; +1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; +1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; +1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; +1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; +1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; +1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; +1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; +1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; +1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; +1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; +1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; +1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; +1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; +1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; +1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; +1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; +1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; +1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; +1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; +1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; +1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; +1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; +1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; +1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; +1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; +1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; +1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; +1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; +1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; +1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; +1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; +1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; +1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; +1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; +1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; +1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; +1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; +1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; +1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; +1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; +1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; +1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; +1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; +1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; +1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; +1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; +1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; +1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; +1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; +1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; +1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; +1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; +1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; +1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; +1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; +1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; +1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; +1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; +1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; +1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; +1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; +1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; +1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; +1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; +1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; +1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; +1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; +1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; +1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; +1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; +1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; +1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; +1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; +1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; +1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; +1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; +1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; +1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; +1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; +1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; +1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; +1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; +1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; +1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; +1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; +1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; +1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; +1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; +1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; +1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; +1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; +1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; +1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; +1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; +1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; +1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; +1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; +1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; +1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; +1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; +1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; +1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; +1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; +1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; +1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; +1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; +1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; +1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; +1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; +1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; +1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; +1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; +1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; +1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; +1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; +1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; +1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; +1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; +1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; +1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; +1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; +1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; +1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; +1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; +1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; +1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; +1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; +1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; +1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; +1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; +1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; +1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; +1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; +1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; +1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; +1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; +1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; +1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; +1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; +1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; +1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; +1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; +1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; +1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; +1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; +1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; +1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; +1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; +1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; +1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; +1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; +1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; +1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; +1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; +1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; +1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; +1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; +1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; +1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; +1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; +1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; +1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; +1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; +1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; +1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; +1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; +1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; +1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; +1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; +1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; +1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; +1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; +1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL; 0631;;;;N;;;;; +1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL; 0631;;;;N;;;;; +1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL; 0628;;;;N;;;;; +1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL; 062F;;;;N;;;;; +1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL; 0648;;;;N;;;;; +1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL; 062D;;;;N;;;;; +1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL; 0637;;;;N;;;;; +1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL; 064A;;;;N;;;;; +1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL; 0644;;;;N;;;;; +1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL; 0646;;;;N;;;;; +1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL; 0639;;;;N;;;;; +1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL; 0641;;;;N;;;;; +1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL; 0635;;;;N;;;;; +1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL; 0642;;;;N;;;;; +1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL; 0631;;;;N;;;;; +1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL; 062A;;;;N;;;;; +1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL; 062B;;;;N;;;;; +1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL; 0630;;;;N;;;;; +1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL; 0636;;;;N;;;;; +1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; +1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; +1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; +1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; +1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; +1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; +1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; +1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; +1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; +1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; +1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; +1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; +1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; +1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; +1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; +1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; +1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; +1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; +1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; +1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; +1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; +1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; +1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; +1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; +1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; +1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; +1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; +1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; +1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; +1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; +1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; +1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; +1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; +1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; +1F100;DIGIT ZERO FULL STOP;No;0;EN; 0030 002E;;0;0;N;;;;; +1F101;DIGIT ZERO COMMA;No;0;EN; 0030 002C;;0;0;N;;;;; +1F102;DIGIT ONE COMMA;No;0;EN; 0031 002C;;1;1;N;;;;; +1F103;DIGIT TWO COMMA;No;0;EN; 0032 002C;;2;2;N;;;;; +1F104;DIGIT THREE COMMA;No;0;EN; 0033 002C;;3;3;N;;;;; +1F105;DIGIT FOUR COMMA;No;0;EN; 0034 002C;;4;4;N;;;;; +1F106;DIGIT FIVE COMMA;No;0;EN; 0035 002C;;5;5;N;;;;; +1F107;DIGIT SIX COMMA;No;0;EN; 0036 002C;;6;6;N;;;;; +1F108;DIGIT SEVEN COMMA;No;0;EN; 0037 002C;;7;7;N;;;;; +1F109;DIGIT EIGHT COMMA;No;0;EN; 0038 002C;;8;8;N;;;;; +1F10A;DIGIT NINE COMMA;No;0;EN; 0039 002C;;9;9;N;;;;; +1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L; 0028 0041 0029;;;;N;;;;; +1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L; 0028 0042 0029;;;;N;;;;; +1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L; 0028 0043 0029;;;;N;;;;; +1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L; 0028 0044 0029;;;;N;;;;; +1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L; 0028 0045 0029;;;;N;;;;; +1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L; 0028 0046 0029;;;;N;;;;; +1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L; 0028 0047 0029;;;;N;;;;; +1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L; 0028 0048 0029;;;;N;;;;; +1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L; 0028 0049 0029;;;;N;;;;; +1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L; 0028 004A 0029;;;;N;;;;; +1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L; 0028 004B 0029;;;;N;;;;; +1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L; 0028 004C 0029;;;;N;;;;; +1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L; 0028 004D 0029;;;;N;;;;; +1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L; 0028 004E 0029;;;;N;;;;; +1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L; 0028 004F 0029;;;;N;;;;; +1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L; 0028 0050 0029;;;;N;;;;; +1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L; 0028 0051 0029;;;;N;;;;; +1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L; 0028 0052 0029;;;;N;;;;; +1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L; 0028 0053 0029;;;;N;;;;; +1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L; 0028 0054 0029;;;;N;;;;; +1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L; 0028 0055 0029;;;;N;;;;; +1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L; 0028 0056 0029;;;;N;;;;; +1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L; 0028 0057 0029;;;;N;;;;; +1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L; 0028 0058 0029;;;;N;;;;; +1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L; 0028 0059 0029;;;;N;;;;; +1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L; 0028 005A 0029;;;;N;;;;; +1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L; 3014 0053 3015;;;;N;;;;; +1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F12D;CIRCLED CD;So;0;L; 0043 0044;;;;N;;;;; +1F12E;CIRCLED WZ;So;0;L; 0057 005A;;;;N;;;;; +1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; +1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; +1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; +1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; +1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; +1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; +1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; +1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; +1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; +1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; +1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; +1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; +1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; +1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; +1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; +1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; +1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; +1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; +1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; +1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; +1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; +1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; +1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; +1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; +1F14A;SQUARED HV;So;0;L; 0048 0056;;;;N;;;;; +1F14B;SQUARED MV;So;0;L; 004D 0056;;;;N;;;;; +1F14C;SQUARED SD;So;0;L; 0053 0044;;;;N;;;;; +1F14D;SQUARED SS;So;0;L; 0053 0053;;;;N;;;;; +1F14E;SQUARED PPV;So;0;L; 0050 0050 0056;;;;N;;;;; +1F14F;SQUARED WC;So;0;L; 0057 0043;;;;N;;;;; +1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F16A;RAISED MC SIGN;So;0;ON; 004D 0043;;;;N;;;;; +1F16B;RAISED MD SIGN;So;0;ON; 004D 0044;;;;N;;;;; +1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; +1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; +1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; +1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; +1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; +1F190;SQUARE DJ;So;0;L; 0044 004A;;;;N;;;;; +1F191;SQUARED CL;So;0;L;;;;;N;;;;; +1F192;SQUARED COOL;So;0;L;;;;;N;;;;; +1F193;SQUARED FREE;So;0;L;;;;;N;;;;; +1F194;SQUARED ID;So;0;L;;;;;N;;;;; +1F195;SQUARED NEW;So;0;L;;;;;N;;;;; +1F196;SQUARED NG;So;0;L;;;;;N;;;;; +1F197;SQUARED OK;So;0;L;;;;;N;;;;; +1F198;SQUARED SOS;So;0;L;;;;;N;;;;; +1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; +1F19A;SQUARED VS;So;0;L;;;;;N;;;;; +1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; +1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; +1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; +1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; +1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; +1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; +1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; +1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; +1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; +1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; +1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; +1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; +1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; +1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; +1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; +1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; +1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; +1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; +1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; +1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; +1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; +1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; +1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; +1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; +1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; +1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; +1F200;SQUARE HIRAGANA HOKA;So;0;L; 307B 304B;;;;N;;;;; +1F201;SQUARED KATAKANA KOKO;So;0;L; 30B3 30B3;;;;N;;;;; +1F202;SQUARED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L; 624B;;;;N;;;;; +1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L; 5B57;;;;N;;;;; +1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L; 53CC;;;;N;;;;; +1F213;SQUARED KATAKANA DE;So;0;L; 30C7;;;;N;;;;; +1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 4E8C;;;;N;;;;; +1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L; 591A;;;;N;;;;; +1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L; 89E3;;;;N;;;;; +1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L; 5929;;;;N;;;;; +1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L; 4EA4;;;;N;;;;; +1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L; 6620;;;;N;;;;; +1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L; 7121;;;;N;;;;; +1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L; 6599;;;;N;;;;; +1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L; 524D;;;;N;;;;; +1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L; 5F8C;;;;N;;;;; +1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L; 518D;;;;N;;;;; +1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L; 65B0;;;;N;;;;; +1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L; 521D;;;;N;;;;; +1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L; 7D42;;;;N;;;;; +1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L; 751F;;;;N;;;;; +1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L; 8CA9;;;;N;;;;; +1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L; 58F0;;;;N;;;;; +1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L; 5439;;;;N;;;;; +1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L; 6F14;;;;N;;;;; +1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L; 6295;;;;N;;;;; +1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L; 6355;;;;N;;;;; +1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L; 4E00;;;;N;;;;; +1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 4E09;;;;N;;;;; +1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L; 904A;;;;N;;;;; +1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L; 5DE6;;;;N;;;;; +1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L; 4E2D;;;;N;;;;; +1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L; 53F3;;;;N;;;;; +1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L; 6307;;;;N;;;;; +1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L; 8D70;;;;N;;;;; +1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 6253;;;;N;;;;; +1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L; 7981;;;;N;;;;; +1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L; 7A7A;;;;N;;;;; +1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L; 5408;;;;N;;;;; +1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L; 6E80;;;;N;;;;; +1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L; 6709;;;;N;;;;; +1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L; 6708;;;;N;;;;; +1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L; 7533;;;;N;;;;; +1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L; 5272;;;;N;;;;; +1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L; 55B6;;;;N;;;;; +1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L; 3014 672C 3015;;;;N;;;;; +1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 3014 4E09 3015;;;;N;;;;; +1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 3014 4E8C 3015;;;;N;;;;; +1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L; 3014 5B89 3015;;;;N;;;;; +1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L; 3014 70B9 3015;;;;N;;;;; +1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 3014 6253 3015;;;;N;;;;; +1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L; 3014 76D7 3015;;;;N;;;;; +1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L; 3014 52DD 3015;;;;N;;;;; +1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L; 3014 6557 3015;;;;N;;;;; +1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L; 5F97;;;;N;;;;; +1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L; 53EF;;;;N;;;;; +1F300;CYCLONE;So;0;ON;;;;;N;;;;; +1F301;FOGGY;So;0;ON;;;;;N;;;;; +1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; +1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; +1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; +1F305;SUNRISE;So;0;ON;;;;;N;;;;; +1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; +1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; +1F308;RAINBOW;So;0;ON;;;;;N;;;;; +1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; +1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; +1F30B;VOLCANO;So;0;ON;;;;;N;;;;; +1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; +1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; +1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; +1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; +1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; +1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; +1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; +1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; +1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; +1F321;THERMOMETER;So;0;ON;;;;;N;;;;; +1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; +1F323;WHITE SUN;So;0;ON;;;;;N;;;;; +1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; +1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; +1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; +1F32B;FOG;So;0;ON;;;;;N;;;;; +1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F330;CHESTNUT;So;0;ON;;;;;N;;;;; +1F331;SEEDLING;So;0;ON;;;;;N;;;;; +1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; +1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; +1F334;PALM TREE;So;0;ON;;;;;N;;;;; +1F335;CACTUS;So;0;ON;;;;;N;;;;; +1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; +1F337;TULIP;So;0;ON;;;;;N;;;;; +1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; +1F339;ROSE;So;0;ON;;;;;N;;;;; +1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; +1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; +1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; +1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; +1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; +1F33F;HERB;So;0;ON;;;;;N;;;;; +1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; +1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; +1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; +1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; +1F344;MUSHROOM;So;0;ON;;;;;N;;;;; +1F345;TOMATO;So;0;ON;;;;;N;;;;; +1F346;AUBERGINE;So;0;ON;;;;;N;;;;; +1F347;GRAPES;So;0;ON;;;;;N;;;;; +1F348;MELON;So;0;ON;;;;;N;;;;; +1F349;WATERMELON;So;0;ON;;;;;N;;;;; +1F34A;TANGERINE;So;0;ON;;;;;N;;;;; +1F34B;LEMON;So;0;ON;;;;;N;;;;; +1F34C;BANANA;So;0;ON;;;;;N;;;;; +1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; +1F34E;RED APPLE;So;0;ON;;;;;N;;;;; +1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; +1F350;PEAR;So;0;ON;;;;;N;;;;; +1F351;PEACH;So;0;ON;;;;;N;;;;; +1F352;CHERRIES;So;0;ON;;;;;N;;;;; +1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; +1F354;HAMBURGER;So;0;ON;;;;;N;;;;; +1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; +1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; +1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; +1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; +1F359;RICE BALL;So;0;ON;;;;;N;;;;; +1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; +1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; +1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; +1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; +1F35E;BREAD;So;0;ON;;;;;N;;;;; +1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; +1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; +1F361;DANGO;So;0;ON;;;;;N;;;;; +1F362;ODEN;So;0;ON;;;;;N;;;;; +1F363;SUSHI;So;0;ON;;;;;N;;;;; +1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; +1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; +1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; +1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; +1F368;ICE CREAM;So;0;ON;;;;;N;;;;; +1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; +1F36A;COOKIE;So;0;ON;;;;;N;;;;; +1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; +1F36C;CANDY;So;0;ON;;;;;N;;;;; +1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; +1F36E;CUSTARD;So;0;ON;;;;;N;;;;; +1F36F;HONEY POT;So;0;ON;;;;;N;;;;; +1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; +1F371;BENTO BOX;So;0;ON;;;;;N;;;;; +1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; +1F373;COOKING;So;0;ON;;;;;N;;;;; +1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; +1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; +1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; +1F377;WINE GLASS;So;0;ON;;;;;N;;;;; +1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; +1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; +1F37A;BEER MUG;So;0;ON;;;;;N;;;;; +1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; +1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; +1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F380;RIBBON;So;0;ON;;;;;N;;;;; +1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; +1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; +1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; +1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; +1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F386;FIREWORKS;So;0;ON;;;;;N;;;;; +1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; +1F388;BALLOON;So;0;ON;;;;;N;;;;; +1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; +1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; +1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; +1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; +1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; +1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; +1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; +1F390;WIND CHIME;So;0;ON;;;;;N;;;;; +1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; +1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; +1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; +1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; +1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; +1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; +1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; +1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; +1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; +1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; +1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; +1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; +1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; +1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; +1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; +1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; +1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; +1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; +1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; +1F3A6;CINEMA;So;0;ON;;;;;N;;;;; +1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; +1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; +1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; +1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; +1F3AB;TICKET;So;0;ON;;;;;N;;;;; +1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; +1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; +1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; +1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; +1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; +1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; +1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; +1F3B3;BOWLING;So;0;ON;;;;;N;;;;; +1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; +1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; +1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; +1F3B8;GUITAR;So;0;ON;;;;;N;;;;; +1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; +1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; +1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; +1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; +1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; +1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; +1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; +1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; +1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; +1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; +1F3C3;RUNNER;So;0;ON;;;;;N;;;;; +1F3C4;SURFER;So;0;ON;;;;;N;;;;; +1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; +1F3C6;TROPHY;So;0;ON;;;;;N;;;;; +1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; +1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; +1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; +1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; +1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; +1F3CC;GOLFER;So;0;ON;;;;;N;;;;; +1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; +1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; +1F3D5;CAMPING;So;0;ON;;;;;N;;;;; +1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; +1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; +1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; +1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; +1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; +1F3DC;DESERT;So;0;ON;;;;;N;;;;; +1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; +1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; +1F3DF;STADIUM;So;0;ON;;;;;N;;;;; +1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; +1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; +1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; +1F3E6;BANK;So;0;ON;;;;;N;;;;; +1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; +1F3E8;HOTEL;So;0;ON;;;;;N;;;;; +1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; +1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; +1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; +1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; +1F3ED;FACTORY;So;0;ON;;;;;N;;;;; +1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; +1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; +1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; +1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; +1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; +1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; +1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; +1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; +1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; +1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F400;RAT;So;0;ON;;;;;N;;;;; +1F401;MOUSE;So;0;ON;;;;;N;;;;; +1F402;OX;So;0;ON;;;;;N;;;;; +1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; +1F404;COW;So;0;ON;;;;;N;;;;; +1F405;TIGER;So;0;ON;;;;;N;;;;; +1F406;LEOPARD;So;0;ON;;;;;N;;;;; +1F407;RABBIT;So;0;ON;;;;;N;;;;; +1F408;CAT;So;0;ON;;;;;N;;;;; +1F409;DRAGON;So;0;ON;;;;;N;;;;; +1F40A;CROCODILE;So;0;ON;;;;;N;;;;; +1F40B;WHALE;So;0;ON;;;;;N;;;;; +1F40C;SNAIL;So;0;ON;;;;;N;;;;; +1F40D;SNAKE;So;0;ON;;;;;N;;;;; +1F40E;HORSE;So;0;ON;;;;;N;;;;; +1F40F;RAM;So;0;ON;;;;;N;;;;; +1F410;GOAT;So;0;ON;;;;;N;;;;; +1F411;SHEEP;So;0;ON;;;;;N;;;;; +1F412;MONKEY;So;0;ON;;;;;N;;;;; +1F413;ROOSTER;So;0;ON;;;;;N;;;;; +1F414;CHICKEN;So;0;ON;;;;;N;;;;; +1F415;DOG;So;0;ON;;;;;N;;;;; +1F416;PIG;So;0;ON;;;;;N;;;;; +1F417;BOAR;So;0;ON;;;;;N;;;;; +1F418;ELEPHANT;So;0;ON;;;;;N;;;;; +1F419;OCTOPUS;So;0;ON;;;;;N;;;;; +1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; +1F41B;BUG;So;0;ON;;;;;N;;;;; +1F41C;ANT;So;0;ON;;;;;N;;;;; +1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; +1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; +1F41F;FISH;So;0;ON;;;;;N;;;;; +1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; +1F421;BLOWFISH;So;0;ON;;;;;N;;;;; +1F422;TURTLE;So;0;ON;;;;;N;;;;; +1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; +1F424;BABY CHICK;So;0;ON;;;;;N;;;;; +1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; +1F426;BIRD;So;0;ON;;;;;N;;;;; +1F427;PENGUIN;So;0;ON;;;;;N;;;;; +1F428;KOALA;So;0;ON;;;;;N;;;;; +1F429;POODLE;So;0;ON;;;;;N;;;;; +1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; +1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; +1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; +1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; +1F42E;COW FACE;So;0;ON;;;;;N;;;;; +1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; +1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; +1F431;CAT FACE;So;0;ON;;;;;N;;;;; +1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; +1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; +1F434;HORSE FACE;So;0;ON;;;;;N;;;;; +1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; +1F436;DOG FACE;So;0;ON;;;;;N;;;;; +1F437;PIG FACE;So;0;ON;;;;;N;;;;; +1F438;FROG FACE;So;0;ON;;;;;N;;;;; +1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; +1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; +1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; +1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; +1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; +1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; +1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; +1F440;EYES;So;0;ON;;;;;N;;;;; +1F441;EYE;So;0;ON;;;;;N;;;;; +1F442;EAR;So;0;ON;;;;;N;;;;; +1F443;NOSE;So;0;ON;;;;;N;;;;; +1F444;MOUTH;So;0;ON;;;;;N;;;;; +1F445;TONGUE;So;0;ON;;;;;N;;;;; +1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; +1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; +1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; +1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; +1F451;CROWN;So;0;ON;;;;;N;;;;; +1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; +1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; +1F454;NECKTIE;So;0;ON;;;;;N;;;;; +1F455;T-SHIRT;So;0;ON;;;;;N;;;;; +1F456;JEANS;So;0;ON;;;;;N;;;;; +1F457;DRESS;So;0;ON;;;;;N;;;;; +1F458;KIMONO;So;0;ON;;;;;N;;;;; +1F459;BIKINI;So;0;ON;;;;;N;;;;; +1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; +1F45B;PURSE;So;0;ON;;;;;N;;;;; +1F45C;HANDBAG;So;0;ON;;;;;N;;;;; +1F45D;POUCH;So;0;ON;;;;;N;;;;; +1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; +1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; +1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; +1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; +1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; +1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; +1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F466;BOY;So;0;ON;;;;;N;;;;; +1F467;GIRL;So;0;ON;;;;;N;;;;; +1F468;MAN;So;0;ON;;;;;N;;;;; +1F469;WOMAN;So;0;ON;;;;;N;;;;; +1F46A;FAMILY;So;0;ON;;;;;N;;;;; +1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; +1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; +1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; +1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; +1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; +1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; +1F474;OLDER MAN;So;0;ON;;;;;N;;;;; +1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; +1F476;BABY;So;0;ON;;;;;N;;;;; +1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; +1F478;PRINCESS;So;0;ON;;;;;N;;;;; +1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; +1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; +1F47B;GHOST;So;0;ON;;;;;N;;;;; +1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; +1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; +1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; +1F47F;IMP;So;0;ON;;;;;N;;;;; +1F480;SKULL;So;0;ON;;;;;N;;;;; +1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; +1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; +1F483;DANCER;So;0;ON;;;;;N;;;;; +1F484;LIPSTICK;So;0;ON;;;;;N;;;;; +1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; +1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; +1F487;HAIRCUT;So;0;ON;;;;;N;;;;; +1F488;BARBER POLE;So;0;ON;;;;;N;;;;; +1F489;SYRINGE;So;0;ON;;;;;N;;;;; +1F48A;PILL;So;0;ON;;;;;N;;;;; +1F48B;KISS MARK;So;0;ON;;;;;N;;;;; +1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; +1F48D;RING;So;0;ON;;;;;N;;;;; +1F48E;GEM STONE;So;0;ON;;;;;N;;;;; +1F48F;KISS;So;0;ON;;;;;N;;;;; +1F490;BOUQUET;So;0;ON;;;;;N;;;;; +1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; +1F492;WEDDING;So;0;ON;;;;;N;;;;; +1F493;BEATING HEART;So;0;ON;;;;;N;;;;; +1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; +1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; +1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; +1F497;GROWING HEART;So;0;ON;;;;;N;;;;; +1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; +1F499;BLUE HEART;So;0;ON;;;;;N;;;;; +1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; +1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; +1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; +1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; +1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; +1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; +1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; +1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; +1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; +1F4A3;BOMB;So;0;ON;;;;;N;;;;; +1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; +1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; +1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; +1F4A7;DROPLET;So;0;ON;;;;;N;;;;; +1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; +1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; +1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; +1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; +1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; +1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; +1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; +1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; +1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; +1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; +1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; +1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; +1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; +1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; +1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; +1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; +1F4BA;SEAT;So;0;ON;;;;;N;;;;; +1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; +1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; +1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; +1F4C0;DVD;So;0;ON;;;;;N;;;;; +1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; +1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; +1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; +1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; +1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; +1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; +1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; +1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; +1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; +1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; +1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; +1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; +1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; +1F4D2;LEDGER;So;0;ON;;;;;N;;;;; +1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; +1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; +1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; +1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; +1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; +1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; +1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; +1F4DA;BOOKS;So;0;ON;;;;;N;;;;; +1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; +1F4DC;SCROLL;So;0;ON;;;;;N;;;;; +1F4DD;MEMO;So;0;ON;;;;;N;;;;; +1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F4DF;PAGER;So;0;ON;;;;;N;;;;; +1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; +1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; +1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; +1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; +1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; +1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; +1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; +1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; +1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; +1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; +1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; +1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; +1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; +1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; +1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; +1F4F7;CAMERA;So;0;ON;;;;;N;;;;; +1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; +1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; +1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; +1F4FB;RADIO;So;0;ON;;;;;N;;;;; +1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; +1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; +1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; +1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; +1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F508;SPEAKER;So;0;ON;;;;;N;;;;; +1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F50B;BATTERY;So;0;ON;;;;;N;;;;; +1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; +1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; +1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; +1F511;KEY;So;0;ON;;;;;N;;;;; +1F512;LOCK;So;0;ON;;;;;N;;;;; +1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; +1F514;BELL;So;0;ON;;;;;N;;;;; +1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F516;BOOKMARK;So;0;ON;;;;;N;;;;; +1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; +1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; +1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; +1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; +1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; +1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; +1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; +1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; +1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; +1F525;FIRE;So;0;ON;;;;;N;;;;; +1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; +1F527;WRENCH;So;0;ON;;;;;N;;;;; +1F528;HAMMER;So;0;ON;;;;;N;;;;; +1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; +1F52A;HOCHO;So;0;ON;;;;;N;;;;; +1F52B;PISTOL;So;0;ON;;;;;N;;;;; +1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; +1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; +1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; +1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; +1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; +1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; +1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; +1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; +1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; +1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; +1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; +1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; +1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; +1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; +1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; +1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; +1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; +1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; +1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; +1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; +1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; +1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; +1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; +1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; +1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; +1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; +1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; +1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; +1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; +1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; +1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; +1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; +1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56B;BULLHORN;So;0;ON;;;;;N;;;;; +1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; +1F56E;BOOK;So;0;ON;;;;;N;;;;; +1F56F;CANDLE;So;0;ON;;;;;N;;;;; +1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; +1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +1F572;NO PIRACY;So;0;ON;;;;;N;;;;; +1F573;HOLE;So;0;ON;;;;;N;;;;; +1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; +1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; +1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; +1F577;SPIDER;So;0;ON;;;;;N;;;;; +1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; +1F579;JOYSTICK;So;0;ON;;;;;N;;;;; +1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; +1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; +1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; +1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; +1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; +1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; +1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; +1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; +1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; +1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; +1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; +1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; +1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; +1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; +1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; +1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; +1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; +1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; +1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; +1F5A8;PRINTER;So;0;ON;;;;;N;;;;; +1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; +1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; +1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; +1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; +1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; +1F5B5;SCREEN;So;0;ON;;;;;N;;;;; +1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; +1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; +1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; +1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; +1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; +1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; +1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; +1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; +1F5C0;FOLDER;So;0;ON;;;;;N;;;;; +1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; +1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; +1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; +1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; +1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; +1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; +1F5C8;NOTE;So;0;ON;;;;;N;;;;; +1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; +1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; +1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; +1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CF;PAGE;So;0;ON;;;;;N;;;;; +1F5D0;PAGES;So;0;ON;;;;;N;;;;; +1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; +1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; +1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; +1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; +1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; +1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; +1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; +1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; +1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; +1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; +1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; +1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; +1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; +1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; +1F5E2;LIPS;So;0;ON;;;;;N;;;;; +1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; +1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; +1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; +1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; +1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; +1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; +1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; +1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; +1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; +1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; +1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; +1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; +1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; +1F5FF;MOYAI;So;0;ON;;;;;N;;;;; +1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; +1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; +1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; +1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; +1F609;WINKING FACE;So;0;ON;;;;;N;;;;; +1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; +1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; +1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; +1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; +1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; +1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; +1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; +1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; +1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; +1F617;KISSING FACE;So;0;ON;;;;;N;;;;; +1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; +1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; +1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; +1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; +1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; +1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; +1F621;POUTING FACE;So;0;ON;;;;;N;;;;; +1F622;CRYING FACE;So;0;ON;;;;;N;;;;; +1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; +1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; +1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; +1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; +1F629;WEARY FACE;So;0;ON;;;;;N;;;;; +1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; +1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; +1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; +1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; +1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; +1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; +1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; +1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; +1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; +1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; +1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; +1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; +1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; +1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; +1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; +1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; +1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; +1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; +1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; +1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; +1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; +1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; +1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; +1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; +1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; +1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; +1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; +1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F680;ROCKET;So;0;ON;;;;;N;;;;; +1F681;HELICOPTER;So;0;ON;;;;;N;;;;; +1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; +1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; +1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; +1F686;TRAIN;So;0;ON;;;;;N;;;;; +1F687;METRO;So;0;ON;;;;;N;;;;; +1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; +1F689;STATION;So;0;ON;;;;;N;;;;; +1F68A;TRAM;So;0;ON;;;;;N;;;;; +1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; +1F68C;BUS;So;0;ON;;;;;N;;;;; +1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; +1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; +1F68F;BUS STOP;So;0;ON;;;;;N;;;;; +1F690;MINIBUS;So;0;ON;;;;;N;;;;; +1F691;AMBULANCE;So;0;ON;;;;;N;;;;; +1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F693;POLICE CAR;So;0;ON;;;;;N;;;;; +1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; +1F695;TAXI;So;0;ON;;;;;N;;;;; +1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; +1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; +1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; +1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; +1F69C;TRACTOR;So;0;ON;;;;;N;;;;; +1F69D;MONORAIL;So;0;ON;;;;;N;;;;; +1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; +1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; +1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; +1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; +1F6A2;SHIP;So;0;ON;;;;;N;;;;; +1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; +1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; +1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; +1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; +1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; +1F6AA;DOOR;So;0;ON;;;;;N;;;;; +1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; +1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; +1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; +1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; +1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; +1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; +1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; +1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; +1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; +1F6BD;TOILET;So;0;ON;;;;;N;;;;; +1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; +1F6BF;SHOWER;So;0;ON;;;;;N;;;;; +1F6C0;BATH;So;0;ON;;;;;N;;;;; +1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; +1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; +1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; +1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; +1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; +1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; +1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; +1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; +1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; +1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; +1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; +1F6CF;BED;So;0;ON;;;;;N;;;;; +1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; +1F6E1;SHIELD;So;0;ON;;;;;N;;;;; +1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; +1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; +1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; +1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; +1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; +1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; +1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; +1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; +1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; +1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; +1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; +1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; +1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; +1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; +1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; +1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; +1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; +1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; +1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; +1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; +1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; +1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; +1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; +1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; +1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; +1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; +1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; +1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; +1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; +1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; +1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; +1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; +1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; +1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; +1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; +1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; +1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; +1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; +1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; +1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; +1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; +1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; +1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; +1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; +1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; +1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; +1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; +1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; +1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; +1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; +1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; +1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; +1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; +1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; +1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; +1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; +1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; +1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; +1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; +1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; +1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; +1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; +1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; +1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; +1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; +1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; +1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; +1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; +1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; +1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; +1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; +1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; +1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; +1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; +1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; +1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; +1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; +1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; +1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; +1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; +1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; +1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; +1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; +1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; +1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; +1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; +1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; +1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; +1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; +1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; +1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; +1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; +1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; +1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; +1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; +1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; +1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; +1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; +1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; +1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; +1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; +1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; +1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; +1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; +1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; +1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; +1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; +1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; +1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; +1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; +1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; +1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; +1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; +1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; +1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; +1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; +1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; +1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; +1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; +1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; +1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; +1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; +1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; +1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; +1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; +1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; +1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; +1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; +1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; +1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; +1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +20000;;Lo;0;L;;;;;N;;;;; +2A6D6;;Lo;0;L;;;;;N;;;;; +2A700;;Lo;0;L;;;;;N;;;;; +2B734;;Lo;0;L;;;;;N;;;;; +2B740;;Lo;0;L;;;;;N;;;;; +2B81D;;Lo;0;L;;;;;N;;;;; +2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; +2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; +2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; +E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; +E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; +E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; +E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; +E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; +E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; +E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; +E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; +E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; +E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; +E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; +E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; +E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; +E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; +E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; +E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; +E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; +E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; +E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; +E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; +E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; +E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; +E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; +E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; +E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; +E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; +E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; +E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; +E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; +E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; +E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; +E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; +E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; +E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; +E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; +E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; +E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; +E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; +E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; +E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; +E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; +E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; +E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; +E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; +E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; +E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; +E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; +E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; +E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; +E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; +E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; +E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; +E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; +E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; +E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; +E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; +E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; +E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; +E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; +E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; +E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; +E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; +E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; +E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; +E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; +E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; +E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; +E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; +E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; +E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; +E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; +E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; +E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; +E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; +E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; +E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; +E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; +E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; +E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; +E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; +E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; +E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; +E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; +E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; +E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; +E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; +E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; +E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; +E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; +E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; +E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; +E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; +E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; +E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; +E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; +E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; +E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; +E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; +E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; +E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; +E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; +E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; +E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; +E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; +E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; +E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; +E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; +E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; +E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; +E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; +E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; +E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; +E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; +E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; +E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; +E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; +E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; +E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; +E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; +E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; +E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; +E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; +E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; +E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; +E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; +E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; +E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; +E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; +E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; +E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; +E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; +E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; +E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; +E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; +E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; +E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; +E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; +E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; +E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; +E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; +E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; +E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; +E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; +E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; +E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; +E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; +E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; +E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; +E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; +E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; +E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; +E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; +E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; +E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; +E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; +E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; +E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; +E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; +E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; +E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; +E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; +E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; +E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; +E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; +E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; +E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; +E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; +E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; +E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; +E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; +E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; +E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; +E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; +E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; +E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; +E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; +E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; +E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; +E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; +E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; +E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; +E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; +E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; +E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; +E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; +E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; +E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; +E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; +E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; +E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; +E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; +E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; +E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; +E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; +E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; +E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; +E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; +E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; +E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; +E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; +E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; +E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; +E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; +E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; +E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; +E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; +E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; +E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; +E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; +E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; +E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; +E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; +E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; +E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; +E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; +E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; +E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; +E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; +E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; +E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; +E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; +E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; +E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; +E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; +E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; +E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; +E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; +E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; +E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; +E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; +E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; +E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; +E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; +E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; +E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; +E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; +E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; +E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; +E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; +E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; +E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; +E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; +E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; +E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; +E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; +E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; +E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; +E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; +E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; +E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; +E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; +E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; +E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; +E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; +E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; +E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; +E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; +E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; +E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; +E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; +E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; +E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; +E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; +E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; +E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; +E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; +E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; +E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; +E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; +E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; +E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; +E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; +E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; +E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; +E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; +E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; +E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; +E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; +E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; +E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; +E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; +E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; +E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; +E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; +E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; +E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; +E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; +E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; +E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; +E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; +E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; +E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; +E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; +E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; +E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; +E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; +E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; +E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; +E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; +E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; +E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; +E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; +E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; +E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; +E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; +E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; +E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; +E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; +E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; +E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; +E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; +E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; +E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; +E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; +E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; +E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; +E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; +E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; +E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; +E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; +E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; +E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; +E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; +E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; +E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; +E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; +E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; +F0000;;Co;0;L;;;;;N;;;;; +FFFFD;;Co;0;L;;;;;N;;;;; +100000;;Co;0;L;;;;;N;;;;; +10FFFD;;Co;0;L;;;;;N;;;;; diff --git a/unicode/unicode-copyright.txt b/unicode/unicode-copyright.txt new file mode 100644 index 0000000000..1a7f162552 --- /dev/null +++ b/unicode/unicode-copyright.txt @@ -0,0 +1,47 @@ +The files Blocks.txt and UnicodeData.txt in this directory were +retrieved from the following URLs on Saturday, February 7, 2015. + +http://www.unicode.org/Public/7.0.0/ucd/Blocks.txt +http://www.unicode.org/Public/7.0.0/ucd/UnicodeData.txt + +The below copyright notice applies to these files. + +======================================================================== + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2015 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in +http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, +(b) this copyright and permission notice appear in associated +documentation, and +(c) there is clear notice in each modified Data File or in the Software +as well as in the documentation associated with the Data File(s) or +Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. \ No newline at end of file From eb42bc51fbb15c3faf3e1a8b59aa695c75c9f035 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 11:28:40 -0800 Subject: [PATCH 231/846] CodePointFilter parameterless ctor should be empty, not Basic Latin --- src/Microsoft.Framework.WebEncoders/CodePointFilter.cs | 3 +-- src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs | 2 +- .../JavaScriptStringEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders/UrlEncoder.cs | 2 +- .../CodePointFilterTests.cs | 8 ++------ 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index 7fd1201b4b..1fee0fbf1b 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -15,12 +15,11 @@ namespace Microsoft.Framework.WebEncoders private AllowedCharsBitmap _allowedCharsBitmap; /// - /// Instantiates the filter allowing only the 'Basic Latin' block of characters through. + /// Instantiates an empty filter. /// public CodePointFilter() { _allowedCharsBitmap = new AllowedCharsBitmap(); - AllowBlock(UnicodeBlocks.BasicLatin); } /// diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 20a504d38d..bea418b83f 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -120,7 +120,7 @@ namespace Microsoft.Framework.WebEncoders HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new HtmlUnicodeEncoder(new CodePointFilter()); + encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index eb6ba16dae..3779c32801 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -124,7 +124,7 @@ namespace Microsoft.Framework.WebEncoders JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter()); + encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index d3c66a26b3..4497939c71 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -163,7 +163,7 @@ namespace Microsoft.Framework.WebEncoders UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new UrlUnicodeEncoder(new CodePointFilter()); + encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs index e0dfbfb92a..e2fdf8dd7b 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -11,17 +11,13 @@ namespace Microsoft.Framework.WebEncoders public class CodePointFilterTests { [Fact] - public void Ctor_Parameterless_DefaultsToBasicLatin() + public void Ctor_Parameterless_CreatesEmptyFilter() { // Act var filter = new CodePointFilter(); // Assert - for (int i = 0; i <= 0x007F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0080; i <= Char.MaxValue; i++) + for (int i = 0; i <= Char.MaxValue; i++) { Assert.False(filter.IsCharacterAllowed((char)i)); } From a1dbce90652bb017b82b272d6cb2d20adbfbee20 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 12:55:55 -0800 Subject: [PATCH 232/846] Rename AddEncoders -> AddWebEncoders --- .../EncoderServiceCollectionExtensions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 9b8a84b98e..44bc002053 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -10,12 +10,12 @@ namespace Microsoft.Framework.DependencyInjection { public static class EncoderServiceCollectionExtensions { - public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services) + public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services) { - return AddEncoders(services, configuration: null); + return AddWebEncoders(services, configuration: null); } - public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) { services.AddOptions(configuration); services.TryAdd(EncoderServices.GetDefaultServices(configuration)); From 04707ccaa00c31967208aa076a7a59aac45e3283 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 14:15:41 -0800 Subject: [PATCH 233/846] Add unit tests for the service provider extensions --- .../EncoderServiceCollectionExtensions.cs | 13 ++- .../EncoderServices.cs | 10 +- ...EncoderOptions.cs => WebEncoderOptions.cs} | 2 +- .../project.json | 1 - .../CommonTestEncoder.cs | 103 ++++++++++++++++++ ...EncoderServiceCollectionExtensionsTests.cs | 88 +++++++++++++++ .../EncoderServiceProviderExtensionsTests.cs | 97 +++++++++++++++++ 7 files changed, 299 insertions(+), 15 deletions(-) rename src/Microsoft.Framework.WebEncoders/{EncoderOptions.cs => WebEncoderOptions.cs} (94%) create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 44bc002053..aae3ffbcf2 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; @@ -12,13 +11,17 @@ namespace Microsoft.Framework.DependencyInjection { public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services) { - return AddWebEncoders(services, configuration: null); + return AddWebEncoders(services, configureOptions: null); } - public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, Action configureOptions) { - services.AddOptions(configuration); - services.TryAdd(EncoderServices.GetDefaultServices(configuration)); + services.AddOptions(); + services.TryAdd(EncoderServices.GetDefaultServices()); + if (configureOptions != null) + { + services.Configure(configureOptions); + } return services; } } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs index 0b9d6820d3..0f90180228 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; @@ -13,12 +12,7 @@ namespace Microsoft.Framework.WebEncoders { public static IEnumerable GetDefaultServices() { - return GetDefaultServices(configuration: null); - } - - public static IEnumerable GetDefaultServices(IConfiguration configuration) - { - var describe = new ServiceDescriber(configuration); + var describe = new ServiceDescriber(); // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching @@ -31,7 +25,7 @@ namespace Microsoft.Framework.WebEncoders { return serviceProvider => { - var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; + var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); }; } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs b/src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs similarity index 94% rename from src/Microsoft.Framework.WebEncoders/EncoderOptions.cs rename to src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs index e2547359cf..a172ca954c 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs +++ b/src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs @@ -8,7 +8,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). /// - public sealed class EncoderOptions + public sealed class WebEncoderOptions { /// /// Specifies which code points are allowed to be represented unescaped by the encoders. diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 15a2417f33..34f87f5fe2 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,7 +5,6 @@ "allowUnsafe": true }, "dependencies": { - "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs new file mode 100644 index 0000000000..0d38957303 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs @@ -0,0 +1,103 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Runtime.CompilerServices; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Dummy encoder used for unit testing. + /// + public sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder + { + /// + /// Returns "HtmlEncode[[value]]". + /// + public string HtmlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "JavaScriptStringEncode[[value]]". + /// + public string JavaScriptStringEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "UrlEncode[[value]]". + /// + public string UrlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) + { + return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); + } + + private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); + } + + private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs new file mode 100644 index 0000000000..41ab636a64 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderServiceCollectionExtensionsTests + { + [Fact] + public void AddWebEncoders_WithoutOptions_RegistersDefaultEncoders() + { + // Arrange + var serviceCollection = new ServiceCollection(); + + // Act + serviceCollection.AddWebEncoders(); + + // Assert + var serviceProvider = serviceCollection.BuildServiceProvider(); + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + } + + [Fact] + public void AddWebEncoders_WithOptions_RegistersEncodersWithCustomCodeFilter() + { + // Arrange + var serviceCollection = new ServiceCollection(); + + // Act + serviceCollection.AddWebEncoders(options => + { + options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + }); + + // Assert + var serviceProvider = serviceCollection.BuildServiceProvider(); + + var htmlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("abcde", htmlEncoder.HtmlEncode("abcde")); + Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + + var javaScriptStringEncoder = serviceProvider.GetRequiredService(); + Assert.Equal(@"a\u0062c\u0064e", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); + Assert.Same(javaScriptStringEncoder, serviceProvider.GetRequiredService()); // as singleton instance + + var urlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); + Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + } + + [Fact] + public void AddWebEncoders_DoesNotOverrideExistingRegisteredEncoders() + { + // Arrange + var serviceCollection = new ServiceCollection(); + + // Act + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + // we don't register an existing URL encoder + serviceCollection.AddWebEncoders(options => + { + options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + }); + + // Assert + var serviceProvider = serviceCollection.BuildServiceProvider(); + + var htmlEncoder = serviceProvider.GetHtmlEncoder(); + Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.HtmlEncode("abcde")); + + var javaScriptStringEncoder = serviceProvider.GetJavaScriptStringEncoder(); + Assert.Equal("JavaScriptStringEncode[[abcde]]", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); + + var urlEncoder = serviceProvider.GetUrlEncoder(); + Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs new file mode 100644 index 0000000000..3a6b144b29 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -0,0 +1,97 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Moq; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderServiceProviderExtensionsTests + { + [Fact] + public void GetHtmlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + { + // Arrange + var serviceProvider = new Mock().Object; + + // Act + var retVal = serviceProvider.GetHtmlEncoder(); + + // Assert + Assert.Same(HtmlEncoder.Default, retVal); + } + + [Fact] + public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + { + // Arrange + var expectedEncoder = new Mock().Object; + var mockServiceProvider = new Mock(); + mockServiceProvider.Setup(o => o.GetService(typeof(IHtmlEncoder))).Returns(expectedEncoder); + + // Act + var retVal = mockServiceProvider.Object.GetHtmlEncoder(); + + // Assert + Assert.Same(expectedEncoder, retVal); + } + + [Fact] + public void GetJavaScriptStringEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + { + // Arrange + var serviceProvider = new Mock().Object; + + // Act + var retVal = serviceProvider.GetJavaScriptStringEncoder(); + + // Assert + Assert.Same(JavaScriptStringEncoder.Default, retVal); + } + + [Fact] + public void GetJavaScriptStringEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + { + // Arrange + var expectedEncoder = new Mock().Object; + var mockServiceProvider = new Mock(); + mockServiceProvider.Setup(o => o.GetService(typeof(IJavaScriptStringEncoder))).Returns(expectedEncoder); + + // Act + var retVal = mockServiceProvider.Object.GetJavaScriptStringEncoder(); + + // Assert + Assert.Same(expectedEncoder, retVal); + } + + [Fact] + public void GetUrlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + { + // Arrange + var serviceProvider = new Mock().Object; + + // Act + var retVal = serviceProvider.GetUrlEncoder(); + + // Assert + Assert.Same(UrlEncoder.Default, retVal); + } + + [Fact] + public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + { + // Arrange + var expectedEncoder = new Mock().Object; + var mockServiceProvider = new Mock(); + mockServiceProvider.Setup(o => o.GetService(typeof(IUrlEncoder))).Returns(expectedEncoder); + + // Act + var retVal = mockServiceProvider.Object.GetUrlEncoder(); + + // Assert + Assert.Same(expectedEncoder, retVal); + } + } +} From ba2c06072e39a2e21e1f34a0e048e35266f16e61 Mon Sep 17 00:00:00 2001 From: "Anthony W. Juckel" Date: Sat, 28 Feb 2015 01:18:27 -0600 Subject: [PATCH 234/846] Remove space from ISignOutContext filename --- .../Security/{ISignOutContext .cs => ISignOutContext.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.Http.Interfaces/Security/{ISignOutContext .cs => ISignOutContext.cs} (100%) diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs From de1e8763dd3fbd4ca94aa44171aa34741c536c66 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 2 Mar 2015 15:25:52 -0800 Subject: [PATCH 235/846] Security -> Authentication AuthN renames and design changes --- .../AuthenticateContext.cs | 26 ++++---- .../ChallengeContext.cs | 13 ++-- .../DescribeSchemesContext.cs} | 11 ++-- .../HttpAuthenticationFeature.cs | 4 +- .../Authentication/SignInContext.cs | 38 ++++++++++++ .../Authentication/SignOutContext.cs | 31 ++++++++++ .../DefaultHttpContext.cs | 37 ++++++------ .../DefaultHttpResponse.cs | 37 +++++------- .../Security/SignInContext.cs | 36 ----------- .../Security/SignOutContext.cs | 32 ---------- .../Security/IAuthenticateContext.cs | 8 +-- .../Security/IAuthenticationHandler.cs | 4 +- .../Security/IChallengeContext.cs | 4 +- ...eContext.cs => IDescribeSchemesContext.cs} | 4 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- .../Security/ISignInContext.cs | 8 ++- .../Security/ISignOutContext.cs | 8 +-- .../AuthenticateResult.cs | 17 ++---- .../AuthenticationDescription.cs | 10 ++-- .../AuthenticationProperties.cs | 2 +- src/Microsoft.AspNet.Http/HttpContext.cs | 16 ++--- src/Microsoft.AspNet.Http/HttpResponse.cs | 60 +++++-------------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +- .../OwinFeatureCollection.cs | 2 +- .../DefaultHttpContextTests.cs | 59 ++++++++++++++++-- 25 files changed, 238 insertions(+), 235 deletions(-) rename src/Microsoft.AspNet.Http.Core/{Security => Authentication}/AuthenticateContext.cs (50%) rename src/Microsoft.AspNet.Http.Core/{Security => Authentication}/ChallengeContext.cs (72%) rename src/Microsoft.AspNet.Http.Core/{Security/AuthTypeContext.cs => Authentication/DescribeSchemesContext.cs} (72%) rename src/Microsoft.AspNet.Http.Core/{Security => Authentication}/HttpAuthenticationFeature.cs (83%) create mode 100644 src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs create mode 100644 src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs rename src/Microsoft.AspNet.Http.Interfaces/Security/{IAuthTypeContext.cs => IDescribeSchemesContext.cs} (73%) rename src/Microsoft.AspNet.Http/{Security => Authentication}/AuthenticateResult.cs (72%) rename src/Microsoft.AspNet.Http/{Security => Authentication}/AuthenticationDescription.cs (86%) rename src/Microsoft.AspNet.Http/{Security => Authentication}/AuthenticationProperties.cs (99%) diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs similarity index 50% rename from src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 95dd14a8d2..938722725e 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -1,30 +1,26 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; -using System.Linq; using System.Security.Claims; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { public class AuthenticateContext : IAuthenticateContext { private List _results; private List _accepted; - public AuthenticateContext([NotNull] IEnumerable authenticationTypes) + public AuthenticateContext([NotNull] IEnumerable authenticationSchemes) { - AuthenticationTypes = authenticationTypes; + AuthenticationSchemes = authenticationSchemes; _results = new List(); _accepted = new List(); } - public IEnumerable AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationSchemes { get; private set; } public IEnumerable Results { @@ -36,16 +32,16 @@ namespace Microsoft.AspNet.Http.Core.Security get { return _accepted; } } - public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) + public void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - _accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType - _results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); + _accepted.Add(descrip.AuthenticationScheme); // may not match identity.AuthType + _results.Add(new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip)); } - public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) + public void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description) { - _accepted.Add(authenticationType); + _accepted.Add(authenticationScheme); } } } diff --git a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs similarity index 72% rename from src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index aa9a424fc4..db2efec1af 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -3,25 +3,22 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { public class ChallengeContext : IChallengeContext { private List _accepted; - public ChallengeContext([NotNull] IEnumerable authenticationTypes, IDictionary properties) + public ChallengeContext([NotNull] IEnumerable authenticationSchemes, IDictionary properties) { - AuthenticationTypes = authenticationTypes; + AuthenticationSchemes = authenticationSchemes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); _accepted = new List(); } - public IEnumerable AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationSchemes { get; private set; } public IDictionary Properties { get; private set; } diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs similarity index 72% rename from src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs index df792fc74f..419d4d930f 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs @@ -1,18 +1,17 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Interfaces.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { - public class AuthTypeContext : IAuthTypeContext + public class DescribeSchemesContext : IDescribeSchemesContext { private List _results; - public AuthTypeContext() + public DescribeSchemesContext() { _results = new List(); } diff --git a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs similarity index 83% rename from src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs index f0989c420c..4c3071e7b9 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs new file mode 100644 index 0000000000..1738456e03 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.AspNet.Http.Interfaces.Authentication; + +namespace Microsoft.AspNet.Http.Core.Authentication +{ + public class SignInContext : ISignInContext + { + private bool _accepted; + + public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary dictionary) + { + AuthenticationScheme = authenticationScheme; + Principal = principal; + Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + } + + public ClaimsPrincipal Principal { get; } + + public IDictionary Properties { get; } + + public string AuthenticationScheme { get; } + + public bool Accepted + { + get { return _accepted; } + } + + public void Accept(IDictionary description) + { + _accepted = true; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs new file mode 100644 index 0000000000..200a348f03 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http.Interfaces.Authentication; + +namespace Microsoft.AspNet.Http.Core.Authentication +{ + public class SignOutContext : ISignOutContext + { + private bool _accepted; + + public SignOutContext(string authenticationScheme) + { + AuthenticationScheme = authenticationScheme; + } + + public string AuthenticationScheme { get; } + + public bool Accepted + { + get { return _accepted; } + } + + public void Accept() + { + _accepted = true; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 2de1680de3..4b91833cca 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -9,14 +9,13 @@ using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Security; +using Microsoft.AspNet.Http.Core.Authentication; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core { @@ -201,7 +200,7 @@ namespace Microsoft.AspNet.Http.Core _features[type] = instance; } - public override IEnumerable GetAuthenticationTypes() + public override IEnumerable GetAuthenticationSchemes() { var handler = HttpAuthenticationFeature.Handler; if (handler == null) @@ -209,46 +208,46 @@ namespace Microsoft.AspNet.Http.Core return new AuthenticationDescription[0]; } - var authTypeContext = new AuthTypeContext(); - handler.GetDescriptions(authTypeContext); - return authTypeContext.Results; + var describeContext = new DescribeSchemesContext(); + handler.GetDescriptions(describeContext); + return describeContext.Results; } - public override IEnumerable Authenticate([NotNull] IEnumerable authenticationTypes) + public override IEnumerable Authenticate([NotNull] IEnumerable authenticationSchemes) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationTypes); + var authenticateContext = new AuthenticateContext(authenticationSchemes); if (handler != null) { handler.Authenticate(authenticateContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); + IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; } - public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationTypes) + public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationSchemes) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationTypes); + var authenticateContext = new AuthenticateContext(authenticationSchemes); if (handler != null) { await handler.AuthenticateAsync(authenticateContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); + IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; @@ -264,4 +263,4 @@ namespace Microsoft.AspNet.Http.Core return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol } ); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 7e44614704..13cecb1eee 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -6,17 +6,14 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Claims; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Security; +using Microsoft.AspNet.Http.Core.Authentication; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core { @@ -129,58 +126,56 @@ namespace Microsoft.AspNet.Http.Core Headers.Set(Constants.Headers.Location, location); } - public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationTypes) + public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationSchemes) { HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); + var challengeContext = new ChallengeContext(authenticationSchemes, properties == null ? null : properties.Dictionary); if (handler != null) { handler.Challenge(challengeContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(challengeContext.Accepted); + IEnumerable leftovers = authenticationSchemes.Except(challengeContext.Accepted); if (leftovers.Any()) { throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } - public override void SignIn(AuthenticationProperties properties, [NotNull] IEnumerable identities) + public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; - var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); + var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); if (handler != null) { handler.SignIn(signInContext); } // Verify all types ack'd - IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Accepted); - if (leftovers.Any()) + if (!signInContext.Accepted) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } } - public override void SignOut([NotNull] IEnumerable authenticationTypes) + public override void SignOut(string authenticationScheme) { var handler = HttpAuthenticationFeature.Handler; - var signOutContext = new SignOutContext(authenticationTypes); + var signOutContext = new SignOutContext(authenticationScheme); if (handler != null) { handler.SignOut(signOutContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(signOutContext.Accepted); - if (leftovers.Any()) + if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } } } diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs deleted file mode 100644 index 0e9383e97c..0000000000 --- a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Security; - -namespace Microsoft.AspNet.Http.Core.Security -{ - public class SignInContext : ISignInContext - { - private List _accepted; - - public SignInContext([NotNull] IEnumerable identities, IDictionary dictionary) - { - Identities = identities; - Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); - _accepted = new List(); - } - - public IEnumerable Identities { get; private set; } - - public IDictionary Properties { get; private set; } - - public IEnumerable Accepted - { - get { return _accepted; } - } - - public void Accept(string authenticationType, IDictionary description) - { - _accepted.Add(authenticationType); - } - } -} diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs deleted file mode 100644 index c2ed25f04a..0000000000 --- a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces.Security; - -namespace Microsoft.AspNet.Http.Core.Security -{ - public class SignOutContext : ISignOutContext - { - private List _accepted; - - public SignOutContext([NotNull] IEnumerable authenticationTypes) - { - AuthenticationTypes = authenticationTypes; - _accepted = new List(); - } - - public IEnumerable AuthenticationTypes { get; private set; } - - public IEnumerable Accepted - { - get { return _accepted; } - } - - public void Accept(string authenticationType, IDictionary description) - { - _accepted.Add(authenticationType); - } - } -} diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 3e09a1aa5e..86a1b7add1 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -4,14 +4,14 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IAuthenticateContext { - IEnumerable AuthenticationTypes { get; } + IEnumerable AuthenticationSchemes { get; } - void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description); + void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description); - void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description); + void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index 32ed5f2cf8..856433f41a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -3,11 +3,11 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IAuthenticationHandler { - void GetDescriptions(IAuthTypeContext context); + void GetDescriptions(IDescribeSchemesContext context); void Authenticate(IAuthenticateContext context); Task AuthenticateAsync(IAuthenticateContext context); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index cb44dc300b..602d1eead3 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -3,11 +3,11 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IChallengeContext { - IEnumerable AuthenticationTypes {get;} + IEnumerable AuthenticationSchemes {get;} IDictionary Properties {get;} void Accept(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs similarity index 73% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs index ef952847b0..7b06b47a6f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { - public interface IAuthTypeContext + public interface IDescribeSchemesContext { void Accept(IDictionary description); } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index 183ebe9d2f..be9ffb4e22 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index c6d1b4efc0..ee6603be66 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -4,13 +4,15 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface ISignInContext { - IEnumerable Identities { get; } + //IEnumerable Principals { get; } + ClaimsPrincipal Principal { get; } IDictionary Properties { get; } + string AuthenticationScheme { get; } - void Accept(string authenticationType, IDictionary description); + void Accept(IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs index 426c601e24..b9720a941d 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs @@ -1,14 +1,12 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface ISignOutContext { - IEnumerable AuthenticationTypes { get; } + string AuthenticationScheme { get; } - void Accept(string authenticationType, IDictionary description); + void Accept(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs similarity index 72% rename from src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs index 38b48dcf0e..e1d3918dbc 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs @@ -1,11 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Security.Claims; -using System.Security.Principal; -namespace Microsoft.AspNet.Http.Security +namespace Microsoft.AspNet.Http.Authentication { /// /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. @@ -18,21 +16,18 @@ namespace Microsoft.AspNet.Http.Security /// Assigned to Identity. May be null. /// Assigned to Properties. Contains extra information carried along with the identity. /// Assigned to Description. Contains information describing the authentication provider. - public AuthenticationResult(IIdentity identity, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) + public AuthenticationResult(ClaimsPrincipal principal, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) { - if (identity != null) - { - Identity = identity as ClaimsIdentity ?? new ClaimsIdentity(identity); - } + Principal = principal; Properties = properties; Description = description; } /// - /// Contains the claims that were authenticated by the given AuthenticationType. If the authentication - /// type was not successful the Identity property will be null. + /// Contains the claims that were authenticated by the given AuthenticationScheme. If the authentication + /// scheme was not successful the Identity property will be null. /// - public ClaimsIdentity Identity { get; private set; } + public ClaimsPrincipal Principal { get; private set; } /// /// Contains extra values that were provided with the original SignIn call. diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs similarity index 86% rename from src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs index 2d7d4f0c73..7df6a014c0 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Http.Security +namespace Microsoft.AspNet.Http.Authentication { /// /// Contains information describing an authentication provider. @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Security public class AuthenticationDescription { private const string CaptionPropertyKey = "Caption"; - private const string AuthenticationTypePropertyKey = "AuthenticationType"; + private const string AuthenticationSchemePropertyKey = "AuthenticationScheme"; /// /// Initializes a new instance of the class @@ -40,10 +40,10 @@ namespace Microsoft.AspNet.Http.Security /// /// Gets or sets the name used to reference the authentication middleware instance. /// - public string AuthenticationType + public string AuthenticationScheme { - get { return GetString(AuthenticationTypePropertyKey); } - set { Dictionary[AuthenticationTypePropertyKey] = value; } + get { return GetString(AuthenticationSchemePropertyKey); } + set { Dictionary[AuthenticationSchemePropertyKey] = value; } } /// diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs index afb9aca66a..475dd027d9 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; -namespace Microsoft.AspNet.Http.Security +namespace Microsoft.AspNet.Http.Authentication { /// /// Dictionary used to store state values about the authentication session. diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 094b6671eb..c76019744e 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -8,7 +8,7 @@ using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Security; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http { @@ -52,21 +52,21 @@ namespace Microsoft.AspNet.Http SetFeature(typeof(T), instance); } - public abstract IEnumerable GetAuthenticationTypes(); + public abstract IEnumerable GetAuthenticationSchemes(); - public virtual AuthenticationResult Authenticate(string authenticationType) + public virtual AuthenticationResult Authenticate(string authenticationScheme) { - return Authenticate(new[] { authenticationType }).SingleOrDefault(); + return Authenticate(new[] { authenticationScheme }).SingleOrDefault(); } - public abstract IEnumerable Authenticate(IEnumerable authenticationTypes); + public abstract IEnumerable Authenticate(IEnumerable authenticationSchemes); - public virtual async Task AuthenticateAsync(string authenticationType) + public virtual async Task AuthenticateAsync(string authenticationScheme) { - return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); + return (await AuthenticateAsync(new[] { authenticationScheme })).SingleOrDefault(); } - public abstract Task> AuthenticateAsync(IEnumerable authenticationTypes); + public abstract Task> AuthenticateAsync(IEnumerable authenticationSchemes); public virtual Task AcceptWebSocketAsync() { diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index d0156b4ee9..047b09825d 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; -using Microsoft.AspNet.Http.Security; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http { @@ -44,70 +44,40 @@ namespace Microsoft.AspNet.Http Challenge(properties, new string[0]); } - public virtual void Challenge(string authenticationType) + public virtual void Challenge(string authenticationScheme) { - Challenge(new[] { authenticationType }); + Challenge(new[] { authenticationScheme }); } - public virtual void Challenge(AuthenticationProperties properties, string authenticationType) + public virtual void Challenge(AuthenticationProperties properties, string authenticationScheme) { - Challenge(properties, new[] { authenticationType }); + Challenge(properties, new[] { authenticationScheme }); } - public virtual void Challenge(params string[] authenticationTypes) + public virtual void Challenge(params string[] authenticationSchemes) { - Challenge((IEnumerable)authenticationTypes); + Challenge((IEnumerable)authenticationSchemes); } - public virtual void Challenge(IEnumerable authenticationTypes) + public virtual void Challenge(IEnumerable authenticationSchemes) { - Challenge(properties: null, authenticationTypes: authenticationTypes); + Challenge(properties: null, authenticationSchemes: authenticationSchemes); } - public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) + public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationSchemes) { - Challenge(properties, (IEnumerable)authenticationTypes); + Challenge(properties, (IEnumerable)authenticationSchemes); } - public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes); + public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationSchemes); - public virtual void SignIn(ClaimsIdentity identity) - { - SignIn(properties: null, identity: identity); - } - - public virtual void SignIn(AuthenticationProperties properties, ClaimsIdentity identity) - { - SignIn(properties, new[] { identity }); - } - - public virtual void SignIn(params ClaimsIdentity[] identities) - { - SignIn(properties: null, identities: (IEnumerable)identities); - } - - public virtual void SignIn(IEnumerable identities) - { - SignIn(properties: null, identities: identities); - } - - public virtual void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) - { - SignIn(properties, (IEnumerable)identities); - } - - public abstract void SignIn(AuthenticationProperties properties, IEnumerable identities); + public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); public virtual void SignOut() { - SignOut(new string[0]); + SignOut(authenticationScheme: null); } - public virtual void SignOut(string authenticationType) - { - SignOut(new[] { authenticationType }); - } - - public abstract void SignOut(IEnumerable authenticationTypes); + public abstract void SignOut(string authenticationScheme); } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 148d80fcc0..f64f274333 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,9 +14,9 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; -using Microsoft.AspNet.Http.Core.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 469933cf64..11d5892cb1 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -16,7 +16,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 146967c135..5e637e1cca 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -3,13 +3,12 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Core.Authentication; +using Microsoft.AspNet.Http.Interfaces.Authentication; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests @@ -66,7 +65,7 @@ namespace Microsoft.AspNet.Http.Core.Tests public void SignInWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Response.SignIn(new ClaimsIdentity("Foo"))); + Assert.Throws(() => context.Response.SignIn("Foo", new ClaimsPrincipal())); } [Fact] @@ -78,6 +77,58 @@ namespace Microsoft.AspNet.Http.Core.Tests Assert.Throws(() => context.Response.SignOut("Foo")); } + [Fact] + public void SignInOutIn() + { + var context = CreateContext(); + var handler = new AuthHandler(); + context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); + var user = new ClaimsPrincipal(); + context.Response.SignIn("ignored", user); + Assert.True(handler.SignedIn); + context.Response.SignOut("ignored"); + Assert.False(handler.SignedIn); + context.Response.SignIn("ignored", user); + Assert.True(handler.SignedIn); + } + + private class AuthHandler : IAuthenticationHandler + { + public bool SignedIn { get; set; } + + public void Authenticate(IAuthenticateContext context) + { + throw new NotImplementedException(); + } + + public Task AuthenticateAsync(IAuthenticateContext context) + { + throw new NotImplementedException(); + } + + public void Challenge(IChallengeContext context) + { + throw new NotImplementedException(); + } + + public void GetDescriptions(IDescribeSchemesContext context) + { + throw new NotImplementedException(); + } + + public void SignIn(ISignInContext context) + { + SignedIn = true; + context.Accept(new Dictionary()); + } + + public void SignOut(ISignOutContext context) + { + SignedIn = false; + context.Accept(); + } + } + private HttpContext CreateContext() { var context = new DefaultHttpContext(); From ae23f7c7bc956d40040c7a7a45aa2dedd293ebc4 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 2 Mar 2015 16:38:38 -0800 Subject: [PATCH 236/846] Adding a feature to get the traceidentifier for a request Addresses : https://github.com/aspnet/HttpAbstractions/issues/117 Related changes in Helios & weblistener in separate PRs. --- .../IRequestIdentifierFeature.cs | 18 ++++++++++++++++++ src/Microsoft.AspNet.Owin/OwinConstants.cs | 8 ++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 7 +++++-- .../OwinFeatureCollection.cs | 19 ++++++++++++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs new file mode 100644 index 0000000000..642dca1210 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http.Interfaces +{ + /// + /// Feature to identify a request. + /// + public interface IRequestIdentifierFeature + { + /// + /// Identifier to trace a request. + /// + Guid TraceIdentifier { get; } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index b86dfc1a75..98ed1c42bd 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -20,6 +20,14 @@ namespace Microsoft.AspNet.Owin #endregion + #region OWIN v1.1.0 - 3.2.1 Request Data + + // OWIN 1.1.0 http://owin.org/html/owin.html + + public const string RequestId = "owin.RequestId"; + + #endregion + #region OWIN v1.0.0 - 3.2.2. Response Data // http://owin.org/spec/owin-1.0.0.html diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index f64f274333..7e17a7d108 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Owin { OwinConstants.Security.User, new FeatureMap(feature => feature.User, ()=> null, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), () => new HttpAuthenticationFeature()) - }, + } }; // owin.CallCancelled is required but the feature may not be present. @@ -113,6 +113,9 @@ namespace Microsoft.AspNet.Owin } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN + + // The request identifier is a string per the spec. + _entries[OwinConstants.RequestId] = new FeatureMap(feature => feature.TraceIdentifier.ToString()); } // Public in case there's a new/custom feature interface that needs to be added. @@ -369,7 +372,7 @@ namespace Microsoft.AspNet.Owin } public FeatureMap(Func getter, Func defaultFactory, Action setter) - : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory,(feature, value) => setter((TFeature)feature, value)) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory, (feature, value) => setter((TFeature)feature, value)) { } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 11d5892cb1..af443bcce9 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -32,7 +32,8 @@ namespace Microsoft.AspNet.Owin IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, IHttpWebSocketFeature, - IOwinEnvironmentFeature + IOwinEnvironmentFeature, + IRequestIdentifierFeature { public IDictionary Environment { get; set; } private bool _headersSent; @@ -427,6 +428,22 @@ namespace Microsoft.AspNet.Owin get { return true; } } + Guid IRequestIdentifierFeature.TraceIdentifier + { + get + { + var requestId = Prop(OwinConstants.RequestId); + Guid requestIdentifier; + + if (requestId != null && Guid.TryParse(requestId, out requestIdentifier)) + { + return requestIdentifier; + } + + return Guid.Empty; + } + } + public bool Remove(KeyValuePair item) { throw new NotSupportedException(); From 20848da93f87d7140e4ff87456f711f7081576eb Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 4 Mar 2015 18:08:36 -0800 Subject: [PATCH 237/846] React to DI changes --- .../EncoderServices.cs | 13 +++++++------ .../UseWithServicesTests.cs | 9 ++++----- .../EncoderServiceCollectionExtensionsTests.cs | 1 - 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs index 0f90180228..a19116daf2 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; @@ -10,15 +9,17 @@ namespace Microsoft.Framework.WebEncoders { public static class EncoderServices { - public static IEnumerable GetDefaultServices() + public static IServiceCollection GetDefaultServices() { - var describe = new ServiceDescriber(); + var services = new ServiceCollection(); // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); - yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); - yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); + services.AddSingleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); + services.AddSingleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); + services.AddSingleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); + + return services; } private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index d2393592ad..7cf66aa951 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -2,13 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Xunit; -using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.AspNet.Http.Core; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http.Core; +using Microsoft.Framework.DependencyInjection; +using Xunit; namespace Microsoft.AspNet.Http.Extensions.Tests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index 41ab636a64..d629184281 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -4,7 +4,6 @@ using System; using Xunit; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.Framework.WebEncoders { From 09ccc84a17b9ab248db0111da8867aae6ba29f1d Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 5 Mar 2015 14:29:22 -0800 Subject: [PATCH 238/846] DI API changes --- .../UseMiddlewareExtensions.cs | 3 +-- .../UseWithServicesTests.cs | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index 8a9de346ab..6425c20dc2 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -22,8 +22,7 @@ namespace Microsoft.AspNet.Builder var applicationServices = builder.ApplicationServices; return builder.Use(next => { - var typeActivator = applicationServices.GetRequiredService(); - var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); var parameters = methodinfo.GetParameters(); if (parameters[0].ParameterType != typeof(HttpContext)) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 7cf66aa951..66b5bb0ef4 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -38,7 +38,6 @@ namespace Microsoft.AspNet.Http.Extensions.Tests { var services = new ServiceCollection() .AddScoped() - .AddTransient() .BuildServiceProvider(); var builder = new ApplicationBuilder(services); @@ -101,7 +100,6 @@ namespace Microsoft.AspNet.Http.Extensions.Tests { var services = new ServiceCollection() .AddScoped() - .AddTransient() .BuildServiceProvider(); var builder = new ApplicationBuilder(services); builder.UseMiddleware(); From d5e1b198dcbc2a6a5097f2ad28ceb1ab536208d5 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Thu, 5 Mar 2015 16:22:18 -0800 Subject: [PATCH 239/846] Rename Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http --- .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/HttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- .../Collections/SessionCollection.cs | 2 +- src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs | 3 +-- src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs | 1 - src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs | 4 ++-- src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/QueryFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs | 2 +- .../IHttpApplicationFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs | 2 +- .../IHttpClientCertificateFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs | 2 +- .../IRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/ISession.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs | 2 +- .../ITlsTokenBindingFeature.cs | 2 +- .../IWebSocketAcceptContext.cs | 2 +- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IAuthenticationHandler.cs | 2 +- .../Security/IChallengeContext.cs | 2 +- .../Security/IDescribeSchemesContext.cs | 2 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 2 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 3 +-- test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs | 1 - .../MapPredicateMiddlewareTests.cs | 1 - .../Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs | 2 +- 50 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 938722725e..858da030a4 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index db2efec1af..00c5a1c6fb 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs index 419d4d930f..7cb613ecb3 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs index 4c3071e7b9..f67075e371 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs index 1738456e03..b5d8361ad6 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs index 200a348f03..2abccf3cfb 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs index 52ad9af615..0c7485096c 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs @@ -5,7 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 4b91833cca..d178aa90e0 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -13,8 +13,7 @@ using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 4c89f0f457..5b59cad761 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 13cecb1eee..ff1fa8e0ae 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -11,8 +11,8 @@ using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs index ae9fb236c9..cefd16584c 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs index 4a5c6c7634..58d48c49bc 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index d9bfb76406..484f41b1a9 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index ea0aa45cf7..6286bdd1da 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs index d4bf2d180a..b3c6354392 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs index 48e3cd7c71..aa857b1205 100644 --- a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs index 1548e74397..3032d47b6e 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpApplicationFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs index d78b7e6e8c..1ce5e33dd0 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpBufferingFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs index c49de2b9e2..da8fd38115 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpClientCertificateFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs index dc1f8bd0ac..bf3a370357 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs index 9f2d3d3c06..0e85c3e60a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs index 351e6eb5be..bd7a6012a3 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index ecdbd93c2f..cd5ffc4ec6 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs index 76e9b832e8..c5b3ddceec 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpSendFileFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs index 6441c8915a..0d6a0bd33a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs @@ -4,7 +4,7 @@ using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpUpgradeFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index 8b79bde6d7..3e86058140 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -4,7 +4,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpWebSocketFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs index 642dca1210..e7fe2c20f6 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { /// /// Feature to identify a request. diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs index 90d4e15566..cc8e6cd886 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface ISession { diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs index ff162b8491..ece1363017 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface ISessionFactory { diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs index ffe6e91eac..3173f44e3d 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { // TODO: Is there any reason not to flatten the Factory down into the Feature? public interface ISessionFeature diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs index d5211d9464..111f6ec8fc 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { /// /// Provides information regarding TLS token binding parameters. diff --git a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs index 1ae4306712..81f041bb27 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IWebSocketAcceptContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 86a1b7add1..71c2b97a30 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticateContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index 856433f41a..76b3e8cb1b 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticationHandler { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index 602d1eead3..3c6f2058de 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IChallengeContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs index 7b06b47a6f..96f395cb37 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IDescribeSchemesContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index be9ffb4e22..053f5d8e12 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index ee6603be66..c79860279d 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface ISignInContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs index b9720a941d..4fbca12a3a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface ISignOutContext { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 7e17a7d108..072f779b98 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -15,8 +15,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index af443bcce9..7d30044171 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -15,8 +15,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 20e73c2967..07b58bc27e 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 063f43eead..56bc445f77 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 1d43a8a85c..8a7d7aa0cf 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 5e637e1cca..0393392f1b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -8,7 +8,7 @@ using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs index 7c5557bb2a..4ec7dff00f 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs @@ -1,11 +1,10 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs index 91846bc000..0fd91f5cd4 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index ae1a7c5985..9bf4faaab6 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -4,7 +4,6 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index bc94b5717c..1c0537beda 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 93becf8a60..f86ce513dc 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Xunit; namespace Microsoft.AspNet.Owin From 9988d5205e6244e444b2e14f597b204c01224364 Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 5 Mar 2015 14:37:40 -0800 Subject: [PATCH 240/846] GetXyzEncoder() shouldn't throw if IServiceProvider is null Also remove dependency on full DI; use Interfaces instead --- .../EncoderServiceProviderExtensions.cs | 13 ++++++------- .../EncoderServices.cs | 13 +++++-------- src/Microsoft.Framework.WebEncoders/project.json | 2 +- .../project.json | 1 + 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs index a7982bdf7a..97a04d1c66 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs @@ -3,7 +3,6 @@ using System; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -19,9 +18,9 @@ namespace Microsoft.Framework.WebEncoders /// This method is guaranteed never to return null. /// It will return a default encoder instance if the service provider does not contain one. /// - public static IHtmlEncoder GetHtmlEncoder([NotNull] this IServiceProvider serviceProvider) + public static IHtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider.GetService() ?? HtmlEncoder.Default; + return serviceProvider?.GetService() ?? HtmlEncoder.Default; } /// @@ -31,9 +30,9 @@ namespace Microsoft.Framework.WebEncoders /// This method is guaranteed never to return null. /// It will return a default encoder instance if the service provider does not contain one. /// - public static IJavaScriptStringEncoder GetJavaScriptStringEncoder([NotNull] this IServiceProvider serviceProvider) + public static IJavaScriptStringEncoder GetJavaScriptStringEncoder(this IServiceProvider serviceProvider) { - return serviceProvider.GetService() ?? JavaScriptStringEncoder.Default; + return serviceProvider?.GetService() ?? JavaScriptStringEncoder.Default; } /// @@ -43,9 +42,9 @@ namespace Microsoft.Framework.WebEncoders /// This method is guaranteed never to return null. /// It will return a default encoder instance if the service provider does not contain one. /// - public static IUrlEncoder GetUrlEncoder([NotNull] this IServiceProvider serviceProvider) + public static IUrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider.GetService() ?? UrlEncoder.Default; + return serviceProvider?.GetService() ?? UrlEncoder.Default; } } } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs index a19116daf2..d7759f5134 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; @@ -9,17 +10,13 @@ namespace Microsoft.Framework.WebEncoders { public static class EncoderServices { - public static IServiceCollection GetDefaultServices() + public static IEnumerable GetDefaultServices() { - var services = new ServiceCollection(); - // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - services.AddSingleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); - services.AddSingleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); - services.AddSingleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); - - return services; + yield return ServiceDescriptor.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); + yield return ServiceDescriptor.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); + yield return ServiceDescriptor.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); } private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 34f87f5fe2..0c83429959 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,7 +5,7 @@ "allowUnsafe": true }, "dependencies": { - "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index e4e4d9f445..33115bacc1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", "Moq": "4.2.1312.1622", "Newtonsoft.Json": "6.0.6", From 0ad48b90b2531bb1cdca9906fa29131ef879a8aa Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:39 -0700 Subject: [PATCH 241/846] Update aspnet50/aspnetcore50 => dnx451/dnxcore50. --- src/Microsoft.AspNet.FeatureModel/project.json | 6 +++--- src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs | 6 +++--- src/Microsoft.AspNet.Http.Core/project.json | 6 +++--- src/Microsoft.AspNet.Http.Extensions/project.json | 6 +++--- src/Microsoft.AspNet.Http.Interfaces/project.json | 6 +++--- src/Microsoft.AspNet.Http/project.json | 6 +++--- src/Microsoft.AspNet.Owin/project.json | 6 +++--- src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs | 4 ++-- .../FileBufferingReadStream.cs | 6 +++--- src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs | 6 +++--- src/Microsoft.AspNet.WebUtilities/project.json | 6 +++--- src/Microsoft.Framework.WebEncoders/project.json | 6 +++--- src/Microsoft.Net.Http.Headers/project.json | 4 ++-- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Core.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 4 ++-- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 6 +++--- test/Microsoft.Framework.WebEncoders.Tests/project.json | 4 ++-- test/Microsoft.Net.Http.Headers.Tests/project.json | 4 ++-- 21 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 72c7319d68..f00900df49 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { }, "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.Linq": "4.0.0-beta-*", diff --git a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs index 06755f543d..ec692ee014 100644 --- a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs @@ -110,7 +110,7 @@ namespace Microsoft.AspNet.Http.Core _position += read; return read; } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -159,7 +159,7 @@ namespace Microsoft.AspNet.Http.Core { throw new NotSupportedException(); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -196,4 +196,4 @@ namespace Microsoft.AspNet.Http.Core } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 91374fa6c6..baa2f4758e 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", @@ -11,8 +11,8 @@ }, "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index be234399ec..3f874d1efe 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { @@ -7,9 +7,9 @@ "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { - "aspnet50" : { + "dnx451" : { }, - "aspnetcore50" : { + "dnxcore50" : { "dependencies": { "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index 3b6666ff83..0ce04e727c 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -1,9 +1,9 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Net.Primitives": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3adb7472e8..87ca4473e4 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,10 +1,10 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": {}, "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 19cc720380..fa41857380 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { @@ -7,8 +7,8 @@ "Microsoft.AspNet.Http.Core": "1.0.0-*" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.ComponentModel": "4.0.0-beta-*", diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 847873e2d1..2e6e39b6d2 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -144,7 +144,7 @@ namespace Microsoft.AspNet.WebUtilities { _inner.Write(buffer, offset, count); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { return _inner.BeginWrite(buffer, offset, count, callback, state); @@ -193,7 +193,7 @@ namespace Microsoft.AspNet.WebUtilities return await _inner.ReadAsync(buffer, offset, count, cancellationToken); } -#if ASPNET50 +#if DNX451 // We only anticipate using ReadAsync public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 2f23ab5247..aecd6e9ee5 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.WebUtilities return read; } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -199,7 +199,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -245,4 +245,4 @@ namespace Microsoft.AspNet.WebUtilities } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index d72809ef81..1bbf55e57c 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -109,7 +109,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -147,7 +147,7 @@ namespace Microsoft.AspNet.WebUtilities } return read; } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { var tcs = new TaskCompletionSource(state); @@ -317,4 +317,4 @@ namespace Microsoft.AspNet.WebUtilities return matchCount > 0; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 3a4c42267f..953d2480d0 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 0c83429959..93344aa0cf 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "Contains encoders for HTML, JavaScript, and URLs.", "compilationOptions": { @@ -11,8 +11,8 @@ }, "frameworks": { "net45": { }, - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index c0c551004b..6b8f2051ec 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -4,8 +4,8 @@ }, "frameworks" : { "net45" : { }, - "aspnet50" : { }, - "aspnetcore50" : { + "dnx451" : { }, + "dnxcore50" : { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.Diagnostics.Contracts": "4.0.0-beta-*", diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 6dfc567e0b..71618f4eaa 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", @@ -9,7 +9,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index df6823dc6d..8046fb859b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", @@ -10,7 +10,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Moq": "4.2.1312.1622" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index ddf07a3826..b50c960ccc 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", @@ -10,7 +10,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index f6549fc724..4b174469d8 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", @@ -10,7 +10,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index f0caf021ab..bb7860d070 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", @@ -11,7 +11,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index d449b763bd..e9abf2ad1c 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", @@ -9,7 +9,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 33115bacc1..215984718a 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", @@ -13,7 +13,7 @@ "allowUnsafe": true }, "frameworks": { - "aspnet50": { } + "dnx451": { } }, "resources": "..\\..\\unicode\\UnicodeData.txt" } diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 4ffa75e704..c448522419 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -8,8 +8,8 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Diagnostics.Debug": "4.0.10-beta-*" } From d69b1000b64903876b12d4a9cbba3eb3e708f00d Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:41 -0700 Subject: [PATCH 242/846] Update K_BUILD_VERSION/kre/KRE/.k => DNX_BUILD_VERSION/dnx/DNX/.dnx. --- build.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 86ca5bbbf1..49ba0692de 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ -@echo off +@echo off cd %~dp0 SETLOCAL @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_KRE_INSTALL%"=="1" goto run +IF "%SKIP_DNX_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 From e2329ae1024d8c9fffec500585cd7d1af3ce4687 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:43 -0700 Subject: [PATCH 243/846] Update kvm/KVM/Kvm => dnvm/DNVM/Dnvm. --- build.cmd | 6 +++--- build.sh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cmd b/build.cmd index 49ba0692de..77be0a6627 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index c7873ef58e..74cb3421e6 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/kvm.sh + source packages/KoreBuild/build/dnvm.sh fi if ! type k > /dev/null 2>&1; then - kvm upgrade + dnvm upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From d2b303d4f0235446991522999d8e5460711f9de5 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:43 -0700 Subject: [PATCH 244/846] Update build.sh to use dnvm correctly. --- build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 74cb3421e6..a9ce06d087 100755 --- a/build.sh +++ b/build.sh @@ -27,7 +27,7 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi -if ! type k > /dev/null 2>&1; then +if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi @@ -36,3 +36,4 @@ if ! type k > /dev/null 2>&1; then fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" + From de25ccc9cd7e1dbb3d50d49e65aeb1e8afdfb57c Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 9 Mar 2015 01:31:50 -0700 Subject: [PATCH 245/846] Temporarily update struct => class. - Will be reverted back as denoted by issue: https://github.com/aspnet/HttpAbstractions/issues/222 --- src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs index 67918e5122..e05a917c56 100644 --- a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -6,7 +6,7 @@ using System.Diagnostics; namespace Microsoft.Framework.WebEncoders { - internal struct AllowedCharsBitmap + internal class AllowedCharsBitmap { private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); private uint[] _allowedCharsBitmap; @@ -34,7 +34,7 @@ namespace Microsoft.Framework.WebEncoders // Creates a deep copy of this bitmap public AllowedCharsBitmap Clone() { - AllowedCharsBitmap retVal; + var retVal = new AllowedCharsBitmap(); retVal._allowedCharsBitmap = (uint[])this._allowedCharsBitmap.Clone(); return retVal; } From 973bf7865e8beaa986f746316ad071090e6b9329 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 9 Mar 2015 12:54:49 -0700 Subject: [PATCH 246/846] Remove BOM from project.json, *.cmd, *.sh and *.shade files. --- build.cmd | 2 +- build.sh | 2 +- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http.Core/project.json | 2 +- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http.Interfaces/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- src/Microsoft.Framework.WebEncoders/project.json | 2 +- src/Microsoft.Net.Http.Headers/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Core.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- test/Microsoft.Framework.WebEncoders.Tests/project.json | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.cmd b/build.cmd index 77be0a6627..68a732c182 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ -@echo off +@echo off cd %~dp0 SETLOCAL diff --git a/build.sh b/build.sh index a9ce06d087..ec3263114a 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index f00900df49..5513054416 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index baa2f4758e..c611f9a806 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 3f874d1efe..f761ed5f65 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index 0ce04e727c..b327b3a467 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", "frameworks": { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 87ca4473e4..a8c1d8aad3 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": {}, diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index fa41857380..90a7af6c7f 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 953d2480d0..45068efbf3 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 93344aa0cf..2c1b7ba06d 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "Contains encoders for HTML, JavaScript, and URLs.", "compilationOptions": { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 6b8f2051ec..fd40eace65 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { }, diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 71618f4eaa..0713f60e97 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index 8046fb859b..d7c027a570 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index b50c960ccc..0e102e3708 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 4b174469d8..a62cd2769e 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index bb7860d070..9dd6d491be 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index e9abf2ad1c..11ef7dc59e 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 215984718a..9c62c1dacd 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index c448522419..297c316376 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.Net.Http.Headers": "1.0.0-*", From 9463b08d7b6d9650c44beeca08e3c2b84ce8f615 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 9 Mar 2015 15:02:33 -0700 Subject: [PATCH 247/846] Move SendFile HttpResponse extensions to Microsoft.AspNet.Http.Extensions Addresses: https://github.com/aspnet/HttpAbstractions/issues/221 --- .../Properties/Resources.Designer.cs | 46 +++++++ .../Resources.resx | 123 ++++++++++++++++++ .../SendFileResponseExtensions.cs | 57 ++++++++ .../project.json | 1 + .../SendFileResponseExtensionsTests.cs | 63 +++++++++ 5 files changed, 290 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Resources.resx create mode 100644 src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..a0d5a215a3 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs @@ -0,0 +1,46 @@ +// +namespace Microsoft.AspNet.Http.Extensions +{ + using System.Globalization; + using System.Reflection; + using System.Resources; + + internal static class Resources + { + private static readonly ResourceManager _resourceManager + = new ResourceManager("Microsoft.AspNet.Http.Extensions.Resources", typeof(Resources).GetTypeInfo().Assembly); + + /// + /// This server does not support the sendfile.SendAsync extension. + /// + internal static string Exception_SendFileNotSupported + { + get { return GetString("Exception_SendFileNotSupported"); } + } + + /// + /// This server does not support the sendfile.SendAsync extension. + /// + internal static string FormatException_SendFileNotSupported() + { + return GetString("Exception_SendFileNotSupported"); + } + + private static string GetString(string name, params string[] formatterNames) + { + var value = _resourceManager.GetString(name); + + System.Diagnostics.Debug.Assert(value != null); + + if (formatterNames != null) + { + for (var i = 0; i < formatterNames.Length; i++) + { + value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}"); + } + } + + return value; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Resources.resx b/src/Microsoft.AspNet.Http.Extensions/Resources.resx new file mode 100644 index 0000000000..2059135d60 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Resources.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + This server does not support the sendfile.SendAsync extension. + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs new file mode 100644 index 0000000000..2dcbdafc8a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Extensions; + +namespace Microsoft.AspNet.Http +{ + /// + /// Provides extensions for HttpResponse exposing the SendFile extension. + /// + public static class SendFileResponseExtensions + { + /// + /// Checks if the SendFile extension is supported. + /// + /// + /// True if sendfile feature exists in the response. + public static bool SupportsSendFile([NotNull] this HttpResponse response) + { + return response.HttpContext.GetFeature() != null; + } + + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// + /// + public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName) + { + return response.SendFileAsync(fileName, 0, null, CancellationToken.None); + } + + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// The full or relative path to the file. + /// The offset in the file. + /// The number of types to send, or null to send the remainder of the file. + /// + /// + public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken) + { + var sendFile = response.HttpContext.GetFeature(); + if (sendFile == null) + { + throw new NotSupportedException(Resources.Exception_SendFileNotSupported); + } + + return sendFile.SendFileAsync(fileName, offset, count, cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index f761ed5f65..f2d71e2528 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,6 +3,7 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs new file mode 100644 index 0000000000..f42fec5efa --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Core; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions.Tests +{ + public class SendFileResponseExtensionsTests + { + [Fact] + public void SendFileSupport() + { + var context = new DefaultHttpContext(); + var response = context.Response; + Assert.False(response.SupportsSendFile()); + context.SetFeature(new FakeSendFileFeature()); + Assert.True(response.SupportsSendFile()); + } + + [Fact] + public Task SendFileWhenNotSupported() + { + var response = new DefaultHttpContext().Response; + return Assert.ThrowsAsync(() => response.SendFileAsync("foo")); + } + + [Fact] + public async Task SendFileWorks() + { + var context = new DefaultHttpContext(); + var response = context.Response; + var fakeFeature = new FakeSendFileFeature(); + context.SetFeature(fakeFeature); + + await response.SendFileAsync("bob", 1, 3, CancellationToken.None); + + Assert.Equal("bob", fakeFeature.name); + Assert.Equal(1, fakeFeature.offset); + Assert.Equal(3, fakeFeature.length); + Assert.Equal(CancellationToken.None, fakeFeature.token); + } + + private class FakeSendFileFeature : IHttpSendFileFeature + { + public string name = null; + public long offset = 0; + public long? length = null; + public CancellationToken token; + + public Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + { + this.name = path; + this.offset = offset; + this.length = length; + this.token = cancellation; + return Task.FromResult(0); + } + } + } +} From 58c45cd379774cf1fd683a12465cb52094b7193d Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 6 Mar 2015 17:20:47 -0800 Subject: [PATCH 248/846] SignOutContext needs AuthenticationProperties --- .../Authentication/SignOutContext.cs | 5 ++++- .../DefaultHttpResponse.cs | 15 +++++++++------ .../Security/ISignOutContext.cs | 4 ++++ src/Microsoft.AspNet.Http/HttpResponse.cs | 6 ++++-- .../DefaultHttpContextTests.cs | 2 ++ 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs index 2abccf3cfb..3676102e03 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -11,13 +11,16 @@ namespace Microsoft.AspNet.Http.Core.Authentication { private bool _accepted; - public SignOutContext(string authenticationScheme) + public SignOutContext([NotNull] string authenticationScheme, IDictionary properties) { AuthenticationScheme = authenticationScheme; + Properties = properties ?? new Dictionary(StringComparer.Ordinal); } public string AuthenticationScheme { get; } + public IDictionary Properties { get; } + public bool Accepted { get { return _accepted; } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index ff1fa8e0ae..fd2dab86ed 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -7,13 +7,11 @@ using System.IO; using System.Linq; using System.Security.Claims; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core { @@ -162,11 +160,11 @@ namespace Microsoft.AspNet.Http.Core } } - public override void SignOut(string authenticationScheme) + public override void SignOut(string authenticationScheme, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; - var signOutContext = new SignOutContext(authenticationScheme); + var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); if (handler != null) { handler.SignOut(signOutContext); @@ -178,5 +176,10 @@ namespace Microsoft.AspNet.Http.Core throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } } + + public override void SignOut(string authenticationScheme) + { + SignOut(authenticationScheme, properties: null); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs index 4fbca12a3a..2bb7036026 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs @@ -1,12 +1,16 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; + namespace Microsoft.AspNet.Http.Authentication { public interface ISignOutContext { string AuthenticationScheme { get; } + IDictionary Properties { get; } + void Accept(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 047b09825d..85dec115e7 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Http public virtual void Challenge(IEnumerable authenticationSchemes) { - Challenge(properties: null, authenticationSchemes: authenticationSchemes); + Challenge(properties: null, authenticationSchemes: authenticationSchemes); } public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationSchemes) @@ -75,9 +75,11 @@ namespace Microsoft.AspNet.Http public virtual void SignOut() { - SignOut(authenticationScheme: null); + SignOut(authenticationScheme: null, properties: null); } public abstract void SignOut(string authenticationScheme); + + public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); } } diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 0393392f1b..02b040af69 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -90,6 +90,8 @@ namespace Microsoft.AspNet.Http.Core.Tests Assert.False(handler.SignedIn); context.Response.SignIn("ignored", user); Assert.True(handler.SignedIn); + context.Response.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + Assert.False(handler.SignedIn); } private class AuthHandler : IAuthenticationHandler From ed380ef61cfed669198ab4ddf0b129cf4278d9af Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 9 Mar 2015 20:51:37 -0700 Subject: [PATCH 249/846] Renaming Nuget.org feed key name to Nuget. fixes https://github.com/aspnet/Universe/issues/174 --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..da57d47267 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,6 +2,6 @@ - + - + \ No newline at end of file From 64077026c7357ee20ff90062317716ad3cd9f39d Mon Sep 17 00:00:00 2001 From: Levi B Date: Sat, 7 Mar 2015 13:29:03 -0800 Subject: [PATCH 250/846] API cleanup: Rename UnicodeBlock -> UnicodeRange Also clean up related doc comments --- .../CodePointFilter.cs | 173 +- .../HtmlEncoder.cs | 13 +- .../JavaScriptStringEncoder.cs | 13 +- .../UnicodeBlock.cs | 66 - .../UnicodeBlocks.cs | 64 - .../UnicodeBlocks.generated.cs | 2336 ----------------- .../UnicodeRange.cs | 64 + .../UnicodeRanges.cs | 51 + .../UnicodeRanges.generated.cs | 1406 ++++++++++ .../UrlEncoder.cs | 17 +- .../CodePointFilterTests.cs | 240 +- .../EncoderExtensionsTests.cs | 6 +- .../HtmlEncoderTests.cs | 14 +- .../JavaScriptStringEncoderTests.cs | 20 +- .../UnicodeBlockTests.cs | 86 - .../UnicodeBlocksTests.cs | 210 -- .../UnicodeEncoderBaseTests.cs | 46 +- .../UnicodeRangeTests.cs | 69 + .../UnicodeRangesTests.cs | 210 ++ .../UrlEncoderTests.cs | 16 +- .../UnicodeTablesGenerator/Program.cs | 18 +- 21 files changed, 2083 insertions(+), 3055 deletions(-) delete mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs delete mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs delete mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeRange.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs delete mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs delete mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index 1fee0fbf1b..f9c57f1873 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -15,7 +15,7 @@ namespace Microsoft.Framework.WebEncoders private AllowedCharsBitmap _allowedCharsBitmap; /// - /// Instantiates an empty filter. + /// Instantiates an empty filter (allows no code points through by default). /// public CodePointFilter() { @@ -23,7 +23,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates the filter by cloning the allow list of another filter. + /// Instantiates the filter by cloning the allow list of another . /// public CodePointFilter([NotNull] ICodePointFilter other) { @@ -40,53 +40,17 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates the filter where only the provided Unicode character blocks are - /// allowed by the filter. + /// Instantiates the filter where only the character ranges specified by + /// are allowed by the filter. /// - /// - public CodePointFilter(params UnicodeBlock[] allowedBlocks) + public CodePointFilter(params UnicodeRange[] allowedRanges) { _allowedCharsBitmap = new AllowedCharsBitmap(); - AllowBlocks(allowedBlocks); + AllowRanges(allowedRanges); } /// - /// Allows all characters in the specified Unicode character block through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowBlock([NotNull] UnicodeBlock block) - { - int firstCodePoint = block.FirstCodePoint; - int blockSize = block.BlockSize; - for (int i = 0; i < blockSize; i++) - { - _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Allows all characters in the specified Unicode character blocks through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowBlocks(params UnicodeBlock[] blocks) - { - if (blocks != null) - { - for (int i = 0; i < blocks.Length; i++) - { - AllowBlock(blocks[i]); - } - } - return this; - } - - /// - /// Allows the specified character through the filter. + /// Allows the character specified by through the filter. /// /// /// The 'this' instance. @@ -98,7 +62,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Allows the specified characters through the filter. + /// Allows all characters specified by through the filter. /// /// /// The 'this' instance. @@ -116,7 +80,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Allows all characters in the specified string through the filter. + /// Allows all characters in the string through the filter. /// /// /// The 'this' instance. @@ -131,7 +95,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Allows all characters approved by the specified filter through this filter. + /// Allows all characters specified by through the filter. /// /// /// The 'this' instance. @@ -151,7 +115,42 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows all characters through the filter. + /// Allows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowRange([NotNull] UnicodeRange range) + { + int firstCodePoint = range.FirstCodePoint; + int rangeSize = range.RangeSize; + for (int i = 0; i < rangeSize; i++) + { + _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Allows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowRanges(params UnicodeRange[] ranges) + { + if (ranges != null) + { + for (int i = 0; i < ranges.Length; i++) + { + AllowRange(ranges[i]); + } + } + return this; + } + + /// + /// Resets this filter by disallowing all characters. /// /// /// The 'this' instance. @@ -163,42 +162,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows all characters in the specified Unicode character block through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidBlock([NotNull] UnicodeBlock block) - { - int firstCodePoint = block.FirstCodePoint; - int blockSize = block.BlockSize; - for (int i = 0; i < blockSize; i++) - { - _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Disallows all characters in the specified Unicode character blocks through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidBlocks(params UnicodeBlock[] blocks) - { - if (blocks != null) - { - for (int i = 0; i < blocks.Length; i++) - { - ForbidBlock(blocks[i]); - } - } - return this; - } - - /// - /// Disallows the specified character through the filter. + /// Disallows the character through the filter. /// /// /// The 'this' instance. @@ -210,7 +174,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows the specified characters through the filter. + /// Disallows all characters specified by through the filter. /// /// /// The 'this' instance. @@ -228,7 +192,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows all characters in the specified string through the filter. + /// Disallows all characters in the string through the filter. /// /// /// The 'this' instance. @@ -242,6 +206,41 @@ namespace Microsoft.Framework.WebEncoders return this; } + /// + /// Disallows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidRange([NotNull] UnicodeRange range) + { + int firstCodePoint = range.FirstCodePoint; + int rangeSize = range.RangeSize; + for (int i = 0; i < rangeSize; i++) + { + _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Disallows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidRanges(params UnicodeRange[] ranges) + { + if (ranges != null) + { + for (int i = 0; i < ranges.Length; i++) + { + ForbidRange(ranges[i]); + } + } + return this; + } + /// /// Retrieves the bitmap of allowed characters from this filter. /// The returned bitmap is a clone of the original bitmap to avoid unintentional modification. @@ -266,13 +265,13 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Returns a value stating whether the given character is allowed through the filter. + /// Returns a value stating whether the character is allowed through the filter. /// public bool IsCharacterAllowed(char c) { return _allowedCharsBitmap.IsCharacterAllowed(c); } - + /// /// Wraps the provided filter as a CodePointFilter, avoiding the clone if possible. /// diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index bea418b83f..4e30ba2505 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -26,7 +26,7 @@ namespace Microsoft.Framework.WebEncoders private readonly HtmlUnicodeEncoder _innerUnicodeEncoder; /// - /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// Instantiates an encoder using as its allow list. /// public HtmlEncoder() : this(HtmlUnicodeEncoder.BasicLatin) @@ -34,11 +34,11 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// Instantiates an encoder specifying which Unicode character ranges are allowed to /// pass through the encoder unescaped. /// - public HtmlEncoder(params UnicodeBlock[] allowedBlocks) - : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + public HtmlEncoder(params UnicodeRange[] allowedRanges) + : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedRanges))) { } @@ -57,8 +57,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// A default instance of the HtmlEncoder, equivalent to allowing only - /// the 'Basic Latin' character range. + /// The default , which uses as its allow list. /// public static HtmlEncoder Default { @@ -120,7 +119,7 @@ namespace Microsoft.Framework.WebEncoders HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); + encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 3779c32801..1703a5447a 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -26,7 +26,7 @@ namespace Microsoft.Framework.WebEncoders private readonly JavaScriptStringUnicodeEncoder _innerUnicodeEncoder; /// - /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// Instantiates an encoder using as its allow list. /// public JavaScriptStringEncoder() : this(JavaScriptStringUnicodeEncoder.BasicLatin) @@ -34,11 +34,11 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// Instantiates an encoder specifying which Unicode character ranges are allowed to /// pass through the encoder unescaped. /// - public JavaScriptStringEncoder(params UnicodeBlock[] allowedBlocks) - : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedBlocks))) + public JavaScriptStringEncoder(params UnicodeRange[] allowedRanges) + : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedRanges))) { } @@ -57,8 +57,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// A default instance of the JavaScriptStringEncoder, equivalent to allowing only - /// the 'Basic Latin' character range. + /// The default , which uses as its allow list. /// public static JavaScriptStringEncoder Default { @@ -124,7 +123,7 @@ namespace Microsoft.Framework.WebEncoders JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); + encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs deleted file mode 100644 index 26f84d86a0..0000000000 --- a/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Represents a range of Unicode code points. - /// - /// - /// Currently only the Basic Multilingual Plane is supported. - /// - public sealed class UnicodeBlock - { - /// - /// Creates a new representation of a Unicode block given the first code point - /// in the block and the number of code points in the block. - /// - public UnicodeBlock(int firstCodePoint, int blockSize) - { - // Parameter checking: the first code point must be U+nnn0, the block size must - // be a multiple of 16 bytes, and we can't span planes. - // See http://unicode.org/faq/blocks_ranges.html for more info. - if (firstCodePoint < 0 || firstCodePoint > 0xFFFF || ((firstCodePoint & 0xF) != 0)) - { - throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); - } - if (blockSize < 0 || (blockSize % 16 != 0) || ((long)firstCodePoint + (long)blockSize > 0x10000)) - { - throw new ArgumentOutOfRangeException(nameof(blockSize)); - } - - FirstCodePoint = firstCodePoint; - BlockSize = blockSize; - } - - /// - /// The number of code points in this block. - /// - public int BlockSize { get; } - - /// - /// The first code point in this block. - /// - public int FirstCodePoint { get; } - - public static UnicodeBlock FromCharacterRange(char firstChar, char lastChar) - { - // Parameter checking: the first code point must be U+nnn0 and the last - // code point must be U+nnnF. We already can't span planes since 'char' - // allows only Basic Multilingual Plane characters. - // See http://unicode.org/faq/blocks_ranges.html for more info. - if ((firstChar & 0xF) != 0) - { - throw new ArgumentOutOfRangeException(nameof(firstChar)); - } - if (lastChar < firstChar || (lastChar & 0xF) != 0xF) - { - throw new ArgumentOutOfRangeException(nameof(lastChar)); - } - - return new UnicodeBlock(firstChar, 1 + (int)(lastChar - firstChar)); - } - } -} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs deleted file mode 100644 index 2217e2db93..0000000000 --- a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Contains predefined Unicode code point filters. - /// - public static partial class UnicodeBlocks - { - /// - /// Represents an empty Unicode block. - /// - /// - /// This block contains no code points. - /// - public static UnicodeBlock None - { - get - { - return Volatile.Read(ref _none) ?? CreateEmptyBlock(ref _none); - } - } - private static UnicodeBlock _none; - - /// - /// Represents a block containing all characters in the Unicode Basic Multilingual Plane (U+0000..U+FFFF). - /// - public static UnicodeBlock All - { - get - { - return Volatile.Read(ref _all) ?? CreateBlock(ref _all, '\u0000', '\uFFFF'); - } - } - private static UnicodeBlock _all; - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeBlock CreateBlock(ref UnicodeBlock block, char first, char last) - { - // If the block hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'block' value. - Debug.Assert(last > first, "Code points were specified out of order."); - var newBlock = UnicodeBlock.FromCharacterRange(first, last); - Volatile.Write(ref block, newBlock); - return newBlock; - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeBlock CreateEmptyBlock(ref UnicodeBlock block) - { - // If the block hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'block' value. - var newBlock = new UnicodeBlock(0, 0); - Volatile.Write(ref block, newBlock); - return newBlock; - } - } -} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs deleted file mode 100644 index d3404759c5..0000000000 --- a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs +++ /dev/null @@ -1,2336 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; - -namespace Microsoft.Framework.WebEncoders -{ - public static partial class UnicodeBlocks - { - /// - /// Represents the 'Basic Latin' Unicode block (U+0000..U+007F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BasicLatin - { - get - { - return Volatile.Read(ref _basicLatin) ?? CreateBlock(ref _basicLatin, first: '\u0000', last: '\u007F'); - } - } - private static UnicodeBlock _basicLatin; - - /// - /// Represents the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Latin1Supplement - { - get - { - return Volatile.Read(ref _latin1Supplement) ?? CreateBlock(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); - } - } - private static UnicodeBlock _latin1Supplement; - - /// - /// Represents the 'Latin Extended-A' Unicode block (U+0100..U+017F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedA - { - get - { - return Volatile.Read(ref _latinExtendedA) ?? CreateBlock(ref _latinExtendedA, first: '\u0100', last: '\u017F'); - } - } - private static UnicodeBlock _latinExtendedA; - - /// - /// Represents the 'Latin Extended-B' Unicode block (U+0180..U+024F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedB - { - get - { - return Volatile.Read(ref _latinExtendedB) ?? CreateBlock(ref _latinExtendedB, first: '\u0180', last: '\u024F'); - } - } - private static UnicodeBlock _latinExtendedB; - - /// - /// Represents the 'IPA Extensions' Unicode block (U+0250..U+02AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. - /// - public static UnicodeBlock IPAExtensions - { - get - { - return Volatile.Read(ref _ipaExtensions) ?? CreateBlock(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); - } - } - private static UnicodeBlock _ipaExtensions; - - /// - /// Represents the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SpacingModifierLetters - { - get - { - return Volatile.Read(ref _spacingModifierLetters) ?? CreateBlock(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); - } - } - private static UnicodeBlock _spacingModifierLetters; - - /// - /// Represents the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarks - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateBlock(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); - } - } - private static UnicodeBlock _combiningDiacriticalMarks; - - /// - /// Represents the 'Greek and Coptic' Unicode block (U+0370..U+03FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GreekandCoptic - { - get - { - return Volatile.Read(ref _greekandCoptic) ?? CreateBlock(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); - } - } - private static UnicodeBlock _greekandCoptic; - - /// - /// Represents the 'Cyrillic' Unicode block (U+0400..U+04FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Cyrillic - { - get - { - return Volatile.Read(ref _cyrillic) ?? CreateBlock(ref _cyrillic, first: '\u0400', last: '\u04FF'); - } - } - private static UnicodeBlock _cyrillic; - - /// - /// Represents the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CyrillicSupplement - { - get - { - return Volatile.Read(ref _cyrillicSupplement) ?? CreateBlock(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); - } - } - private static UnicodeBlock _cyrillicSupplement; - - /// - /// Represents the 'Armenian' Unicode block (U+0530..U+058F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Armenian - { - get - { - return Volatile.Read(ref _armenian) ?? CreateBlock(ref _armenian, first: '\u0530', last: '\u058F'); - } - } - private static UnicodeBlock _armenian; - - /// - /// Represents the 'Hebrew' Unicode block (U+0590..U+05FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Hebrew - { - get - { - return Volatile.Read(ref _hebrew) ?? CreateBlock(ref _hebrew, first: '\u0590', last: '\u05FF'); - } - } - private static UnicodeBlock _hebrew; - - /// - /// Represents the 'Arabic' Unicode block (U+0600..U+06FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Arabic - { - get - { - return Volatile.Read(ref _arabic) ?? CreateBlock(ref _arabic, first: '\u0600', last: '\u06FF'); - } - } - private static UnicodeBlock _arabic; - - /// - /// Represents the 'Syriac' Unicode block (U+0700..U+074F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Syriac - { - get - { - return Volatile.Read(ref _syriac) ?? CreateBlock(ref _syriac, first: '\u0700', last: '\u074F'); - } - } - private static UnicodeBlock _syriac; - - /// - /// Represents the 'Arabic Supplement' Unicode block (U+0750..U+077F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicSupplement - { - get - { - return Volatile.Read(ref _arabicSupplement) ?? CreateBlock(ref _arabicSupplement, first: '\u0750', last: '\u077F'); - } - } - private static UnicodeBlock _arabicSupplement; - - /// - /// Represents the 'Thaana' Unicode block (U+0780..U+07BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Thaana - { - get - { - return Volatile.Read(ref _thaana) ?? CreateBlock(ref _thaana, first: '\u0780', last: '\u07BF'); - } - } - private static UnicodeBlock _thaana; - - /// - /// Represents the 'NKo' Unicode block (U+07C0..U+07FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock NKo - { - get - { - return Volatile.Read(ref _nKo) ?? CreateBlock(ref _nKo, first: '\u07C0', last: '\u07FF'); - } - } - private static UnicodeBlock _nKo; - - /// - /// Represents the 'Samaritan' Unicode block (U+0800..U+083F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Samaritan - { - get - { - return Volatile.Read(ref _samaritan) ?? CreateBlock(ref _samaritan, first: '\u0800', last: '\u083F'); - } - } - private static UnicodeBlock _samaritan; - - /// - /// Represents the 'Mandaic' Unicode block (U+0840..U+085F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Mandaic - { - get - { - return Volatile.Read(ref _mandaic) ?? CreateBlock(ref _mandaic, first: '\u0840', last: '\u085F'); - } - } - private static UnicodeBlock _mandaic; - - /// - /// Represents the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicExtendedA - { - get - { - return Volatile.Read(ref _arabicExtendedA) ?? CreateBlock(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); - } - } - private static UnicodeBlock _arabicExtendedA; - - /// - /// Represents the 'Devanagari' Unicode block (U+0900..U+097F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Devanagari - { - get - { - return Volatile.Read(ref _devanagari) ?? CreateBlock(ref _devanagari, first: '\u0900', last: '\u097F'); - } - } - private static UnicodeBlock _devanagari; - - /// - /// Represents the 'Bengali' Unicode block (U+0980..U+09FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Bengali - { - get - { - return Volatile.Read(ref _bengali) ?? CreateBlock(ref _bengali, first: '\u0980', last: '\u09FF'); - } - } - private static UnicodeBlock _bengali; - - /// - /// Represents the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Gurmukhi - { - get - { - return Volatile.Read(ref _gurmukhi) ?? CreateBlock(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); - } - } - private static UnicodeBlock _gurmukhi; - - /// - /// Represents the 'Gujarati' Unicode block (U+0A80..U+0AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Gujarati - { - get - { - return Volatile.Read(ref _gujarati) ?? CreateBlock(ref _gujarati, first: '\u0A80', last: '\u0AFF'); - } - } - private static UnicodeBlock _gujarati; - - /// - /// Represents the 'Oriya' Unicode block (U+0B00..U+0B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Oriya - { - get - { - return Volatile.Read(ref _oriya) ?? CreateBlock(ref _oriya, first: '\u0B00', last: '\u0B7F'); - } - } - private static UnicodeBlock _oriya; - - /// - /// Represents the 'Tamil' Unicode block (U+0B80..U+0BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tamil - { - get - { - return Volatile.Read(ref _tamil) ?? CreateBlock(ref _tamil, first: '\u0B80', last: '\u0BFF'); - } - } - private static UnicodeBlock _tamil; - - /// - /// Represents the 'Telugu' Unicode block (U+0C00..U+0C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Telugu - { - get - { - return Volatile.Read(ref _telugu) ?? CreateBlock(ref _telugu, first: '\u0C00', last: '\u0C7F'); - } - } - private static UnicodeBlock _telugu; - - /// - /// Represents the 'Kannada' Unicode block (U+0C80..U+0CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Kannada - { - get - { - return Volatile.Read(ref _kannada) ?? CreateBlock(ref _kannada, first: '\u0C80', last: '\u0CFF'); - } - } - private static UnicodeBlock _kannada; - - /// - /// Represents the 'Malayalam' Unicode block (U+0D00..U+0D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Malayalam - { - get - { - return Volatile.Read(ref _malayalam) ?? CreateBlock(ref _malayalam, first: '\u0D00', last: '\u0D7F'); - } - } - private static UnicodeBlock _malayalam; - - /// - /// Represents the 'Sinhala' Unicode block (U+0D80..U+0DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Sinhala - { - get - { - return Volatile.Read(ref _sinhala) ?? CreateBlock(ref _sinhala, first: '\u0D80', last: '\u0DFF'); - } - } - private static UnicodeBlock _sinhala; - - /// - /// Represents the 'Thai' Unicode block (U+0E00..U+0E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Thai - { - get - { - return Volatile.Read(ref _thai) ?? CreateBlock(ref _thai, first: '\u0E00', last: '\u0E7F'); - } - } - private static UnicodeBlock _thai; - - /// - /// Represents the 'Lao' Unicode block (U+0E80..U+0EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Lao - { - get - { - return Volatile.Read(ref _lao) ?? CreateBlock(ref _lao, first: '\u0E80', last: '\u0EFF'); - } - } - private static UnicodeBlock _lao; - - /// - /// Represents the 'Tibetan' Unicode block (U+0F00..U+0FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tibetan - { - get - { - return Volatile.Read(ref _tibetan) ?? CreateBlock(ref _tibetan, first: '\u0F00', last: '\u0FFF'); - } - } - private static UnicodeBlock _tibetan; - - /// - /// Represents the 'Myanmar' Unicode block (U+1000..U+109F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Myanmar - { - get - { - return Volatile.Read(ref _myanmar) ?? CreateBlock(ref _myanmar, first: '\u1000', last: '\u109F'); - } - } - private static UnicodeBlock _myanmar; - - /// - /// Represents the 'Georgian' Unicode block (U+10A0..U+10FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Georgian - { - get - { - return Volatile.Read(ref _georgian) ?? CreateBlock(ref _georgian, first: '\u10A0', last: '\u10FF'); - } - } - private static UnicodeBlock _georgian; - - /// - /// Represents the 'Hangul Jamo' Unicode block (U+1100..U+11FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulJamo - { - get - { - return Volatile.Read(ref _hangulJamo) ?? CreateBlock(ref _hangulJamo, first: '\u1100', last: '\u11FF'); - } - } - private static UnicodeBlock _hangulJamo; - - /// - /// Represents the 'Ethiopic' Unicode block (U+1200..U+137F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Ethiopic - { - get - { - return Volatile.Read(ref _ethiopic) ?? CreateBlock(ref _ethiopic, first: '\u1200', last: '\u137F'); - } - } - private static UnicodeBlock _ethiopic; - - /// - /// Represents the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EthiopicSupplement - { - get - { - return Volatile.Read(ref _ethiopicSupplement) ?? CreateBlock(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); - } - } - private static UnicodeBlock _ethiopicSupplement; - - /// - /// Represents the 'Cherokee' Unicode block (U+13A0..U+13FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Cherokee - { - get - { - return Volatile.Read(ref _cherokee) ?? CreateBlock(ref _cherokee, first: '\u13A0', last: '\u13FF'); - } - } - private static UnicodeBlock _cherokee; - - /// - /// Represents the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock UnifiedCanadianAboriginalSyllabics - { - get - { - return Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); - } - } - private static UnicodeBlock _unifiedCanadianAboriginalSyllabics; - - /// - /// Represents the 'Ogham' Unicode block (U+1680..U+169F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Ogham - { - get - { - return Volatile.Read(ref _ogham) ?? CreateBlock(ref _ogham, first: '\u1680', last: '\u169F'); - } - } - private static UnicodeBlock _ogham; - - /// - /// Represents the 'Runic' Unicode block (U+16A0..U+16FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Runic - { - get - { - return Volatile.Read(ref _runic) ?? CreateBlock(ref _runic, first: '\u16A0', last: '\u16FF'); - } - } - private static UnicodeBlock _runic; - - /// - /// Represents the 'Tagalog' Unicode block (U+1700..U+171F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tagalog - { - get - { - return Volatile.Read(ref _tagalog) ?? CreateBlock(ref _tagalog, first: '\u1700', last: '\u171F'); - } - } - private static UnicodeBlock _tagalog; - - /// - /// Represents the 'Hanunoo' Unicode block (U+1720..U+173F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Hanunoo - { - get - { - return Volatile.Read(ref _hanunoo) ?? CreateBlock(ref _hanunoo, first: '\u1720', last: '\u173F'); - } - } - private static UnicodeBlock _hanunoo; - - /// - /// Represents the 'Buhid' Unicode block (U+1740..U+175F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Buhid - { - get - { - return Volatile.Read(ref _buhid) ?? CreateBlock(ref _buhid, first: '\u1740', last: '\u175F'); - } - } - private static UnicodeBlock _buhid; - - /// - /// Represents the 'Tagbanwa' Unicode block (U+1760..U+177F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tagbanwa - { - get - { - return Volatile.Read(ref _tagbanwa) ?? CreateBlock(ref _tagbanwa, first: '\u1760', last: '\u177F'); - } - } - private static UnicodeBlock _tagbanwa; - - /// - /// Represents the 'Khmer' Unicode block (U+1780..U+17FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Khmer - { - get - { - return Volatile.Read(ref _khmer) ?? CreateBlock(ref _khmer, first: '\u1780', last: '\u17FF'); - } - } - private static UnicodeBlock _khmer; - - /// - /// Represents the 'Mongolian' Unicode block (U+1800..U+18AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Mongolian - { - get - { - return Volatile.Read(ref _mongolian) ?? CreateBlock(ref _mongolian, first: '\u1800', last: '\u18AF'); - } - } - private static UnicodeBlock _mongolian; - - /// - /// Represents the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock UnifiedCanadianAboriginalSyllabicsExtended - { - get - { - return Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); - } - } - private static UnicodeBlock _unifiedCanadianAboriginalSyllabicsExtended; - - /// - /// Represents the 'Limbu' Unicode block (U+1900..U+194F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Limbu - { - get - { - return Volatile.Read(ref _limbu) ?? CreateBlock(ref _limbu, first: '\u1900', last: '\u194F'); - } - } - private static UnicodeBlock _limbu; - - /// - /// Represents the 'Tai Le' Unicode block (U+1950..U+197F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. - /// - public static UnicodeBlock TaiLe - { - get - { - return Volatile.Read(ref _taiLe) ?? CreateBlock(ref _taiLe, first: '\u1950', last: '\u197F'); - } - } - private static UnicodeBlock _taiLe; - - /// - /// Represents the 'New Tai Lue' Unicode block (U+1980..U+19DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock NewTaiLue - { - get - { - return Volatile.Read(ref _newTaiLue) ?? CreateBlock(ref _newTaiLue, first: '\u1980', last: '\u19DF'); - } - } - private static UnicodeBlock _newTaiLue; - - /// - /// Represents the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KhmerSymbols - { - get - { - return Volatile.Read(ref _khmerSymbols) ?? CreateBlock(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); - } - } - private static UnicodeBlock _khmerSymbols; - - /// - /// Represents the 'Buginese' Unicode block (U+1A00..U+1A1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Buginese - { - get - { - return Volatile.Read(ref _buginese) ?? CreateBlock(ref _buginese, first: '\u1A00', last: '\u1A1F'); - } - } - private static UnicodeBlock _buginese; - - /// - /// Represents the 'Tai Tham' Unicode block (U+1A20..U+1AAF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. - /// - public static UnicodeBlock TaiTham - { - get - { - return Volatile.Read(ref _taiTham) ?? CreateBlock(ref _taiTham, first: '\u1A20', last: '\u1AAF'); - } - } - private static UnicodeBlock _taiTham; - - /// - /// Represents the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarksExtended - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateBlock(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); - } - } - private static UnicodeBlock _combiningDiacriticalMarksExtended; - - /// - /// Represents the 'Balinese' Unicode block (U+1B00..U+1B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Balinese - { - get - { - return Volatile.Read(ref _balinese) ?? CreateBlock(ref _balinese, first: '\u1B00', last: '\u1B7F'); - } - } - private static UnicodeBlock _balinese; - - /// - /// Represents the 'Sundanese' Unicode block (U+1B80..U+1BBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Sundanese - { - get - { - return Volatile.Read(ref _sundanese) ?? CreateBlock(ref _sundanese, first: '\u1B80', last: '\u1BBF'); - } - } - private static UnicodeBlock _sundanese; - - /// - /// Represents the 'Batak' Unicode block (U+1BC0..U+1BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Batak - { - get - { - return Volatile.Read(ref _batak) ?? CreateBlock(ref _batak, first: '\u1BC0', last: '\u1BFF'); - } - } - private static UnicodeBlock _batak; - - /// - /// Represents the 'Lepcha' Unicode block (U+1C00..U+1C4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Lepcha - { - get - { - return Volatile.Read(ref _lepcha) ?? CreateBlock(ref _lepcha, first: '\u1C00', last: '\u1C4F'); - } - } - private static UnicodeBlock _lepcha; - - /// - /// Represents the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. - /// - public static UnicodeBlock OlChiki - { - get - { - return Volatile.Read(ref _olChiki) ?? CreateBlock(ref _olChiki, first: '\u1C50', last: '\u1C7F'); - } - } - private static UnicodeBlock _olChiki; - - /// - /// Represents the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SundaneseSupplement - { - get - { - return Volatile.Read(ref _sundaneseSupplement) ?? CreateBlock(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); - } - } - private static UnicodeBlock _sundaneseSupplement; - - /// - /// Represents the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock VedicExtensions - { - get - { - return Volatile.Read(ref _vedicExtensions) ?? CreateBlock(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); - } - } - private static UnicodeBlock _vedicExtensions; - - /// - /// Represents the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock PhoneticExtensions - { - get - { - return Volatile.Read(ref _phoneticExtensions) ?? CreateBlock(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); - } - } - private static UnicodeBlock _phoneticExtensions; - - /// - /// Represents the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock PhoneticExtensionsSupplement - { - get - { - return Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateBlock(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); - } - } - private static UnicodeBlock _phoneticExtensionsSupplement; - - /// - /// Represents the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarksSupplement - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateBlock(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); - } - } - private static UnicodeBlock _combiningDiacriticalMarksSupplement; - - /// - /// Represents the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedAdditional - { - get - { - return Volatile.Read(ref _latinExtendedAdditional) ?? CreateBlock(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); - } - } - private static UnicodeBlock _latinExtendedAdditional; - - /// - /// Represents the 'Greek Extended' Unicode block (U+1F00..U+1FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GreekExtended - { - get - { - return Volatile.Read(ref _greekExtended) ?? CreateBlock(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); - } - } - private static UnicodeBlock _greekExtended; - - /// - /// Represents the 'General Punctuation' Unicode block (U+2000..U+206F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GeneralPunctuation - { - get - { - return Volatile.Read(ref _generalPunctuation) ?? CreateBlock(ref _generalPunctuation, first: '\u2000', last: '\u206F'); - } - } - private static UnicodeBlock _generalPunctuation; - - /// - /// Represents the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SuperscriptsandSubscripts - { - get - { - return Volatile.Read(ref _superscriptsandSubscripts) ?? CreateBlock(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); - } - } - private static UnicodeBlock _superscriptsandSubscripts; - - /// - /// Represents the 'Currency Symbols' Unicode block (U+20A0..U+20CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CurrencySymbols - { - get - { - return Volatile.Read(ref _currencySymbols) ?? CreateBlock(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); - } - } - private static UnicodeBlock _currencySymbols; - - /// - /// Represents the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarksforSymbols - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateBlock(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); - } - } - private static UnicodeBlock _combiningDiacriticalMarksforSymbols; - - /// - /// Represents the 'Letterlike Symbols' Unicode block (U+2100..U+214F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LetterlikeSymbols - { - get - { - return Volatile.Read(ref _letterlikeSymbols) ?? CreateBlock(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); - } - } - private static UnicodeBlock _letterlikeSymbols; - - /// - /// Represents the 'Number Forms' Unicode block (U+2150..U+218F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. - /// - public static UnicodeBlock NumberForms - { - get - { - return Volatile.Read(ref _numberForms) ?? CreateBlock(ref _numberForms, first: '\u2150', last: '\u218F'); - } - } - private static UnicodeBlock _numberForms; - - /// - /// Represents the 'Arrows' Unicode block (U+2190..U+21FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Arrows - { - get - { - return Volatile.Read(ref _arrows) ?? CreateBlock(ref _arrows, first: '\u2190', last: '\u21FF'); - } - } - private static UnicodeBlock _arrows; - - /// - /// Represents the 'Mathematical Operators' Unicode block (U+2200..U+22FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MathematicalOperators - { - get - { - return Volatile.Read(ref _mathematicalOperators) ?? CreateBlock(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); - } - } - private static UnicodeBlock _mathematicalOperators; - - /// - /// Represents the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousTechnical - { - get - { - return Volatile.Read(ref _miscellaneousTechnical) ?? CreateBlock(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); - } - } - private static UnicodeBlock _miscellaneousTechnical; - - /// - /// Represents the 'Control Pictures' Unicode block (U+2400..U+243F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ControlPictures - { - get - { - return Volatile.Read(ref _controlPictures) ?? CreateBlock(ref _controlPictures, first: '\u2400', last: '\u243F'); - } - } - private static UnicodeBlock _controlPictures; - - /// - /// Represents the 'Optical Character Recognition' Unicode block (U+2440..U+245F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. - /// - public static UnicodeBlock OpticalCharacterRecognition - { - get - { - return Volatile.Read(ref _opticalCharacterRecognition) ?? CreateBlock(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); - } - } - private static UnicodeBlock _opticalCharacterRecognition; - - /// - /// Represents the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EnclosedAlphanumerics - { - get - { - return Volatile.Read(ref _enclosedAlphanumerics) ?? CreateBlock(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); - } - } - private static UnicodeBlock _enclosedAlphanumerics; - - /// - /// Represents the 'Box Drawing' Unicode block (U+2500..U+257F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BoxDrawing - { - get - { - return Volatile.Read(ref _boxDrawing) ?? CreateBlock(ref _boxDrawing, first: '\u2500', last: '\u257F'); - } - } - private static UnicodeBlock _boxDrawing; - - /// - /// Represents the 'Block Elements' Unicode block (U+2580..U+259F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BlockElements - { - get - { - return Volatile.Read(ref _blockElements) ?? CreateBlock(ref _blockElements, first: '\u2580', last: '\u259F'); - } - } - private static UnicodeBlock _blockElements; - - /// - /// Represents the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GeometricShapes - { - get - { - return Volatile.Read(ref _geometricShapes) ?? CreateBlock(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); - } - } - private static UnicodeBlock _geometricShapes; - - /// - /// Represents the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousSymbols - { - get - { - return Volatile.Read(ref _miscellaneousSymbols) ?? CreateBlock(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); - } - } - private static UnicodeBlock _miscellaneousSymbols; - - /// - /// Represents the 'Dingbats' Unicode block (U+2700..U+27BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Dingbats - { - get - { - return Volatile.Read(ref _dingbats) ?? CreateBlock(ref _dingbats, first: '\u2700', last: '\u27BF'); - } - } - private static UnicodeBlock _dingbats; - - /// - /// Represents the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousMathematicalSymbolsA - { - get - { - return Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); - } - } - private static UnicodeBlock _miscellaneousMathematicalSymbolsA; - - /// - /// Represents the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalArrowsA - { - get - { - return Volatile.Read(ref _supplementalArrowsA) ?? CreateBlock(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); - } - } - private static UnicodeBlock _supplementalArrowsA; - - /// - /// Represents the 'Braille Patterns' Unicode block (U+2800..U+28FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BraillePatterns - { - get - { - return Volatile.Read(ref _braillePatterns) ?? CreateBlock(ref _braillePatterns, first: '\u2800', last: '\u28FF'); - } - } - private static UnicodeBlock _braillePatterns; - - /// - /// Represents the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalArrowsB - { - get - { - return Volatile.Read(ref _supplementalArrowsB) ?? CreateBlock(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); - } - } - private static UnicodeBlock _supplementalArrowsB; - - /// - /// Represents the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousMathematicalSymbolsB - { - get - { - return Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); - } - } - private static UnicodeBlock _miscellaneousMathematicalSymbolsB; - - /// - /// Represents the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalMathematicalOperators - { - get - { - return Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateBlock(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); - } - } - private static UnicodeBlock _supplementalMathematicalOperators; - - /// - /// Represents the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousSymbolsandArrows - { - get - { - return Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateBlock(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); - } - } - private static UnicodeBlock _miscellaneousSymbolsandArrows; - - /// - /// Represents the 'Glagolitic' Unicode block (U+2C00..U+2C5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Glagolitic - { - get - { - return Volatile.Read(ref _glagolitic) ?? CreateBlock(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); - } - } - private static UnicodeBlock _glagolitic; - - /// - /// Represents the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedC - { - get - { - return Volatile.Read(ref _latinExtendedC) ?? CreateBlock(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); - } - } - private static UnicodeBlock _latinExtendedC; - - /// - /// Represents the 'Coptic' Unicode block (U+2C80..U+2CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Coptic - { - get - { - return Volatile.Read(ref _coptic) ?? CreateBlock(ref _coptic, first: '\u2C80', last: '\u2CFF'); - } - } - private static UnicodeBlock _coptic; - - /// - /// Represents the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GeorgianSupplement - { - get - { - return Volatile.Read(ref _georgianSupplement) ?? CreateBlock(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); - } - } - private static UnicodeBlock _georgianSupplement; - - /// - /// Represents the 'Tifinagh' Unicode block (U+2D30..U+2D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tifinagh - { - get - { - return Volatile.Read(ref _tifinagh) ?? CreateBlock(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); - } - } - private static UnicodeBlock _tifinagh; - - /// - /// Represents the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EthiopicExtended - { - get - { - return Volatile.Read(ref _ethiopicExtended) ?? CreateBlock(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); - } - } - private static UnicodeBlock _ethiopicExtended; - - /// - /// Represents the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CyrillicExtendedA - { - get - { - return Volatile.Read(ref _cyrillicExtendedA) ?? CreateBlock(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); - } - } - private static UnicodeBlock _cyrillicExtendedA; - - /// - /// Represents the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalPunctuation - { - get - { - return Volatile.Read(ref _supplementalPunctuation) ?? CreateBlock(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); - } - } - private static UnicodeBlock _supplementalPunctuation; - - /// - /// Represents the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKRadicalsSupplement - { - get - { - return Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateBlock(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); - } - } - private static UnicodeBlock _cjkRadicalsSupplement; - - /// - /// Represents the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KangxiRadicals - { - get - { - return Volatile.Read(ref _kangxiRadicals) ?? CreateBlock(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); - } - } - private static UnicodeBlock _kangxiRadicals; - - /// - /// Represents the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock IdeographicDescriptionCharacters - { - get - { - return Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateBlock(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); - } - } - private static UnicodeBlock _ideographicDescriptionCharacters; - - /// - /// Represents the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKSymbolsandPunctuation - { - get - { - return Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateBlock(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); - } - } - private static UnicodeBlock _cjkSymbolsandPunctuation; - - /// - /// Represents the 'Hiragana' Unicode block (U+3040..U+309F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Hiragana - { - get - { - return Volatile.Read(ref _hiragana) ?? CreateBlock(ref _hiragana, first: '\u3040', last: '\u309F'); - } - } - private static UnicodeBlock _hiragana; - - /// - /// Represents the 'Katakana' Unicode block (U+30A0..U+30FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Katakana - { - get - { - return Volatile.Read(ref _katakana) ?? CreateBlock(ref _katakana, first: '\u30A0', last: '\u30FF'); - } - } - private static UnicodeBlock _katakana; - - /// - /// Represents the 'Bopomofo' Unicode block (U+3100..U+312F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Bopomofo - { - get - { - return Volatile.Read(ref _bopomofo) ?? CreateBlock(ref _bopomofo, first: '\u3100', last: '\u312F'); - } - } - private static UnicodeBlock _bopomofo; - - /// - /// Represents the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulCompatibilityJamo - { - get - { - return Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateBlock(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); - } - } - private static UnicodeBlock _hangulCompatibilityJamo; - - /// - /// Represents the 'Kanbun' Unicode block (U+3190..U+319F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Kanbun - { - get - { - return Volatile.Read(ref _kanbun) ?? CreateBlock(ref _kanbun, first: '\u3190', last: '\u319F'); - } - } - private static UnicodeBlock _kanbun; - - /// - /// Represents the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BopomofoExtended - { - get - { - return Volatile.Read(ref _bopomofoExtended) ?? CreateBlock(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); - } - } - private static UnicodeBlock _bopomofoExtended; - - /// - /// Represents the 'CJK Strokes' Unicode block (U+31C0..U+31EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKStrokes - { - get - { - return Volatile.Read(ref _cjkStrokes) ?? CreateBlock(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); - } - } - private static UnicodeBlock _cjkStrokes; - - /// - /// Represents the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KatakanaPhoneticExtensions - { - get - { - return Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateBlock(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); - } - } - private static UnicodeBlock _katakanaPhoneticExtensions; - - /// - /// Represents the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EnclosedCJKLettersandMonths - { - get - { - return Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateBlock(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); - } - } - private static UnicodeBlock _enclosedCJKLettersandMonths; - - /// - /// Represents the 'CJK Compatibility' Unicode block (U+3300..U+33FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKCompatibility - { - get - { - return Volatile.Read(ref _cjkCompatibility) ?? CreateBlock(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); - } - } - private static UnicodeBlock _cjkCompatibility; - - /// - /// Represents the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKUnifiedIdeographsExtensionA - { - get - { - return Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateBlock(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); - } - } - private static UnicodeBlock _cjkUnifiedIdeographsExtensionA; - - /// - /// Represents the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock YijingHexagramSymbols - { - get - { - return Volatile.Read(ref _yijingHexagramSymbols) ?? CreateBlock(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); - } - } - private static UnicodeBlock _yijingHexagramSymbols; - - /// - /// Represents the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKUnifiedIdeographs - { - get - { - return Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateBlock(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); - } - } - private static UnicodeBlock _cjkUnifiedIdeographs; - - /// - /// Represents the 'Yi Syllables' Unicode block (U+A000..U+A48F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock YiSyllables - { - get - { - return Volatile.Read(ref _yiSyllables) ?? CreateBlock(ref _yiSyllables, first: '\uA000', last: '\uA48F'); - } - } - private static UnicodeBlock _yiSyllables; - - /// - /// Represents the 'Yi Radicals' Unicode block (U+A490..U+A4CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. - /// - public static UnicodeBlock YiRadicals - { - get - { - return Volatile.Read(ref _yiRadicals) ?? CreateBlock(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); - } - } - private static UnicodeBlock _yiRadicals; - - /// - /// Represents the 'Lisu' Unicode block (U+A4D0..U+A4FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Lisu - { - get - { - return Volatile.Read(ref _lisu) ?? CreateBlock(ref _lisu, first: '\uA4D0', last: '\uA4FF'); - } - } - private static UnicodeBlock _lisu; - - /// - /// Represents the 'Vai' Unicode block (U+A500..U+A63F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Vai - { - get - { - return Volatile.Read(ref _vai) ?? CreateBlock(ref _vai, first: '\uA500', last: '\uA63F'); - } - } - private static UnicodeBlock _vai; - - /// - /// Represents the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CyrillicExtendedB - { - get - { - return Volatile.Read(ref _cyrillicExtendedB) ?? CreateBlock(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); - } - } - private static UnicodeBlock _cyrillicExtendedB; - - /// - /// Represents the 'Bamum' Unicode block (U+A6A0..U+A6FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Bamum - { - get - { - return Volatile.Read(ref _bamum) ?? CreateBlock(ref _bamum, first: '\uA6A0', last: '\uA6FF'); - } - } - private static UnicodeBlock _bamum; - - /// - /// Represents the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ModifierToneLetters - { - get - { - return Volatile.Read(ref _modifierToneLetters) ?? CreateBlock(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); - } - } - private static UnicodeBlock _modifierToneLetters; - - /// - /// Represents the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedD - { - get - { - return Volatile.Read(ref _latinExtendedD) ?? CreateBlock(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); - } - } - private static UnicodeBlock _latinExtendedD; - - /// - /// Represents the 'Syloti Nagri' Unicode block (U+A800..U+A82F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SylotiNagri - { - get - { - return Volatile.Read(ref _sylotiNagri) ?? CreateBlock(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); - } - } - private static UnicodeBlock _sylotiNagri; - - /// - /// Represents the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CommonIndicNumberForms - { - get - { - return Volatile.Read(ref _commonIndicNumberForms) ?? CreateBlock(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); - } - } - private static UnicodeBlock _commonIndicNumberForms; - - /// - /// Represents the 'Phags-pa' Unicode block (U+A840..U+A87F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Phagspa - { - get - { - return Volatile.Read(ref _phagspa) ?? CreateBlock(ref _phagspa, first: '\uA840', last: '\uA87F'); - } - } - private static UnicodeBlock _phagspa; - - /// - /// Represents the 'Saurashtra' Unicode block (U+A880..U+A8DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Saurashtra - { - get - { - return Volatile.Read(ref _saurashtra) ?? CreateBlock(ref _saurashtra, first: '\uA880', last: '\uA8DF'); - } - } - private static UnicodeBlock _saurashtra; - - /// - /// Represents the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock DevanagariExtended - { - get - { - return Volatile.Read(ref _devanagariExtended) ?? CreateBlock(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); - } - } - private static UnicodeBlock _devanagariExtended; - - /// - /// Represents the 'Kayah Li' Unicode block (U+A900..U+A92F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KayahLi - { - get - { - return Volatile.Read(ref _kayahLi) ?? CreateBlock(ref _kayahLi, first: '\uA900', last: '\uA92F'); - } - } - private static UnicodeBlock _kayahLi; - - /// - /// Represents the 'Rejang' Unicode block (U+A930..U+A95F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Rejang - { - get - { - return Volatile.Read(ref _rejang) ?? CreateBlock(ref _rejang, first: '\uA930', last: '\uA95F'); - } - } - private static UnicodeBlock _rejang; - - /// - /// Represents the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulJamoExtendedA - { - get - { - return Volatile.Read(ref _hangulJamoExtendedA) ?? CreateBlock(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); - } - } - private static UnicodeBlock _hangulJamoExtendedA; - - /// - /// Represents the 'Javanese' Unicode block (U+A980..U+A9DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Javanese - { - get - { - return Volatile.Read(ref _javanese) ?? CreateBlock(ref _javanese, first: '\uA980', last: '\uA9DF'); - } - } - private static UnicodeBlock _javanese; - - /// - /// Represents the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MyanmarExtendedB - { - get - { - return Volatile.Read(ref _myanmarExtendedB) ?? CreateBlock(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); - } - } - private static UnicodeBlock _myanmarExtendedB; - - /// - /// Represents the 'Cham' Unicode block (U+AA00..U+AA5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Cham - { - get - { - return Volatile.Read(ref _cham) ?? CreateBlock(ref _cham, first: '\uAA00', last: '\uAA5F'); - } - } - private static UnicodeBlock _cham; - - /// - /// Represents the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MyanmarExtendedA - { - get - { - return Volatile.Read(ref _myanmarExtendedA) ?? CreateBlock(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); - } - } - private static UnicodeBlock _myanmarExtendedA; - - /// - /// Represents the 'Tai Viet' Unicode block (U+AA80..U+AADF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock TaiViet - { - get - { - return Volatile.Read(ref _taiViet) ?? CreateBlock(ref _taiViet, first: '\uAA80', last: '\uAADF'); - } - } - private static UnicodeBlock _taiViet; - - /// - /// Represents the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MeeteiMayekExtensions - { - get - { - return Volatile.Read(ref _meeteiMayekExtensions) ?? CreateBlock(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); - } - } - private static UnicodeBlock _meeteiMayekExtensions; - - /// - /// Represents the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EthiopicExtendedA - { - get - { - return Volatile.Read(ref _ethiopicExtendedA) ?? CreateBlock(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); - } - } - private static UnicodeBlock _ethiopicExtendedA; - - /// - /// Represents the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedE - { - get - { - return Volatile.Read(ref _latinExtendedE) ?? CreateBlock(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); - } - } - private static UnicodeBlock _latinExtendedE; - - /// - /// Represents the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MeeteiMayek - { - get - { - return Volatile.Read(ref _meeteiMayek) ?? CreateBlock(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); - } - } - private static UnicodeBlock _meeteiMayek; - - /// - /// Represents the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulSyllables - { - get - { - return Volatile.Read(ref _hangulSyllables) ?? CreateBlock(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); - } - } - private static UnicodeBlock _hangulSyllables; - - /// - /// Represents the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulJamoExtendedB - { - get - { - return Volatile.Read(ref _hangulJamoExtendedB) ?? CreateBlock(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); - } - } - private static UnicodeBlock _hangulJamoExtendedB; - - /// - /// Represents the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKCompatibilityIdeographs - { - get - { - return Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateBlock(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); - } - } - private static UnicodeBlock _cjkCompatibilityIdeographs; - - /// - /// Represents the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock AlphabeticPresentationForms - { - get - { - return Volatile.Read(ref _alphabeticPresentationForms) ?? CreateBlock(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); - } - } - private static UnicodeBlock _alphabeticPresentationForms; - - /// - /// Represents the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicPresentationFormsA - { - get - { - return Volatile.Read(ref _arabicPresentationFormsA) ?? CreateBlock(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); - } - } - private static UnicodeBlock _arabicPresentationFormsA; - - /// - /// Represents the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock VariationSelectors - { - get - { - return Volatile.Read(ref _variationSelectors) ?? CreateBlock(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); - } - } - private static UnicodeBlock _variationSelectors; - - /// - /// Represents the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. - /// - public static UnicodeBlock VerticalForms - { - get - { - return Volatile.Read(ref _verticalForms) ?? CreateBlock(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); - } - } - private static UnicodeBlock _verticalForms; - - /// - /// Represents the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningHalfMarks - { - get - { - return Volatile.Read(ref _combiningHalfMarks) ?? CreateBlock(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); - } - } - private static UnicodeBlock _combiningHalfMarks; - - /// - /// Represents the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKCompatibilityForms - { - get - { - return Volatile.Read(ref _cjkCompatibilityForms) ?? CreateBlock(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); - } - } - private static UnicodeBlock _cjkCompatibilityForms; - - /// - /// Represents the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SmallFormVariants - { - get - { - return Volatile.Read(ref _smallFormVariants) ?? CreateBlock(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); - } - } - private static UnicodeBlock _smallFormVariants; - - /// - /// Represents the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicPresentationFormsB - { - get - { - return Volatile.Read(ref _arabicPresentationFormsB) ?? CreateBlock(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); - } - } - private static UnicodeBlock _arabicPresentationFormsB; - - /// - /// Represents the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HalfwidthandFullwidthForms - { - get - { - return Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateBlock(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); - } - } - private static UnicodeBlock _halfwidthandFullwidthForms; - - /// - /// Represents the 'Specials' Unicode block (U+FFF0..U+FFFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Specials - { - get - { - return Volatile.Read(ref _specials) ?? CreateBlock(ref _specials, first: '\uFFF0', last: '\uFFFF'); - } - } - private static UnicodeBlock _specials; - } -} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs b/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs new file mode 100644 index 0000000000..04474ef759 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Represents a contiguous range of Unicode code points. + /// + /// + /// Currently only the Basic Multilingual Plane is supported. + /// + public sealed class UnicodeRange + { + /// + /// Creates a new . + /// + /// The first code point in the range. + /// The number of code points in the range. + public UnicodeRange(int firstCodePoint, int rangeSize) + { + // Parameter checking: the first code point and last code point must + // lie within the BMP. See http://unicode.org/faq/blocks_ranges.html for more info. + if (firstCodePoint < 0 || firstCodePoint > 0xFFFF) + { + throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); + } + if (rangeSize < 0 || ((long)firstCodePoint + (long)rangeSize > 0x10000)) + { + throw new ArgumentOutOfRangeException(nameof(rangeSize)); + } + + FirstCodePoint = firstCodePoint; + RangeSize = rangeSize; + } + + /// + /// The first code point in this range. + /// + public int FirstCodePoint { get; } + + /// + /// The number of code points in this range. + /// + public int RangeSize { get; } + + /// + /// Creates a new from a span of characters. + /// + /// The first character in the range. + /// The last character in the range. + /// The representing this span. + public static UnicodeRange FromSpan(char firstChar, char lastChar) + { + if (lastChar < firstChar) + { + throw new ArgumentOutOfRangeException(nameof(lastChar)); + } + + return new UnicodeRange(firstChar, 1 + (int)(lastChar - firstChar)); + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs new file mode 100644 index 0000000000..ccfac4b876 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Contains predefined instances which correspond to blocks + /// from the Unicode 7.0 specification. + /// + public static partial class UnicodeRanges + { + /// + /// An empty . This range contains no code points. + /// + public static UnicodeRange None => Volatile.Read(ref _none) ?? CreateEmptyRange(ref _none); + private static UnicodeRange _none; + + /// + /// A which contains all characters in the Unicode Basic + /// Multilingual Plane (U+0000..U+FFFF). + /// + public static UnicodeRange All => Volatile.Read(ref _all) ?? CreateRange(ref _all, '\u0000', '\uFFFF'); + private static UnicodeRange _all; + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeRange CreateEmptyRange(ref UnicodeRange range) + { + // If the range hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'range' value. + var newRange = new UnicodeRange(0, 0); + Volatile.Write(ref range, newRange); + return newRange; + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeRange CreateRange(ref UnicodeRange range, char first, char last) + { + // If the range hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'range' value. + Debug.Assert(last > first, "Code points were specified out of order."); + var newRange = UnicodeRange.FromSpan(first, last); + Volatile.Write(ref range, newRange); + return newRange; + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs new file mode 100644 index 0000000000..d5aced410b --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs @@ -0,0 +1,1406 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + public static partial class UnicodeRanges + { + /// + /// A corresponding to the 'Basic Latin' Unicode block (U+0000..U+007F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. + /// + public static UnicodeRange BasicLatin => Volatile.Read(ref _basicLatin) ?? CreateRange(ref _basicLatin, first: '\u0000', last: '\u007F'); + private static UnicodeRange _basicLatin; + + /// + /// A corresponding to the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. + /// + public static UnicodeRange Latin1Supplement => Volatile.Read(ref _latin1Supplement) ?? CreateRange(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); + private static UnicodeRange _latin1Supplement; + + /// + /// A corresponding to the 'Latin Extended-A' Unicode block (U+0100..U+017F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedA => Volatile.Read(ref _latinExtendedA) ?? CreateRange(ref _latinExtendedA, first: '\u0100', last: '\u017F'); + private static UnicodeRange _latinExtendedA; + + /// + /// A corresponding to the 'Latin Extended-B' Unicode block (U+0180..U+024F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedB => Volatile.Read(ref _latinExtendedB) ?? CreateRange(ref _latinExtendedB, first: '\u0180', last: '\u024F'); + private static UnicodeRange _latinExtendedB; + + /// + /// A corresponding to the 'IPA Extensions' Unicode block (U+0250..U+02AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. + /// + public static UnicodeRange IPAExtensions => Volatile.Read(ref _ipaExtensions) ?? CreateRange(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); + private static UnicodeRange _ipaExtensions; + + /// + /// A corresponding to the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. + /// + public static UnicodeRange SpacingModifierLetters => Volatile.Read(ref _spacingModifierLetters) ?? CreateRange(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); + private static UnicodeRange _spacingModifierLetters; + + /// + /// A corresponding to the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarks => Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateRange(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); + private static UnicodeRange _combiningDiacriticalMarks; + + /// + /// A corresponding to the 'Greek and Coptic' Unicode block (U+0370..U+03FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. + /// + public static UnicodeRange GreekandCoptic => Volatile.Read(ref _greekandCoptic) ?? CreateRange(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); + private static UnicodeRange _greekandCoptic; + + /// + /// A corresponding to the 'Cyrillic' Unicode block (U+0400..U+04FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. + /// + public static UnicodeRange Cyrillic => Volatile.Read(ref _cyrillic) ?? CreateRange(ref _cyrillic, first: '\u0400', last: '\u04FF'); + private static UnicodeRange _cyrillic; + + /// + /// A corresponding to the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. + /// + public static UnicodeRange CyrillicSupplement => Volatile.Read(ref _cyrillicSupplement) ?? CreateRange(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); + private static UnicodeRange _cyrillicSupplement; + + /// + /// A corresponding to the 'Armenian' Unicode block (U+0530..U+058F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. + /// + public static UnicodeRange Armenian => Volatile.Read(ref _armenian) ?? CreateRange(ref _armenian, first: '\u0530', last: '\u058F'); + private static UnicodeRange _armenian; + + /// + /// A corresponding to the 'Hebrew' Unicode block (U+0590..U+05FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. + /// + public static UnicodeRange Hebrew => Volatile.Read(ref _hebrew) ?? CreateRange(ref _hebrew, first: '\u0590', last: '\u05FF'); + private static UnicodeRange _hebrew; + + /// + /// A corresponding to the 'Arabic' Unicode block (U+0600..U+06FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. + /// + public static UnicodeRange Arabic => Volatile.Read(ref _arabic) ?? CreateRange(ref _arabic, first: '\u0600', last: '\u06FF'); + private static UnicodeRange _arabic; + + /// + /// A corresponding to the 'Syriac' Unicode block (U+0700..U+074F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. + /// + public static UnicodeRange Syriac => Volatile.Read(ref _syriac) ?? CreateRange(ref _syriac, first: '\u0700', last: '\u074F'); + private static UnicodeRange _syriac; + + /// + /// A corresponding to the 'Arabic Supplement' Unicode block (U+0750..U+077F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicSupplement => Volatile.Read(ref _arabicSupplement) ?? CreateRange(ref _arabicSupplement, first: '\u0750', last: '\u077F'); + private static UnicodeRange _arabicSupplement; + + /// + /// A corresponding to the 'Thaana' Unicode block (U+0780..U+07BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. + /// + public static UnicodeRange Thaana => Volatile.Read(ref _thaana) ?? CreateRange(ref _thaana, first: '\u0780', last: '\u07BF'); + private static UnicodeRange _thaana; + + /// + /// A corresponding to the 'NKo' Unicode block (U+07C0..U+07FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. + /// + public static UnicodeRange NKo => Volatile.Read(ref _nKo) ?? CreateRange(ref _nKo, first: '\u07C0', last: '\u07FF'); + private static UnicodeRange _nKo; + + /// + /// A corresponding to the 'Samaritan' Unicode block (U+0800..U+083F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. + /// + public static UnicodeRange Samaritan => Volatile.Read(ref _samaritan) ?? CreateRange(ref _samaritan, first: '\u0800', last: '\u083F'); + private static UnicodeRange _samaritan; + + /// + /// A corresponding to the 'Mandaic' Unicode block (U+0840..U+085F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. + /// + public static UnicodeRange Mandaic => Volatile.Read(ref _mandaic) ?? CreateRange(ref _mandaic, first: '\u0840', last: '\u085F'); + private static UnicodeRange _mandaic; + + /// + /// A corresponding to the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicExtendedA => Volatile.Read(ref _arabicExtendedA) ?? CreateRange(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); + private static UnicodeRange _arabicExtendedA; + + /// + /// A corresponding to the 'Devanagari' Unicode block (U+0900..U+097F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. + /// + public static UnicodeRange Devanagari => Volatile.Read(ref _devanagari) ?? CreateRange(ref _devanagari, first: '\u0900', last: '\u097F'); + private static UnicodeRange _devanagari; + + /// + /// A corresponding to the 'Bengali' Unicode block (U+0980..U+09FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. + /// + public static UnicodeRange Bengali => Volatile.Read(ref _bengali) ?? CreateRange(ref _bengali, first: '\u0980', last: '\u09FF'); + private static UnicodeRange _bengali; + + /// + /// A corresponding to the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Gurmukhi => Volatile.Read(ref _gurmukhi) ?? CreateRange(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); + private static UnicodeRange _gurmukhi; + + /// + /// A corresponding to the 'Gujarati' Unicode block (U+0A80..U+0AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Gujarati => Volatile.Read(ref _gujarati) ?? CreateRange(ref _gujarati, first: '\u0A80', last: '\u0AFF'); + private static UnicodeRange _gujarati; + + /// + /// A corresponding to the 'Oriya' Unicode block (U+0B00..U+0B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Oriya => Volatile.Read(ref _oriya) ?? CreateRange(ref _oriya, first: '\u0B00', last: '\u0B7F'); + private static UnicodeRange _oriya; + + /// + /// A corresponding to the 'Tamil' Unicode block (U+0B80..U+0BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tamil => Volatile.Read(ref _tamil) ?? CreateRange(ref _tamil, first: '\u0B80', last: '\u0BFF'); + private static UnicodeRange _tamil; + + /// + /// A corresponding to the 'Telugu' Unicode block (U+0C00..U+0C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Telugu => Volatile.Read(ref _telugu) ?? CreateRange(ref _telugu, first: '\u0C00', last: '\u0C7F'); + private static UnicodeRange _telugu; + + /// + /// A corresponding to the 'Kannada' Unicode block (U+0C80..U+0CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Kannada => Volatile.Read(ref _kannada) ?? CreateRange(ref _kannada, first: '\u0C80', last: '\u0CFF'); + private static UnicodeRange _kannada; + + /// + /// A corresponding to the 'Malayalam' Unicode block (U+0D00..U+0D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Malayalam => Volatile.Read(ref _malayalam) ?? CreateRange(ref _malayalam, first: '\u0D00', last: '\u0D7F'); + private static UnicodeRange _malayalam; + + /// + /// A corresponding to the 'Sinhala' Unicode block (U+0D80..U+0DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Sinhala => Volatile.Read(ref _sinhala) ?? CreateRange(ref _sinhala, first: '\u0D80', last: '\u0DFF'); + private static UnicodeRange _sinhala; + + /// + /// A corresponding to the 'Thai' Unicode block (U+0E00..U+0E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Thai => Volatile.Read(ref _thai) ?? CreateRange(ref _thai, first: '\u0E00', last: '\u0E7F'); + private static UnicodeRange _thai; + + /// + /// A corresponding to the 'Lao' Unicode block (U+0E80..U+0EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Lao => Volatile.Read(ref _lao) ?? CreateRange(ref _lao, first: '\u0E80', last: '\u0EFF'); + private static UnicodeRange _lao; + + /// + /// A corresponding to the 'Tibetan' Unicode block (U+0F00..U+0FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tibetan => Volatile.Read(ref _tibetan) ?? CreateRange(ref _tibetan, first: '\u0F00', last: '\u0FFF'); + private static UnicodeRange _tibetan; + + /// + /// A corresponding to the 'Myanmar' Unicode block (U+1000..U+109F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. + /// + public static UnicodeRange Myanmar => Volatile.Read(ref _myanmar) ?? CreateRange(ref _myanmar, first: '\u1000', last: '\u109F'); + private static UnicodeRange _myanmar; + + /// + /// A corresponding to the 'Georgian' Unicode block (U+10A0..U+10FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Georgian => Volatile.Read(ref _georgian) ?? CreateRange(ref _georgian, first: '\u10A0', last: '\u10FF'); + private static UnicodeRange _georgian; + + /// + /// A corresponding to the 'Hangul Jamo' Unicode block (U+1100..U+11FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulJamo => Volatile.Read(ref _hangulJamo) ?? CreateRange(ref _hangulJamo, first: '\u1100', last: '\u11FF'); + private static UnicodeRange _hangulJamo; + + /// + /// A corresponding to the 'Ethiopic' Unicode block (U+1200..U+137F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. + /// + public static UnicodeRange Ethiopic => Volatile.Read(ref _ethiopic) ?? CreateRange(ref _ethiopic, first: '\u1200', last: '\u137F'); + private static UnicodeRange _ethiopic; + + /// + /// A corresponding to the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. + /// + public static UnicodeRange EthiopicSupplement => Volatile.Read(ref _ethiopicSupplement) ?? CreateRange(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); + private static UnicodeRange _ethiopicSupplement; + + /// + /// A corresponding to the 'Cherokee' Unicode block (U+13A0..U+13FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Cherokee => Volatile.Read(ref _cherokee) ?? CreateRange(ref _cherokee, first: '\u13A0', last: '\u13FF'); + private static UnicodeRange _cherokee; + + /// + /// A corresponding to the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. + /// + public static UnicodeRange UnifiedCanadianAboriginalSyllabics => Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); + private static UnicodeRange _unifiedCanadianAboriginalSyllabics; + + /// + /// A corresponding to the 'Ogham' Unicode block (U+1680..U+169F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. + /// + public static UnicodeRange Ogham => Volatile.Read(ref _ogham) ?? CreateRange(ref _ogham, first: '\u1680', last: '\u169F'); + private static UnicodeRange _ogham; + + /// + /// A corresponding to the 'Runic' Unicode block (U+16A0..U+16FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Runic => Volatile.Read(ref _runic) ?? CreateRange(ref _runic, first: '\u16A0', last: '\u16FF'); + private static UnicodeRange _runic; + + /// + /// A corresponding to the 'Tagalog' Unicode block (U+1700..U+171F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tagalog => Volatile.Read(ref _tagalog) ?? CreateRange(ref _tagalog, first: '\u1700', last: '\u171F'); + private static UnicodeRange _tagalog; + + /// + /// A corresponding to the 'Hanunoo' Unicode block (U+1720..U+173F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. + /// + public static UnicodeRange Hanunoo => Volatile.Read(ref _hanunoo) ?? CreateRange(ref _hanunoo, first: '\u1720', last: '\u173F'); + private static UnicodeRange _hanunoo; + + /// + /// A corresponding to the 'Buhid' Unicode block (U+1740..U+175F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. + /// + public static UnicodeRange Buhid => Volatile.Read(ref _buhid) ?? CreateRange(ref _buhid, first: '\u1740', last: '\u175F'); + private static UnicodeRange _buhid; + + /// + /// A corresponding to the 'Tagbanwa' Unicode block (U+1760..U+177F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tagbanwa => Volatile.Read(ref _tagbanwa) ?? CreateRange(ref _tagbanwa, first: '\u1760', last: '\u177F'); + private static UnicodeRange _tagbanwa; + + /// + /// A corresponding to the 'Khmer' Unicode block (U+1780..U+17FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. + /// + public static UnicodeRange Khmer => Volatile.Read(ref _khmer) ?? CreateRange(ref _khmer, first: '\u1780', last: '\u17FF'); + private static UnicodeRange _khmer; + + /// + /// A corresponding to the 'Mongolian' Unicode block (U+1800..U+18AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. + /// + public static UnicodeRange Mongolian => Volatile.Read(ref _mongolian) ?? CreateRange(ref _mongolian, first: '\u1800', last: '\u18AF'); + private static UnicodeRange _mongolian; + + /// + /// A corresponding to the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. + /// + public static UnicodeRange UnifiedCanadianAboriginalSyllabicsExtended => Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); + private static UnicodeRange _unifiedCanadianAboriginalSyllabicsExtended; + + /// + /// A corresponding to the 'Limbu' Unicode block (U+1900..U+194F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. + /// + public static UnicodeRange Limbu => Volatile.Read(ref _limbu) ?? CreateRange(ref _limbu, first: '\u1900', last: '\u194F'); + private static UnicodeRange _limbu; + + /// + /// A corresponding to the 'Tai Le' Unicode block (U+1950..U+197F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. + /// + public static UnicodeRange TaiLe => Volatile.Read(ref _taiLe) ?? CreateRange(ref _taiLe, first: '\u1950', last: '\u197F'); + private static UnicodeRange _taiLe; + + /// + /// A corresponding to the 'New Tai Lue' Unicode block (U+1980..U+19DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. + /// + public static UnicodeRange NewTaiLue => Volatile.Read(ref _newTaiLue) ?? CreateRange(ref _newTaiLue, first: '\u1980', last: '\u19DF'); + private static UnicodeRange _newTaiLue; + + /// + /// A corresponding to the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. + /// + public static UnicodeRange KhmerSymbols => Volatile.Read(ref _khmerSymbols) ?? CreateRange(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); + private static UnicodeRange _khmerSymbols; + + /// + /// A corresponding to the 'Buginese' Unicode block (U+1A00..U+1A1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Buginese => Volatile.Read(ref _buginese) ?? CreateRange(ref _buginese, first: '\u1A00', last: '\u1A1F'); + private static UnicodeRange _buginese; + + /// + /// A corresponding to the 'Tai Tham' Unicode block (U+1A20..U+1AAF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. + /// + public static UnicodeRange TaiTham => Volatile.Read(ref _taiTham) ?? CreateRange(ref _taiTham, first: '\u1A20', last: '\u1AAF'); + private static UnicodeRange _taiTham; + + /// + /// A corresponding to the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarksExtended => Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateRange(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); + private static UnicodeRange _combiningDiacriticalMarksExtended; + + /// + /// A corresponding to the 'Balinese' Unicode block (U+1B00..U+1B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Balinese => Volatile.Read(ref _balinese) ?? CreateRange(ref _balinese, first: '\u1B00', last: '\u1B7F'); + private static UnicodeRange _balinese; + + /// + /// A corresponding to the 'Sundanese' Unicode block (U+1B80..U+1BBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Sundanese => Volatile.Read(ref _sundanese) ?? CreateRange(ref _sundanese, first: '\u1B80', last: '\u1BBF'); + private static UnicodeRange _sundanese; + + /// + /// A corresponding to the 'Batak' Unicode block (U+1BC0..U+1BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Batak => Volatile.Read(ref _batak) ?? CreateRange(ref _batak, first: '\u1BC0', last: '\u1BFF'); + private static UnicodeRange _batak; + + /// + /// A corresponding to the 'Lepcha' Unicode block (U+1C00..U+1C4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Lepcha => Volatile.Read(ref _lepcha) ?? CreateRange(ref _lepcha, first: '\u1C00', last: '\u1C4F'); + private static UnicodeRange _lepcha; + + /// + /// A corresponding to the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. + /// + public static UnicodeRange OlChiki => Volatile.Read(ref _olChiki) ?? CreateRange(ref _olChiki, first: '\u1C50', last: '\u1C7F'); + private static UnicodeRange _olChiki; + + /// + /// A corresponding to the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange SundaneseSupplement => Volatile.Read(ref _sundaneseSupplement) ?? CreateRange(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); + private static UnicodeRange _sundaneseSupplement; + + /// + /// A corresponding to the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. + /// + public static UnicodeRange VedicExtensions => Volatile.Read(ref _vedicExtensions) ?? CreateRange(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); + private static UnicodeRange _vedicExtensions; + + /// + /// A corresponding to the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. + /// + public static UnicodeRange PhoneticExtensions => Volatile.Read(ref _phoneticExtensions) ?? CreateRange(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); + private static UnicodeRange _phoneticExtensions; + + /// + /// A corresponding to the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. + /// + public static UnicodeRange PhoneticExtensionsSupplement => Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateRange(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); + private static UnicodeRange _phoneticExtensionsSupplement; + + /// + /// A corresponding to the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarksSupplement => Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateRange(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); + private static UnicodeRange _combiningDiacriticalMarksSupplement; + + /// + /// A corresponding to the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedAdditional => Volatile.Read(ref _latinExtendedAdditional) ?? CreateRange(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); + private static UnicodeRange _latinExtendedAdditional; + + /// + /// A corresponding to the 'Greek Extended' Unicode block (U+1F00..U+1FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. + /// + public static UnicodeRange GreekExtended => Volatile.Read(ref _greekExtended) ?? CreateRange(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); + private static UnicodeRange _greekExtended; + + /// + /// A corresponding to the 'General Punctuation' Unicode block (U+2000..U+206F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. + /// + public static UnicodeRange GeneralPunctuation => Volatile.Read(ref _generalPunctuation) ?? CreateRange(ref _generalPunctuation, first: '\u2000', last: '\u206F'); + private static UnicodeRange _generalPunctuation; + + /// + /// A corresponding to the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. + /// + public static UnicodeRange SuperscriptsandSubscripts => Volatile.Read(ref _superscriptsandSubscripts) ?? CreateRange(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); + private static UnicodeRange _superscriptsandSubscripts; + + /// + /// A corresponding to the 'Currency Symbols' Unicode block (U+20A0..U+20CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CurrencySymbols => Volatile.Read(ref _currencySymbols) ?? CreateRange(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); + private static UnicodeRange _currencySymbols; + + /// + /// A corresponding to the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarksforSymbols => Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateRange(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); + private static UnicodeRange _combiningDiacriticalMarksforSymbols; + + /// + /// A corresponding to the 'Letterlike Symbols' Unicode block (U+2100..U+214F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. + /// + public static UnicodeRange LetterlikeSymbols => Volatile.Read(ref _letterlikeSymbols) ?? CreateRange(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); + private static UnicodeRange _letterlikeSymbols; + + /// + /// A corresponding to the 'Number Forms' Unicode block (U+2150..U+218F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. + /// + public static UnicodeRange NumberForms => Volatile.Read(ref _numberForms) ?? CreateRange(ref _numberForms, first: '\u2150', last: '\u218F'); + private static UnicodeRange _numberForms; + + /// + /// A corresponding to the 'Arrows' Unicode block (U+2190..U+21FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. + /// + public static UnicodeRange Arrows => Volatile.Read(ref _arrows) ?? CreateRange(ref _arrows, first: '\u2190', last: '\u21FF'); + private static UnicodeRange _arrows; + + /// + /// A corresponding to the 'Mathematical Operators' Unicode block (U+2200..U+22FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. + /// + public static UnicodeRange MathematicalOperators => Volatile.Read(ref _mathematicalOperators) ?? CreateRange(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); + private static UnicodeRange _mathematicalOperators; + + /// + /// A corresponding to the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousTechnical => Volatile.Read(ref _miscellaneousTechnical) ?? CreateRange(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); + private static UnicodeRange _miscellaneousTechnical; + + /// + /// A corresponding to the 'Control Pictures' Unicode block (U+2400..U+243F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. + /// + public static UnicodeRange ControlPictures => Volatile.Read(ref _controlPictures) ?? CreateRange(ref _controlPictures, first: '\u2400', last: '\u243F'); + private static UnicodeRange _controlPictures; + + /// + /// A corresponding to the 'Optical Character Recognition' Unicode block (U+2440..U+245F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. + /// + public static UnicodeRange OpticalCharacterRecognition => Volatile.Read(ref _opticalCharacterRecognition) ?? CreateRange(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); + private static UnicodeRange _opticalCharacterRecognition; + + /// + /// A corresponding to the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. + /// + public static UnicodeRange EnclosedAlphanumerics => Volatile.Read(ref _enclosedAlphanumerics) ?? CreateRange(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); + private static UnicodeRange _enclosedAlphanumerics; + + /// + /// A corresponding to the 'Box Drawing' Unicode block (U+2500..U+257F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. + /// + public static UnicodeRange BoxDrawing => Volatile.Read(ref _boxDrawing) ?? CreateRange(ref _boxDrawing, first: '\u2500', last: '\u257F'); + private static UnicodeRange _boxDrawing; + + /// + /// A corresponding to the 'Block Elements' Unicode block (U+2580..U+259F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. + /// + public static UnicodeRange BlockElements => Volatile.Read(ref _blockElements) ?? CreateRange(ref _blockElements, first: '\u2580', last: '\u259F'); + private static UnicodeRange _blockElements; + + /// + /// A corresponding to the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange GeometricShapes => Volatile.Read(ref _geometricShapes) ?? CreateRange(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); + private static UnicodeRange _geometricShapes; + + /// + /// A corresponding to the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousSymbols => Volatile.Read(ref _miscellaneousSymbols) ?? CreateRange(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); + private static UnicodeRange _miscellaneousSymbols; + + /// + /// A corresponding to the 'Dingbats' Unicode block (U+2700..U+27BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. + /// + public static UnicodeRange Dingbats => Volatile.Read(ref _dingbats) ?? CreateRange(ref _dingbats, first: '\u2700', last: '\u27BF'); + private static UnicodeRange _dingbats; + + /// + /// A corresponding to the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousMathematicalSymbolsA => Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateRange(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); + private static UnicodeRange _miscellaneousMathematicalSymbolsA; + + /// + /// A corresponding to the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalArrowsA => Volatile.Read(ref _supplementalArrowsA) ?? CreateRange(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); + private static UnicodeRange _supplementalArrowsA; + + /// + /// A corresponding to the 'Braille Patterns' Unicode block (U+2800..U+28FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. + /// + public static UnicodeRange BraillePatterns => Volatile.Read(ref _braillePatterns) ?? CreateRange(ref _braillePatterns, first: '\u2800', last: '\u28FF'); + private static UnicodeRange _braillePatterns; + + /// + /// A corresponding to the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalArrowsB => Volatile.Read(ref _supplementalArrowsB) ?? CreateRange(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); + private static UnicodeRange _supplementalArrowsB; + + /// + /// A corresponding to the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousMathematicalSymbolsB => Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateRange(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); + private static UnicodeRange _miscellaneousMathematicalSymbolsB; + + /// + /// A corresponding to the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalMathematicalOperators => Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateRange(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); + private static UnicodeRange _supplementalMathematicalOperators; + + /// + /// A corresponding to the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousSymbolsandArrows => Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateRange(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); + private static UnicodeRange _miscellaneousSymbolsandArrows; + + /// + /// A corresponding to the 'Glagolitic' Unicode block (U+2C00..U+2C5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Glagolitic => Volatile.Read(ref _glagolitic) ?? CreateRange(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); + private static UnicodeRange _glagolitic; + + /// + /// A corresponding to the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedC => Volatile.Read(ref _latinExtendedC) ?? CreateRange(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); + private static UnicodeRange _latinExtendedC; + + /// + /// A corresponding to the 'Coptic' Unicode block (U+2C80..U+2CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Coptic => Volatile.Read(ref _coptic) ?? CreateRange(ref _coptic, first: '\u2C80', last: '\u2CFF'); + private static UnicodeRange _coptic; + + /// + /// A corresponding to the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. + /// + public static UnicodeRange GeorgianSupplement => Volatile.Read(ref _georgianSupplement) ?? CreateRange(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); + private static UnicodeRange _georgianSupplement; + + /// + /// A corresponding to the 'Tifinagh' Unicode block (U+2D30..U+2D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tifinagh => Volatile.Read(ref _tifinagh) ?? CreateRange(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); + private static UnicodeRange _tifinagh; + + /// + /// A corresponding to the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. + /// + public static UnicodeRange EthiopicExtended => Volatile.Read(ref _ethiopicExtended) ?? CreateRange(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); + private static UnicodeRange _ethiopicExtended; + + /// + /// A corresponding to the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CyrillicExtendedA => Volatile.Read(ref _cyrillicExtendedA) ?? CreateRange(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); + private static UnicodeRange _cyrillicExtendedA; + + /// + /// A corresponding to the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalPunctuation => Volatile.Read(ref _supplementalPunctuation) ?? CreateRange(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); + private static UnicodeRange _supplementalPunctuation; + + /// + /// A corresponding to the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKRadicalsSupplement => Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateRange(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); + private static UnicodeRange _cjkRadicalsSupplement; + + /// + /// A corresponding to the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. + /// + public static UnicodeRange KangxiRadicals => Volatile.Read(ref _kangxiRadicals) ?? CreateRange(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); + private static UnicodeRange _kangxiRadicals; + + /// + /// A corresponding to the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. + /// + public static UnicodeRange IdeographicDescriptionCharacters => Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateRange(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); + private static UnicodeRange _ideographicDescriptionCharacters; + + /// + /// A corresponding to the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKSymbolsandPunctuation => Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateRange(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); + private static UnicodeRange _cjkSymbolsandPunctuation; + + /// + /// A corresponding to the 'Hiragana' Unicode block (U+3040..U+309F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. + /// + public static UnicodeRange Hiragana => Volatile.Read(ref _hiragana) ?? CreateRange(ref _hiragana, first: '\u3040', last: '\u309F'); + private static UnicodeRange _hiragana; + + /// + /// A corresponding to the 'Katakana' Unicode block (U+30A0..U+30FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Katakana => Volatile.Read(ref _katakana) ?? CreateRange(ref _katakana, first: '\u30A0', last: '\u30FF'); + private static UnicodeRange _katakana; + + /// + /// A corresponding to the 'Bopomofo' Unicode block (U+3100..U+312F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. + /// + public static UnicodeRange Bopomofo => Volatile.Read(ref _bopomofo) ?? CreateRange(ref _bopomofo, first: '\u3100', last: '\u312F'); + private static UnicodeRange _bopomofo; + + /// + /// A corresponding to the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulCompatibilityJamo => Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateRange(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); + private static UnicodeRange _hangulCompatibilityJamo; + + /// + /// A corresponding to the 'Kanbun' Unicode block (U+3190..U+319F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. + /// + public static UnicodeRange Kanbun => Volatile.Read(ref _kanbun) ?? CreateRange(ref _kanbun, first: '\u3190', last: '\u319F'); + private static UnicodeRange _kanbun; + + /// + /// A corresponding to the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange BopomofoExtended => Volatile.Read(ref _bopomofoExtended) ?? CreateRange(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); + private static UnicodeRange _bopomofoExtended; + + /// + /// A corresponding to the 'CJK Strokes' Unicode block (U+31C0..U+31EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKStrokes => Volatile.Read(ref _cjkStrokes) ?? CreateRange(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); + private static UnicodeRange _cjkStrokes; + + /// + /// A corresponding to the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. + /// + public static UnicodeRange KatakanaPhoneticExtensions => Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateRange(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); + private static UnicodeRange _katakanaPhoneticExtensions; + + /// + /// A corresponding to the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. + /// + public static UnicodeRange EnclosedCJKLettersandMonths => Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateRange(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); + private static UnicodeRange _enclosedCJKLettersandMonths; + + /// + /// A corresponding to the 'CJK Compatibility' Unicode block (U+3300..U+33FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKCompatibility => Volatile.Read(ref _cjkCompatibility) ?? CreateRange(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); + private static UnicodeRange _cjkCompatibility; + + /// + /// A corresponding to the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKUnifiedIdeographsExtensionA => Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateRange(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); + private static UnicodeRange _cjkUnifiedIdeographsExtensionA; + + /// + /// A corresponding to the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange YijingHexagramSymbols => Volatile.Read(ref _yijingHexagramSymbols) ?? CreateRange(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); + private static UnicodeRange _yijingHexagramSymbols; + + /// + /// A corresponding to the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKUnifiedIdeographs => Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateRange(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); + private static UnicodeRange _cjkUnifiedIdeographs; + + /// + /// A corresponding to the 'Yi Syllables' Unicode block (U+A000..U+A48F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. + /// + public static UnicodeRange YiSyllables => Volatile.Read(ref _yiSyllables) ?? CreateRange(ref _yiSyllables, first: '\uA000', last: '\uA48F'); + private static UnicodeRange _yiSyllables; + + /// + /// A corresponding to the 'Yi Radicals' Unicode block (U+A490..U+A4CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. + /// + public static UnicodeRange YiRadicals => Volatile.Read(ref _yiRadicals) ?? CreateRange(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); + private static UnicodeRange _yiRadicals; + + /// + /// A corresponding to the 'Lisu' Unicode block (U+A4D0..U+A4FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Lisu => Volatile.Read(ref _lisu) ?? CreateRange(ref _lisu, first: '\uA4D0', last: '\uA4FF'); + private static UnicodeRange _lisu; + + /// + /// A corresponding to the 'Vai' Unicode block (U+A500..U+A63F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. + /// + public static UnicodeRange Vai => Volatile.Read(ref _vai) ?? CreateRange(ref _vai, first: '\uA500', last: '\uA63F'); + private static UnicodeRange _vai; + + /// + /// A corresponding to the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. + /// + public static UnicodeRange CyrillicExtendedB => Volatile.Read(ref _cyrillicExtendedB) ?? CreateRange(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); + private static UnicodeRange _cyrillicExtendedB; + + /// + /// A corresponding to the 'Bamum' Unicode block (U+A6A0..U+A6FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Bamum => Volatile.Read(ref _bamum) ?? CreateRange(ref _bamum, first: '\uA6A0', last: '\uA6FF'); + private static UnicodeRange _bamum; + + /// + /// A corresponding to the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. + /// + public static UnicodeRange ModifierToneLetters => Volatile.Read(ref _modifierToneLetters) ?? CreateRange(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); + private static UnicodeRange _modifierToneLetters; + + /// + /// A corresponding to the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedD => Volatile.Read(ref _latinExtendedD) ?? CreateRange(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); + private static UnicodeRange _latinExtendedD; + + /// + /// A corresponding to the 'Syloti Nagri' Unicode block (U+A800..U+A82F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. + /// + public static UnicodeRange SylotiNagri => Volatile.Read(ref _sylotiNagri) ?? CreateRange(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); + private static UnicodeRange _sylotiNagri; + + /// + /// A corresponding to the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. + /// + public static UnicodeRange CommonIndicNumberForms => Volatile.Read(ref _commonIndicNumberForms) ?? CreateRange(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); + private static UnicodeRange _commonIndicNumberForms; + + /// + /// A corresponding to the 'Phags-pa' Unicode block (U+A840..U+A87F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. + /// + public static UnicodeRange Phagspa => Volatile.Read(ref _phagspa) ?? CreateRange(ref _phagspa, first: '\uA840', last: '\uA87F'); + private static UnicodeRange _phagspa; + + /// + /// A corresponding to the 'Saurashtra' Unicode block (U+A880..U+A8DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. + /// + public static UnicodeRange Saurashtra => Volatile.Read(ref _saurashtra) ?? CreateRange(ref _saurashtra, first: '\uA880', last: '\uA8DF'); + private static UnicodeRange _saurashtra; + + /// + /// A corresponding to the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. + /// + public static UnicodeRange DevanagariExtended => Volatile.Read(ref _devanagariExtended) ?? CreateRange(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); + private static UnicodeRange _devanagariExtended; + + /// + /// A corresponding to the 'Kayah Li' Unicode block (U+A900..U+A92F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. + /// + public static UnicodeRange KayahLi => Volatile.Read(ref _kayahLi) ?? CreateRange(ref _kayahLi, first: '\uA900', last: '\uA92F'); + private static UnicodeRange _kayahLi; + + /// + /// A corresponding to the 'Rejang' Unicode block (U+A930..U+A95F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. + /// + public static UnicodeRange Rejang => Volatile.Read(ref _rejang) ?? CreateRange(ref _rejang, first: '\uA930', last: '\uA95F'); + private static UnicodeRange _rejang; + + /// + /// A corresponding to the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulJamoExtendedA => Volatile.Read(ref _hangulJamoExtendedA) ?? CreateRange(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); + private static UnicodeRange _hangulJamoExtendedA; + + /// + /// A corresponding to the 'Javanese' Unicode block (U+A980..U+A9DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. + /// + public static UnicodeRange Javanese => Volatile.Read(ref _javanese) ?? CreateRange(ref _javanese, first: '\uA980', last: '\uA9DF'); + private static UnicodeRange _javanese; + + /// + /// A corresponding to the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MyanmarExtendedB => Volatile.Read(ref _myanmarExtendedB) ?? CreateRange(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); + private static UnicodeRange _myanmarExtendedB; + + /// + /// A corresponding to the 'Cham' Unicode block (U+AA00..U+AA5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Cham => Volatile.Read(ref _cham) ?? CreateRange(ref _cham, first: '\uAA00', last: '\uAA5F'); + private static UnicodeRange _cham; + + /// + /// A corresponding to the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. + /// + public static UnicodeRange MyanmarExtendedA => Volatile.Read(ref _myanmarExtendedA) ?? CreateRange(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); + private static UnicodeRange _myanmarExtendedA; + + /// + /// A corresponding to the 'Tai Viet' Unicode block (U+AA80..U+AADF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. + /// + public static UnicodeRange TaiViet => Volatile.Read(ref _taiViet) ?? CreateRange(ref _taiViet, first: '\uAA80', last: '\uAADF'); + private static UnicodeRange _taiViet; + + /// + /// A corresponding to the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MeeteiMayekExtensions => Volatile.Read(ref _meeteiMayekExtensions) ?? CreateRange(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); + private static UnicodeRange _meeteiMayekExtensions; + + /// + /// A corresponding to the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. + /// + public static UnicodeRange EthiopicExtendedA => Volatile.Read(ref _ethiopicExtendedA) ?? CreateRange(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); + private static UnicodeRange _ethiopicExtendedA; + + /// + /// A corresponding to the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedE => Volatile.Read(ref _latinExtendedE) ?? CreateRange(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); + private static UnicodeRange _latinExtendedE; + + /// + /// A corresponding to the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MeeteiMayek => Volatile.Read(ref _meeteiMayek) ?? CreateRange(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); + private static UnicodeRange _meeteiMayek; + + /// + /// A corresponding to the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulSyllables => Volatile.Read(ref _hangulSyllables) ?? CreateRange(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); + private static UnicodeRange _hangulSyllables; + + /// + /// A corresponding to the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulJamoExtendedB => Volatile.Read(ref _hangulJamoExtendedB) ?? CreateRange(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); + private static UnicodeRange _hangulJamoExtendedB; + + /// + /// A corresponding to the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKCompatibilityIdeographs => Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateRange(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); + private static UnicodeRange _cjkCompatibilityIdeographs; + + /// + /// A corresponding to the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. + /// + public static UnicodeRange AlphabeticPresentationForms => Volatile.Read(ref _alphabeticPresentationForms) ?? CreateRange(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); + private static UnicodeRange _alphabeticPresentationForms; + + /// + /// A corresponding to the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicPresentationFormsA => Volatile.Read(ref _arabicPresentationFormsA) ?? CreateRange(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); + private static UnicodeRange _arabicPresentationFormsA; + + /// + /// A corresponding to the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. + /// + public static UnicodeRange VariationSelectors => Volatile.Read(ref _variationSelectors) ?? CreateRange(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); + private static UnicodeRange _variationSelectors; + + /// + /// A corresponding to the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. + /// + public static UnicodeRange VerticalForms => Volatile.Read(ref _verticalForms) ?? CreateRange(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); + private static UnicodeRange _verticalForms; + + /// + /// A corresponding to the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningHalfMarks => Volatile.Read(ref _combiningHalfMarks) ?? CreateRange(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); + private static UnicodeRange _combiningHalfMarks; + + /// + /// A corresponding to the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKCompatibilityForms => Volatile.Read(ref _cjkCompatibilityForms) ?? CreateRange(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); + private static UnicodeRange _cjkCompatibilityForms; + + /// + /// A corresponding to the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. + /// + public static UnicodeRange SmallFormVariants => Volatile.Read(ref _smallFormVariants) ?? CreateRange(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); + private static UnicodeRange _smallFormVariants; + + /// + /// A corresponding to the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicPresentationFormsB => Volatile.Read(ref _arabicPresentationFormsB) ?? CreateRange(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); + private static UnicodeRange _arabicPresentationFormsB; + + /// + /// A corresponding to the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. + /// + public static UnicodeRange HalfwidthandFullwidthForms => Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateRange(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); + private static UnicodeRange _halfwidthandFullwidthForms; + + /// + /// A corresponding to the 'Specials' Unicode block (U+FFF0..U+FFFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Specials => Volatile.Read(ref _specials) ?? CreateRange(ref _specials, first: '\uFFF0', last: '\uFFFF'); + private static UnicodeRange _specials; + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 4497939c71..90f1bf2abc 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -26,7 +26,7 @@ namespace Microsoft.Framework.WebEncoders private readonly UrlUnicodeEncoder _innerUnicodeEncoder; /// - /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// Instantiates an encoder using as its allow list. /// public UrlEncoder() : this(UrlUnicodeEncoder.BasicLatin) @@ -34,11 +34,11 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// Instantiates an encoder specifying which Unicode character ranges are allowed to /// pass through the encoder unescaped. /// - public UrlEncoder(params UnicodeBlock[] allowedBlocks) - : this(new UrlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + public UrlEncoder(params UnicodeRange[] allowedRanges) + : this(new UrlUnicodeEncoder(new CodePointFilter(allowedRanges))) { } @@ -57,8 +57,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// A default instance of the UrlEncoder, equivalent to allowing only - /// the 'Basic Latin' character range. + /// The default which uses as its allow list. /// public static UrlEncoder Default { @@ -133,8 +132,8 @@ namespace Microsoft.Framework.WebEncoders // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" // / "*" / "+" / "," / ";" / "=" // - // From this list, the base encoder blocks "&", "'", "+", - // and we'll additionally block "=" since it has special meaning + // From this list, the base encoder forbids "&", "'", "+", + // and we'll additionally forbid "=" since it has special meaning // in x-www-form-urlencoded representations. // // This means that the full list of allowed characters from the @@ -163,7 +162,7 @@ namespace Microsoft.Framework.WebEncoders UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); + encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs index e2fdf8dd7b..d8de51865d 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -43,7 +43,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_OtherCodePointFilterAsConcreteType_Clones() { // Arrange - var originalFilter = new CodePointFilter(UnicodeBlocks.None).AllowChar('x'); + var originalFilter = new CodePointFilter().AllowChar('x'); // Act var newFilter = new CodePointFilter(originalFilter).AllowChar('y'); @@ -56,10 +56,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_UnicodeBlocks() + public void Ctor_UnicodeRanges() { // Act - var filter = new CodePointFilter(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); + var filter = new CodePointFilter(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); // Assert for (int i = 0; i < 0x0100; i++) @@ -84,64 +84,6 @@ namespace Microsoft.Framework.WebEncoders } } - [Fact] - public void AllowBlock() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None); - - // Act - var retVal = filter.AllowBlock(UnicodeBlocks.LatinExtendedA); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowBlocks() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None); - - // Act - var retVal = filter.AllowBlocks(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i < 0x2C60; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C60; i <= 0x2C7F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C80; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - [Fact] public void AllowChar() { @@ -195,7 +137,7 @@ namespace Microsoft.Framework.WebEncoders public void AllowFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); // Act var retVal = filter.AllowFilter(new OddCodePointFilter()); @@ -212,6 +154,64 @@ namespace Microsoft.Framework.WebEncoders } } + [Fact] + public void AllowRange() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowRange(UnicodeRanges.LatinExtendedA); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowRanges() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowRanges(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i < 0x2C60; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C60; i <= 0x2C7F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C80; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + [Fact] public void Clear() { @@ -234,13 +234,64 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void ForbidBlock() + public void ForbidChar() + { + // Arrange + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); + + // Act + var retVal = filter.ForbidChar('x'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.True(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_Array() + { + // Arrange + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); + + // Act + var retVal = filter.ForbidChars('x', 'z'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_String() + { + // Arrange + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); + + // Act + var retVal = filter.ForbidChars("xz"); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidRange() { // Arrange var filter = new CodePointFilter(new OddCodePointFilter()); // Act - var retVal = filter.ForbidBlock(UnicodeBlocks.Specials); + var retVal = filter.ForbidRange(UnicodeRanges.Specials); // Assert Assert.Same(filter, retVal); // returns 'this' instance @@ -255,13 +306,13 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void ForbidBlocks() + public void ForbidRanges() { // Arrange var filter = new CodePointFilter(new OddCodePointFilter()); // Act - var retVal = filter.ForbidBlocks(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + var retVal = filter.ForbidRanges(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); // Assert Assert.Same(filter, retVal); // returns 'this' instance @@ -279,68 +330,17 @@ namespace Microsoft.Framework.WebEncoders } } - [Fact] - public void ForbidChar() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); - - // Act - var retVal = filter.ForbidChar('x'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.True(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_Array() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); - - // Act - var retVal = filter.ForbidChars('x', 'z'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_String() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); - - // Act - var retVal = filter.ForbidChars("xz"); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - [Fact] public void GetAllowedCodePoints() { // Arrange - var expected = Enumerable.Range(UnicodeBlocks.BasicLatin.FirstCodePoint, UnicodeBlocks.BasicLatin.BlockSize) - .Concat(Enumerable.Range(UnicodeBlocks.Specials.FirstCodePoint, UnicodeBlocks.Specials.BlockSize)) + var expected = Enumerable.Range(UnicodeRanges.BasicLatin.FirstCodePoint, UnicodeRanges.BasicLatin.RangeSize) + .Concat(Enumerable.Range(UnicodeRanges.Specials.FirstCodePoint, UnicodeRanges.Specials.RangeSize)) .Except(new int[] { 'x' }) .OrderBy(i => i) .ToArray(); - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + var filter = new CodePointFilter(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); filter.ForbidChar('x'); // Act diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs index d4351a169e..8c5cfd83ac 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -19,7 +19,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_PositiveTestCase() { // Arrange - IHtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + IHtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); StringWriter writer = new StringWriter(); // Act @@ -39,7 +39,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_PositiveTestCase() { // Arrange - IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); StringWriter writer = new StringWriter(); // Act @@ -59,7 +59,7 @@ namespace Microsoft.Framework.WebEncoders public void UrlEncode_PositiveTestCase() { // Arrange - IUrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + IUrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); StringWriter writer = new StringWriter(); // Act diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs index 6da944dc07..ee0c3231d9 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCodePointFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); HtmlEncoder encoder = new HtmlEncoder(filter); // Act & assert @@ -28,10 +28,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); // Act & assert Assert.Equal("a", encoder.HtmlEncode("a")); @@ -55,7 +55,7 @@ namespace Microsoft.Framework.WebEncoders public void Default_EquivalentToBasicLatin() { // Arrange - HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeBlocks.BasicLatin); + HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeRanges.BasicLatin); HtmlEncoder testEncoder = HtmlEncoder.Default; // Act & assert @@ -90,7 +90,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // Act string retVal = encoder.HtmlEncode(input); @@ -103,7 +103,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -165,7 +165,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); // allow all codepoints + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs index 470a5b2311..dbb9f91e68 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCodePointFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(filter); // Act & assert @@ -28,10 +28,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); // Act & assert Assert.Equal(@"\u0061", encoder.JavaScriptStringEncode("a")); @@ -55,7 +55,7 @@ namespace Microsoft.Framework.WebEncoders public void Default_EquivalentToBasicLatin() { // Arrange - JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeBlocks.BasicLatin); + JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeRanges.BasicLatin); JavaScriptStringEncoder testEncoder = JavaScriptStringEncoder.Default; // Act & assert @@ -97,7 +97,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // Act string retVal = encoder.JavaScriptStringEncode(input); @@ -110,7 +110,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -183,7 +183,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); // allow all codepoints + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; @@ -290,7 +290,7 @@ namespace Microsoft.Framework.WebEncoders // \u-escape these characters instead of using \' and \". // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // Act string retVal = encoder.JavaScriptStringEncode(input); @@ -306,8 +306,8 @@ namespace Microsoft.Framework.WebEncoders // by never emitting HTML-sensitive characters unescaped. // Arrange - JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeBlocks.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeRanges.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); // Act & assert for (int i = 0; i <= 0x10FFFF; i++) diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs deleted file mode 100644 index 5dee8d76bb..0000000000 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using Xunit; - -namespace Microsoft.Framework.WebEncoders -{ - public class UnicodeBlockTests - { - [Theory] - [InlineData(-1, 16)] - [InlineData(1, 16)] - [InlineData(0x10000, 16)] - public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int blockSize) - { - var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); - Assert.Equal("firstCodePoint", ex.ParamName); - } - - [Theory] - [InlineData(0x0100, -1)] - [InlineData(0x0100, 15)] - [InlineData(0x0100, 0x10000)] - public void Ctor_FailureCase_BlockSize(int firstCodePoint, int blockSize) - { - var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); - Assert.Equal("blockSize", ex.ParamName); - } - - [Fact] - public void Ctor_SuccessCase() - { - // Act - var block = new UnicodeBlock(0x0100, 128); // Latin Extended-A - - // Assert - Assert.Equal(0x0100, block.FirstCodePoint); - Assert.Equal(128, block.BlockSize); - } - - [Theory] - [InlineData('\u0001', '\u0002')] - public void FromCharacterRange_FailureCases_FirstChar(char firstChar, char lastChar) - { - var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); - Assert.Equal("firstChar", ex.ParamName); - } - - [Theory] - [InlineData('\u0100', '\u007F')] - [InlineData('\u0100', '\u0100')] - [InlineData('\u0100', '\u010E')] - public void FromCharacterRange_FailureCases_LastChar(char firstChar, char lastChar) - { - var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); - Assert.Equal("lastChar", ex.ParamName); - } - - [Fact] - public void FromCharacterRange_SuccessCase() - { - // Act - var block = UnicodeBlock.FromCharacterRange('\u0180', '\u024F'); // Latin Extended-B - - // Assert - Assert.Equal(0x0180, block.FirstCodePoint); - Assert.Equal(208, block.BlockSize); - } - - [Fact] - public void FromCharacterRange_SuccessCase_All() - { - // Act - var block = UnicodeBlock.FromCharacterRange('\u0000', '\uFFFF'); - - // Assert - Assert.Equal(0, block.FirstCodePoint); - Assert.Equal(0x10000, block.BlockSize); - } - } -} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs deleted file mode 100644 index c4eb4591e3..0000000000 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Reflection; -using Xunit; - -namespace Microsoft.Framework.WebEncoders -{ - public class UnicodeBlocksTests - { - [Fact] - public void Block_None() - { - UnicodeBlock block = UnicodeBlocks.None; - Assert.NotNull(block); - - // Test 1: the block should be empty - Assert.Equal(0, block.FirstCodePoint); - Assert.Equal(0, block.BlockSize); - - // Test 2: calling the property multiple times should cache and return the same block instance - UnicodeBlock block2 = UnicodeBlocks.None; - Assert.Same(block, block2); - } - - [Fact] - public void Block_All() - { - Block_Unicode('\u0000', '\uFFFF', nameof(UnicodeBlocks.All)); - } - - [Theory] - [InlineData('\u0000', '\u007F', nameof(UnicodeBlocks.BasicLatin))] - [InlineData('\u0080', '\u00FF', nameof(UnicodeBlocks.Latin1Supplement))] - [InlineData('\u0100', '\u017F', nameof(UnicodeBlocks.LatinExtendedA))] - [InlineData('\u0180', '\u024F', nameof(UnicodeBlocks.LatinExtendedB))] - [InlineData('\u0250', '\u02AF', nameof(UnicodeBlocks.IPAExtensions))] - [InlineData('\u02B0', '\u02FF', nameof(UnicodeBlocks.SpacingModifierLetters))] - [InlineData('\u0300', '\u036F', nameof(UnicodeBlocks.CombiningDiacriticalMarks))] - [InlineData('\u0370', '\u03FF', nameof(UnicodeBlocks.GreekandCoptic))] - [InlineData('\u0400', '\u04FF', nameof(UnicodeBlocks.Cyrillic))] - [InlineData('\u0500', '\u052F', nameof(UnicodeBlocks.CyrillicSupplement))] - [InlineData('\u0530', '\u058F', nameof(UnicodeBlocks.Armenian))] - [InlineData('\u0590', '\u05FF', nameof(UnicodeBlocks.Hebrew))] - [InlineData('\u0600', '\u06FF', nameof(UnicodeBlocks.Arabic))] - [InlineData('\u0700', '\u074F', nameof(UnicodeBlocks.Syriac))] - [InlineData('\u0750', '\u077F', nameof(UnicodeBlocks.ArabicSupplement))] - [InlineData('\u0780', '\u07BF', nameof(UnicodeBlocks.Thaana))] - [InlineData('\u07C0', '\u07FF', nameof(UnicodeBlocks.NKo))] - [InlineData('\u0800', '\u083F', nameof(UnicodeBlocks.Samaritan))] - [InlineData('\u0840', '\u085F', nameof(UnicodeBlocks.Mandaic))] - [InlineData('\u08A0', '\u08FF', nameof(UnicodeBlocks.ArabicExtendedA))] - [InlineData('\u0900', '\u097F', nameof(UnicodeBlocks.Devanagari))] - [InlineData('\u0980', '\u09FF', nameof(UnicodeBlocks.Bengali))] - [InlineData('\u0A00', '\u0A7F', nameof(UnicodeBlocks.Gurmukhi))] - [InlineData('\u0A80', '\u0AFF', nameof(UnicodeBlocks.Gujarati))] - [InlineData('\u0B00', '\u0B7F', nameof(UnicodeBlocks.Oriya))] - [InlineData('\u0B80', '\u0BFF', nameof(UnicodeBlocks.Tamil))] - [InlineData('\u0C00', '\u0C7F', nameof(UnicodeBlocks.Telugu))] - [InlineData('\u0C80', '\u0CFF', nameof(UnicodeBlocks.Kannada))] - [InlineData('\u0D00', '\u0D7F', nameof(UnicodeBlocks.Malayalam))] - [InlineData('\u0D80', '\u0DFF', nameof(UnicodeBlocks.Sinhala))] - [InlineData('\u0E00', '\u0E7F', nameof(UnicodeBlocks.Thai))] - [InlineData('\u0E80', '\u0EFF', nameof(UnicodeBlocks.Lao))] - [InlineData('\u0F00', '\u0FFF', nameof(UnicodeBlocks.Tibetan))] - [InlineData('\u1000', '\u109F', nameof(UnicodeBlocks.Myanmar))] - [InlineData('\u10A0', '\u10FF', nameof(UnicodeBlocks.Georgian))] - [InlineData('\u1100', '\u11FF', nameof(UnicodeBlocks.HangulJamo))] - [InlineData('\u1200', '\u137F', nameof(UnicodeBlocks.Ethiopic))] - [InlineData('\u1380', '\u139F', nameof(UnicodeBlocks.EthiopicSupplement))] - [InlineData('\u13A0', '\u13FF', nameof(UnicodeBlocks.Cherokee))] - [InlineData('\u1400', '\u167F', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabics))] - [InlineData('\u1680', '\u169F', nameof(UnicodeBlocks.Ogham))] - [InlineData('\u16A0', '\u16FF', nameof(UnicodeBlocks.Runic))] - [InlineData('\u1700', '\u171F', nameof(UnicodeBlocks.Tagalog))] - [InlineData('\u1720', '\u173F', nameof(UnicodeBlocks.Hanunoo))] - [InlineData('\u1740', '\u175F', nameof(UnicodeBlocks.Buhid))] - [InlineData('\u1760', '\u177F', nameof(UnicodeBlocks.Tagbanwa))] - [InlineData('\u1780', '\u17FF', nameof(UnicodeBlocks.Khmer))] - [InlineData('\u1800', '\u18AF', nameof(UnicodeBlocks.Mongolian))] - [InlineData('\u18B0', '\u18FF', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabicsExtended))] - [InlineData('\u1900', '\u194F', nameof(UnicodeBlocks.Limbu))] - [InlineData('\u1950', '\u197F', nameof(UnicodeBlocks.TaiLe))] - [InlineData('\u1980', '\u19DF', nameof(UnicodeBlocks.NewTaiLue))] - [InlineData('\u19E0', '\u19FF', nameof(UnicodeBlocks.KhmerSymbols))] - [InlineData('\u1A00', '\u1A1F', nameof(UnicodeBlocks.Buginese))] - [InlineData('\u1A20', '\u1AAF', nameof(UnicodeBlocks.TaiTham))] - [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksExtended))] - [InlineData('\u1B00', '\u1B7F', nameof(UnicodeBlocks.Balinese))] - [InlineData('\u1B80', '\u1BBF', nameof(UnicodeBlocks.Sundanese))] - [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeBlocks.Batak))] - [InlineData('\u1C00', '\u1C4F', nameof(UnicodeBlocks.Lepcha))] - [InlineData('\u1C50', '\u1C7F', nameof(UnicodeBlocks.OlChiki))] - [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeBlocks.SundaneseSupplement))] - [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeBlocks.VedicExtensions))] - [InlineData('\u1D00', '\u1D7F', nameof(UnicodeBlocks.PhoneticExtensions))] - [InlineData('\u1D80', '\u1DBF', nameof(UnicodeBlocks.PhoneticExtensionsSupplement))] - [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksSupplement))] - [InlineData('\u1E00', '\u1EFF', nameof(UnicodeBlocks.LatinExtendedAdditional))] - [InlineData('\u1F00', '\u1FFF', nameof(UnicodeBlocks.GreekExtended))] - [InlineData('\u2000', '\u206F', nameof(UnicodeBlocks.GeneralPunctuation))] - [InlineData('\u2070', '\u209F', nameof(UnicodeBlocks.SuperscriptsandSubscripts))] - [InlineData('\u20A0', '\u20CF', nameof(UnicodeBlocks.CurrencySymbols))] - [InlineData('\u20D0', '\u20FF', nameof(UnicodeBlocks.CombiningDiacriticalMarksforSymbols))] - [InlineData('\u2100', '\u214F', nameof(UnicodeBlocks.LetterlikeSymbols))] - [InlineData('\u2150', '\u218F', nameof(UnicodeBlocks.NumberForms))] - [InlineData('\u2190', '\u21FF', nameof(UnicodeBlocks.Arrows))] - [InlineData('\u2200', '\u22FF', nameof(UnicodeBlocks.MathematicalOperators))] - [InlineData('\u2300', '\u23FF', nameof(UnicodeBlocks.MiscellaneousTechnical))] - [InlineData('\u2400', '\u243F', nameof(UnicodeBlocks.ControlPictures))] - [InlineData('\u2440', '\u245F', nameof(UnicodeBlocks.OpticalCharacterRecognition))] - [InlineData('\u2460', '\u24FF', nameof(UnicodeBlocks.EnclosedAlphanumerics))] - [InlineData('\u2500', '\u257F', nameof(UnicodeBlocks.BoxDrawing))] - [InlineData('\u2580', '\u259F', nameof(UnicodeBlocks.BlockElements))] - [InlineData('\u25A0', '\u25FF', nameof(UnicodeBlocks.GeometricShapes))] - [InlineData('\u2600', '\u26FF', nameof(UnicodeBlocks.MiscellaneousSymbols))] - [InlineData('\u2700', '\u27BF', nameof(UnicodeBlocks.Dingbats))] - [InlineData('\u27C0', '\u27EF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsA))] - [InlineData('\u27F0', '\u27FF', nameof(UnicodeBlocks.SupplementalArrowsA))] - [InlineData('\u2800', '\u28FF', nameof(UnicodeBlocks.BraillePatterns))] - [InlineData('\u2900', '\u297F', nameof(UnicodeBlocks.SupplementalArrowsB))] - [InlineData('\u2980', '\u29FF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsB))] - [InlineData('\u2A00', '\u2AFF', nameof(UnicodeBlocks.SupplementalMathematicalOperators))] - [InlineData('\u2B00', '\u2BFF', nameof(UnicodeBlocks.MiscellaneousSymbolsandArrows))] - [InlineData('\u2C00', '\u2C5F', nameof(UnicodeBlocks.Glagolitic))] - [InlineData('\u2C60', '\u2C7F', nameof(UnicodeBlocks.LatinExtendedC))] - [InlineData('\u2C80', '\u2CFF', nameof(UnicodeBlocks.Coptic))] - [InlineData('\u2D00', '\u2D2F', nameof(UnicodeBlocks.GeorgianSupplement))] - [InlineData('\u2D30', '\u2D7F', nameof(UnicodeBlocks.Tifinagh))] - [InlineData('\u2D80', '\u2DDF', nameof(UnicodeBlocks.EthiopicExtended))] - [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeBlocks.CyrillicExtendedA))] - [InlineData('\u2E00', '\u2E7F', nameof(UnicodeBlocks.SupplementalPunctuation))] - [InlineData('\u2E80', '\u2EFF', nameof(UnicodeBlocks.CJKRadicalsSupplement))] - [InlineData('\u2F00', '\u2FDF', nameof(UnicodeBlocks.KangxiRadicals))] - [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeBlocks.IdeographicDescriptionCharacters))] - [InlineData('\u3000', '\u303F', nameof(UnicodeBlocks.CJKSymbolsandPunctuation))] - [InlineData('\u3040', '\u309F', nameof(UnicodeBlocks.Hiragana))] - [InlineData('\u30A0', '\u30FF', nameof(UnicodeBlocks.Katakana))] - [InlineData('\u3100', '\u312F', nameof(UnicodeBlocks.Bopomofo))] - [InlineData('\u3130', '\u318F', nameof(UnicodeBlocks.HangulCompatibilityJamo))] - [InlineData('\u3190', '\u319F', nameof(UnicodeBlocks.Kanbun))] - [InlineData('\u31A0', '\u31BF', nameof(UnicodeBlocks.BopomofoExtended))] - [InlineData('\u31C0', '\u31EF', nameof(UnicodeBlocks.CJKStrokes))] - [InlineData('\u31F0', '\u31FF', nameof(UnicodeBlocks.KatakanaPhoneticExtensions))] - [InlineData('\u3200', '\u32FF', nameof(UnicodeBlocks.EnclosedCJKLettersandMonths))] - [InlineData('\u3300', '\u33FF', nameof(UnicodeBlocks.CJKCompatibility))] - [InlineData('\u3400', '\u4DBF', nameof(UnicodeBlocks.CJKUnifiedIdeographsExtensionA))] - [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeBlocks.YijingHexagramSymbols))] - [InlineData('\u4E00', '\u9FFF', nameof(UnicodeBlocks.CJKUnifiedIdeographs))] - [InlineData('\uA000', '\uA48F', nameof(UnicodeBlocks.YiSyllables))] - [InlineData('\uA490', '\uA4CF', nameof(UnicodeBlocks.YiRadicals))] - [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeBlocks.Lisu))] - [InlineData('\uA500', '\uA63F', nameof(UnicodeBlocks.Vai))] - [InlineData('\uA640', '\uA69F', nameof(UnicodeBlocks.CyrillicExtendedB))] - [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeBlocks.Bamum))] - [InlineData('\uA700', '\uA71F', nameof(UnicodeBlocks.ModifierToneLetters))] - [InlineData('\uA720', '\uA7FF', nameof(UnicodeBlocks.LatinExtendedD))] - [InlineData('\uA800', '\uA82F', nameof(UnicodeBlocks.SylotiNagri))] - [InlineData('\uA830', '\uA83F', nameof(UnicodeBlocks.CommonIndicNumberForms))] - [InlineData('\uA840', '\uA87F', nameof(UnicodeBlocks.Phagspa))] - [InlineData('\uA880', '\uA8DF', nameof(UnicodeBlocks.Saurashtra))] - [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeBlocks.DevanagariExtended))] - [InlineData('\uA900', '\uA92F', nameof(UnicodeBlocks.KayahLi))] - [InlineData('\uA930', '\uA95F', nameof(UnicodeBlocks.Rejang))] - [InlineData('\uA960', '\uA97F', nameof(UnicodeBlocks.HangulJamoExtendedA))] - [InlineData('\uA980', '\uA9DF', nameof(UnicodeBlocks.Javanese))] - [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeBlocks.MyanmarExtendedB))] - [InlineData('\uAA00', '\uAA5F', nameof(UnicodeBlocks.Cham))] - [InlineData('\uAA60', '\uAA7F', nameof(UnicodeBlocks.MyanmarExtendedA))] - [InlineData('\uAA80', '\uAADF', nameof(UnicodeBlocks.TaiViet))] - [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeBlocks.MeeteiMayekExtensions))] - [InlineData('\uAB00', '\uAB2F', nameof(UnicodeBlocks.EthiopicExtendedA))] - [InlineData('\uAB30', '\uAB6F', nameof(UnicodeBlocks.LatinExtendedE))] - [InlineData('\uABC0', '\uABFF', nameof(UnicodeBlocks.MeeteiMayek))] - [InlineData('\uAC00', '\uD7AF', nameof(UnicodeBlocks.HangulSyllables))] - [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeBlocks.HangulJamoExtendedB))] - [InlineData('\uF900', '\uFAFF', nameof(UnicodeBlocks.CJKCompatibilityIdeographs))] - [InlineData('\uFB00', '\uFB4F', nameof(UnicodeBlocks.AlphabeticPresentationForms))] - [InlineData('\uFB50', '\uFDFF', nameof(UnicodeBlocks.ArabicPresentationFormsA))] - [InlineData('\uFE00', '\uFE0F', nameof(UnicodeBlocks.VariationSelectors))] - [InlineData('\uFE10', '\uFE1F', nameof(UnicodeBlocks.VerticalForms))] - [InlineData('\uFE20', '\uFE2F', nameof(UnicodeBlocks.CombiningHalfMarks))] - [InlineData('\uFE30', '\uFE4F', nameof(UnicodeBlocks.CJKCompatibilityForms))] - [InlineData('\uFE50', '\uFE6F', nameof(UnicodeBlocks.SmallFormVariants))] - [InlineData('\uFE70', '\uFEFF', nameof(UnicodeBlocks.ArabicPresentationFormsB))] - [InlineData('\uFF00', '\uFFEF', nameof(UnicodeBlocks.HalfwidthandFullwidthForms))] - [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeBlocks.Specials))] - public void Block_Unicode(char first, char last, string blockName) - { - Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 - Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF - Assert.True(first < last); // code point ranges should be ordered - - var propInfo = typeof(UnicodeBlocks).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); - Assert.NotNull(propInfo); - - UnicodeBlock block = (UnicodeBlock)propInfo.GetValue(null); - Assert.NotNull(block); - - // Test 1: the block should span the range first..last - Assert.Equal(first, block.FirstCodePoint); - Assert.Equal(last, block.FirstCodePoint + block.BlockSize - 1); - - // Test 2: calling the property multiple times should cache and return the same block instance - UnicodeBlock block2 = (UnicodeBlock)propInfo.GetValue(null); - Assert.Same(block, block2); - } - } -} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index 06e2fc0c73..07944d7c35 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -16,7 +16,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCustomFilters() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(filter); // Act & assert @@ -30,10 +30,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols)); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols)); // Act & assert Assert.Equal("[U+0061]", encoder.Encode("a")); @@ -45,7 +45,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Simple() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); const string input = "Hello <>&\'\"+ there!"; const string expected = "Hello [U+003C][U+003E][U+0026][U+0027][U+0022][U+002B] there!"; @@ -57,7 +57,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -120,7 +120,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); // allow all codepoints + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; @@ -137,7 +137,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_EmptyStringInput_ReturnsEmptyString() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // Act & assert Assert.Equal("", encoder.Encode("")); @@ -147,7 +147,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); string input = "Hello, there!"; // Act & assert @@ -158,7 +158,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_NullInput_ReturnsNull() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // Act & assert Assert.Null(encoder.Encode(null)); @@ -167,25 +167,25 @@ namespace Microsoft.Framework.WebEncoders [Fact] public void Encode_WithCharsRequiringEncodingAtBeginning() { - Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("&Hello, there!")); + Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("&Hello, there!")); } [Fact] public void Encode_WithCharsRequiringEncodingAtEnd() { - Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, there!&")); + Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, there!&")); } [Fact] public void Encode_WithCharsRequiringEncodingInMiddle() { - Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, &there!")); + Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, &there!")); } [Fact] public void Encode_WithCharsRequiringEncodingInterspersed() { - Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, !")); + Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, !")); } [Fact] @@ -222,7 +222,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_AllCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -236,7 +236,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_AllCharsInvalid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); StringWriter output = new StringWriter(); // Act @@ -250,7 +250,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_SomeCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -294,7 +294,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_AllCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -308,7 +308,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_EntireString_AllCharsValid_ForwardDirectlyToOutput() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); var mockWriter = new Mock(MockBehavior.Strict); mockWriter.Setup(o => o.Write("abc")).Verifiable(); @@ -323,7 +323,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_AllCharsInvalid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); StringWriter output = new StringWriter(); // Act @@ -337,7 +337,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_SomeCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -351,7 +351,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_EntireString_SomeCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -392,8 +392,8 @@ namespace Microsoft.Framework.WebEncoders { } - public CustomUnicodeEncoderBase(params UnicodeBlock[] allowedBlocks) - : this(new CodePointFilter(allowedBlocks)) + public CustomUnicodeEncoderBase(params UnicodeRange[] allowedRanges) + : this(new CodePointFilter(allowedRanges)) { } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs new file mode 100644 index 0000000000..cb3197ae71 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeRangeTests + { + [Theory] + [InlineData(-1, 16)] + [InlineData(0x10000, 16)] + public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int rangeSize) + { + var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); + Assert.Equal("firstCodePoint", ex.ParamName); + } + + [Theory] + [InlineData(0x0100, -1)] + [InlineData(0x0100, 0x10000)] + public void Ctor_FailureCase_RangeSize(int firstCodePoint, int rangeSize) + { + var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); + Assert.Equal("rangeSize", ex.ParamName); + } + + [Fact] + public void Ctor_SuccessCase() + { + // Act + var range = new UnicodeRange(0x0100, 128); // Latin Extended-A + + // Assert + Assert.Equal(0x0100, range.FirstCodePoint); + Assert.Equal(128, range.RangeSize); + } + + [Fact] + public void FromSpan_FailureCase() + { + var ex = Assert.Throws(() => UnicodeRange.FromSpan('\u0020', '\u0010')); + Assert.Equal("lastChar", ex.ParamName); + } + + [Fact] + public void FromSpan_SuccessCase() + { + // Act + var range = UnicodeRange.FromSpan('\u0180', '\u024F'); // Latin Extended-B + + // Assert + Assert.Equal(0x0180, range.FirstCodePoint); + Assert.Equal(208, range.RangeSize); + } + + [Fact] + public void FromSpan_SuccessCase_All() + { + // Act + var range = UnicodeRange.FromSpan('\u0000', '\uFFFF'); + + // Assert + Assert.Equal(0, range.FirstCodePoint); + Assert.Equal(0x10000, range.RangeSize); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs new file mode 100644 index 0000000000..ac9e55bdac --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs @@ -0,0 +1,210 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeRangesTests + { + [Fact] + public void Range_None() + { + UnicodeRange range = UnicodeRanges.None; + Assert.NotNull(range); + + // Test 1: the range should be empty + Assert.Equal(0, range.FirstCodePoint); + Assert.Equal(0, range.RangeSize); + + // Test 2: calling the property multiple times should cache and return the same range instance + UnicodeRange range2 = UnicodeRanges.None; + Assert.Same(range, range2); + } + + [Fact] + public void Range_All() + { + Range_Unicode('\u0000', '\uFFFF', nameof(UnicodeRanges.All)); + } + + [Theory] + [InlineData('\u0000', '\u007F', nameof(UnicodeRanges.BasicLatin))] + [InlineData('\u0080', '\u00FF', nameof(UnicodeRanges.Latin1Supplement))] + [InlineData('\u0100', '\u017F', nameof(UnicodeRanges.LatinExtendedA))] + [InlineData('\u0180', '\u024F', nameof(UnicodeRanges.LatinExtendedB))] + [InlineData('\u0250', '\u02AF', nameof(UnicodeRanges.IPAExtensions))] + [InlineData('\u02B0', '\u02FF', nameof(UnicodeRanges.SpacingModifierLetters))] + [InlineData('\u0300', '\u036F', nameof(UnicodeRanges.CombiningDiacriticalMarks))] + [InlineData('\u0370', '\u03FF', nameof(UnicodeRanges.GreekandCoptic))] + [InlineData('\u0400', '\u04FF', nameof(UnicodeRanges.Cyrillic))] + [InlineData('\u0500', '\u052F', nameof(UnicodeRanges.CyrillicSupplement))] + [InlineData('\u0530', '\u058F', nameof(UnicodeRanges.Armenian))] + [InlineData('\u0590', '\u05FF', nameof(UnicodeRanges.Hebrew))] + [InlineData('\u0600', '\u06FF', nameof(UnicodeRanges.Arabic))] + [InlineData('\u0700', '\u074F', nameof(UnicodeRanges.Syriac))] + [InlineData('\u0750', '\u077F', nameof(UnicodeRanges.ArabicSupplement))] + [InlineData('\u0780', '\u07BF', nameof(UnicodeRanges.Thaana))] + [InlineData('\u07C0', '\u07FF', nameof(UnicodeRanges.NKo))] + [InlineData('\u0800', '\u083F', nameof(UnicodeRanges.Samaritan))] + [InlineData('\u0840', '\u085F', nameof(UnicodeRanges.Mandaic))] + [InlineData('\u08A0', '\u08FF', nameof(UnicodeRanges.ArabicExtendedA))] + [InlineData('\u0900', '\u097F', nameof(UnicodeRanges.Devanagari))] + [InlineData('\u0980', '\u09FF', nameof(UnicodeRanges.Bengali))] + [InlineData('\u0A00', '\u0A7F', nameof(UnicodeRanges.Gurmukhi))] + [InlineData('\u0A80', '\u0AFF', nameof(UnicodeRanges.Gujarati))] + [InlineData('\u0B00', '\u0B7F', nameof(UnicodeRanges.Oriya))] + [InlineData('\u0B80', '\u0BFF', nameof(UnicodeRanges.Tamil))] + [InlineData('\u0C00', '\u0C7F', nameof(UnicodeRanges.Telugu))] + [InlineData('\u0C80', '\u0CFF', nameof(UnicodeRanges.Kannada))] + [InlineData('\u0D00', '\u0D7F', nameof(UnicodeRanges.Malayalam))] + [InlineData('\u0D80', '\u0DFF', nameof(UnicodeRanges.Sinhala))] + [InlineData('\u0E00', '\u0E7F', nameof(UnicodeRanges.Thai))] + [InlineData('\u0E80', '\u0EFF', nameof(UnicodeRanges.Lao))] + [InlineData('\u0F00', '\u0FFF', nameof(UnicodeRanges.Tibetan))] + [InlineData('\u1000', '\u109F', nameof(UnicodeRanges.Myanmar))] + [InlineData('\u10A0', '\u10FF', nameof(UnicodeRanges.Georgian))] + [InlineData('\u1100', '\u11FF', nameof(UnicodeRanges.HangulJamo))] + [InlineData('\u1200', '\u137F', nameof(UnicodeRanges.Ethiopic))] + [InlineData('\u1380', '\u139F', nameof(UnicodeRanges.EthiopicSupplement))] + [InlineData('\u13A0', '\u13FF', nameof(UnicodeRanges.Cherokee))] + [InlineData('\u1400', '\u167F', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabics))] + [InlineData('\u1680', '\u169F', nameof(UnicodeRanges.Ogham))] + [InlineData('\u16A0', '\u16FF', nameof(UnicodeRanges.Runic))] + [InlineData('\u1700', '\u171F', nameof(UnicodeRanges.Tagalog))] + [InlineData('\u1720', '\u173F', nameof(UnicodeRanges.Hanunoo))] + [InlineData('\u1740', '\u175F', nameof(UnicodeRanges.Buhid))] + [InlineData('\u1760', '\u177F', nameof(UnicodeRanges.Tagbanwa))] + [InlineData('\u1780', '\u17FF', nameof(UnicodeRanges.Khmer))] + [InlineData('\u1800', '\u18AF', nameof(UnicodeRanges.Mongolian))] + [InlineData('\u18B0', '\u18FF', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabicsExtended))] + [InlineData('\u1900', '\u194F', nameof(UnicodeRanges.Limbu))] + [InlineData('\u1950', '\u197F', nameof(UnicodeRanges.TaiLe))] + [InlineData('\u1980', '\u19DF', nameof(UnicodeRanges.NewTaiLue))] + [InlineData('\u19E0', '\u19FF', nameof(UnicodeRanges.KhmerSymbols))] + [InlineData('\u1A00', '\u1A1F', nameof(UnicodeRanges.Buginese))] + [InlineData('\u1A20', '\u1AAF', nameof(UnicodeRanges.TaiTham))] + [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeRanges.CombiningDiacriticalMarksExtended))] + [InlineData('\u1B00', '\u1B7F', nameof(UnicodeRanges.Balinese))] + [InlineData('\u1B80', '\u1BBF', nameof(UnicodeRanges.Sundanese))] + [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeRanges.Batak))] + [InlineData('\u1C00', '\u1C4F', nameof(UnicodeRanges.Lepcha))] + [InlineData('\u1C50', '\u1C7F', nameof(UnicodeRanges.OlChiki))] + [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeRanges.SundaneseSupplement))] + [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeRanges.VedicExtensions))] + [InlineData('\u1D00', '\u1D7F', nameof(UnicodeRanges.PhoneticExtensions))] + [InlineData('\u1D80', '\u1DBF', nameof(UnicodeRanges.PhoneticExtensionsSupplement))] + [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeRanges.CombiningDiacriticalMarksSupplement))] + [InlineData('\u1E00', '\u1EFF', nameof(UnicodeRanges.LatinExtendedAdditional))] + [InlineData('\u1F00', '\u1FFF', nameof(UnicodeRanges.GreekExtended))] + [InlineData('\u2000', '\u206F', nameof(UnicodeRanges.GeneralPunctuation))] + [InlineData('\u2070', '\u209F', nameof(UnicodeRanges.SuperscriptsandSubscripts))] + [InlineData('\u20A0', '\u20CF', nameof(UnicodeRanges.CurrencySymbols))] + [InlineData('\u20D0', '\u20FF', nameof(UnicodeRanges.CombiningDiacriticalMarksforSymbols))] + [InlineData('\u2100', '\u214F', nameof(UnicodeRanges.LetterlikeSymbols))] + [InlineData('\u2150', '\u218F', nameof(UnicodeRanges.NumberForms))] + [InlineData('\u2190', '\u21FF', nameof(UnicodeRanges.Arrows))] + [InlineData('\u2200', '\u22FF', nameof(UnicodeRanges.MathematicalOperators))] + [InlineData('\u2300', '\u23FF', nameof(UnicodeRanges.MiscellaneousTechnical))] + [InlineData('\u2400', '\u243F', nameof(UnicodeRanges.ControlPictures))] + [InlineData('\u2440', '\u245F', nameof(UnicodeRanges.OpticalCharacterRecognition))] + [InlineData('\u2460', '\u24FF', nameof(UnicodeRanges.EnclosedAlphanumerics))] + [InlineData('\u2500', '\u257F', nameof(UnicodeRanges.BoxDrawing))] + [InlineData('\u2580', '\u259F', nameof(UnicodeRanges.BlockElements))] + [InlineData('\u25A0', '\u25FF', nameof(UnicodeRanges.GeometricShapes))] + [InlineData('\u2600', '\u26FF', nameof(UnicodeRanges.MiscellaneousSymbols))] + [InlineData('\u2700', '\u27BF', nameof(UnicodeRanges.Dingbats))] + [InlineData('\u27C0', '\u27EF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsA))] + [InlineData('\u27F0', '\u27FF', nameof(UnicodeRanges.SupplementalArrowsA))] + [InlineData('\u2800', '\u28FF', nameof(UnicodeRanges.BraillePatterns))] + [InlineData('\u2900', '\u297F', nameof(UnicodeRanges.SupplementalArrowsB))] + [InlineData('\u2980', '\u29FF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsB))] + [InlineData('\u2A00', '\u2AFF', nameof(UnicodeRanges.SupplementalMathematicalOperators))] + [InlineData('\u2B00', '\u2BFF', nameof(UnicodeRanges.MiscellaneousSymbolsandArrows))] + [InlineData('\u2C00', '\u2C5F', nameof(UnicodeRanges.Glagolitic))] + [InlineData('\u2C60', '\u2C7F', nameof(UnicodeRanges.LatinExtendedC))] + [InlineData('\u2C80', '\u2CFF', nameof(UnicodeRanges.Coptic))] + [InlineData('\u2D00', '\u2D2F', nameof(UnicodeRanges.GeorgianSupplement))] + [InlineData('\u2D30', '\u2D7F', nameof(UnicodeRanges.Tifinagh))] + [InlineData('\u2D80', '\u2DDF', nameof(UnicodeRanges.EthiopicExtended))] + [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeRanges.CyrillicExtendedA))] + [InlineData('\u2E00', '\u2E7F', nameof(UnicodeRanges.SupplementalPunctuation))] + [InlineData('\u2E80', '\u2EFF', nameof(UnicodeRanges.CJKRadicalsSupplement))] + [InlineData('\u2F00', '\u2FDF', nameof(UnicodeRanges.KangxiRadicals))] + [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeRanges.IdeographicDescriptionCharacters))] + [InlineData('\u3000', '\u303F', nameof(UnicodeRanges.CJKSymbolsandPunctuation))] + [InlineData('\u3040', '\u309F', nameof(UnicodeRanges.Hiragana))] + [InlineData('\u30A0', '\u30FF', nameof(UnicodeRanges.Katakana))] + [InlineData('\u3100', '\u312F', nameof(UnicodeRanges.Bopomofo))] + [InlineData('\u3130', '\u318F', nameof(UnicodeRanges.HangulCompatibilityJamo))] + [InlineData('\u3190', '\u319F', nameof(UnicodeRanges.Kanbun))] + [InlineData('\u31A0', '\u31BF', nameof(UnicodeRanges.BopomofoExtended))] + [InlineData('\u31C0', '\u31EF', nameof(UnicodeRanges.CJKStrokes))] + [InlineData('\u31F0', '\u31FF', nameof(UnicodeRanges.KatakanaPhoneticExtensions))] + [InlineData('\u3200', '\u32FF', nameof(UnicodeRanges.EnclosedCJKLettersandMonths))] + [InlineData('\u3300', '\u33FF', nameof(UnicodeRanges.CJKCompatibility))] + [InlineData('\u3400', '\u4DBF', nameof(UnicodeRanges.CJKUnifiedIdeographsExtensionA))] + [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeRanges.YijingHexagramSymbols))] + [InlineData('\u4E00', '\u9FFF', nameof(UnicodeRanges.CJKUnifiedIdeographs))] + [InlineData('\uA000', '\uA48F', nameof(UnicodeRanges.YiSyllables))] + [InlineData('\uA490', '\uA4CF', nameof(UnicodeRanges.YiRadicals))] + [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeRanges.Lisu))] + [InlineData('\uA500', '\uA63F', nameof(UnicodeRanges.Vai))] + [InlineData('\uA640', '\uA69F', nameof(UnicodeRanges.CyrillicExtendedB))] + [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeRanges.Bamum))] + [InlineData('\uA700', '\uA71F', nameof(UnicodeRanges.ModifierToneLetters))] + [InlineData('\uA720', '\uA7FF', nameof(UnicodeRanges.LatinExtendedD))] + [InlineData('\uA800', '\uA82F', nameof(UnicodeRanges.SylotiNagri))] + [InlineData('\uA830', '\uA83F', nameof(UnicodeRanges.CommonIndicNumberForms))] + [InlineData('\uA840', '\uA87F', nameof(UnicodeRanges.Phagspa))] + [InlineData('\uA880', '\uA8DF', nameof(UnicodeRanges.Saurashtra))] + [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeRanges.DevanagariExtended))] + [InlineData('\uA900', '\uA92F', nameof(UnicodeRanges.KayahLi))] + [InlineData('\uA930', '\uA95F', nameof(UnicodeRanges.Rejang))] + [InlineData('\uA960', '\uA97F', nameof(UnicodeRanges.HangulJamoExtendedA))] + [InlineData('\uA980', '\uA9DF', nameof(UnicodeRanges.Javanese))] + [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeRanges.MyanmarExtendedB))] + [InlineData('\uAA00', '\uAA5F', nameof(UnicodeRanges.Cham))] + [InlineData('\uAA60', '\uAA7F', nameof(UnicodeRanges.MyanmarExtendedA))] + [InlineData('\uAA80', '\uAADF', nameof(UnicodeRanges.TaiViet))] + [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeRanges.MeeteiMayekExtensions))] + [InlineData('\uAB00', '\uAB2F', nameof(UnicodeRanges.EthiopicExtendedA))] + [InlineData('\uAB30', '\uAB6F', nameof(UnicodeRanges.LatinExtendedE))] + [InlineData('\uABC0', '\uABFF', nameof(UnicodeRanges.MeeteiMayek))] + [InlineData('\uAC00', '\uD7AF', nameof(UnicodeRanges.HangulSyllables))] + [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeRanges.HangulJamoExtendedB))] + [InlineData('\uF900', '\uFAFF', nameof(UnicodeRanges.CJKCompatibilityIdeographs))] + [InlineData('\uFB00', '\uFB4F', nameof(UnicodeRanges.AlphabeticPresentationForms))] + [InlineData('\uFB50', '\uFDFF', nameof(UnicodeRanges.ArabicPresentationFormsA))] + [InlineData('\uFE00', '\uFE0F', nameof(UnicodeRanges.VariationSelectors))] + [InlineData('\uFE10', '\uFE1F', nameof(UnicodeRanges.VerticalForms))] + [InlineData('\uFE20', '\uFE2F', nameof(UnicodeRanges.CombiningHalfMarks))] + [InlineData('\uFE30', '\uFE4F', nameof(UnicodeRanges.CJKCompatibilityForms))] + [InlineData('\uFE50', '\uFE6F', nameof(UnicodeRanges.SmallFormVariants))] + [InlineData('\uFE70', '\uFEFF', nameof(UnicodeRanges.ArabicPresentationFormsB))] + [InlineData('\uFF00', '\uFFEF', nameof(UnicodeRanges.HalfwidthandFullwidthForms))] + [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeRanges.Specials))] + public void Range_Unicode(char first, char last, string blockName) + { + Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 + Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF + Assert.True(first < last); // code point ranges should be ordered + + var propInfo = typeof(UnicodeRanges).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(propInfo); + + UnicodeRange range = (UnicodeRange)propInfo.GetValue(null); + Assert.NotNull(range); + + // Test 1: the range should span the range first..last + Assert.Equal(first, range.FirstCodePoint); + Assert.Equal(last, range.FirstCodePoint + range.RangeSize - 1); + + // Test 2: calling the property multiple times should cache and return the same range instance + UnicodeRange range2 = (UnicodeRange)propInfo.GetValue(null); + Assert.Same(range, range2); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs index fd649ffc08..2141bba7d7 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -18,7 +18,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCodePointFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); UrlEncoder encoder = new UrlEncoder(filter); // Act & assert @@ -32,10 +32,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + UrlEncoder encoder = new UrlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); // Act & assert Assert.Equal("%61", encoder.UrlEncode("a")); @@ -59,7 +59,7 @@ namespace Microsoft.Framework.WebEncoders public void Default_EquivalentToBasicLatin() { // Arrange - UrlEncoder controlEncoder = new UrlEncoder(UnicodeBlocks.BasicLatin); + UrlEncoder controlEncoder = new UrlEncoder(UnicodeRanges.BasicLatin); UrlEncoder testEncoder = UrlEncoder.Default; // Act & assert @@ -88,7 +88,7 @@ namespace Microsoft.Framework.WebEncoders public void UrlEncode_AllRangesAllowed_StillEncodesForbiddenChars() { // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -168,7 +168,7 @@ namespace Microsoft.Framework.WebEncoders public void UrlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); // allow all codepoints + UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; @@ -271,8 +271,8 @@ namespace Microsoft.Framework.WebEncoders // by never emitting HTML-sensitive characters unescaped. // Arrange - UrlEncoder urlEncoder = new UrlEncoder(UnicodeBlocks.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + UrlEncoder urlEncoder = new UrlEncoder(UnicodeRanges.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); // Act & assert for (int i = 0; i <= 0x10FFFF; i++) diff --git a/unicode/Generators/UnicodeTablesGenerator/Program.cs b/unicode/Generators/UnicodeTablesGenerator/Program.cs index 02c740a785..76e4d7bd15 100644 --- a/unicode/Generators/UnicodeTablesGenerator/Program.cs +++ b/unicode/Generators/UnicodeTablesGenerator/Program.cs @@ -20,22 +20,16 @@ namespace UnicodeTablesGenerator { private const string _codePointFiltersGeneratedFormat = @" /// -/// Represents the '{0}' Unicode block (U+{1}..U+{2}). +/// A corresponding to the '{0}' Unicode block (U+{1}..U+{2}). /// /// /// See http://www.unicode.org/charts/PDF/U{1}.pdf for the full set of characters in this block. /// -public static UnicodeBlock {3} -{{ - get - {{ - return Volatile.Read(ref _{4}) ?? CreateBlock(ref _{4}, first: '\u{1}', last: '\u{2}'); - }} -}} -private static UnicodeBlock _{4}; +public static UnicodeRange {3} => Volatile.Read(ref _{4}) ?? CreateRange(ref _{4}, first: '\u{1}', last: '\u{2}'); +private static UnicodeRange _{4}; "; - private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeBlocks.{0}))]"; + private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeRanges.{0}))]"; private static void Main() { @@ -73,8 +67,8 @@ private static UnicodeBlock _{4}; testCodeBuilder.AppendLine(); } - File.WriteAllText("UnicodeBlocks.generated.txt", runtimeCodeBuilder.ToString()); - File.WriteAllText("UnicodeBlocksTests.generated.txt", testCodeBuilder.ToString()); + File.WriteAllText("UnicodeRanges.generated.txt", runtimeCodeBuilder.ToString()); + File.WriteAllText("UnicodeRangesTests.generated.txt", testCodeBuilder.ToString()); } private static string RemoveAllNonAlphanumeric(string blockName) From ae456401a833a82d1e13e4d94b5af84fa73af8d5 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 10 Mar 2015 11:47:36 -0700 Subject: [PATCH 251/846] Change AllowedCharsBitmap back to a struct. I also experimented with having a fixed uint[] field inside the struct, but this actually ended up having worse performance than a proper uint[] array reference since it defeated some of the JITter's optimizations. --- .../AllowedCharsBitmap.cs | 21 ++++++++++++------- .../CodePointFilter.cs | 6 +++--- .../AllowedCharsBitmapTests.cs | 10 ++++----- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs index e05a917c56..3ad3312ae9 100644 --- a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -6,14 +6,15 @@ using System.Diagnostics; namespace Microsoft.Framework.WebEncoders { - internal class AllowedCharsBitmap + internal struct AllowedCharsBitmap { private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); - private uint[] _allowedCharsBitmap; + private readonly uint[] _allowedCharsBitmap; - public AllowedCharsBitmap() + private AllowedCharsBitmap(uint[] allowedCharsBitmap) { - _allowedCharsBitmap = new uint[ALLOWED_CHARS_BITMAP_LENGTH]; + Debug.Assert(allowedCharsBitmap != null); + _allowedCharsBitmap = allowedCharsBitmap; } // Marks a character as allowed (can be returned unencoded) @@ -34,9 +35,13 @@ namespace Microsoft.Framework.WebEncoders // Creates a deep copy of this bitmap public AllowedCharsBitmap Clone() { - var retVal = new AllowedCharsBitmap(); - retVal._allowedCharsBitmap = (uint[])this._allowedCharsBitmap.Clone(); - return retVal; + return new AllowedCharsBitmap((uint[])_allowedCharsBitmap.Clone()); + } + + // should be called in place of the ctor + public static AllowedCharsBitmap CreateNew() + { + return new AllowedCharsBitmap(new uint[ALLOWED_CHARS_BITMAP_LENGTH]); } // Marks a character as forbidden (must be returned encoded) @@ -47,7 +52,7 @@ namespace Microsoft.Framework.WebEncoders int offset = (int)(codePoint & 0x1FU); _allowedCharsBitmap[index] &= ~(0x1U << offset); } - + public void ForbidUndefinedCharacters() { // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index f9c57f1873..da5991e7e2 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -19,7 +19,7 @@ namespace Microsoft.Framework.WebEncoders /// public CodePointFilter() { - _allowedCharsBitmap = new AllowedCharsBitmap(); + _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); } /// @@ -34,7 +34,7 @@ namespace Microsoft.Framework.WebEncoders } else { - _allowedCharsBitmap = new AllowedCharsBitmap(); + _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); AllowFilter(other); } } @@ -45,7 +45,7 @@ namespace Microsoft.Framework.WebEncoders /// public CodePointFilter(params UnicodeRange[] allowedRanges) { - _allowedCharsBitmap = new AllowedCharsBitmap(); + _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); AllowRanges(allowedRanges); } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs index 0810fb82d8..e26046b239 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -12,7 +12,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_EmptyByDefault() { // Act - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); // Assert for (int i = 0; i <= Char.MaxValue; i++) @@ -25,7 +25,7 @@ namespace Microsoft.Framework.WebEncoders public void Allow_Forbid_ZigZag() { // Arrange - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); // Act // The only chars which are allowed are those whose code points are multiples of 3 or 7 @@ -58,7 +58,7 @@ namespace Microsoft.Framework.WebEncoders public void Clear_ForbidsEverything() { // Arrange - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); for (int i = 1; i <= Char.MaxValue; i++) { bitmap.AllowCharacter((char)i); @@ -78,7 +78,7 @@ namespace Microsoft.Framework.WebEncoders public void Clone_MakesDeepCopy() { // Arrange - var originalBitmap = new AllowedCharsBitmap(); + var originalBitmap = AllowedCharsBitmap.CreateNew(); originalBitmap.AllowCharacter('x'); // Act @@ -99,7 +99,7 @@ namespace Microsoft.Framework.WebEncoders // We only allow odd-numbered characters in this test so that // we can validate that we properly merged the two bitmaps together // rather than simply overwriting the target. - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); for (int i = 1; i <= Char.MaxValue; i += 2) { bitmap.AllowCharacter((char)i); From 332900b175457afa71f55baf4a5851c2fcd0271c Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 10 Mar 2015 13:57:55 -0700 Subject: [PATCH 252/846] Allow XyzEncoder.Default to be settable. --- .../HtmlEncoder.cs | 30 ++++++++++++++----- .../JavaScriptStringEncoder.cs | 30 ++++++++++++++----- .../UrlEncoder.cs | 30 ++++++++++++++----- 3 files changed, 66 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 4e30ba2505..6331189706 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Threading; namespace Microsoft.Framework.WebEncoders @@ -57,20 +58,33 @@ namespace Microsoft.Framework.WebEncoders } /// - /// The default , which uses as its allow list. + /// A default instance of . /// + /// + /// This normally corresponds to . However, this property is + /// settable so that a developer can change the default implementation application-wide. + /// public static HtmlEncoder Default { get { - HtmlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); - if (defaultEncoder == null) - { - defaultEncoder = new HtmlEncoder(); - Volatile.Write(ref _defaultEncoder, defaultEncoder); - } - return defaultEncoder; + return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Volatile.Write(ref _defaultEncoder, value); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us + private static HtmlEncoder CreateDefaultEncoderSlow() + { + var onDemandEncoder = new HtmlEncoder(); + return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; } /// diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 1703a5447a..26bc175b81 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Threading; namespace Microsoft.Framework.WebEncoders @@ -57,20 +58,33 @@ namespace Microsoft.Framework.WebEncoders } /// - /// The default , which uses as its allow list. + /// A default instance of . /// + /// + /// This normally corresponds to . However, this property is + /// settable so that a developer can change the default implementation application-wide. + /// public static JavaScriptStringEncoder Default { get { - JavaScriptStringEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); - if (defaultEncoder == null) - { - defaultEncoder = new JavaScriptStringEncoder(); - Volatile.Write(ref _defaultEncoder, defaultEncoder); - } - return defaultEncoder; + return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Volatile.Write(ref _defaultEncoder, value); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us + private static JavaScriptStringEncoder CreateDefaultEncoderSlow() + { + var onDemandEncoder = new JavaScriptStringEncoder(); + return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; } /// diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 90f1bf2abc..3f487e2533 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Threading; namespace Microsoft.Framework.WebEncoders @@ -57,20 +58,33 @@ namespace Microsoft.Framework.WebEncoders } /// - /// The default which uses as its allow list. + /// A default instance of . /// + /// + /// This normally corresponds to . However, this property is + /// settable so that a developer can change the default implementation application-wide. + /// public static UrlEncoder Default { get { - UrlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); - if (defaultEncoder == null) - { - defaultEncoder = new UrlEncoder(); - Volatile.Write(ref _defaultEncoder, defaultEncoder); - } - return defaultEncoder; + return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Volatile.Write(ref _defaultEncoder, value); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us + private static UrlEncoder CreateDefaultEncoderSlow() + { + var onDemandEncoder = new UrlEncoder(); + return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; } /// From 543e0f4863054b97ad46cc4f5360d143bcce80f3 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 10 Mar 2015 18:06:59 -0700 Subject: [PATCH 253/846] Code comment cleanup. --- src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs | 8 ++++++-- .../JavaScriptStringEncoder.cs | 8 ++++++-- src/Microsoft.Framework.WebEncoders/UrlEncoder.cs | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 6331189706..8f6c976dd1 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -28,6 +28,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using as its allow list. + /// Any character not in the range will be escaped. /// public HtmlEncoder() : this(HtmlUnicodeEncoder.BasicLatin) @@ -36,7 +37,8 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. + /// pass through the encoder unescaped. Any character not in the set of ranges specified + /// by will be escaped. /// public HtmlEncoder(params UnicodeRange[] allowedRanges) : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedRanges))) @@ -44,7 +46,9 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom code point filter. + /// Instantiates an encoder using a custom code point filter. Any character not in the + /// set returned by 's + /// method will be escaped. /// public HtmlEncoder(ICodePointFilter filter) : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 26bc175b81..acc9241b63 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -28,6 +28,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using as its allow list. + /// Any character not in the range will be escaped. /// public JavaScriptStringEncoder() : this(JavaScriptStringUnicodeEncoder.BasicLatin) @@ -36,7 +37,8 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. + /// pass through the encoder unescaped. Any character not in the set of ranges specified + /// by will be escaped. /// public JavaScriptStringEncoder(params UnicodeRange[] allowedRanges) : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedRanges))) @@ -44,7 +46,9 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom code point filter. + /// Instantiates an encoder using a custom code point filter. Any character not in the + /// set returned by 's + /// method will be escaped. /// public JavaScriptStringEncoder(ICodePointFilter filter) : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 3f487e2533..dbda74917d 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -28,6 +28,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using as its allow list. + /// Any character not in the range will be escaped. /// public UrlEncoder() : this(UrlUnicodeEncoder.BasicLatin) @@ -36,7 +37,8 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. + /// pass through the encoder unescaped. Any character not in the set of ranges specified + /// by will be escaped. /// public UrlEncoder(params UnicodeRange[] allowedRanges) : this(new UrlUnicodeEncoder(new CodePointFilter(allowedRanges))) @@ -44,7 +46,9 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom code point filter. + /// Instantiates an encoder using a custom code point filter. Any character not in the + /// set returned by 's + /// method will be escaped. /// public UrlEncoder(ICodePointFilter filter) : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) From a6670114b16c90295af312427f05420fc9a63763 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 6 Mar 2015 13:05:20 -0800 Subject: [PATCH 254/846] Adding more fallbacks for BufferingHelper temporary folder location Fixes: https://github.com/aspnet/HttpAbstractions/issues/168 --- .../BufferingHelper.cs | 9 +++------ .../BufferingHelperTests.cs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs diff --git a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs index 58ef9c509e..32dde60d46 100644 --- a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs @@ -3,7 +3,6 @@ using System; using System.IO; -using Microsoft.AspNet.Http; using Microsoft.AspNet.WebUtilities; namespace Microsoft.AspNet.Http.Core @@ -16,11 +15,9 @@ namespace Microsoft.AspNet.Http.Core { get { - var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP"); - if (string.IsNullOrEmpty(temp)) - { - temp = Environment.GetEnvironmentVariable("TEMP"); - } + // Look for folders in the following order. + var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP") ?? // ASPNET_TEMP - User set temporary location. + Path.GetTempPath(); // Fall back. if (!Directory.Exists(temp)) { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs new file mode 100644 index 0000000000..362849193c --- /dev/null +++ b/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using Xunit; + +namespace Microsoft.AspNet.Http.Core.Tests +{ + public class BufferingHelperTests + { + [Fact] + public void GetTempDirectory_Returns_Valid_Location() + { + var tempDirectory = BufferingHelper.TempDirectory; + Assert.NotNull(tempDirectory); + Assert.True(Directory.Exists(tempDirectory)); + } + } +} \ No newline at end of file From 12f90869c04c57d6b3a2e7f38fbb6dc4183d421c Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 11 Mar 2015 14:07:45 -0700 Subject: [PATCH 255/846] Update .kproj => .xproj. --- HttpAbstractions.sln | 34 +++++++++---------- ...oj => Microsoft.AspNet.FeatureModel.xproj} | 0 ...kproj => Microsoft.AspNet.Http.Core.xproj} | 0 ...=> Microsoft.AspNet.Http.Extensions.xproj} | 0 ...=> Microsoft.AspNet.Http.Interfaces.xproj} | 0 ...Http.kproj => Microsoft.AspNet.Http.xproj} | 0 ...Owin.kproj => Microsoft.AspNet.Owin.xproj} | 0 ...oj => Microsoft.AspNet.WebUtilities.xproj} | 0 ... => Microsoft.Framework.WebEncoders.xproj} | 0 ...kproj => Microsoft.Net.Http.Headers.xproj} | 0 ...Microsoft.AspNet.FeatureModel.Tests.xproj} | 0 ...=> Microsoft.AspNet.Http.Core.Tests.xproj} | 0 ...rosoft.AspNet.Http.Extensions.Tests.xproj} | 0 ...proj => Microsoft.AspNet.Http.Tests.xproj} | 0 ...proj => Microsoft.AspNet.Owin.Tests.xproj} | 0 ...Microsoft.AspNet.WebUtilities.Tests.xproj} | 0 ...crosoft.Framework.WebEncoders.Tests.xproj} | 0 ...=> Microsoft.Net.Http.Headers.Tests.xproj} | 0 18 files changed, 17 insertions(+), 17 deletions(-) rename src/Microsoft.AspNet.FeatureModel/{Microsoft.AspNet.FeatureModel.kproj => Microsoft.AspNet.FeatureModel.xproj} (100%) rename src/Microsoft.AspNet.Http.Core/{Microsoft.AspNet.Http.Core.kproj => Microsoft.AspNet.Http.Core.xproj} (100%) rename src/Microsoft.AspNet.Http.Extensions/{Microsoft.AspNet.Http.Extensions.kproj => Microsoft.AspNet.Http.Extensions.xproj} (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Microsoft.AspNet.Http.Interfaces.kproj => Microsoft.AspNet.Http.Interfaces.xproj} (100%) rename src/Microsoft.AspNet.Http/{Microsoft.AspNet.Http.kproj => Microsoft.AspNet.Http.xproj} (100%) rename src/Microsoft.AspNet.Owin/{Microsoft.AspNet.Owin.kproj => Microsoft.AspNet.Owin.xproj} (100%) rename src/Microsoft.AspNet.WebUtilities/{Microsoft.AspNet.WebUtilities.kproj => Microsoft.AspNet.WebUtilities.xproj} (100%) rename src/Microsoft.Framework.WebEncoders/{Microsoft.Framework.WebEncoders.kproj => Microsoft.Framework.WebEncoders.xproj} (100%) rename src/Microsoft.Net.Http.Headers/{Microsoft.Net.Http.Headers.kproj => Microsoft.Net.Http.Headers.xproj} (100%) rename test/Microsoft.AspNet.FeatureModel.Tests/{Microsoft.AspNet.FeatureModel.Tests.kproj => Microsoft.AspNet.FeatureModel.Tests.xproj} (100%) rename test/Microsoft.AspNet.Http.Core.Tests/{Microsoft.AspNet.Http.Core.Tests.kproj => Microsoft.AspNet.Http.Core.Tests.xproj} (100%) rename test/Microsoft.AspNet.Http.Extensions.Tests/{Microsoft.AspNet.Http.Extensions.Tests.kproj => Microsoft.AspNet.Http.Extensions.Tests.xproj} (100%) rename test/Microsoft.AspNet.Http.Tests/{Microsoft.AspNet.Http.Tests.kproj => Microsoft.AspNet.Http.Tests.xproj} (100%) rename test/Microsoft.AspNet.Owin.Tests/{Microsoft.AspNet.Owin.Tests.kproj => Microsoft.AspNet.Owin.Tests.xproj} (100%) rename test/Microsoft.AspNet.WebUtilities.Tests/{Microsoft.AspNet.WebUtilities.Tests.kproj => Microsoft.AspNet.WebUtilities.Tests.xproj} (100%) rename test/Microsoft.Framework.WebEncoders.Tests/{Microsoft.Framework.WebEncoders.Tests.kproj => Microsoft.Framework.WebEncoders.Tests.xproj} (100%) rename test/Microsoft.Net.Http.Headers.Tests/{Microsoft.Net.Http.Headers.Tests.kproj => Microsoft.Net.Http.Headers.Tests.xproj} (100%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 042139d424..cf16a26dce 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -7,39 +7,39 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.kproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.kproj", "{16219571-3268-4D12-8689-12B7163DBA13}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.xproj", "{16219571-3268-4D12-8689-12B7163DBA13}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.kproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.xproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.kproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.xproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.kproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.xproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.kproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.xproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.kproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.xproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.kproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.xproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.kproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.kproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj similarity index 100% rename from src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj rename to src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj rename to src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj rename to src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj rename to src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj similarity index 100% rename from src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj rename to src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj similarity index 100% rename from src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj rename to src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj rename to src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj rename to src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj similarity index 100% rename from src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj rename to src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj rename to test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj rename to test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj rename to test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj rename to test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj rename to test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj rename to test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj similarity index 100% rename from test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj rename to test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj rename to test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj From c27c85c7ac0ba49caf8c357fe8f153146d90619d Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 11 Mar 2015 16:58:26 -0700 Subject: [PATCH 256/846] Do not use deprecated `dnvm -x86` switch --- build.cmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 68a732c182..41025afb26 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 :run -CALL packages\KoreBuild\build\dnvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From a06d05ffae07a9a17b77208b9e617283c91b8a3a Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 12 Mar 2015 16:27:02 -0700 Subject: [PATCH 257/846] Update xunit.runner.kre => xunit.runner.aspnet. --- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Core.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 4 ++-- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 4 ++-- test/Microsoft.Framework.WebEncoders.Tests/project.json | 4 ++-- test/Microsoft.Net.Http.Headers.Tests/project.json | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 0713f60e97..3b35b808af 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -3,10 +3,10 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index d7c027a570..f943dd78c7 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 0e102e3708..e3518a3c7d 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index a62cd2769e..5c51fc5e3f 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 9dd6d491be..3dbc5de4e6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -5,10 +5,10 @@ "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 11ef7dc59e..29994be207 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -3,10 +3,10 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 9c62c1dacd..5fb71938d1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.Framework.WebEncoders": "1.0.0-*", "Moq": "4.2.1312.1622", "Newtonsoft.Json": "6.0.6", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "compilationOptions": { "allowUnsafe": true diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 297c316376..0fc76424a5 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -2,10 +2,10 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.Net.Http.Headers": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { }, From 8ca2728ef8b330f73765f2e6a4ecc0059782e17b Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 12 Mar 2015 11:01:47 -0700 Subject: [PATCH 258/846] Split encoders into two packages to resolve layering issues The core package has no external dependencies aside from NetFX-produced packages --- HttpAbstractions.sln | 17 ++++++++++++- .../AllowedCharsBitmap.cs | 0 .../CodePointFilter.cs | 0 .../EncoderCommon.cs | 0 .../EncoderExtensions.cs | 0 .../EncoderServiceProviderExtensions.cs | 21 ++++++++------- .../HexUtil.cs | 0 .../HtmlEncoder.cs | 3 ++- .../ICodePointFilter.cs | 0 .../IHtmlEncoder.cs | 0 .../IJavaScriptStringEncoder.cs | 0 .../IUrlEncoder.cs | 0 .../JavaScriptStringEncoder.cs | 3 ++- ...Microsoft.Framework.WebEncoders.Core.xproj | 17 +++++++++++++ .../Properties/AssemblyInfo.cs | 0 .../UnicodeEncoderBase.cs | 0 .../UnicodeHelpers.cs | 0 .../UnicodeRange.cs | 0 .../UnicodeRanges.cs | 0 .../UnicodeRanges.generated.cs | 0 .../UrlEncoder.cs | 3 ++- .../WebEncoderOptions.cs | 0 .../unicode-7.0.0-defined-characters.bin | Bin .../project.json | 24 ++++++++++++++++++ .../project.json | 19 +++----------- 25 files changed, 77 insertions(+), 30 deletions(-) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/AllowedCharsBitmap.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/CodePointFilter.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/EncoderCommon.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/EncoderExtensions.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/EncoderServiceProviderExtensions.cs (50%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/HexUtil.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/HtmlEncoder.cs (98%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/ICodePointFilter.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/IHtmlEncoder.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/IJavaScriptStringEncoder.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/IUrlEncoder.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/JavaScriptStringEncoder.cs (98%) create mode 100644 src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeEncoderBase.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeHelpers.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeRange.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeRanges.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeRanges.generated.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UrlEncoder.cs (98%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/WebEncoderOptions.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/compiler/resources/unicode-7.0.0-defined-characters.bin (100%) create mode 100644 src/Microsoft.Framework.WebEncoders.Core/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index cf16a26dce..dbc423e462 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22609.0 +VisualStudioVersion = 14.0.22710.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -41,6 +41,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEnco EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Core", "src\Microsoft.Framework.WebEncoders.Core\Microsoft.Framework.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -229,6 +231,18 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.ActiveCfg = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.Build.0 = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.Build.0 = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.ActiveCfg = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -251,5 +265,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs rename to src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/CodePointFilter.cs rename to src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderCommon.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/EncoderCommon.cs rename to src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs rename to src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs similarity index 50% rename from src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs rename to src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs index 97a04d1c66..c9f57a59a9 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs @@ -2,49 +2,48 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.DependencyInjection; namespace Microsoft.Framework.WebEncoders { /// - /// Contains extension methods for fetching encoders from a service provider. + /// Contains extension methods for fetching encoders from an . /// public static class EncoderServiceProviderExtensions { /// - /// Retrieves an IHtmlEncoder from a service provider. + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. - /// It will return a default encoder instance if the service provider does not contain one. + /// It will return a default encoder instance if does not contain one or is null. /// public static IHtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider?.GetService() ?? HtmlEncoder.Default; + return (IHtmlEncoder)serviceProvider?.GetService(typeof(IHtmlEncoder)) ?? HtmlEncoder.Default; } /// - /// Retrieves an IJavaScriptStringEncoder from a service provider. + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. - /// It will return a default encoder instance if the service provider does not contain one. + /// It will return a default encoder instance if does not contain one or is null. /// public static IJavaScriptStringEncoder GetJavaScriptStringEncoder(this IServiceProvider serviceProvider) { - return serviceProvider?.GetService() ?? JavaScriptStringEncoder.Default; + return (IJavaScriptStringEncoder)serviceProvider?.GetService(typeof(IJavaScriptStringEncoder)) ?? JavaScriptStringEncoder.Default; } /// - /// Retrieves an IUrlEncoder from a service provider. + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. - /// It will return a default encoder instance if the service provider does not contain one. + /// It will return a default encoder instance if does not contain one or is null. /// public static IUrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider?.GetService() ?? UrlEncoder.Default; + return (IUrlEncoder)serviceProvider?.GetService(typeof(IUrlEncoder)) ?? UrlEncoder.Default; } } } diff --git a/src/Microsoft.Framework.WebEncoders/HexUtil.cs b/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/HexUtil.cs rename to src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs index 8f6c976dd1..b176b66346 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -50,7 +51,7 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public HtmlEncoder(ICodePointFilter filter) + public HtmlEncoder([NotNull] ICodePointFilter filter) : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } diff --git a/src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs rename to src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs diff --git a/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs diff --git a/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs diff --git a/src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs index acc9241b63..189d9ac08f 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -50,7 +51,7 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public JavaScriptStringEncoder(ICodePointFilter filter) + public JavaScriptStringEncoder([NotNull] ICodePointFilter filter) : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) { } diff --git a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj new file mode 100644 index 0000000000..9ae58fa6a5 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj @@ -0,0 +1,17 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + be9112cb-d87d-4080-9cc3-24492d49cbe6 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs rename to src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeRange.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders/UrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index dbda74917d..c29fa70ba8 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -50,7 +51,7 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public UrlEncoder(ICodePointFilter filter) + public UrlEncoder([NotNull] ICodePointFilter filter) : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } diff --git a/src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs b/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs rename to src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs diff --git a/src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin similarity index 100% rename from src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin rename to src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json new file mode 100644 index 0000000000..5b43df9eb3 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -0,0 +1,24 @@ +{ + "version": "1.0.0-*", + "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", + "compilationOptions": { + "allowUnsafe": true + }, + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, + "frameworks": { + "net45": { }, + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.ComponentModel": "4.0.0-*", + "System.Diagnostics.Debug": "4.0.10-*", + "System.IO": "4.0.10-*", + "System.Reflection": "4.0.10-*", + "System.Runtime.Extensions": "4.0.10-*", + "System.Threading": "4.0.10-*" + } + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 2c1b7ba06d..612cd69ddd 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,26 +1,15 @@ { "version": "1.0.0-*", - "description": "Contains encoders for HTML, JavaScript, and URLs.", - "compilationOptions": { - "allowUnsafe": true - }, + "description": "Contains registration and configuration APIs for the core framework encoders.", "dependencies": { "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "net45": { }, "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Reflection": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Threading": "4.0.10-beta-*" - } - } + "dnxcore50": { } } } From ca07b6e2fd254c05501e08190fc760e2df4be5fc Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 9 Mar 2015 13:21:05 -0700 Subject: [PATCH 259/846] Using new encoders over the old encoders. --- .../Authentication/AuthenticateContext.cs | 1 - .../Authentication/DescribeSchemesContext.cs | 1 - .../Collections/ResponseCookies.cs | 10 +-- .../Collections/SessionCollection.cs | 2 - .../QueryFeature.cs | 2 - .../RequestCookiesFeature.cs | 4 +- .../ResponseCookiesFeature.cs | 2 - src/Microsoft.AspNet.Http.Core/project.json | 67 +++++++++---------- .../QueryBuilder.cs | 6 +- .../project.json | 7 +- src/Microsoft.AspNet.Http/PathString.cs | 3 +- src/Microsoft.AspNet.Http/QueryString.cs | 3 +- src/Microsoft.AspNet.Http/project.json | 52 +++++++------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 3 +- .../QueryHelpers.cs | 7 +- .../project.json | 1 + 16 files changed, 83 insertions(+), 88 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 858da030a4..b623f15c50 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs index 7cb613ecb3..6da55ce724 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index 35aa02b17c..8066450f98 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -5,8 +5,8 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http.Core.Collections { @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value) { - Headers.AppendValues(Constants.Headers.SetCookie, Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(value) + "; path=/"); + Headers.AppendValues(Constants.Headers.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); } /// @@ -49,9 +49,9 @@ namespace Microsoft.AspNet.Http.Core.Collections bool expiresHasValue = options.Expires.HasValue; string setCookieValue = string.Concat( - Uri.EscapeDataString(key), + UrlEncoder.Default.UrlEncode(key), "=", - Uri.EscapeDataString(value ?? string.Empty), + UrlEncoder.Default.UrlEncode(value ?? string.Empty), !domainHasValue ? null : "; domain=", !domainHasValue ? null : options.Domain, !pathHasValue ? null : "; path=", @@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Http.Core.Collections { Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); - var deleteCookies = new[] { Uri.EscapeDataString(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; + var deleteCookies = new[] { UrlEncoder.Default.UrlEncode(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); if (existingValues == null || existingValues.Count == 0) { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs index 0c7485096c..df58e4a63f 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs @@ -4,8 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index 484f41b1a9..16923fe544 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -3,8 +3,6 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index 6286bdd1da..192c5f866f 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -4,11 +4,9 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs index b3c6354392..11e3c098fa 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index c611f9a806..569d667698 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,35 +1,34 @@ - -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature implementations.", - "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" - - }, - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal" : "4.0.0-beta-*", - "System.Text.Encoding": "4.0.10-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" - } +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature implementations.", + "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Text.Encoding": "4.0.10-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" + } + } } - } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index a4afbba272..98550eb832 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections; using System.Collections.Generic; using System.Text; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http.Extensions { @@ -45,9 +45,9 @@ namespace Microsoft.AspNet.Http.Extensions var pair = _params[i]; builder.Append(first ? "?" : "&"); first = false; - builder.Append(Uri.EscapeDataString(pair.Key)); + builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); builder.Append("="); - builder.Append(Uri.EscapeDataString(pair.Value)); + builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); } return builder.ToString(); diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index f2d71e2528..383484ef75 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,12 +5,13 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, - "frameworks" : { - "dnx451" : { + "frameworks": { + "dnx451": { }, - "dnxcore50" : { + "dnxcore50": { "dependencies": { "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index 2963c64d8f..8a7f5d945c 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http { @@ -65,7 +66,7 @@ namespace Microsoft.AspNet.Http public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. - return HasValue ? String.Join("/", _value.Split('/').Select(Uri.EscapeDataString)) : String.Empty; + return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.UrlEncode)) : string.Empty; } /// diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index c32e3bb037..6b61d92f99 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http { @@ -38,7 +39,7 @@ namespace Microsoft.AspNet.Http /// The un-encoded parameter value public QueryString(string name, string value) { - _value = "?" + Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); + _value = "?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value); } /// diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index a8c1d8aad3..30d577d013 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,26 +1,28 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP object model. HttpContext and family.", - "dependencies": {}, - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal" : "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" - } +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "dependencies": { + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" + } + } } - } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 072f779b98..4e37f6b218 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,9 +14,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Core.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 1414ef8f17..d7584b536a 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.WebUtilities { @@ -19,7 +20,7 @@ namespace Microsoft.AspNet.WebUtilities public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { bool hasQuery = uri.IndexOf('?') != -1; - return uri + (hasQuery ? "&" : "?") + Uri.EscapeDataString(name) + "=" + Uri.EscapeDataString(value); + return uri + (hasQuery ? "&" : "?") + UrlEncoder.Default.UrlEncode(name) + "=" + UrlEncoder.Default.UrlEncode(value); } /// @@ -36,9 +37,9 @@ namespace Microsoft.AspNet.WebUtilities foreach (var parameter in queryString) { sb.Append(hasQuery ? '&' : '?'); - sb.Append(Uri.EscapeDataString(parameter.Key)); + sb.Append(UrlEncoder.Default.UrlEncode(parameter.Key)); sb.Append('='); - sb.Append(Uri.EscapeDataString(parameter.Value)); + sb.Append(UrlEncoder.Default.UrlEncode(parameter.Value)); hasQuery = true; } return sb.ToString(); diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 45068efbf3..19bedc2195 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, From b77e9d2d9ccdf78e4cd0941af53aff08931b8374 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 13 Mar 2015 17:44:51 -0700 Subject: [PATCH 260/846] Using [NotNull] attribute from the Common repo package --- .../FeatureCollection.cs | 1 + .../NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.FeatureModel/project.json | 9 +++++---- .../Authentication/AuthenticateContext.cs | 1 + .../Authentication/ChallengeContext.cs | 1 + .../Authentication/SignInContext.cs | 1 + .../Authentication/SignOutContext.cs | 1 + src/Microsoft.AspNet.Http.Core/BufferingHelper.cs | 1 + .../Collections/FormCollection.cs | 2 +- .../Collections/HeaderDictionary.cs | 3 +-- .../Collections/ReadableStringCollection.cs | 3 +-- .../Collections/ResponseCookies.cs | 1 + src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs | 6 +++--- .../DefaultHttpResponse.cs | 1 + src/Microsoft.AspNet.Http.Core/FormFeature.cs | 3 +-- .../Infrastructure/ParsingHelpers.cs | 2 +- src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.Http.Core/QueryFeature.cs | 1 + .../ReferenceReadStream.cs | 1 + .../RequestCookiesFeature.cs | 1 + src/Microsoft.AspNet.Http.Core/project.json | 1 + .../FormFileExtensions.cs | 1 + .../HeaderDictionaryTypeExtensions.cs | 1 + .../HttpResponseSendingExtensions.cs | 1 + .../NotNullAttribute.cs | 12 ------------ .../RequestHeaders.cs | 1 + .../ResponseHeaders.cs | 1 + .../SendFileResponseExtensions.cs | 1 + src/Microsoft.AspNet.Http.Extensions/project.json | 1 + .../Authentication/AuthenticateResult.cs | 1 + .../Authentication/AuthenticationDescription.cs | 1 + .../Extensions/MapExtensions.cs | 1 + .../Extensions/MapMiddleware.cs | 1 + .../Extensions/MapWhenExtensions.cs | 1 + .../Extensions/MapWhenMiddleware.cs | 1 + .../Extensions/RunExtensions.cs | 1 + src/Microsoft.AspNet.Http/FragmentString.cs | 1 + src/Microsoft.AspNet.Http/HostString.cs | 1 + .../HttpResponseWritingExtensions.cs | 1 + src/Microsoft.AspNet.Http/NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.Http/PathString.cs | 1 + src/Microsoft.AspNet.Http/QueryString.cs | 1 + src/Microsoft.AspNet.Http/project.json | 1 + src/Microsoft.AspNet.Owin/NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 1 + src/Microsoft.AspNet.Owin/project.json | 3 ++- .../BufferedReadStream.cs | 1 + .../FileBufferingReadStream.cs | 1 + src/Microsoft.AspNet.WebUtilities/FormReader.cs | 1 + .../KeyValueAccumulator.cs | 1 + src/Microsoft.AspNet.WebUtilities/MultipartReader.cs | 1 + .../MultipartReaderStream.cs | 1 + .../NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 1 + src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 1 + src/Microsoft.AspNet.WebUtilities/project.json | 1 + src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs | 1 + .../GenericHeaderParser.cs | 2 ++ src/Microsoft.Net.Http.Headers/NotNullAttribute.cs | 12 ------------ .../SetCookieHeaderValue.cs | 1 + .../StringWithQualityHeaderValueComparer.cs | 1 + src/Microsoft.Net.Http.Headers/project.json | 1 + 62 files changed, 63 insertions(+), 100 deletions(-) delete mode 100644 src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Http/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Owin/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs delete mode 100644 src/Microsoft.Net.Http.Headers/NotNullAttribute.cs diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index b86a3832b1..28e01101ff 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -6,6 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.FeatureModel { diff --git a/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs b/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs deleted file mode 100644 index 3869edda12..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.FeatureModel -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 5513054416..1d28c1258f 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,8 +1,9 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature infrastructure.", - "dependencies": { - }, + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature infrastructure.", + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, "frameworks": { "dnx451": {}, "dnxcore50": { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index b623f15c50..1fa87a6417 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index 00c5a1c6fb..7b86337ccd 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs index b5d8361ad6..6d067c3919 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs index 3676102e03..318be62c70 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs index 32dde60d46..3c0120f725 100644 --- a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs @@ -4,6 +4,7 @@ using System; using System.IO; using Microsoft.AspNet.WebUtilities; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs index 55d7b321a0..ffef8fcaa2 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs index 72dc55ec36..487f1c4190 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs @@ -5,9 +5,8 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs index 91f3b8c8f3..38aa497e12 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs @@ -1,10 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index 8066450f98..056df67640 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http.Core.Collections diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index d178aa90e0..90dff4c588 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -9,12 +9,12 @@ using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index fd2dab86ed..fda8dd0ff3 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -12,6 +12,7 @@ using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/FormFeature.cs b/src/Microsoft.AspNet.Http.Core/FormFeature.cs index a0f1d5db07..33f84e3745 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/FormFeature.cs @@ -4,13 +4,12 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.WebUtilities; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs index 85208daa0d..d9c9a3540e 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs @@ -6,8 +6,8 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Infrastructure { diff --git a/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs deleted file mode 100644 index 2328b5d5d8..0000000000 --- a/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http.Core -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index 16923fe544..bda0ab5fc4 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -6,6 +6,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs index ec692ee014..4b1093a66a 100644 --- a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index 192c5f866f..a04d2b7016 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -7,6 +7,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 569d667698..61d978811d 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -6,6 +6,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index e97059c66b..358be0ad3a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -4,6 +4,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index fc4438c018..02178a65cd 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs index b97da7c13b..40d4f1c3c7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs deleted file mode 100644 index d43b93e4e4..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index eeeef90b24..21499b8092 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 4169f237a7..c88430eed8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Extensions; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 2dcbdafc8a..029ce3d4be 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Extensions; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 383484ef75..1a418e3bdf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,6 +5,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs index e1d3918dbc..9488cd52c4 100644 --- a/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs index 7df6a014c0..81653dd166 100644 --- a/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index 9696b99da7..5f71a1b792 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index 5bf26af0b8..5e2d8891b7 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index 63e65a0a11..117b8cacc1 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -8,6 +8,7 @@ using Microsoft.AspNet.Builder.Extensions; namespace Microsoft.AspNet.Builder { + using Microsoft.Framework.Internal; using Predicate = Func; using PredicateAsync = Func>; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index 51606e609c..b4f5c78b0b 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 4b74158aae..c0cb5af259 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNet.Http; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http/FragmentString.cs index f40ba626a1..32b4ba6f52 100644 --- a/src/Microsoft.AspNet.Http/FragmentString.cs +++ b/src/Microsoft.AspNet.Http/FragmentString.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index c91ce65a5b..55fdb988ec 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs index 464513f895..1035c1aaaa 100644 --- a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/NotNullAttribute.cs b/src/Microsoft.AspNet.Http/NotNullAttribute.cs deleted file mode 100644 index d43b93e4e4..0000000000 --- a/src/Microsoft.AspNet.Http/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index 8a7f5d945c..5e6f03ec70 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index 6b61d92f99..48d68b292a 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 30d577d013..33d1c1c46a 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Owin/NotNullAttribute.cs b/src/Microsoft.AspNet.Owin/NotNullAttribute.cs deleted file mode 100644 index a42aa58d4a..0000000000 --- a/src/Microsoft.AspNet.Owin/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Owin -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 7d30044171..0c7af1986a 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -20,6 +20,7 @@ using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Owin { + using Microsoft.Framework.Internal; using SendFileFunc = Func; public class OwinFeatureCollection : diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 90a7af6c7f..e7274c329b 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -4,7 +4,8 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*" + "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 2e6e39b6d2..2ffc33ad46 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -6,6 +6,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index aecd6e9ee5..26fba82548 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 1682e7c5b2..dd11b0cff2 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -7,6 +7,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index 4c9d629a47..286f2a8a6f 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 766e5361dc..d9966ffd48 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 1bbf55e57c..bb8e07c25e 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -7,6 +7,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs b/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs deleted file mode 100644 index d489cf36b3..0000000000 --- a/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.WebUtilities -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index d7584b536a..8266dc4fb5 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.WebUtilities diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index f73c3c249f..2a559d0ec9 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 19bedc2195..d47cde29be 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index c4c1207380..a7911d164f 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs index c8e5f933e2..5796d89fae 100644 --- a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.Framework.Internal; + namespace Microsoft.Net.Http.Headers { internal sealed class GenericHeaderParser : BaseHeaderParser diff --git a/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs b/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs deleted file mode 100644 index a725ce11fe..0000000000 --- a/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Net.Http.Headers -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 3556454156..568f204fa7 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index d7a3def9e1..982a97b131 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index fd40eace65..07da653d6f 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,6 +1,7 @@ { "version": "1.0.0-*", "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks" : { "net45" : { }, From 93deb0b440ad2a1b6ff40cd747d6c3de704e458e Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 13 Mar 2015 16:29:05 -0700 Subject: [PATCH 261/846] Remove dependency on DependencyInjection and instead use DependencyInjection.Interfaces on Http.Extensions Fixes: https://github.com/aspnet/HttpAbstractions/issues/228 --- src/Microsoft.AspNet.Http.Extensions/project.json | 3 ++- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1a418e3bdf..415597b029 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" @@ -14,6 +14,7 @@ }, "dnxcore50": { "dependencies": { + "System.IO.FileSystem": "4.0.0-beta-*", "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index e3518a3c7d..a5bc898aaa 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -4,6 +4,7 @@ "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From 08ddbe853130fe10bdde6f8b529e5a885e0974be Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 16 Mar 2015 14:26:46 -0700 Subject: [PATCH 262/846] Auth cleanup - Rename Security folder -> Authentication - Change Authenticate to only take one scheme to match other APIs, the params overload did not make it any cleaner to consume (since it didn't produce a combined ClaimsPrincipal anyways) --- .../Authentication/AuthenticateContext.cs | 28 ++++++++----------- .../DefaultHttpContext.cs | 23 +++++++-------- .../IAuthenticateContext.cs | 4 +-- .../IAuthenticationHandler.cs | 0 .../IChallengeContext.cs | 0 .../IDescribeSchemesContext.cs | 0 .../IHttpAuthenticationFeature.cs | 1 + .../ISignInContext.cs | 0 .../ISignOutContext.cs | 0 src/Microsoft.AspNet.Http/HttpContext.cs | 14 ++-------- 10 files changed, 27 insertions(+), 43 deletions(-) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IAuthenticateContext.cs (71%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IAuthenticationHandler.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IChallengeContext.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IDescribeSchemesContext.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IHttpAuthenticationFeature.cs (99%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/ISignInContext.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/ISignOutContext.cs (100%) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 1fa87a6417..ed0dd55eb7 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; @@ -10,24 +11,19 @@ namespace Microsoft.AspNet.Http.Core.Authentication { public class AuthenticateContext : IAuthenticateContext { - private List _results; - private List _accepted; + private AuthenticationResult _result; + private bool _accepted; - public AuthenticateContext([NotNull] IEnumerable authenticationSchemes) + public AuthenticateContext([NotNull] string authenticationScheme) { - AuthenticationSchemes = authenticationSchemes; - _results = new List(); - _accepted = new List(); + AuthenticationScheme = authenticationScheme; } - public IEnumerable AuthenticationSchemes { get; private set; } + public string AuthenticationScheme { get; private set; } - public IEnumerable Results - { - get { return _results; } - } + public AuthenticationResult Result { get; set; } - public IEnumerable Accepted + public bool Accepted { get { return _accepted; } } @@ -35,13 +31,13 @@ namespace Microsoft.AspNet.Http.Core.Authentication public void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - _accepted.Add(descrip.AuthenticationScheme); // may not match identity.AuthType - _results.Add(new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip)); + _accepted = true; + Result = new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip); } - public void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description) + public void NotAuthenticated() { - _accepted.Add(authenticationScheme); + _accepted = true; } } } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 90dff4c588..5ff30f1fc5 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -212,44 +212,41 @@ namespace Microsoft.AspNet.Http.Core return describeContext.Results; } - public override IEnumerable Authenticate([NotNull] IEnumerable authenticationSchemes) + public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationSchemes); + var authenticateContext = new AuthenticateContext(authenticationScheme); if (handler != null) { handler.Authenticate(authenticateContext); } - // Verify all types ack'd - IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); - if (leftovers.Any()) + if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } - return authenticateContext.Results; + return authenticateContext.Result; } - public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationSchemes) + public override async Task AuthenticateAsync([NotNull] string authenticationScheme) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationSchemes); + var authenticateContext = new AuthenticateContext(authenticationScheme); if (handler != null) { await handler.AuthenticateAsync(authenticateContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); - if (leftovers.Any()) + if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } - return authenticateContext.Results; + return authenticateContext.Result; } public override Task AcceptWebSocketAsync(string subProtocol) diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs similarity index 71% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs index 71c2b97a30..ecf8b56788 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs @@ -8,10 +8,10 @@ namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticateContext { - IEnumerable AuthenticationSchemes { get; } + string AuthenticationScheme { get; } void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description); - void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description); + void NotAuthenticated(); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs index 053f5d8e12..fb14959790 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs @@ -8,6 +8,7 @@ namespace Microsoft.AspNet.Http.Authentication public interface IHttpAuthenticationFeature { ClaimsPrincipal User { get; set; } + IAuthenticationHandler Handler { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index c76019744e..c69f882f91 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -54,19 +54,9 @@ namespace Microsoft.AspNet.Http public abstract IEnumerable GetAuthenticationSchemes(); - public virtual AuthenticationResult Authenticate(string authenticationScheme) - { - return Authenticate(new[] { authenticationScheme }).SingleOrDefault(); - } + public abstract AuthenticationResult Authenticate(string authenticationScheme); - public abstract IEnumerable Authenticate(IEnumerable authenticationSchemes); - - public virtual async Task AuthenticateAsync(string authenticationScheme) - { - return (await AuthenticateAsync(new[] { authenticationScheme })).SingleOrDefault(); - } - - public abstract Task> AuthenticateAsync(IEnumerable authenticationSchemes); + public abstract Task AuthenticateAsync(string authenticationScheme); public virtual Task AcceptWebSocketAsync() { From f63702754fc0c7ce827b2e2be6519b4ec3ef6497 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 19 Feb 2015 14:39:21 -0800 Subject: [PATCH 263/846] [Fixes #160] Added OnResponseCompleted to HttpResponse --- src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs | 5 +++++ src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs | 5 +++++ src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs | 1 + src/Microsoft.AspNet.Http/HttpResponse.cs | 2 ++ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 5 +++++ 5 files changed, 18 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index fda8dd0ff3..6e23c35b15 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -111,6 +111,11 @@ namespace Microsoft.AspNet.Http.Core HttpResponseFeature.OnSendingHeaders(callback, state); } + public override void OnResponseCompleted(Action callback, object state) + { + HttpResponseFeature.OnResponseCompleted(callback, state); + } + public override void Redirect(string location, bool permanent) { if (permanent) diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs index 58d48c49bc..509677f4a7 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs @@ -34,5 +34,10 @@ namespace Microsoft.AspNet.Http.Core { throw new NotSupportedException(); } + + public void OnResponseCompleted(Action callback, object state) + { + throw new NotSupportedException(); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index cd5ffc4ec6..921e70700e 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -15,5 +15,6 @@ namespace Microsoft.AspNet.Http Stream Body { get; set; } bool HeadersSent { get; } void OnSendingHeaders(Action callback, object state); + void OnResponseCompleted(Action callback, object state); } } diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 85dec115e7..5fd8e099e0 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -27,6 +27,8 @@ namespace Microsoft.AspNet.Http public abstract void OnSendingHeaders(Action callback, object state); + public abstract void OnResponseCompleted(Action callback, object state); + public virtual void Redirect(string location) { Redirect(location, permanent: false); diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 0c7af1986a..50d58adb9c 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -157,6 +157,11 @@ namespace Microsoft.AspNet.Owin register(callback, state); } + void IHttpResponseFeature.OnResponseCompleted(Action callback, object state) + { + throw new NotSupportedException(); + } + IPAddress IHttpConnectionFeature.RemoteIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } From 1e9d57f80ca883881804292448fff4de8b112733 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 17 Mar 2015 16:50:02 -0700 Subject: [PATCH 264/846] UrlEncoder should always encode the U+003A COLON character Provides extra defense-in-depth in case an application is using this API to encode a relative URL, otherwise the part before the colon could inadvertently be treated as a scheme. --- .../UrlEncoder.cs | 26 +++++++++++++++---- .../UrlEncoderTests.cs | 3 +-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index c29fa70ba8..d347345303 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -131,12 +131,24 @@ namespace Microsoft.Framework.WebEncoders : base(filter, MaxOutputCharsPerInputChar) { // Per RFC 3987, Sec. 2.2, we want encodings that are safe for - // 'isegment', 'iquery', and 'ifragment'. The only thing these - // all have in common is 'ipchar', which is defined as such: + // four particular components: 'isegment', 'ipath-noscheme', + // 'iquery', and 'ifragment'. The relevant definitions are below. + // + // ipath-noscheme = isegment-nz-nc *( "/" isegment ) + // + // isegment = *ipchar + // + // isegment-nz-nc = 1*( iunreserved / pct-encoded / sub-delims + // / "@" ) + // ; non-zero-length segment without any colon ":" // // ipchar = iunreserved / pct-encoded / sub-delims / ":" // / "@" // + // iquery = *( ipchar / iprivate / "/" / "?" ) + // + // ifragment = *( ipchar / "/" / "?" ) + // // iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar // // ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF @@ -151,15 +163,19 @@ namespace Microsoft.Framework.WebEncoders // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" // / "*" / "+" / "," / ";" / "=" // - // From this list, the base encoder forbids "&", "'", "+", + // The only common characters between these four components are the + // intersection of 'isegment-nz-nc' and 'ipchar', which is really + // just 'isegment-nz-nc' (colons forbidden). + // + // From this list, the base encoder already forbids "&", "'", "+", // and we'll additionally forbid "=" since it has special meaning // in x-www-form-urlencoded representations. // // This means that the full list of allowed characters from the // Basic Latin set is: - // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / ":" / "@" + // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / "@" - const string forbiddenChars = @" #%/=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder + const string forbiddenChars = @" #%/:=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder foreach (char c in forbiddenChars) { ForbidCharacter(c); diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs index 2141bba7d7..0d37e4f934 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -123,8 +123,7 @@ namespace Microsoft.Framework.WebEncoders case '_': case '~': - // ipchar - case ':': + // isegment-nz-nc case '@': // sub-delims From 5afe55dc39282a852b9fd2d52120820b9f440e59 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 24 Mar 2015 21:31:44 -0700 Subject: [PATCH 265/846] Remove k command and use dnx instead --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index ec3263114a..d81164353c 100755 --- a/build.sh +++ b/build.sh @@ -31,7 +31,7 @@ if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi -if ! type k > /dev/null 2>&1; then +if ! type dnx > /dev/null 2>&1; then dnvm upgrade fi From fd86bf74c5c02faa77878e513501d3b7b210c707 Mon Sep 17 00:00:00 2001 From: suhasj Date: Wed, 25 Mar 2015 11:46:42 -0700 Subject: [PATCH 266/846] Updating to release NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..1978dc065a 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + - \ No newline at end of file + From ac9db0ff3538279083121bc4d7b7963cd4d64bdc Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 1 Apr 2015 15:45:04 -0700 Subject: [PATCH 267/846] Add travis and appveyor CI support. --- .travis.yml | 3 +++ appveyor.yml | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 .travis.yml create mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..0f4cb93e59 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: csharp +script: + - ./build.sh verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..88cb9ef145 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,5 @@ +build_script: + - build.cmd verify +clone_depth: 1 +test: off +deploy: off \ No newline at end of file From adfad921c57f867d61aa0a212231a64bff7fdce6 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 1 Apr 2015 17:05:57 -0700 Subject: [PATCH 268/846] Turn off sudo for .travis.yml. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0f4cb93e59..5939a529e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ language: csharp +sudo: false script: - ./build.sh verify \ No newline at end of file From fd85a8b3a5254b3e4b3cce52dfec61dd010f00d6 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 1 Apr 2015 18:47:56 -0700 Subject: [PATCH 269/846] Adding status badges --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e9ec88786b..8ed5ec4edc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ HttpAbstractions ================ +AppVeyor: [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) + +Travis: [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) Contains HTTP abstractions for ASP.NET 5 such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. From d95202528b54d364921be66cf3aefe0b230d96b8 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 2 Apr 2015 09:20:13 -0700 Subject: [PATCH 270/846] Update global.json, sources=>projects --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 840c36f6ad..983ba0401e 100644 --- a/global.json +++ b/global.json @@ -1,3 +1,3 @@ { - "sources": ["src"] -} \ No newline at end of file + "projects": ["src"] +} From c6bf89a04e76eacf1b65046049d076e16bdb3294 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Thu, 2 Apr 2015 13:49:26 -0700 Subject: [PATCH 271/846] Update .xproj files for Microsoft.Web.AspNet.* -> Microsoft.DNX.* rename --- .../Microsoft.AspNet.FeatureModel.xproj | 6 +++--- .../Microsoft.AspNet.Http.Core.xproj | 6 +++--- .../Microsoft.AspNet.Http.Extensions.xproj | 6 +++--- .../Microsoft.AspNet.Http.Interfaces.xproj | 6 +++--- src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj | 6 +++--- src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj | 6 +++--- .../Microsoft.AspNet.WebUtilities.xproj | 6 +++--- .../Microsoft.Framework.WebEncoders.Core.xproj | 6 +++--- .../Microsoft.Framework.WebEncoders.xproj | 6 +++--- .../Microsoft.Net.Http.Headers.xproj | 6 +++--- .../Microsoft.AspNet.FeatureModel.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.Http.Core.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.Http.Extensions.Tests.xproj | 6 +++--- .../Microsoft.AspNet.Http.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.Owin.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.WebUtilities.Tests.xproj | 6 +++--- .../Microsoft.Framework.WebEncoders.Tests.xproj | 6 +++--- .../Microsoft.Net.Http.Headers.Tests.xproj | 6 +++--- 18 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj index f75392129d..bd9dcea294 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 32a4c918-30ee-41db-8e26-8a3bb88ed231 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj index b50c4e7764..447e54485b 100644 --- a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj +++ b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + bcf0f967-8753-4438-bd07-aadca9ce509a ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj index 64be73c1ea..31d24d7bf6 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + ccc4363e-81e2-4058-94dd-00494e9e992a ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj index bd80d293f8..2326ea959f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj +++ b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + d9128247-8f97-48b8-a863-f1f21a029fce ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj index aead60bd2e..67db5d869b 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj index e668c3289a..cf782585d1 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 59bed991-f207-48ed-b24c-0a1d9c986c01 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj index 77c0886660..5f79a271e0 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + a2fb7838-0031-4fad-ba3e-83c30b3af406 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj index 9ae58fa6a5..559ec64868 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj +++ b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + be9112cb-d87d-4080-9cc3-24492d49cbe6 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj index 9a3c5e9646..084e7901ea 100644 --- a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj +++ b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + dd2ce416-765e-4000-a03e-c2ff165da1b6 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj index 8750df3e9b..182749e71e 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 60aa2fdb-8121-4826-8d00-9a143fefaf66 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj index 048ee0ea9b..6bd0b3bd59 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + c5d2bae1-e182-48a0-aa74-1af14b782bf7 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj index 1e73261367..c438cb7050 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + aa99af26-f7b1-4a6b-a922-5c25539f6391 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj index 3fa25da029..38294666a7 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + ae25ef21-7f91-4b86-b73e-af746821d339 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj index f307eafd3c..424d3a7f9b 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + f16692b8-9f38-4dca-a582-e43172b989c6 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj index 135f58392d..0a5d033908 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 16219571-3268-4d12-8689-12b7163dba13 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj index 2592290c21..8476f5e9a6 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 93c10e50-bcbb-4d8e-9492-d46e1396225b ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj index f91eeecab2..d456c7e180 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj +++ b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 7ae2731d-43cd-4cf8-850a-4914de2ce930 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj index dfb42bfc9a..a0a2089ec3 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file From 0ca6960a3250924b9b499b915bc784b000ba0c06 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Fri, 3 Apr 2015 17:11:45 -0700 Subject: [PATCH 272/846] Fix AppVeyor git line ending config --- appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 88cb9ef145..3fab83e134 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,3 +1,5 @@ +init: + - git config --global core.autocrlf true build_script: - build.cmd verify clone_depth: 1 From 1f127d25c3fb45a101814bab102ab241c71de60c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 6 Apr 2015 07:41:05 -0700 Subject: [PATCH 273/846] * Adding TimeSpan to DateTimeOffset so test succeeds in non-PST timezones * Removing unused dependency from project.json --- .../ContentDispositionHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index 41bb2bdaae..da906e8171 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -324,7 +324,7 @@ namespace Microsoft.Net.Http.Headers contentDisposition.FileName = "my File Name"; Assert.Equal("inline; name=myname; filename=\"my File Name\"", contentDisposition.ToString()); - contentDisposition.CreationDate = new DateTimeOffset(new DateTime(2011, 2, 15)); + contentDisposition.CreationDate = new DateTimeOffset(new DateTime(2011, 2, 15), new TimeSpan(-8, 0, 0)); Assert.Equal("inline; name=myname; filename=\"my File Name\"; creation-date=" + "\"Tue, 15 Feb 2011 08:00:00 GMT\"", contentDisposition.ToString()); diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 0fc76424a5..4859085a96 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -9,10 +9,6 @@ }, "frameworks": { "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*" - } - } + "dnxcore50": { } } } From c24a40517fe95829ed615414de6405d3e938aa8f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 11:25:26 -0700 Subject: [PATCH 274/846] #246 Fix multipart test on linux. --- .../FormFeatureTests.cs | 45 +++--- .../MultipartReaderTests.cs | 140 +++++++++--------- 2 files changed, 90 insertions(+), 95 deletions(-) diff --git a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs index 7f1224c1b7..254a6800ea 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs @@ -96,31 +96,32 @@ namespace Microsoft.AspNet.Http.Core private const string MultipartContentType = "multipart/form-data; boundary=WebKitFormBoundary5pDRpGheQXaM8k3T"; private const string EmptyMultipartForm = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + // Note that CRLF (\r\n) is required. You can't use multi-line C# strings here because the line breaks on Linux are just LF. private const string MultipartFormWithField = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""description"" - -Foo ---WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"description\"\r\n" + +"\r\n" + +"Foo\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; private const string MultipartFormWithFile = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" -Content-Type: text/html - -Hello World ---WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + +"Hello World\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; private const string MultipartFormWithFieldAndFile = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""description"" - -Foo ---WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" -Content-Type: text/html - -Hello World ---WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"description\"\r\n" + +"\r\n" + +"Foo\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + +"Hello World\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; [Fact] public async Task ReadForm_EmptyMultipart_ReturnsParsedFormCollection() diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs index 49a5abedd0..2dd618cdf1 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -11,72 +11,68 @@ namespace Microsoft.AspNet.WebUtilities public class MultipartReaderTests { private const string Boundary = "9051914041544843365972754266"; + // Note that CRLF (\r\n) is required. You can't use multi-line C# strings here because the line breaks on Linux are just LF. private const string OnePartBody = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; private const string OnePartBodyWithTrailingWhitespace = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266 \r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; // It's non-compliant but common to leave off the last CRLF. private const string OnePartBodyWithoutFinalCRLF = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266--"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--"; private const string TwoPartBody = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file1""; filename=""a.txt"" -Content-Type: text/plain - -Content of a.txt. - ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\"\r\n" + +"Content-Type: text/plain\r\n" + +"\r\n" + +"Content of a.txt.\r\n" + +"\r\n" + +"--9051914041544843365972754266--\r\n"; private const string TwoPartBodyWithUnicodeFileName = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file1""; filename=""a色.txt"" -Content-Type: text/plain - -Content of a.txt. - ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file1\"; filename=\"a色.txt\"\r\n" + +"Content-Type: text/plain\r\n" + +"\r\n" + +"Content of a.txt.\r\n" + +"\r\n" + +"--9051914041544843365972754266--\r\n"; private const string ThreePartBody = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file1""; filename=""a.txt"" -Content-Type: text/plain - -Content of a.txt. - ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file2""; filename=""a.html"" -Content-Type: text/html - -Content of a.html. - ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\"\r\n" + +"Content-Type: text/plain\r\n" + +"\r\n" + +"Content of a.txt.\r\n" + +"\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file2\"; filename=\"a.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + +"Content of a.html.\r\n" + +"\r\n" + +"--9051914041544843365972754266--\r\n"; private static MemoryStream MakeStream(string text) { @@ -225,15 +221,14 @@ Content-Type: text/html public async Task MutipartReader_ReadInvalidUtf8Header_ReplacementCharacters() { var body1 = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" filename=""a"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\" filename=\"a"; var body2 = -@".txt"" - -text default ---9051914041544843365972754266-- -"; +".txt\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; var stream = new MemoryStream(); var bytes = Encoding.UTF8.GetBytes(body1); stream.Write(bytes, 0, bytes.Length); @@ -261,15 +256,14 @@ text default public async Task MutipartReader_ReadInvalidUtf8SurrogateHeader_ReplacementCharacters() { var body1 = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" filename=""a"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\" filename=\"a"; var body2 = -@".txt"" - -text default ---9051914041544843365972754266-- -"; +".txt\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; var stream = new MemoryStream(); var bytes = Encoding.UTF8.GetBytes(body1); stream.Write(bytes, 0, bytes.Length); From 31dae8140527295d30195637ac2376426f33dd7f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 11:56:27 -0700 Subject: [PATCH 275/846] Short circuit empty inputs. --- src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index 2a559d0ec9..de801b29d4 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -41,6 +41,12 @@ namespace Microsoft.AspNet.WebUtilities { ValidateParameters(input.Length, offset, count); + // Special-case empty input + if (count == 0) + { + return new byte[0]; + } + // Assumption: input is base64url encoded without padding and contains no whitespace. // First, we need to add the padding characters back. From b62dde23e6b11534669541f28633d26741a48c35 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 12:09:27 -0700 Subject: [PATCH 276/846] Add quotes in project.json file. --- test/Microsoft.Framework.WebEncoders.Tests/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 5fb71938d1..b24bd45764 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -10,7 +10,7 @@ "test": "xunit.runner.aspnet" }, "compilationOptions": { - "allowUnsafe": true + "allowUnsafe": "true" }, "frameworks": { "dnx451": { } From 957a77219c464fad02ec4c771ec9689d3a6fe232 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 12:41:01 -0700 Subject: [PATCH 277/846] Use MemberData instead of InlineData. --- .../UnicodeHelpersTests.cs | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 9a2671023a..1984a61a53 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -29,15 +29,26 @@ namespace Microsoft.Framework.WebEncoders Assert.Same(retVal1, retVal2); } + public static TheoryData Utf16ScalarValues + { + get + { + var dataset = new TheoryData(); + dataset.Add(1, "a", (int)'a'); // normal BMP char, end of string + dataset.Add(2, "ab", (int)'a'); // normal BMP char, not end of string + dataset.Add(3, "\uDFFF", UnicodeReplacementChar); // trailing surrogate, end of string + dataset.Add(4, "\uDFFFx", UnicodeReplacementChar); // trailing surrogate, not end of string + dataset.Add(5, "\uD800", UnicodeReplacementChar); // leading surrogate, end of string + dataset.Add(6, "\uD800x", UnicodeReplacementChar); // leading surrogate, not end of string, followed by non-surrogate + dataset.Add(7, "\uD800\uD800", UnicodeReplacementChar); // leading surrogate, not end of string, followed by leading surrogate + dataset.Add(8, "\uD800\uDFFF", 0x103FF); // leading surrogate, not end of string, followed by trailing surrogate + + return dataset; + } + } + [Theory] - [InlineData(1, "a", (int)'a')] // normal BMP char, end of string - [InlineData(2, "ab", (int)'a')] // normal BMP char, not end of string - [InlineData(3, "\uDFFF", UnicodeReplacementChar)] // trailing surrogate, end of string - [InlineData(4, "\uDFFFx", UnicodeReplacementChar)] // trailing surrogate, not end of string - [InlineData(5, "\uD800", UnicodeReplacementChar)] // leading surrogate, end of string - [InlineData(6, "\uD800x", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by non-surrogate - [InlineData(7, "\uD800\uD800", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by leading surrogate - [InlineData(8, "\uD800\uDFFF", 0x103FF)] // leading surrogate, not end of string, followed by trailing surrogate + [MemberData(nameof(Utf16ScalarValues))] public void GetScalarValueFromUtf16(int unused, string input, int expectedResult) { // The 'unused' parameter exists because the xunit runner can't distinguish From 8da763a14a0eb7d05f950722102add00b7d5e861 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 13:52:08 -0700 Subject: [PATCH 278/846] Disable false positive date parser test. --- .../RangeConditionHeaderValueTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs index b47b03b026..14a65efdd2 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -112,7 +112,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] @@ -141,7 +141,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] From 6c9055cadcd1a715482751c75660e05cadb693ee Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 1 Apr 2015 11:45:52 -0700 Subject: [PATCH 279/846] Fix CJK Ideographs and Hangul Syllables representation Characters in these blocks weren't correctly identified as assigned characters, which caused the encoders to always encode them, even if the ranges were in the allow list. --- .../unicode-7.0.0-defined-characters.bin | Bin 8192 -> 8192 bytes .../UnicodeHelpersTests.cs | 28 ++++++- .../DefinedCharListGenerator/Program.cs | 77 +++++++++++++++++- 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin index c9b36c871d6146d5c25044cd405807c15641d3f3..06530d73cf6848c91b0f41b326dccf833192412a 100644 GIT binary patch delta 148 zcmZp0XmHrjz&3dS%Q+-`hRL2`@= retVal.Length) { continue; // don't care about supplementary chars } + if (name.EndsWith(", First>", StringComparison.Ordinal) || name.EndsWith(", Last>", StringComparison.Ordinal)) + { + // ignore spans - we'll handle them separately + continue; + } + if (codePoint == (uint)' ') { retVal[codePoint] = true; // we allow U+0020 SPACE as our only valid Zs (whitespace) char @@ -184,6 +190,24 @@ namespace Microsoft.Framework.WebEncoders } } + // Handle known spans from Unicode 7.0.0's UnicodeData.txt + + // CJK Ideograph Extension A + for (int i = '\u3400'; i <= '\u4DB5'; i++) + { + retVal[i] = true; + } + // CJK Ideograph + for (int i = '\u4E00'; i <= '\u9FCC'; i++) + { + retVal[i] = true; + } + // Hangul Syllable + for (int i = '\uAC00'; i <= '\uD7A3'; i++) + { + retVal[i] = true; + } + // Finally, we need to make sure we've seen every category which contains // allowed characters. This provides extra defense against having a typo // in the list of categories. diff --git a/unicode/Generators/DefinedCharListGenerator/Program.cs b/unicode/Generators/DefinedCharListGenerator/Program.cs index f98dd32f5b..edcd0f3602 100644 --- a/unicode/Generators/DefinedCharListGenerator/Program.cs +++ b/unicode/Generators/DefinedCharListGenerator/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; @@ -19,6 +20,7 @@ namespace DefinedCharListGenerator const uint MAX_UNICODE_CHAR = 0x10FFFF; // Unicode range is U+0000 .. U+10FFFF bool[] definedChars = new bool[MAX_UNICODE_CHAR + 1]; + Dictionary spans = new Dictionary(); // Read all defined characters from the input file. string[] allLines = File.ReadAllLines("UnicodeData.txt"); @@ -28,11 +30,33 @@ namespace DefinedCharListGenerator foreach (string line in allLines) { string[] splitLine = line.Split(new char[] { ';' }, 4); + uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); + string rawName = splitLine[1]; + string category = splitLine[2]; + + // spans go into their own dictionary for later processing + string spanName; + bool isStartOfSpan; + if (IsSpanDefinition(rawName, out spanName, out isStartOfSpan)) + { + if (isStartOfSpan) + { + spans.Add(spanName, new Span() { FirstCodePoint = codepoint, Category = category }); + } + else + { + var existingSpan = spans[spanName]; + Debug.Assert(existingSpan.FirstCodePoint != 0, "We should've seen the start of this span already."); + Debug.Assert(existingSpan.LastCodePoint == 0, "We shouldn't have seen the end of this span already."); + Debug.Assert(existingSpan.Category == category, "Span start Unicode category doesn't match span end Unicode category."); + existingSpan.LastCodePoint = codepoint; + } + continue; + } // We only allow certain categories of code points. // Zs (space separators) aren't included, but we allow U+0020 SPACE as a special case - uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); - string category = splitLine[2]; + if (!(codepoint == (uint)' ' || IsAllowedUnicodeCategory(category))) { continue; @@ -42,6 +66,21 @@ namespace DefinedCharListGenerator definedChars[codepoint] = true; } + // Next, populate characters that weren't defined on their own lines + // but which are instead defined as members of a named span. + foreach (var span in spans.Values) + { + if (IsAllowedUnicodeCategory(span.Category)) + { + Debug.Assert(span.FirstCodePoint <= MAX_UNICODE_CHAR); + Debug.Assert(span.LastCodePoint <= MAX_UNICODE_CHAR); + for (uint i = span.FirstCodePoint; i <= span.LastCodePoint; i++) + { + definedChars[i] = true; + } + } + } + // Finally, write the list of defined characters out as a bitmap. // Each consecutive block of 8 chars is written as a single byte. // For instance, the first byte of the output file contains the @@ -103,5 +142,39 @@ namespace DefinedCharListGenerator || category == "So" || category == "Cf"; /* other */ } + + private static bool IsSpanDefinition(string rawName, out string spanName, out bool isStartOfSpan) + { + // Spans are represented within angle brackets, such as the following: + // DC00;;Cs;0;L;;;;;N;;;;; + // DFFF;;Cs;0;L;;;;;N;;;;; + if (rawName.StartsWith("<", StringComparison.Ordinal)) + { + if (rawName.EndsWith(", First>", StringComparison.Ordinal)) + { + spanName = rawName.Substring(1, rawName.Length - 1 - ", First>".Length); + isStartOfSpan = true; + return true; + } + else if (rawName.EndsWith(", Last>", StringComparison.Ordinal)) + { + spanName = rawName.Substring(1, rawName.Length - 1 - ", Last>".Length); + isStartOfSpan = false; + return true; + } + } + + // not surrounded by <>, or or some other non-span + spanName = null; + isStartOfSpan = false; + return false; + } + + private class Span + { + public uint FirstCodePoint; + public uint LastCodePoint; + public string Category; + } } } From e2e14681d120f328e6e02232f7cd26326cd8839a Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 7 Apr 2015 14:45:42 -0700 Subject: [PATCH 280/846] Add serviceable attribute to projects. aspnet/DNX#1600 --- .../Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 6 ++++++ 10 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs index 9ee9efbfa5..694179e207 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -1,7 +1,9 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Reflection; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] +[assembly: AssemblyMetadata("Serviceable", "True")] diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file From e0b09418722e2bcf1b7130f6229d84efebedbe2e Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 7 Apr 2015 16:15:21 -0700 Subject: [PATCH 281/846] Update .travis.yml and appveyor.yml to build quietly. --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5939a529e5..947bf868ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ language: csharp sudo: false script: - - ./build.sh verify \ No newline at end of file + - ./build.sh --quiet verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 3fab83e134..636a7618d3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,7 @@ init: - git config --global core.autocrlf true build_script: - - build.cmd verify + - build.cmd --quiet verify clone_depth: 1 test: off deploy: off \ No newline at end of file From 043b0f204cbf6d3adda028c809461f681ec78b04 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 8 Apr 2015 14:22:51 -0700 Subject: [PATCH 282/846] Replace WebSocket dependency. Remove chained dependencies. --- src/Microsoft.AspNet.Http.Core/project.json | 15 +-------------- src/Microsoft.AspNet.Http.Interfaces/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 5 +---- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 61d978811d..2658e2f517 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -14,21 +14,8 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Text.Encoding": "4.0.10-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Text.Encoding": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index b327b3a467..3af7b3bdfb 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -5,8 +5,8 @@ "dnx451": {}, "dnxcore50": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets" : "4.0.0-beta-*", "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*" diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 33d1c1c46a..aad1a478bc 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -9,16 +9,13 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", "System.Diagnostics.Tools": "4.0.0-beta-*", "System.Globalization": "4.0.10-beta-*", "System.Globalization.Extensions": "4.0.0-beta-*", - "System.IO": "4.0.10-beta-*", "System.Linq": "4.0.0-beta-*", + "System.Net.WebSockets" : "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", From fab55afca53f956e928df0aff5b09f7aa0fff674 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 8 Apr 2015 14:55:34 -0700 Subject: [PATCH 283/846] Update resource names --- src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs | 5 ++++- .../UnicodeHelpersTests.cs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs index 549f912e1a..2aa3dac0e0 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs @@ -34,7 +34,10 @@ namespace Microsoft.Framework.WebEncoders private static uint[] CreateDefinedCharacterBitmap() { // The stream should be exactly 8KB in size. - var stream = typeof(UnicodeHelpers).GetTypeInfo().Assembly.GetManifestResourceStream("compiler/resources/unicode-7.0.0-defined-characters.bin"); + var assembly = typeof(UnicodeHelpers).GetTypeInfo().Assembly; + var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-7.0.0-defined-characters.bin"; + + var stream = assembly.GetManifestResourceStream(resourceName); if (stream.Length != 8 * 1024) { Environment.FailFast("Corrupt data detected."); diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 6be7c93bbc..4d34a40e96 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -157,7 +157,10 @@ namespace Microsoft.Framework.WebEncoders HashSet seenCategories = new HashSet(); bool[] retVal = new bool[0x10000]; - string[] allLines = new StreamReader(typeof(UnicodeHelpersTests).GetTypeInfo().Assembly.GetManifestResourceStream("../../unicode/UnicodeData.txt")).ReadAllLines(); + + var assembly = typeof(UnicodeHelpersTests).GetTypeInfo().Assembly; + var resourceName = assembly.GetName().Name + ".UnicodeData.txt"; + string[] allLines = new StreamReader(assembly.GetManifestResourceStream(resourceName)).ReadAllLines(); foreach (string line in allLines) { From 58f759ac25521207f8a1bd632c3740972cdf8e1e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 10 Apr 2015 09:51:01 -0700 Subject: [PATCH 284/846] Move IServerInformation to Hosting. --- src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs | 6 +++--- src/Microsoft.AspNet.Http/IApplicationBuilder.cs | 2 +- src/Microsoft.AspNet.Http/IServerInformation.cs | 10 ---------- 3 files changed, 4 insertions(+), 14 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs index 71f6ef267b..e7a00106c2 100644 --- a/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs @@ -36,15 +36,15 @@ namespace Microsoft.AspNet.Builder } } - public IServerInformation Server + public object Server { get { - return GetProperty(Constants.BuilderProperties.ServerInformation); + return GetProperty(Constants.BuilderProperties.ServerInformation); } set { - SetProperty(Constants.BuilderProperties.ServerInformation, value); + SetProperty(Constants.BuilderProperties.ServerInformation, value); } } diff --git a/src/Microsoft.AspNet.Http/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs index bed7c50f0d..cfecfd9728 100644 --- a/src/Microsoft.AspNet.Http/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Builder { IServiceProvider ApplicationServices { get; set; } - IServerInformation Server { get; set; } + object Server { get; set; } IDictionary Properties { get; set; } diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs deleted file mode 100644 index e99042e637..0000000000 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Builder -{ - public interface IServerInformation - { - string Name { get; } - } -} From 03c47ad58205cba94483d969c6bf44ad323741be Mon Sep 17 00:00:00 2001 From: Ryan Meyer Date: Fri, 10 Apr 2015 16:05:44 -0700 Subject: [PATCH 285/846] Spelling mistake. Sorry I was looking at this code trying to track down a bug somewhere else and noticed a spelling mistake for a local variable. I know I tend to be anal about spelling, so figured I'd at least point it out. --- src/Microsoft.AspNet.Http.Core/FormFeature.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/FormFeature.cs b/src/Microsoft.AspNet.Http.Core/FormFeature.cs index 33f84e3745..3be19c7ebb 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/FormFeature.cs @@ -48,8 +48,8 @@ namespace Microsoft.AspNet.Http.Core return true; } - var conentType = ContentType; - return HasApplicationFormContentType(conentType) || HasMultipartFormContentType(conentType); + var contentType = ContentType; + return HasApplicationFormContentType(contentType) || HasMultipartFormContentType(contentType); } } From 09d6ab03bc537c18a53f857a98699d0326ee60f7 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 9 Apr 2015 15:54:43 -0700 Subject: [PATCH 286/846] Re-use public constants for header names. --- .../Collections/ResponseCookies.cs | 16 ++++++++-------- .../DefaultHttpContext.cs | 5 ++--- .../DefaultHttpRequest.cs | 10 +++++----- .../DefaultHttpResponse.cs | 10 +++++----- .../Infrastructure/Constants.cs | 19 ------------------- .../Infrastructure/ParsingHelpers.cs | 8 ++++---- .../RequestCookiesFeature.cs | 4 ++-- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 1 + 8 files changed, 27 insertions(+), 46 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index 056df67640..cfdd8798c7 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core.Collections { @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value) { - Headers.AppendValues(Constants.Headers.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); + Headers.AppendValues(HeaderNames.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); } /// @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Http.Core.Collections !expiresHasValue ? null : options.Expires.Value.ToString("ddd, dd-MMM-yyyy HH:mm:ss ", CultureInfo.InvariantCulture) + "GMT", !options.Secure ? null : "; secure", !options.HttpOnly ? null : "; HttpOnly"); - Headers.AppendValues("Set-Cookie", setCookieValue); + Headers.AppendValues(HeaderNames.SetCookie, setCookieValue); } /// @@ -73,14 +73,14 @@ namespace Microsoft.AspNet.Http.Core.Collections Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); var deleteCookies = new[] { UrlEncoder.Default.UrlEncode(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; - IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + IList existingValues = Headers.GetValues(HeaderNames.SetCookie); if (existingValues == null || existingValues.Count == 0) { - Headers.SetValues(Constants.Headers.SetCookie, deleteCookies); + Headers.SetValues(HeaderNames.SetCookie, deleteCookies); } else { - Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); + Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); } } @@ -112,10 +112,10 @@ namespace Microsoft.AspNet.Http.Core.Collections rejectPredicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); } - IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + IList existingValues = Headers.GetValues(HeaderNames.SetCookie); if (existingValues != null) { - Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); + Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); } Append(key, string.Empty, new CookieOptions diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 5ff30f1fc5..304099c3ff 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net.WebSockets; using System.Security.Claims; using System.Threading; @@ -13,8 +12,8 @@ using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -169,7 +168,7 @@ namespace Microsoft.AspNet.Http.Core { get { - return Request.Headers.GetValues(Constants.Headers.WebSocketSubProtocols) ?? EmptyList; + return Request.Headers.GetValues(HeaderNames.WebSocketSubProtocols) ?? EmptyList; } } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 5b59cad761..03dca77785 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -6,10 +6,10 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -113,7 +113,7 @@ namespace Microsoft.AspNet.Http.Core public override bool IsHttps { - get { return string.Equals("https", Scheme, StringComparison.OrdinalIgnoreCase); } + get { return string.Equals(Constants.Https, Scheme, StringComparison.OrdinalIgnoreCase); } } public override HostString Host @@ -145,8 +145,8 @@ namespace Microsoft.AspNet.Http.Core public override string ContentType { - get { return Headers[Constants.Headers.ContentType]; } - set { Headers[Constants.Headers.ContentType] = value; } + get { return Headers[HeaderNames.ContentType]; } + set { Headers[HeaderNames.ContentType] = value; } } public override bool HasFormContentType diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 6e23c35b15..0cb23010a0 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -11,8 +11,8 @@ using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -80,18 +80,18 @@ namespace Microsoft.AspNet.Http.Core { get { - var contentType = Headers[Constants.Headers.ContentType]; + var contentType = Headers[HeaderNames.ContentType]; return contentType; } set { if (string.IsNullOrWhiteSpace(value)) { - HttpResponseFeature.Headers.Remove(Constants.Headers.ContentType); + HttpResponseFeature.Headers.Remove(HeaderNames.ContentType); } else { - HttpResponseFeature.Headers[Constants.Headers.ContentType] = new[] { value }; + HttpResponseFeature.Headers[HeaderNames.ContentType] = new[] { value }; } } } @@ -127,7 +127,7 @@ namespace Microsoft.AspNet.Http.Core HttpResponseFeature.StatusCode = 302; } - Headers.Set(Constants.Headers.Location, location); + Headers.Set(HeaderNames.Location, location); } public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationSchemes) diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs index c918c4de33..67c3aecb76 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs @@ -7,25 +7,6 @@ namespace Microsoft.AspNet.Http.Infrastructure { internal const string Https = "HTTPS"; - internal const string HttpDateFormat = "r"; - - internal static class Headers - { - internal const string ContentType = "Content-Type"; - internal const string CacheControl = "Cache-Control"; - internal const string MediaType = "Media-Type"; - internal const string Accept = "Accept"; - internal const string AcceptCharset = "Accept-Charset"; - internal const string Host = "Host"; - internal const string ETag = "ETag"; - internal const string Location = "Location"; - internal const string ContentLength = "Content-Length"; - internal const string Cookie = "Cookie"; - internal const string SetCookie = "Set-Cookie"; - internal const string Expires = "Expires"; - internal const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; - } - internal static class BuilderProperties { internal static string ServerInformation = "server.Information"; diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs index d9c9a3540e..0831839bd7 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs @@ -6,8 +6,8 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core.Infrastructure { @@ -775,7 +775,7 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; - string rawValue = headers.Get(Constants.Headers.ContentLength); + string rawValue = headers.Get(HeaderNames.ContentLength); if (!string.IsNullOrWhiteSpace(rawValue) && long.TryParse(rawValue, styles, CultureInfo.InvariantCulture, out value)) { @@ -789,11 +789,11 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure { if (value.HasValue) { - headers[Constants.Headers.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); + headers[HeaderNames.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); } else { - headers.Remove(Constants.Headers.ContentLength); + headers.Remove(HeaderNames.ContentLength); } } } diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index a04d2b7016..46d7a4f249 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -6,8 +6,8 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Core } var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? string.Empty; + string cookiesHeader = ParsingHelpers.GetHeader(headers, HeaderNames.Cookie) ?? string.Empty; if (_cookiesCollection == null) { diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index 53f1d53dc9..d7f83090b8 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -54,6 +54,7 @@ namespace Microsoft.Net.Http.Headers public const string Vary = "Vary"; public const string Via = "Via"; public const string Warning = "Warning"; + public const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; public const string WWWAuthenticate = "WWW-Authenticate"; } } \ No newline at end of file From e818783ba4b818542a681be4a206dc40804c33a6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 10 Apr 2015 12:06:09 -0700 Subject: [PATCH 287/846] #167: Update cookie APIs to use shared core. --- .../Collections/RequestCookiesCollection.cs | 28 +++-- .../Collections/ResponseCookies.cs | 47 ++++---- .../Infrastructure/ParsingHelpers.cs | 107 ------------------ .../RequestCookiesFeature.cs | 19 ++-- 4 files changed, 48 insertions(+), 153 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs index 36a91735a3..6f43aa3d07 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs @@ -4,8 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core.Collections { @@ -73,12 +72,20 @@ namespace Microsoft.AspNet.Http.Core.Collections return _dictionary.TryGetValue(key, out value) ? new[] { value } : null; } - private static readonly char[] SemicolonAndComma = { ';', ',' }; - - public void Reparse(string cookiesHeader) + public void Reparse(IList values) { _dictionary.Clear(); - ParsingHelpers.ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, _dictionary); + + IList cookies; + if (CookieHeaderValue.TryParseList(values, out cookies)) + { + foreach (var cookie in cookies) + { + var name = Uri.UnescapeDataString(cookie.Name.Replace('+', ' ')); + var value = Uri.UnescapeDataString(cookie.Value.Replace('+', ' ')); + _dictionary[name] = value; + } + } } public IEnumerator> GetEnumerator() @@ -93,14 +100,5 @@ namespace Microsoft.AspNet.Http.Core.Collections { return GetEnumerator(); } - - private static readonly Action AddCookieCallback = (name, value, state) => - { - var dictionary = (IDictionary)state; - if (!dictionary.ContainsKey(name)) - { - dictionary.Add(name, value); - } - }; } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index cfdd8798c7..45da572ccb 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; @@ -34,7 +33,11 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value) { - Headers.AppendValues(HeaderNames.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); + Headers.AppendValues(HeaderNames.SetCookie, + new SetCookieHeaderValue( + UrlEncoder.Default.UrlEncode(key), + UrlEncoder.Default.UrlEncode(value)) + { Path = "/" }.ToString()); } /// @@ -45,23 +48,17 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value, [NotNull] CookieOptions options) { - bool domainHasValue = !string.IsNullOrEmpty(options.Domain); - bool pathHasValue = !string.IsNullOrEmpty(options.Path); - bool expiresHasValue = options.Expires.HasValue; - - string setCookieValue = string.Concat( - UrlEncoder.Default.UrlEncode(key), - "=", - UrlEncoder.Default.UrlEncode(value ?? string.Empty), - !domainHasValue ? null : "; domain=", - !domainHasValue ? null : options.Domain, - !pathHasValue ? null : "; path=", - !pathHasValue ? null : options.Path, - !expiresHasValue ? null : "; expires=", - !expiresHasValue ? null : options.Expires.Value.ToString("ddd, dd-MMM-yyyy HH:mm:ss ", CultureInfo.InvariantCulture) + "GMT", - !options.Secure ? null : "; secure", - !options.HttpOnly ? null : "; HttpOnly"); - Headers.AppendValues(HeaderNames.SetCookie, setCookieValue); + Headers.AppendValues(HeaderNames.SetCookie, + new SetCookieHeaderValue( + UrlEncoder.Default.UrlEncode(key), + UrlEncoder.Default.UrlEncode(value)) + { + Domain = options.Domain, + Path = options.Path, + Expires = options.Expires, + Secure = options.Secure, + HttpOnly = options.HttpOnly, + }.ToString()); } /// @@ -70,9 +67,10 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Delete(string key) { - Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; + Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - var deleteCookies = new[] { UrlEncoder.Default.UrlEncode(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; + var deleteCookies = new[] { encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; IList existingValues = Headers.GetValues(HeaderNames.SetCookie); if (existingValues == null || existingValues.Count == 0) { @@ -91,6 +89,7 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Delete(string key, [NotNull] CookieOptions options) { + var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); @@ -98,18 +97,18 @@ namespace Microsoft.AspNet.Http.Core.Collections if (domainHasValue) { rejectPredicate = value => - value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && value.IndexOf("domain=" + options.Domain, StringComparison.OrdinalIgnoreCase) != -1; } else if (pathHasValue) { rejectPredicate = value => - value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && value.IndexOf("path=" + options.Path, StringComparison.OrdinalIgnoreCase) != -1; } else { - rejectPredicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + rejectPredicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); } IList existingValues = Headers.GetValues(HeaderNames.SetCookie); diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs index 0831839bd7..cf6a955d86 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs @@ -496,71 +496,6 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure internal static class ParsingHelpers { - private static readonly Action AddCookieCallback = (name, value, state) => - { - var dictionary = (IDictionary)state; - if (!dictionary.ContainsKey(name)) - { - dictionary.Add(name, value); - } - }; - - private static readonly char[] SemicolonAndComma = new[] { ';', ',' }; - - internal static T GetItem(HttpRequest request, string key) - { - object value; - return request.HttpContext.Items.TryGetValue(key, out value) ? (T)value : default(T); - } - - internal static void SetItem(HttpRequest request, string key, T value) - { - request.HttpContext.Items[key] = value; - } - - internal static void ParseCookies(string cookiesHeader, IDictionary cookiesCollection) - { - ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, cookiesCollection); - } - - internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) - { - int textLength = text.Length; - int equalIndex = text.IndexOf('='); - if (equalIndex == -1) - { - equalIndex = textLength; - } - int scanIndex = 0; - while (scanIndex < textLength) - { - int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); - if (delimiterIndex == -1) - { - delimiterIndex = textLength; - } - if (equalIndex < delimiterIndex) - { - while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) - { - ++scanIndex; - } - string name = text.Substring(scanIndex, equalIndex - scanIndex); - string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); - callback( - Uri.UnescapeDataString(name.Replace('+', ' ')), - Uri.UnescapeDataString(value.Replace('+', ' ')), - state); - equalIndex = text.IndexOf('=', delimiterIndex); - if (equalIndex == -1) - { - equalIndex = textLength; - } - } - scanIndex = delimiterIndex + 1; - } - } - public static string GetHeader(IDictionary headers, string key) { string[] values = GetHeaderUnmodified(headers, key); @@ -729,48 +664,6 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure } } - private static readonly Action AppendItemCallback = (name, value, state) => - { - var dictionary = (IDictionary>)state; - - List existing; - if (!dictionary.TryGetValue(name, out existing)) - { - dictionary.Add(name, new List(1) { value }); - } - else - { - existing.Add(value); - } - }; - - internal static string GetJoinedValue(IDictionary store, string key) - { - string[] values = GetUnmodifiedValues(store, key); - return values == null ? null : string.Join(",", values); - } - - internal static string[] GetUnmodifiedValues([NotNull] IDictionary store, string key) - { - string[] values; - return store.TryGetValue(key, out values) ? values : null; - } - - //internal static string GetHost(HttpRequest request) - //{ - // IHeaderDictionary headers = request.Headers; - - // string host = GetHeader(headers, "Host"); - // if (!string.IsNullOrWhiteSpace(host)) - // { - // return host; - // } - - // string localIpAddress = request.LocalIpAddress ?? "localhost"; - // var localPort = request.Get(OwinConstants.CommonKeys.LocalPort); - // return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); - //} - public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index 46d7a4f249..4a22b22a93 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; @@ -15,7 +16,7 @@ namespace Microsoft.AspNet.Http.Core { private readonly IFeatureCollection _features; private readonly FeatureReference _request = FeatureReference.Default; - private string _cookiesHeader; + private string[] _cookieHeaders; private RequestCookiesCollection _cookiesCollection; private IReadableStringCollection _cookies; @@ -44,18 +45,22 @@ namespace Microsoft.AspNet.Http.Core } var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, HeaderNames.Cookie) ?? string.Empty; + string[] values; + if (!headers.TryGetValue(HeaderNames.Cookie, out values)) + { + values = new string[0]; + } if (_cookiesCollection == null) { + _cookieHeaders = values; _cookiesCollection = new RequestCookiesCollection(); - _cookiesCollection.Reparse(cookiesHeader); - _cookiesHeader = cookiesHeader; + _cookiesCollection.Reparse(values); } - else if (!string.Equals(_cookiesHeader, cookiesHeader, StringComparison.Ordinal)) + else if (!Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) { - _cookiesCollection.Reparse(cookiesHeader); - _cookiesHeader = cookiesHeader; + _cookieHeaders = values; + _cookiesCollection.Reparse(values); } return _cookiesCollection; From c69c289abf85a42c5eff156f1a571efd26ce407f Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 15 Apr 2015 11:15:40 -0700 Subject: [PATCH 288/846] Simplify Challenge flow --- .../Authentication/ChallengeContext.cs | 19 +++++++------ .../DefaultHttpResponse.cs | 10 +++---- .../Authentication/IChallengeContext.cs | 6 ++-- src/Microsoft.AspNet.Http/HttpResponse.cs | 28 +++---------------- 4 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index 7b86337ccd..b47feedf45 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -4,33 +4,34 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { public class ChallengeContext : IChallengeContext { - private List _accepted; + private bool _accepted; - public ChallengeContext([NotNull] IEnumerable authenticationSchemes, IDictionary properties) + public ChallengeContext(string authenticationScheme, IDictionary properties) { - AuthenticationSchemes = authenticationSchemes; + AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - _accepted = new List(); + + // The default Challenge with no scheme is always accepted + _accepted = string.IsNullOrEmpty(authenticationScheme); } - public IEnumerable AuthenticationSchemes { get; private set; } + public string AuthenticationScheme { get; private set; } public IDictionary Properties { get; private set; } - public IEnumerable Accepted + public bool Accepted { get { return _accepted; } } - public void Accept(string authenticationType, IDictionary description) + public void Accept() { - _accepted.Add(authenticationType); + _accepted = true; } } } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 0cb23010a0..1c91cd5a0c 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -130,22 +130,20 @@ namespace Microsoft.AspNet.Http.Core Headers.Set(HeaderNames.Location, location); } - public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationSchemes) + public override void Challenge(AuthenticationProperties properties, string authenticationScheme) { HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationSchemes, properties == null ? null : properties.Dictionary); + var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); if (handler != null) { handler.Challenge(challengeContext); } - // Verify all types ack'd - IEnumerable leftovers = authenticationSchemes.Except(challengeContext.Accepted); - if (leftovers.Any()) + if (!challengeContext.Accepted) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs index 3c6f2058de..26a90fefb2 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs @@ -7,9 +7,9 @@ namespace Microsoft.AspNet.Http.Authentication { public interface IChallengeContext { - IEnumerable AuthenticationSchemes {get;} - IDictionary Properties {get;} + string AuthenticationScheme { get; } + IDictionary Properties { get; } - void Accept(string authenticationType, IDictionary description); + void Accept(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 5fd8e099e0..97c0a63e50 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -38,40 +38,20 @@ namespace Microsoft.AspNet.Http public virtual void Challenge() { - Challenge(new string[0]); + Challenge(properties: null, authenticationScheme: null); } public virtual void Challenge(AuthenticationProperties properties) { - Challenge(properties, new string[0]); + Challenge(properties, ""); } public virtual void Challenge(string authenticationScheme) { - Challenge(new[] { authenticationScheme }); + Challenge(properties: null, authenticationScheme: authenticationScheme); } - public virtual void Challenge(AuthenticationProperties properties, string authenticationScheme) - { - Challenge(properties, new[] { authenticationScheme }); - } - - public virtual void Challenge(params string[] authenticationSchemes) - { - Challenge((IEnumerable)authenticationSchemes); - } - - public virtual void Challenge(IEnumerable authenticationSchemes) - { - Challenge(properties: null, authenticationSchemes: authenticationSchemes); - } - - public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationSchemes) - { - Challenge(properties, (IEnumerable)authenticationSchemes); - } - - public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationSchemes); + public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); From 22a1cab976dce5dfdc2a96a40fe459145e4f7cfe Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 16 Apr 2015 11:41:41 -0700 Subject: [PATCH 289/846] #149 - Expose connection information as 1st class. --- .../DefaultConnectionInfo.cs | 76 +++++++++++++++++++ .../DefaultHttpContext.cs | 4 + .../DefaultHttpRequest.cs | 12 --- .../HttpClientCertificateFeature.cs | 23 ++++++ .../HttpConnectionFeature.cs | 24 ++++++ src/Microsoft.AspNet.Http.Core/project.json | 1 - src/Microsoft.AspNet.Http/ConnectionInfo.cs | 27 +++++++ src/Microsoft.AspNet.Http/HttpContext.cs | 4 +- src/Microsoft.AspNet.Http/project.json | 2 + 9 files changed, 159 insertions(+), 14 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs create mode 100644 src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs create mode 100644 src/Microsoft.AspNet.Http/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs new file mode 100644 index 0000000000..4cd327a9fe --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Core.Infrastructure; + +namespace Microsoft.AspNet.Http.Core +{ + public class DefaultConnectionInfo : ConnectionInfo + { + private readonly IFeatureCollection _features; + + private FeatureReference _connection = FeatureReference.Default; + private FeatureReference _clientCertificate = FeatureReference.Default; + + public DefaultConnectionInfo(IFeatureCollection features) + { + _features = features; + } + + private IHttpConnectionFeature HttpConnectionFeature + { + get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); } + } + + private IHttpClientCertificateFeature HttpClientCertificateFeature + { + get { return _clientCertificate.Fetch(_features) ?? _clientCertificate.Update(_features, new HttpClientCertificateFeature()); } + } + + public override IPAddress RemoteIpAddress + { + get { return HttpConnectionFeature.RemoteIpAddress; } + set { HttpConnectionFeature.RemoteIpAddress = value; } + } + + public override int RemotePort + { + get { return HttpConnectionFeature.RemotePort; } + set { HttpConnectionFeature.RemotePort = value; } + } + + public override IPAddress LocalIpAddress + { + get { return HttpConnectionFeature.LocalIpAddress; } + set { HttpConnectionFeature.LocalIpAddress = value; } + } + + public override int LocalPort + { + get { return HttpConnectionFeature.LocalPort; } + set { HttpConnectionFeature.LocalPort = value; } + } + + public override bool IsLocal + { + get { return HttpConnectionFeature.IsLocal; } + set { HttpConnectionFeature.IsLocal = value; } + } + + public override X509Certificate ClientCertificate + { + get { return HttpClientCertificateFeature.ClientCertificate; } + set { HttpClientCertificateFeature.ClientCertificate = value; } + } + + public override Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()) + { + return HttpClientCertificateFeature.GetClientCertificateAsync(cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 304099c3ff..e8382c0022 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -23,6 +23,7 @@ namespace Microsoft.AspNet.Http.Core private readonly HttpRequest _request; private readonly HttpResponse _response; + private readonly ConnectionInfo _connection; private FeatureReference _items; private FeatureReference _serviceProviders; @@ -44,6 +45,7 @@ namespace Microsoft.AspNet.Http.Core _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); + _connection = new DefaultConnectionInfo(features); _items = FeatureReference.Default; _serviceProviders = FeatureReference.Default; @@ -87,6 +89,8 @@ namespace Microsoft.AspNet.Http.Core public override HttpResponse Response { get { return _response; } } + public override ConnectionInfo Connection { get { return _connection; } } + public override ClaimsPrincipal User { get diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 03dca77785..3e5e95e03a 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -19,8 +19,6 @@ namespace Microsoft.AspNet.Http.Core private readonly IFeatureCollection _features; private FeatureReference _request = FeatureReference.Default; - private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _clientCertificate = FeatureReference.Default; private FeatureReference _query = FeatureReference.Default; private FeatureReference _form = FeatureReference.Default; private FeatureReference _cookies = FeatureReference.Default; @@ -36,16 +34,6 @@ namespace Microsoft.AspNet.Http.Core get { return _request.Fetch(_features); } } - private IHttpConnectionFeature HttpConnectionFeature - { - get { return _connection.Fetch(_features); } - } - - private IHttpClientCertificateFeature HttpClientCertificateFeature - { - get { return _clientCertificate.Fetch(_features); } - } - private IQueryFeature QueryFeature { get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); } diff --git a/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs new file mode 100644 index 0000000000..dbdc0f14a9 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http.Core +{ + public class HttpClientCertificateFeature : IHttpClientCertificateFeature + { + public HttpClientCertificateFeature() + { + } + + public X509Certificate ClientCertificate { get; set; } + + public Task GetClientCertificateAsync(CancellationToken cancellationToken) + { + return Task.FromResult(ClientCertificate); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs new file mode 100644 index 0000000000..efe3e3aee6 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; + +namespace Microsoft.AspNet.Http.Core +{ + public class HttpConnectionFeature : IHttpConnectionFeature + { + public HttpConnectionFeature() + { + } + + public bool IsLocal { get; set; } + + public IPAddress LocalIpAddress { get; set; } + + public int LocalPort { get; set; } + + public IPAddress RemoteIpAddress { get; set; } + + public int RemotePort { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 2658e2f517..a241a92cfb 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -7,7 +7,6 @@ "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http/ConnectionInfo.cs b/src/Microsoft.AspNet.Http/ConnectionInfo.cs new file mode 100644 index 0000000000..54175ec2f2 --- /dev/null +++ b/src/Microsoft.AspNet.Http/ConnectionInfo.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + public abstract class ConnectionInfo + { + public abstract IPAddress RemoteIpAddress { get; set; } + + public abstract int RemotePort { get; set; } + + public abstract IPAddress LocalIpAddress { get; set; } + + public abstract int LocalPort { get; set; } + + public abstract bool IsLocal { get; set; } + + public abstract X509Certificate ClientCertificate { get; set; } + + public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index c69f882f91..47f595df17 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -18,8 +18,10 @@ namespace Microsoft.AspNet.Http public abstract HttpResponse Response { get; } + public abstract ConnectionInfo Connection { get; } + public abstract ClaimsPrincipal User { get; set; } - + public abstract IDictionary Items { get; } public abstract IServiceProvider ApplicationServices { get; set; } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index aad1a478bc..0a94666c50 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -14,10 +14,12 @@ "System.Globalization": "4.0.10-beta-*", "System.Globalization.Extensions": "4.0.0-beta-*", "System.Linq": "4.0.0-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", "System.Net.WebSockets" : "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" } From d111e24da71abdcaa0a60a2c4a057926759d5d8c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 16 Apr 2015 12:07:50 -0700 Subject: [PATCH 290/846] #190 - Swap Http and Http.Core package names. Remove Http.Core namespace. --- HttpAbstractions.sln | 10 +++--- .../Authentication/AuthenticateResult.cs | 0 .../AuthenticationDescription.cs | 0 .../AuthenticationProperties.cs | 0 .../ConnectionInfo.cs | 0 .../CookieOptions.cs | 0 .../Extensions/MapExtensions.cs | 0 .../Extensions/MapMiddleware.cs | 0 .../Extensions/MapOptions.cs | 0 .../Extensions/MapWhenExtensions.cs | 0 .../Extensions/MapWhenMiddleware.cs | 0 .../Extensions/MapWhenOptions.cs | 0 .../Extensions/RunExtensions.cs | 0 .../Extensions/UseExtensions.cs | 0 .../FragmentString.cs | 0 .../HostString.cs | 0 .../HttpContext.cs | 0 .../HttpRequest.cs | 0 .../HttpResponse.cs | 0 .../HttpResponseWritingExtensions.cs | 0 .../IApplicationBuilder.cs | 0 .../IFormCollection.cs | 0 .../IFormFile.cs | 0 .../IFormFileCollection.cs | 0 .../IHeaderDictionary.cs | 0 .../IReadableStringCollection.cs | 0 .../IResponseCookies.cs | 0 .../ISessionCollection.cs | 0 .../Microsoft.AspNet.Http.Core.xproj | 2 +- .../PathString.cs | 0 .../QueryString.cs | 0 .../RequestDelegate.cs | 0 src/Microsoft.AspNet.Http.Core/project.json | 23 ++++++++----- .../project.json | 2 +- .../ApplicationBuilder.cs | 0 .../Authentication/AuthenticateContext.cs | 4 +-- .../Authentication/ChallengeContext.cs | 4 +-- .../Authentication/DescribeSchemesContext.cs | 5 ++- .../HttpAuthenticationFeature.cs | 3 +- .../Authentication/SignInContext.cs | 3 +- .../Authentication/SignOutContext.cs | 3 +- .../BufferingHelper.cs | 2 +- .../Collections/FormCollection.cs | 2 +- .../Collections/FormFileCollection.cs | 3 +- .../Collections/HeaderDictionary.cs | 4 +-- .../Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 2 +- .../Collections/RequestCookiesCollection.cs | 2 +- .../Collections/ResponseCookies.cs | 2 +- .../Collections/SessionCollection.cs | 2 +- .../DefaultConnectionInfo.cs | 4 +-- .../DefaultHttpContext.cs | 7 ++-- .../DefaultHttpRequest.cs | 5 ++- .../DefaultHttpResponse.cs | 7 ++-- .../FormFeature.cs | 4 +-- .../FormFile.cs | 3 +- .../HttpClientCertificateFeature.cs | 2 +- .../HttpConnectionFeature.cs | 2 +- .../HttpRequestFeature.cs | 3 +- .../HttpResponseFeature.cs | 3 +- .../IFormFeature.cs | 2 +- .../IItemsFeature.cs | 2 +- .../IQueryFeature.cs | 4 +-- .../IRequestCookiesFeature.cs | 4 +-- .../IResponseCookiesFeature.cs | 5 +-- .../IServiceProvidersFeature.cs | 2 +- .../Infrastructure/Constants.cs | 0 .../Infrastructure/FeatureReference.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 2 +- .../ItemsFeature.cs | 2 +- .../Microsoft.AspNet.Http.xproj | 2 +- .../QueryFeature.cs | 6 ++-- .../ReferenceReadStream.cs | 2 +- .../RequestCookiesFeature.cs | 6 ++-- .../ResponseCookiesFeature.cs | 6 ++-- .../ServiceProvidersFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 4 +-- src/Microsoft.AspNet.Http/project.json | 23 +++++-------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 1 - src/Microsoft.AspNet.Owin/project.json | 2 -- .../project.json | 4 +-- .../HttpResponseWritingExtensionsTests.cs | 1 - .../MapPathMiddlewareTests.cs | 1 - .../MapPredicateMiddlewareTests.cs | 1 - .../Microsoft.AspNet.Http.Core.Tests.xproj | 2 +- .../PathStringTests.cs | 0 .../project.json | 33 ++++++++----------- .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../HttpResponseSendingExtensionsTests.cs | 1 - .../SendFileResponseExtensionsTests.cs | 1 - .../UseWithServicesTests.cs | 1 - .../project.json | 2 -- .../ApplicationBuilderTests.cs | 2 +- .../BufferingHelperTests.cs | 2 +- .../DefaultHttpContextTests.cs | 3 +- .../DefaultHttpRequestTests.cs | 3 +- .../FormFeatureTests.cs | 2 +- .../HeaderDictionaryTests.cs | 4 +-- .../Microsoft.AspNet.Http.Tests.xproj | 2 +- .../QueryFeatureTests.cs | 3 +- test/Microsoft.AspNet.Http.Tests/project.json | 32 +++++++++--------- .../OwinEnvironmentTests.cs | 1 - test/Microsoft.AspNet.Owin.Tests/project.json | 3 -- 104 files changed, 129 insertions(+), 177 deletions(-) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Authentication/AuthenticateResult.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Authentication/AuthenticationDescription.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Authentication/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/ConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/CookieOptions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapOptions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapWhenExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapWhenMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapWhenOptions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/RunExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/UseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/FragmentString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HostString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpContext.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpResponseWritingExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IFormCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IFormFile.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IHeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IReadableStringCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/ISessionCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/PathString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/QueryString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/RequestDelegate.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/AuthenticateContext.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/ChallengeContext.cs (91%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/DescribeSchemesContext.cs (87%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/HttpAuthenticationFeature.cs (85%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/SignInContext.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/SignOutContext.cs (90%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/BufferingHelper.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/FormCollection.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/FormFileCollection.cs (93%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/HeaderDictionary.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/ItemsDictionary.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/ReadableStringCollection.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/RequestCookiesCollection.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/ResponseCookies.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/SessionCollection.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultConnectionInfo.cs (96%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultHttpContext.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultHttpRequest.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultHttpResponse.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/FormFeature.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/FormFile.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpClientCertificateFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpConnectionFeature.cs (93%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpRequestFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpResponseFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IFormFeature.cs (96%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IItemsFeature.cs (89%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IQueryFeature.cs (80%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IRequestCookiesFeature.cs (81%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IResponseCookiesFeature.cs (71%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IServiceProvidersFeature.cs (90%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Infrastructure/Constants.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Infrastructure/FeatureReference.cs (95%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Infrastructure/ParsingHelpers.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ItemsFeature.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/QueryFeature.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ReferenceReadStream.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/RequestCookiesFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ResponseCookiesFeature.cs (88%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ServiceProvidersFeature.cs (91%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/WebSocketAcceptContext.cs (82%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/HttpResponseWritingExtensionsTests.cs (97%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/MapPathMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/MapPredicateMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/PathStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/ApplicationBuilderTests.cs (95%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/BufferingHelperTests.cs (92%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/DefaultHttpContextTests.cs (98%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/DefaultHttpRequestTests.cs (98%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/FormFeatureTests.cs (99%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/HeaderDictionaryTests.cs (91%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/QueryFeatureTests.cs (93%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index dbc423e462..18c4d05c9f 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,25 +1,25 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22710.0 +VisualStudioVersion = 14.0.22807.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNet.Http/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ConnectionInfo.cs rename to src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http/CookieOptions.cs b/src/Microsoft.AspNet.Http.Core/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/CookieOptions.cs rename to src/Microsoft.AspNet.Http.Core/CookieOptions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapOptions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http.Core/FragmentString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/FragmentString.cs rename to src/Microsoft.AspNet.Http.Core/FragmentString.cs diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http.Core/HostString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HostString.cs rename to src/Microsoft.AspNet.Http.Core/HostString.cs diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http.Core/HttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpContext.cs rename to src/Microsoft.AspNet.Http.Core/HttpContext.cs diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http.Core/HttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpRequest.cs rename to src/Microsoft.AspNet.Http.Core/HttpRequest.cs diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http.Core/HttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpResponse.cs rename to src/Microsoft.AspNet.Http.Core/HttpResponse.cs diff --git a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IApplicationBuilder.cs rename to src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http/IFormCollection.cs b/src/Microsoft.AspNet.Http.Core/IFormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IFormCollection.cs rename to src/Microsoft.AspNet.Http.Core/IFormCollection.cs diff --git a/src/Microsoft.AspNet.Http/IFormFile.cs b/src/Microsoft.AspNet.Http.Core/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IFormFile.cs rename to src/Microsoft.AspNet.Http.Core/IFormFile.cs diff --git a/src/Microsoft.AspNet.Http/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IFormFileCollection.cs rename to src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IHeaderDictionary.cs rename to src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IReadableStringCollection.cs rename to src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs diff --git a/src/Microsoft.AspNet.Http/IResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IResponseCookies.cs rename to src/Microsoft.AspNet.Http.Core/IResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Core/ISessionCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ISessionCollection.cs rename to src/Microsoft.AspNet.Http.Core/ISessionCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj index 447e54485b..67db5d869b 100644 --- a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj +++ b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj @@ -6,7 +6,7 @@ - bcf0f967-8753-4438-bd07-aadca9ce509a + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/PathString.cs rename to src/Microsoft.AspNet.Http.Core/PathString.cs diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http.Core/QueryString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/QueryString.cs rename to src/Microsoft.AspNet.Http.Core/QueryString.cs diff --git a/src/Microsoft.AspNet.Http/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Core/RequestDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Http/RequestDelegate.cs rename to src/Microsoft.AspNet.Http.Core/RequestDelegate.cs diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index a241a92cfb..4f562544c9 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,20 +1,27 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature implementations.", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Net.Http.Headers": "1.0.0-*" + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Text.Encoding": "4.0.10-beta-*" + "System.Collections": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets" : "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 415597b029..4055d3b43d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs rename to src/Microsoft.AspNet.Http/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs index ed0dd55eb7..91d530dfad 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs @@ -1,13 +1,11 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class AuthenticateContext : IAuthenticateContext { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs similarity index 91% rename from src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs index b47feedf45..0a137bb645 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs @@ -3,9 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class ChallengeContext : IChallengeContext { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs similarity index 87% rename from src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs index 6da55ce724..6e4907949d 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Authentication; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class DescribeSchemesContext : IDescribeSchemesContext { @@ -19,7 +18,7 @@ namespace Microsoft.AspNet.Http.Core.Authentication { get { return _results; } } - + public void Accept(IDictionary description) { _results.Add(new AuthenticationDescription(description)); diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs similarity index 85% rename from src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs index f67075e371..0a56cf4eaf 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs rename to src/Microsoft.AspNet.Http/Authentication/SignInContext.cs index 6d067c3919..1a77db412b 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs @@ -4,10 +4,9 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class SignInContext : ISignInContext { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs similarity index 90% rename from src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs rename to src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs index 318be62c70..d78820980e 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs @@ -3,10 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Authentication; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class SignOutContext : ISignOutContext { diff --git a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/BufferingHelper.cs rename to src/Microsoft.AspNet.Http/BufferingHelper.cs index 3c0120f725..37c93d8392 100644 --- a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -6,7 +6,7 @@ using System.IO; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public static class BufferingHelper { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs rename to src/Microsoft.AspNet.Http/Collections/FormCollection.cs index ffef8fcaa2..fed0bb1b1c 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs similarity index 93% rename from src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs rename to src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs index d33992bff8..2844d1c60d 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs rename to src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs index 487f1c4190..ffff7d724f 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs @@ -5,10 +5,10 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs rename to src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs index 06c27fbc1e..ead480bdf1 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs index 38aa497e12..4977d04e08 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs @@ -5,7 +5,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs index 6f43aa3d07..0610faa880 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs rename to src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs index 45da572ccb..1636d4e739 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs @@ -8,7 +8,7 @@ using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs rename to src/Microsoft.AspNet.Http/Collections/SessionCollection.cs index df58e4a63f..d2147c6c4b 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs @@ -5,7 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { public class SessionCollection : ISessionCollection { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs similarity index 96% rename from src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs rename to src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 4cd327a9fe..f400f6aaff 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -6,9 +6,9 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultConnectionInfo : ConnectionInfo { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs rename to src/Microsoft.AspNet.Http/DefaultHttpContext.cs index e8382c0022..81aef590ff 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -9,13 +9,12 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultHttpContext : HttpContext { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs rename to src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 3e5e95e03a..8f2a20e55c 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -6,12 +6,11 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs rename to src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 1c91cd5a0c..a5a3e9a438 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -8,13 +8,12 @@ using System.Linq; using System.Security.Claims; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNet.Http.Core/FormFeature.cs b/src/Microsoft.AspNet.Http/FormFeature.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/FormFeature.cs rename to src/Microsoft.AspNet.Http/FormFeature.cs index 3be19c7ebb..a8c490100f 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/FormFeature.cs @@ -7,12 +7,12 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNet.Http.Core/FormFile.cs b/src/Microsoft.AspNet.Http/FormFile.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/FormFile.cs rename to src/Microsoft.AspNet.Http/FormFile.cs index bbf0a52699..25e1081b2a 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFile.cs +++ b/src/Microsoft.AspNet.Http/FormFile.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs index dbdc0f14a9..22ef21f704 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpClientCertificateFeature : IHttpClientCertificateFeature { diff --git a/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs similarity index 93% rename from src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http/HttpConnectionFeature.cs index efe3e3aee6..8f1a7c0123 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpConnectionFeature : IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs rename to src/Microsoft.AspNet.Http/HttpRequestFeature.cs index cefd16584c..e17746cc7d 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs @@ -4,9 +4,8 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpRequestFeature : IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs rename to src/Microsoft.AspNet.Http/HttpResponseFeature.cs index 509677f4a7..f0b9c7faeb 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs @@ -4,9 +4,8 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpResponseFeature : IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs b/src/Microsoft.AspNet.Http/IFormFeature.cs similarity index 96% rename from src/Microsoft.AspNet.Http.Core/IFormFeature.cs rename to src/Microsoft.AspNet.Http/IFormFeature.cs index 2447a8a3fe..0f8e97eb67 100644 --- a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http/IFormFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IFormFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IItemsFeature.cs b/src/Microsoft.AspNet.Http/IItemsFeature.cs similarity index 89% rename from src/Microsoft.AspNet.Http.Core/IItemsFeature.cs rename to src/Microsoft.AspNet.Http/IItemsFeature.cs index a38a9cb720..876580ef79 100644 --- a/src/Microsoft.AspNet.Http.Core/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IItemsFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IQueryFeature.cs b/src/Microsoft.AspNet.Http/IQueryFeature.cs similarity index 80% rename from src/Microsoft.AspNet.Http.Core/IQueryFeature.cs rename to src/Microsoft.AspNet.Http/IQueryFeature.cs index 545200b3c5..086e9f189b 100644 --- a/src/Microsoft.AspNet.Http.Core/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/IQueryFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IQueryFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs similarity index 81% rename from src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs index d52e714c71..5ba34bb9a0 100644 --- a/src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs similarity index 71% rename from src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs index f33a15361b..b10b1c40c9 100644 --- a/src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs @@ -1,10 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core.Collections; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs similarity index 90% rename from src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs index 3435e53972..d2bb79b6c8 100644 --- a/src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs rename to src/Microsoft.AspNet.Http/Infrastructure/Constants.cs diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs similarity index 95% rename from src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs rename to src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs index f6db6e4fef..cea473a4ef 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.FeatureModel; -namespace Microsoft.AspNet.Http.Core.Infrastructure +namespace Microsoft.AspNet.Http.Infrastructure { internal struct FeatureReference { diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs index cf6a955d86..549bf51777 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Infrastructure +namespace Microsoft.AspNet.Http.Infrastructure { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNet.Http.Core/ItemsFeature.cs b/src/Microsoft.AspNet.Http/ItemsFeature.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/ItemsFeature.cs rename to src/Microsoft.AspNet.Http/ItemsFeature.cs index 50b32711a3..bb9d94ae15 100644 --- a/src/Microsoft.AspNet.Http.Core/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/ItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj index 67db5d869b..447e54485b 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj @@ -6,7 +6,7 @@ - 22071333-15ba-4d16-a1d5-4d5b1a83fbdd + bcf0f967-8753-4438-bd07-aadca9ce509a ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http/QueryFeature.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/QueryFeature.cs rename to src/Microsoft.AspNet.Http/QueryFeature.cs index bda0ab5fc4..34643cf128 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/QueryFeature.cs @@ -3,12 +3,12 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs rename to src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 4b1093a66a..5030e59ef3 100644 --- a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -7,7 +7,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/RequestCookiesFeature.cs index 4a22b22a93..eb5e95ec79 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs @@ -5,12 +5,12 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs similarity index 88% rename from src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs index 11e3c098fa..651beded8d 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs similarity index 91% rename from src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs index 9f218d9bbb..8a8c4b1551 100644 --- a/src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs similarity index 82% rename from src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs index aa857b1205..34747f900f 100644 --- a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class WebSocketAcceptContext : IWebSocketAcceptContext { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 0a94666c50..b554c9eabe 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,27 +1,20 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "description": "ASP.NET 5 HTTP feature implementations.", "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", - "System.Net.WebSockets" : "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Text.Encoding": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 4e37f6b218..75b1c88067 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -15,7 +15,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Core.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index fe4b17d1ac..cfb647d88a 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; -using Microsoft.AspNet.Http.Core; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index e7274c329b..2fa0fca43b 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -3,8 +3,6 @@ "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 3b35b808af..320d7f0186 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,15 +1,13 @@ { "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs similarity index 97% rename from test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs index c9692254f1..2388da9973 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,7 +3,6 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs index 9bf4faaab6..e0d7b30689 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs @@ -4,7 +4,6 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs index 1c0537beda..fef12361fd 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Builder.Extensions diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj index c438cb7050..424d3a7f9b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj @@ -6,7 +6,7 @@ - aa99af26-f7b1-4a6b-a922-5c25539f6391 + f16692b8-9f38-4dca-a582-e43172b989c6 ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/PathStringTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index f943dd78c7..7faf925aae 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -1,22 +1,17 @@ { - "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { - "dependencies": { - "Moq": "4.2.1312.1622" - }, - "frameworkAssemblies": { - "System.Net.Http": "" - } - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Testing": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { + "dependencies": { + "Shouldly": "1.1.1.1" + } } + } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index a7e15c1844..ccd20be196 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Collections; using Microsoft.Net.Http.Headers; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs index ce046ba3e7..6f30bc053a 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -4,7 +4,6 @@ using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index f42fec5efa..07b6ed7163 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -3,7 +3,6 @@ using System; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http.Extensions.Tests diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 66b5bb0ef4..0fa5e071cc 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http.Core; using Microsoft.Framework.DependencyInjection; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index a5bc898aaa..4287829625 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -2,8 +2,6 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, diff --git a/test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs similarity index 95% rename from test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs rename to test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 755eee5f76..21c1bd640d 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -4,7 +4,7 @@ using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.Builder.Tests +namespace Microsoft.AspNet.Builder { public class ApplicationBuilderTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs similarity index 92% rename from test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs rename to test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs index 362849193c..7f35d274db 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs @@ -4,7 +4,7 @@ using System.IO; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class BufferingHelperTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs similarity index 98% rename from test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs rename to test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 02b040af69..d46ff5d6e7 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -7,11 +7,10 @@ using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Authentication; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs similarity index 98% rename from test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs rename to test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 4ec7dff00f..69c0ea85e8 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -4,10 +4,9 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs similarity index 99% rename from test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs rename to test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 254a6800ea..270c364301 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class FormFeatureTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs similarity index 91% rename from test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs rename to test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 4bee6e446d..02082c9ec3 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Collections; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj index 424d3a7f9b..c438cb7050 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj @@ -6,7 +6,7 @@ - f16692b8-9f38-4dca-a582-e43172b989c6 + aa99af26-f7b1-4a6b-a922-5c25539f6391 ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs similarity index 93% rename from test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs rename to test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 0fd91f5cd4..4a53e6205b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -2,11 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; using Moq; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class QueryFeatureTests { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 5c51fc5e3f..42315e13eb 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,19 +1,19 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Testing": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { + "dependencies": { + "Moq": "4.2.1312.1622" + }, + "frameworkAssemblies": { + "System.Net.Http": "" + } + } } - } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index b98e99cfc1..68f7d7a103 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 3dbc5de4e6..79f1cafd16 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,10 +1,7 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From f5267fc14546c369c440db56569572568ae9a9d5 Mon Sep 17 00:00:00 2001 From: Justin Van Patten Date: Thu, 16 Apr 2015 18:23:30 -0700 Subject: [PATCH 291/846] Rename SetInt & GetInt -> SetInt32 & GetInt32 Fixes #256 --- .../SessionCollectionExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs index d13f34be02..6a94e0f20c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Http { public static class SessionCollectionExtensions { - public static void SetInt(this ISessionCollection session, string key, int value) + public static void SetInt32(this ISessionCollection session, string key, int value) { var bytes = new byte[] { @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Http session.Set(key, bytes); } - public static int? GetInt(this ISessionCollection session, string key) + public static int? GetInt32(this ISessionCollection session, string key) { var data = session.Get(key); if (data == null || data.Length < 4) From 43c3913b86e60f6fd5dbfa1e0a4d72541909f4ee Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 12:18:09 -0700 Subject: [PATCH 292/846] #265 Remove setters for IApplcationBuilder.Properties and Server. --- .../IApplicationBuilder.cs | 4 ++-- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs index cfecfd9728..79e11d5a5c 100644 --- a/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs @@ -10,9 +10,9 @@ namespace Microsoft.AspNet.Builder { IServiceProvider ApplicationServices { get; set; } - object Server { get; set; } + object Server { get; } - IDictionary Properties { get; set; } + IDictionary Properties { get; } IApplicationBuilder Use(Func middleware); diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index e7a00106c2..3a284eb52a 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -19,6 +19,12 @@ namespace Microsoft.AspNet.Builder ApplicationServices = serviceProvider; } + public ApplicationBuilder(IServiceProvider serviceProvider, object server) + : this(serviceProvider) + { + SetProperty(Constants.BuilderProperties.ServerInformation, server); + } + private ApplicationBuilder(ApplicationBuilder builder) { Properties = builder.Properties; @@ -42,13 +48,9 @@ namespace Microsoft.AspNet.Builder { return GetProperty(Constants.BuilderProperties.ServerInformation); } - set - { - SetProperty(Constants.BuilderProperties.ServerInformation, value); - } } - public IDictionary Properties { get; set; } + public IDictionary Properties { get; } private T GetProperty(string key) { From 7d7cd5fde7a6679149e0197105c18fb9e9b1e1f4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 12:28:02 -0700 Subject: [PATCH 293/846] #265 Remove some overloads for Run, Map, and MapWhen. --- .../Extensions/MapExtensions.cs | 13 ----- .../Extensions/MapWhenExtensions.cs | 26 +-------- .../Extensions/MapWhenMiddleware.cs | 20 ++----- .../Extensions/MapWhenOptions.cs | 5 -- .../Extensions/RunExtensions.cs | 20 ------- .../MapPathMiddlewareTests.cs | 16 +++--- .../MapPredicateMiddlewareTests.cs | 53 ------------------- 7 files changed, 12 insertions(+), 141 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs index 5f71a1b792..3a53395fda 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs @@ -10,19 +10,6 @@ namespace Microsoft.AspNet.Builder { public static class MapExtensions { - /// - /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of - /// continuing to the next component in the pipeline. - /// - /// - /// The path to match - /// The branch to take for positive path matches - /// - public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) - { - return Map(app, new PathString(pathMatch), configuration); - } - /// /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of /// continuing to the next component in the pipeline. diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs index 117b8cacc1..30564a114b 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs @@ -5,12 +5,11 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { - using Microsoft.Framework.Internal; using Predicate = Func; - using PredicateAsync = Func>; /// /// Extension methods for the MapWhenMiddleware @@ -39,28 +38,5 @@ namespace Microsoft.AspNet.Builder }; return app.Use(next => new MapWhenMiddleware(next, options).Invoke); } - - /// - /// Branches the request pipeline based on the async result of the given predicate. - /// - /// - /// Invoked asynchronously with the request environment to determine if the branch should be taken - /// Configures a branch to take - /// - public static IApplicationBuilder MapWhenAsync([NotNull] this IApplicationBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) - { - // create branch - var branchBuilder = app.New(); - configuration(branchBuilder); - var branch = branchBuilder.Build(); - - // put middleware in pipeline - var options = new MapWhenOptions - { - PredicateAsync = predicate, - Branch = branch, - }; - return app.Use(next => new MapWhenMiddleware(next, options).Invoke); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs index b4f5c78b0b..ab0e2d3dbf 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs @@ -20,27 +20,13 @@ namespace Microsoft.AspNet.Builder.Extensions public async Task Invoke([NotNull] HttpContext context) { - if (_options.Predicate != null) + if (_options.Predicate(context)) { - if (_options.Predicate(context)) - { - await _options.Branch(context); - } - else - { - await _next(context); - } + await _options.Branch(context); } else { - if (await _options.PredicateAsync(context)) - { - await _options.Branch(context); - } - else - { - await _next(context); - } + await _next(context); } } } diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs index c94b15f181..27a9d9b1be 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs @@ -17,11 +17,6 @@ namespace Microsoft.AspNet.Builder.Extensions /// public Func Predicate { get; set; } - /// - /// The async user callback that determines if the branch should be taken - /// - public Func> PredicateAsync { get; set; } - /// /// The branch taken for a positive match /// diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs index c0cb5af259..ad103c3d1e 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs @@ -14,25 +14,5 @@ namespace Microsoft.AspNet.Builder { app.Use(_ => handler); } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1) => handler(ctx, s1)); - } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1, s2) => handler(ctx, s1, s2)); - } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1, s2, s3) => handler(ctx, s1, s2, s3)); - } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1, s2, s3, s4) => handler(ctx, s1, s2, s3, s4)); - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs index e0d7b30689..071e8fbdaf 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs @@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, UseSuccess); + builder.Map(new PathString(matchPath), UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -81,7 +81,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); + builder.Map(new PathString(matchPath), subBuilder => subBuilder.Run(Success)); var app = builder.Build(); app.Invoke(context).Wait(); @@ -96,7 +96,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); + Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(new PathString(matchPath), map => { }).Build()); } [Theory] @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, UseNotImplemented); + builder.Map(new PathString(matchPath), UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -133,7 +133,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, UseNotImplemented); + builder.Map(new PathString(matchPath), UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -147,12 +147,12 @@ namespace Microsoft.AspNet.Builder.Extensions public void ChainedRoutes_Success() { var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map("/route1", map => + builder.Map(new PathString("/route1"), map => { - map.Map((string)"/subroute1", UseSuccess); + map.Map(new PathString("/subroute1"), UseSuccess); map.Run(NotImplemented); }); - builder.Map("/route2/subroute2", UseSuccess); + builder.Map(new PathString("/route2/subroute2"), UseSuccess); var app = builder.Build(); HttpContext context = CreateRequest(string.Empty, "/route1"); diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs index fef12361fd..29b6eac3ff 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs @@ -16,7 +16,6 @@ namespace Microsoft.AspNet.Builder.Extensions public class MapPredicateMiddlewareTests { private static readonly Predicate NotImplementedPredicate = new Predicate(envionment => { throw new NotImplementedException(); }); - private static readonly PredicateAsync NotImplementedPredicateAsync = new PredicateAsync(envionment => { throw new NotImplementedException(); }); private static Task Success(HttpContext context) { @@ -49,16 +48,6 @@ namespace Microsoft.AspNet.Builder.Extensions return false; } - private Task TruePredicateAsync(HttpContext context) - { - return Task.FromResult(true); - } - - private Task FalsePredicateAsync(HttpContext context) - { - return Task.FromResult(false); - } - [Fact] public void NullArguments_ArgumentNullException() { @@ -113,31 +102,6 @@ namespace Microsoft.AspNet.Builder.Extensions Assert.Equal(200, context.Response.StatusCode); } - [Fact] - public void PredicateAsyncTrueAction_BranchTaken() - { - HttpContext context = CreateRequest(); - var builder = new ApplicationBuilder(serviceProvider: null); - builder.MapWhenAsync(TruePredicateAsync, UseSuccess); - var app = builder.Build(); - app.Invoke(context).Wait(); - - Assert.Equal(200, context.Response.StatusCode); - } - - [Fact] - public void PredicateAsyncFalseAction_PassThrough() - { - HttpContext context = CreateRequest(); - var builder = new ApplicationBuilder(serviceProvider: null); - builder.MapWhenAsync(FalsePredicateAsync, UseNotImplemented); - builder.Run(Success); - var app = builder.Build(); - app.Invoke(context).Wait(); - - Assert.Equal(200, context.Response.StatusCode); - } - [Fact] public void ChainedPredicates_Success() { @@ -155,23 +119,6 @@ namespace Microsoft.AspNet.Builder.Extensions Assert.Equal(200, context.Response.StatusCode); } - [Fact] - public void ChainedPredicatesAsync_Success() - { - var builder = new ApplicationBuilder(serviceProvider: null); - builder.MapWhenAsync(TruePredicateAsync, map1 => - { - map1.MapWhenAsync((PredicateAsync)FalsePredicateAsync, UseNotImplemented); - map1.MapWhenAsync((PredicateAsync)TruePredicateAsync, map2 => map2.MapWhenAsync((PredicateAsync)TruePredicateAsync, UseSuccess)); - map1.Run(NotImplemented); - }); - var app = builder.Build(); - - HttpContext context = CreateRequest(); - app.Invoke(context).Wait(); - Assert.Equal(200, context.Response.StatusCode); - } - private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(); From 4030be585db1620a59e4105cbcae214351b3a6fb Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 20 Apr 2015 10:54:33 -0700 Subject: [PATCH 294/846] #265 Add implicit converters between string and PathString. --- src/Microsoft.AspNet.Http.Core/PathString.cs | 18 ++++++++++++++++++ .../MapPathMiddlewareTests.cs | 16 ++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs index 5e6f03ec70..11249afb91 100644 --- a/src/Microsoft.AspNet.Http.Core/PathString.cs +++ b/src/Microsoft.AspNet.Http.Core/PathString.cs @@ -236,5 +236,23 @@ namespace Microsoft.AspNet.Http { return left.Add(right); } + + /// + /// Implicitly creates a new PathString from the given string. + /// + /// + public static implicit operator PathString(string s) + { + return new PathString(s); + } + + /// + /// Implicitly calls ToString(). + /// + /// + public static implicit operator string(PathString path) + { + return path.ToString(); + } } } diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs index 071e8fbdaf..a54a89d09e 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs @@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), UseSuccess); + builder.Map(matchPath, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -81,7 +81,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), subBuilder => subBuilder.Run(Success)); + builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); var app = builder.Build(); app.Invoke(context).Wait(); @@ -96,7 +96,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(new PathString(matchPath), map => { }).Build()); + Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); } [Theory] @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), UseNotImplemented); + builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -133,7 +133,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), UseNotImplemented); + builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -147,12 +147,12 @@ namespace Microsoft.AspNet.Builder.Extensions public void ChainedRoutes_Success() { var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString("/route1"), map => + builder.Map("/route1", map => { - map.Map(new PathString("/subroute1"), UseSuccess); + map.Map("/subroute1", UseSuccess); map.Run(NotImplemented); }); - builder.Map(new PathString("/route2/subroute2"), UseSuccess); + builder.Map("/route2/subroute2", UseSuccess); var app = builder.Build(); HttpContext context = CreateRequest(string.Empty, "/route1"); From 0737ea392f9747f80ebc0854cb29b544958994a1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 20 Apr 2015 11:41:43 -0700 Subject: [PATCH 295/846] Add NotNull to Predicate setter. --- .../Extensions/MapWhenOptions.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs index 27a9d9b1be..86967a2c70 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs @@ -4,6 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -15,7 +16,12 @@ namespace Microsoft.AspNet.Builder.Extensions /// /// The user callback that determines if the branch should be taken /// - public Func Predicate { get; set; } + public Func Predicate + { + get; + [param: NotNull] + set; + } /// /// The branch taken for a positive match From 86bd393d3d884872965daf535c8e005a2dcde66e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 21 Apr 2015 10:23:22 -0700 Subject: [PATCH 296/846] Add string+PathString operator to prevent too much string<->PathString implicit conversion. --- src/Microsoft.AspNet.Http.Core/PathString.cs | 12 ++++++++++++ .../PathStringTests.cs | 14 ++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs index 11249afb91..fe33adc2ba 100644 --- a/src/Microsoft.AspNet.Http.Core/PathString.cs +++ b/src/Microsoft.AspNet.Http.Core/PathString.cs @@ -215,6 +215,18 @@ namespace Microsoft.AspNet.Http return !left.Equals(right, StringComparison.OrdinalIgnoreCase); } + /// + /// + /// The left parameter + /// The right parameter + /// The ToString combination of both values + public static string operator +(string left, PathString right) + { + // This overload exists to prevent the implicit string<->PathString converter from + // trying to call the PathString+PathString operator for things that are not path strings. + return string.Concat(left, right.ToString()); + } + /// /// Operator call through to Add /// diff --git a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs index d547c0a4ac..d4a5502cbb 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs @@ -50,5 +50,19 @@ namespace Microsoft.AspNet.Http // Assert Assert.Equal(expected, result.Value); } + + [Fact] + public void ImplicitStringConverters_WorksWithAdd() + { + var scheme = "http"; + var host = new HostString("localhost:80"); + var pathBase = new PathString("/base"); + var path = new PathString("/path"); + var query = new QueryString("?query"); + var fragment = new FragmentString("#frag"); + + var result = scheme + "://" + host + pathBase + path + query + fragment; + Assert.Equal("http://localhost:80/base/path?query#frag", result); + } } } From 65e57d28f31c9966e208ae3182c81b65008c639a Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 21 Apr 2015 11:08:54 -0700 Subject: [PATCH 297/846] Add PathString+string operator to prevent too much string<->PathString implicit conversion. --- src/Microsoft.AspNet.Http.Core/PathString.cs | 12 ++++++++++++ .../PathStringTests.cs | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs index fe33adc2ba..cff6e1d3c6 100644 --- a/src/Microsoft.AspNet.Http.Core/PathString.cs +++ b/src/Microsoft.AspNet.Http.Core/PathString.cs @@ -227,6 +227,18 @@ namespace Microsoft.AspNet.Http return string.Concat(left, right.ToString()); } + /// + /// + /// The left parameter + /// The right parameter + /// The ToString combination of both values + public static string operator +(PathString left, string right) + { + // This overload exists to prevent the implicit string<->PathString converter from + // trying to call the PathString+PathString operator for things that are not path strings. + return string.Concat(left.ToString(), right); + } + /// /// Operator call through to Add /// diff --git a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs index d4a5502cbb..720b3b0814 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs @@ -63,6 +63,12 @@ namespace Microsoft.AspNet.Http var result = scheme + "://" + host + pathBase + path + query + fragment; Assert.Equal("http://localhost:80/base/path?query#frag", result); + + result = pathBase + path + query + fragment; + Assert.Equal("/base/path?query#frag", result); + + result = path + "text"; + Assert.Equal("/pathtext", result); } } } From d4132d98fdd611d8f77e66f27fe8b37269d9ebb5 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Fri, 17 Apr 2015 15:13:30 -0700 Subject: [PATCH 298/846] Moved CommonTestEncoder to Testing repo --- .../CommonTestEncoder.cs | 103 ------------------ ...EncoderServiceCollectionExtensionsTests.cs | 1 + .../project.json | 1 + 3 files changed, 2 insertions(+), 103 deletions(-) delete mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs deleted file mode 100644 index 0d38957303..0000000000 --- a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Runtime.CompilerServices; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Dummy encoder used for unit testing. - /// - public sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder - { - /// - /// Returns "HtmlEncode[[value]]". - /// - public string HtmlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "JavaScriptStringEncode[[value]]". - /// - public string JavaScriptStringEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "UrlEncode[[value]]". - /// - public string UrlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) - { - return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); - } - - private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); - } - - private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); - } - } -} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index d629184281..b8ddbef391 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -4,6 +4,7 @@ using System; using Xunit; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.WebEncoders.Testing; namespace Microsoft.Framework.WebEncoders { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index b24bd45764..4acf0c6ad2 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -2,6 +2,7 @@ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "Moq": "4.2.1312.1622", "Newtonsoft.Json": "6.0.6", "xunit.runner.aspnet": "2.0.0-aspnet-*" From 25aed6f88e5bf5f3c9ca31d589648db5d7231561 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 22 Apr 2015 11:43:12 -0700 Subject: [PATCH 299/846] #274 Reorganize the strong header type extensions. Remove SendAsync extensions. --- .../HeaderDictionaryTypeExtensions.cs | 24 +-- .../HttpResponseSendingExtensions.cs | 153 ------------------ .../RequestHeaders.cs | 31 ++++ .../ResponseHeaders.cs | 31 ++++ .../HeaderDictionaryTypeExtensionsTest.cs | 76 ++++----- .../HttpResponseSendingExtensionsTests.cs | 86 ---------- 6 files changed, 108 insertions(+), 293 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs delete mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 02178a65cd..db8eb01b76 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -23,12 +23,14 @@ namespace Microsoft.AspNet.Http return new ResponseHeaders(response.Headers); } - public static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) + // These are all shared helpers used by both RequestHeaders and ResponseHeaders + + internal static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) { return headers.Get(name); } - public static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) + internal static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) { if (value == null) { @@ -40,7 +42,7 @@ namespace Microsoft.AspNet.Http } } - public static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) + internal static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) { if (values == null || values.Count == 0) { @@ -52,7 +54,7 @@ namespace Microsoft.AspNet.Http } } - public static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) + internal static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) { if (value.HasValue) { @@ -64,16 +66,6 @@ namespace Microsoft.AspNet.Http } } - public static void Append([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] object value) - { - headers.Append(name, value.ToString()); - } - - public static void AppendList([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] IList values) - { - headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); - } - private static IDictionary KnownParsers = new Dictionary() { { typeof(CacheControlHeaderValue), new Func(value => { CacheControlHeaderValue result; return CacheControlHeaderValue.TryParse(value, out result) ? result : null; }) }, @@ -96,7 +88,7 @@ namespace Microsoft.AspNet.Http { typeof(SetCookieHeaderValue), new Func, IList>(value => { IList result; return SetCookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, }; - public static T Get([NotNull] this IHeaderDictionary headers, string name) + internal static T Get([NotNull] this IHeaderDictionary headers, string name) { object temp; if (KnownParsers.TryGetValue(typeof(T), out temp)) @@ -114,7 +106,7 @@ namespace Microsoft.AspNet.Http return GetViaReflection(value); } - public static IList GetList([NotNull] this IHeaderDictionary headers, string name) + internal static IList GetList([NotNull] this IHeaderDictionary headers, string name) { object temp; if (KnownListParsers.TryGetValue(typeof(T), out temp)) diff --git a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs deleted file mode 100644 index 40d4f1c3c7..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Framework.Internal; - -namespace Microsoft.AspNet.Http -{ - /// - /// Convenience methods for writing to the response. - /// - public static class HttpResponseSendingExtensions - { - /// - /// Sends a response with the given Content-Type and body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(text, Encoding.UTF8, contentType, cancellationToken); - } - - /// - /// Sends a response with the given Content-Type, encoding, and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - if (string.IsNullOrEmpty(contentType)) - { - throw new ArgumentException("Empty Content-Type is not allowed."); - } - if (contentType.IndexOf("charset=", StringComparison.OrdinalIgnoreCase) < 0) - { - contentType += "; charset=" + encoding.WebName; - } - response.ContentType = contentType; - return response.SendAsync(text, encoding, cancellationToken); - } - - /// - /// Sends a response with the given body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(text, Encoding.UTF8, cancellationToken); - } - - /// - /// Sends a response with the given encoding and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) - { - byte[] data = encoding.GetBytes(text); - return response.SendAsync(data, cancellationToken); - } - - /// - /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(new ArraySegment(data), contentType, cancellationToken); - } - - /// - /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - if (string.IsNullOrEmpty(contentType)) - { - throw new ArgumentException("Empty Content-Type is not allowed."); - } - response.ContentType = contentType; - return response.SendAsync(data, cancellationToken); - } - - /// - /// Sends a response with the given body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(new ArraySegment(data), cancellationToken); - } - - /// - /// Sends a response with the given body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, int offset, int count, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(new ArraySegment(data, offset, count), cancellationToken); - } - - /// - /// Sends a response with the given body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, CancellationToken cancellationToken = default(CancellationToken)) - { - if (data.Array == null) - { - throw new ArgumentException("The Array cannot be null.", "data"); // TODO: LOC - } - response.ContentLength = data.Count; - return response.Body.WriteAsync(data.Array, data.Offset, data.Count, cancellationToken); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index 21499b8092..fb10af0bab 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; @@ -256,5 +257,35 @@ namespace Microsoft.AspNet.Http.Headers Headers.Set(HeaderNames.Range, value); } } + + public T Get(string name) + { + return Headers.Get(name); + } + + public IList GetList(string name) + { + return Headers.GetList(name); + } + + public void Set([NotNull] string name, object value) + { + Headers.Set(name, value); + } + + public void SetList([NotNull] string name, IList values) + { + Headers.SetList(name, values); + } + + public void Append([NotNull] string name, [NotNull] object value) + { + Headers.Append(name, value.ToString()); + } + + public void AppendList([NotNull] string name, [NotNull] IList values) + { + Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index c88430eed8..3f4103ab83 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.AspNet.Http.Extensions; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; @@ -153,5 +154,35 @@ namespace Microsoft.AspNet.Http.Headers Headers.SetList(HeaderNames.SetCookie, value); } } + + public T Get(string name) + { + return Headers.Get(name); + } + + public IList GetList(string name) + { + return Headers.GetList(name); + } + + public void Set([NotNull] string name, object value) + { + Headers.Set(name, value); + } + + public void SetList([NotNull] string name, IList values) + { + Headers.SetList(name, values); + } + + public void Append([NotNull] string name, [NotNull] object value) + { + Headers.Append(name, value.ToString()); + } + + public void AppendList([NotNull] string name, [NotNull] IList values) + { + Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index ccd20be196..4495cbb364 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -15,10 +15,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_KnownTypeWithValidValue_Success() { - var headers = new HeaderDictionary(); - headers[HeaderNames.ContentType] = "text/plain"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.ContentType] = "text/plain"; - var result = headers.Get(HeaderNames.ContentType); + var result = context.Request.GetTypedHeaders().Get(HeaderNames.ContentType); var expected = new MediaTypeHeaderValue("text/plain"); Assert.Equal(expected, result); @@ -27,9 +27,9 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_KnownTypeWithMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var result = headers.Get(HeaderNames.ContentType); + var result = context.Request.GetTypedHeaders().Get(HeaderNames.ContentType); Assert.Null(result); } @@ -37,10 +37,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_KnownTypeWithInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers[HeaderNames.ContentType] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.ContentType] = "invalid"; - var result = headers.Get(HeaderNames.ContentType); + var result = context.Request.GetTypedHeaders().Get(HeaderNames.ContentType); Assert.Null(result); } @@ -48,48 +48,48 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_UnknownTypeWithTryParseAndValidValue_Success() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - var result = headers.Get("custom"); + var result = context.Request.GetTypedHeaders().Get("custom"); Assert.NotNull(result); } [Fact] public void GetT_UnknownTypeWithTryParseAndInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers["custom"] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "invalid"; - var result = headers.Get("custom"); + var result = context.Request.GetTypedHeaders().Get("custom"); Assert.Null(result); } [Fact] public void GetT_UnknownTypeWithTryParseAndMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var result = headers.Get("custom"); + var result = context.Request.GetTypedHeaders().Get("custom"); Assert.Null(result); } [Fact] public void GetT_UnknownTypeWithoutTryParse_Throws() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - Assert.Throws(() => headers.Get("custom")); + Assert.Throws(() => context.Request.GetTypedHeaders().Get("custom")); } [Fact] public void GetListT_KnownTypeWithValidValue_Success() { - var headers = new HeaderDictionary(); - headers[HeaderNames.Accept] = "text/plain; q=0.9, text/other, */*"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.Accept] = "text/plain; q=0.9, text/other, */*"; - var result = headers.GetList(HeaderNames.Accept); + var result = context.Request.GetTypedHeaders().GetList(HeaderNames.Accept); var expected = new[] { new MediaTypeHeaderValue("text/plain", 0.9), @@ -102,9 +102,9 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_KnownTypeWithMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var result = headers.GetList(HeaderNames.Accept); + var result = context.Request.GetTypedHeaders().GetList(HeaderNames.Accept); Assert.Null(result); } @@ -112,10 +112,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_KnownTypeWithInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers[HeaderNames.Accept] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.Accept] = "invalid"; - var result = headers.GetList(HeaderNames.Accept); + var result = context.Request.GetTypedHeaders().GetList(HeaderNames.Accept); Assert.Null(result); } @@ -123,10 +123,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_UnknownTypeWithTryParseListAndValidValue_Success() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - var results = headers.GetList("custom"); + var results = context.Request.GetTypedHeaders().GetList("custom"); Assert.NotNull(results); Assert.Equal(new[] { new TestHeaderValue() }.ToList(), results); } @@ -134,29 +134,29 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_UnknownTypeWithTryParseListAndInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers["custom"] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "invalid"; - var results = headers.GetList("custom"); + var results = context.Request.GetTypedHeaders().GetList("custom"); Assert.Null(results); } [Fact] public void GetListT_UnknownTypeWithTryParseListAndMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var results = headers.GetList("custom"); + var results = context.Request.GetTypedHeaders().GetList("custom"); Assert.Null(results); } [Fact] public void GetListT_UnknownTypeWithoutTryParseList_Throws() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - Assert.Throws(() => headers.GetList("custom")); + Assert.Throws(() => context.Request.GetTypedHeaders().GetList("custom")); } public class TestHeaderValue diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs deleted file mode 100644 index 6f30bc053a..0000000000 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace Microsoft.AspNet.Http.Extensions -{ - public class HttpResponseSendingExtensionsTests - { - [Fact] - public async Task SendData_SendBytes() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync(new byte[10]); - - Assert.Equal(10, context.Response.Body.Length); - Assert.Equal(10, context.Response.ContentLength); - Assert.Null(context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendBytesAndContentType() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync(new byte[10], "text/html"); - - Assert.Equal(10, context.Response.Body.Length); - Assert.Equal(10, context.Response.ContentLength); - Assert.Equal("text/html", context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendText() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World"); - - Assert.Equal(11, context.Response.Body.Length); - Assert.Equal(11, context.Response.ContentLength); - Assert.Null(context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendTextWithContentType() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World", "text/html"); - - Assert.Equal(11, context.Response.Body.Length); - Assert.Equal(11, context.Response.ContentLength); - Assert.Equal("text/html; charset=utf-8", context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendTextWithEncoding() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World", Encoding.UTF32); - - Assert.Equal(44, context.Response.Body.Length); - Assert.Equal(44, context.Response.ContentLength); - Assert.Null(context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendTextWithContentTypeAndEncoding() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World", Encoding.UTF32, "text/html"); - - Assert.Equal(44, context.Response.Body.Length); - Assert.Equal(44, context.Response.ContentLength); - Assert.Equal("text/html; charset=utf-32", context.Response.ContentType); - } - - private HttpContext CreateRequest() - { - HttpContext context = new DefaultHttpContext(); - context.Response.Body = new MemoryStream(); - return context; - } - } -} From 4637a951570d7bc264b4f526ada49cbc563cfe1c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 10:02:00 -0700 Subject: [PATCH 300/846] #266 Consolidate authentication APIs. --- .../Authentication/AuthenticationManager.cs | 46 ++++++ src/Microsoft.AspNet.Http.Core/HttpContext.cs | 9 +- src/Microsoft.AspNet.Http.Core/HttpRequest.cs | 5 - .../HttpResponse.cs | 37 +---- .../DefaultAuthenticationManager.cs | 141 ++++++++++++++++++ .../DefaultHttpContext.cs | 55 +------ .../DefaultHttpResponse.cs | 67 --------- .../DefaultHttpContextTests.cs | 22 +-- 8 files changed, 208 insertions(+), 174 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs create mode 100644 src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs new file mode 100644 index 0000000000..219e909221 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http.Authentication +{ + public abstract class AuthenticationManager + { + public abstract IEnumerable GetAuthenticationSchemes(); + + public abstract AuthenticationResult Authenticate(string authenticationScheme); + + public abstract Task AuthenticateAsync(string authenticationScheme); + + public virtual void Challenge() + { + Challenge(properties: null, authenticationScheme: null); + } + + public virtual void Challenge(AuthenticationProperties properties) + { + Challenge(properties, ""); + } + + public virtual void Challenge(string authenticationScheme) + { + Challenge(properties: null, authenticationScheme: authenticationScheme); + } + + public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); + + public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); + + public virtual void SignOut() + { + SignOut(authenticationScheme: null, properties: null); + } + + public abstract void SignOut(string authenticationScheme); + + public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); + } +} diff --git a/src/Microsoft.AspNet.Http.Core/HttpContext.cs b/src/Microsoft.AspNet.Http.Core/HttpContext.cs index 47f595df17..83457e775c 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpContext.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net.WebSockets; using System.Security.Claims; using System.Threading; @@ -20,6 +19,8 @@ namespace Microsoft.AspNet.Http public abstract ConnectionInfo Connection { get; } + public abstract AuthenticationManager Authentication { get; } + public abstract ClaimsPrincipal User { get; set; } public abstract IDictionary Items { get; } @@ -54,12 +55,6 @@ namespace Microsoft.AspNet.Http SetFeature(typeof(T), instance); } - public abstract IEnumerable GetAuthenticationSchemes(); - - public abstract AuthenticationResult Authenticate(string authenticationScheme); - - public abstract Task AuthenticateAsync(string authenticationScheme); - public virtual Task AcceptWebSocketAsync() { return AcceptWebSocketAsync(subProtocol: null); diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequest.cs b/src/Microsoft.AspNet.Http.Core/HttpRequest.cs index 7465c30638..5252c8649f 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpRequest.cs @@ -1,9 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections; -using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -12,8 +9,6 @@ namespace Microsoft.AspNet.Http { public abstract class HttpRequest { - // TODO - review IOwinRequest for properties - public abstract HttpContext HttpContext { get; } /// diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponse.cs b/src/Microsoft.AspNet.Http.Core/HttpResponse.cs index 97c0a63e50..4721f9a4b4 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponse.cs @@ -2,23 +2,22 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; -using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http { public abstract class HttpResponse { - // TODO - review IOwinResponse for completeness - public abstract HttpContext HttpContext { get; } + public abstract int StatusCode { get; set; } + public abstract IHeaderDictionary Headers { get; } + public abstract Stream Body { get; set; } public abstract long? ContentLength { get; set; } + public abstract string ContentType { get; set; } public abstract IResponseCookies Cookies { get; } @@ -35,33 +34,5 @@ namespace Microsoft.AspNet.Http } public abstract void Redirect(string location, bool permanent); - - public virtual void Challenge() - { - Challenge(properties: null, authenticationScheme: null); - } - - public virtual void Challenge(AuthenticationProperties properties) - { - Challenge(properties, ""); - } - - public virtual void Challenge(string authenticationScheme) - { - Challenge(properties: null, authenticationScheme: authenticationScheme); - } - - public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); - - public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); - - public virtual void SignOut() - { - SignOut(authenticationScheme: null, properties: null); - } - - public abstract void SignOut(string authenticationScheme); - - public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs new file mode 100644 index 0000000000..76369f246d --- /dev/null +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -0,0 +1,141 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.Http.Authentication +{ + public class DefaultAuthenticationManager : AuthenticationManager + { + private readonly IFeatureCollection _features; + private FeatureReference _authentication = FeatureReference.Default; + private FeatureReference _response = FeatureReference.Default; + + public DefaultAuthenticationManager(IFeatureCollection features) + { + _features = features; + } + + private IHttpAuthenticationFeature HttpAuthenticationFeature + { + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } + } + + private IHttpResponseFeature HttpResponseFeature + { + get { return _response.Fetch(_features); } + } + + public override IEnumerable GetAuthenticationSchemes() + { + var handler = HttpAuthenticationFeature.Handler; + if (handler == null) + { + return new AuthenticationDescription[0]; + } + + var describeContext = new DescribeSchemesContext(); + handler.GetDescriptions(describeContext); + return describeContext.Results; + } + + public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) + { + var handler = HttpAuthenticationFeature.Handler; + + var authenticateContext = new AuthenticateContext(authenticationScheme); + if (handler != null) + { + handler.Authenticate(authenticateContext); + } + + if (!authenticateContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + + return authenticateContext.Result; + } + + public override async Task AuthenticateAsync([NotNull] string authenticationScheme) + { + var handler = HttpAuthenticationFeature.Handler; + + var authenticateContext = new AuthenticateContext(authenticationScheme); + if (handler != null) + { + await handler.AuthenticateAsync(authenticateContext); + } + + // Verify all types ack'd + if (!authenticateContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + + return authenticateContext.Result; + } + + public override void Challenge(AuthenticationProperties properties, string authenticationScheme) + { + HttpResponseFeature.StatusCode = 401; + var handler = HttpAuthenticationFeature.Handler; + + var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); + if (handler != null) + { + handler.Challenge(challengeContext); + } + + if (!challengeContext.Accepted) + { + throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); + } + } + + public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + { + var handler = HttpAuthenticationFeature.Handler; + + var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); + if (handler != null) + { + handler.SignIn(signInContext); + } + + // Verify all types ack'd + if (!signInContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + } + + public override void SignOut(string authenticationScheme, AuthenticationProperties properties) + { + var handler = HttpAuthenticationFeature.Handler; + + var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); + if (handler != null) + { + handler.SignOut(signOutContext); + } + + // Verify all types ack'd + if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + } + + public override void SignOut(string authenticationScheme) + { + SignOut(authenticationScheme, properties: null); + } + } +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 81aef590ff..7dc14893b5 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -11,7 +11,6 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http @@ -23,6 +22,7 @@ namespace Microsoft.AspNet.Http private readonly HttpRequest _request; private readonly HttpResponse _response; private readonly ConnectionInfo _connection; + private readonly AuthenticationManager _authenticationManager; private FeatureReference _items; private FeatureReference _serviceProviders; @@ -45,6 +45,7 @@ namespace Microsoft.AspNet.Http _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); _connection = new DefaultConnectionInfo(features); + _authenticationManager = new DefaultAuthenticationManager(features); _items = FeatureReference.Default; _serviceProviders = FeatureReference.Default; @@ -90,6 +91,8 @@ namespace Microsoft.AspNet.Http public override ConnectionInfo Connection { get { return _connection; } } + public override AuthenticationManager Authentication { get { return _authenticationManager; } } + public override ClaimsPrincipal User { get @@ -201,56 +204,6 @@ namespace Microsoft.AspNet.Http _features[type] = instance; } - public override IEnumerable GetAuthenticationSchemes() - { - var handler = HttpAuthenticationFeature.Handler; - if (handler == null) - { - return new AuthenticationDescription[0]; - } - - var describeContext = new DescribeSchemesContext(); - handler.GetDescriptions(describeContext); - return describeContext.Results; - } - - public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) - { - var handler = HttpAuthenticationFeature.Handler; - - var authenticateContext = new AuthenticateContext(authenticationScheme); - if (handler != null) - { - handler.Authenticate(authenticateContext); - } - - if (!authenticateContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - - return authenticateContext.Result; - } - - public override async Task AuthenticateAsync([NotNull] string authenticationScheme) - { - var handler = HttpAuthenticationFeature.Handler; - - var authenticateContext = new AuthenticateContext(authenticationScheme); - if (handler != null) - { - await handler.AuthenticateAsync(authenticateContext); - } - - // Verify all types ack'd - if (!authenticateContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - - return authenticateContext.Result; - } - public override Task AcceptWebSocketAsync(string subProtocol) { var webSocketFeature = WebSocketFeature; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index a5a3e9a438..026ce3b2f1 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -2,15 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Security.Claims; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http @@ -21,7 +16,6 @@ namespace Microsoft.AspNet.Http private readonly IFeatureCollection _features; private FeatureReference _response = FeatureReference.Default; private FeatureReference _cookies = FeatureReference.Default; - private FeatureReference _authentication = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -39,11 +33,6 @@ namespace Microsoft.AspNet.Http get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); } } - private IHttpAuthenticationFeature HttpAuthenticationFeature - { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } - } - public override HttpContext HttpContext { get { return _context; } } public override int StatusCode @@ -128,61 +117,5 @@ namespace Microsoft.AspNet.Http Headers.Set(HeaderNames.Location, location); } - - public override void Challenge(AuthenticationProperties properties, string authenticationScheme) - { - HttpResponseFeature.StatusCode = 401; - var handler = HttpAuthenticationFeature.Handler; - - var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); - if (handler != null) - { - handler.Challenge(challengeContext); - } - - if (!challengeContext.Accepted) - { - throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); - } - } - - public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) - { - var handler = HttpAuthenticationFeature.Handler; - - var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); - if (handler != null) - { - handler.SignIn(signInContext); - } - - // Verify all types ack'd - if (!signInContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - } - - public override void SignOut(string authenticationScheme, AuthenticationProperties properties) - { - var handler = HttpAuthenticationFeature.Handler; - - var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); - if (handler != null) - { - handler.SignOut(signOutContext); - } - - // Verify all types ack'd - if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - } - - public override void SignOut(string authenticationScheme) - { - SignOut(authenticationScheme, properties: null); - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index d46ff5d6e7..c53c3c73c2 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -46,34 +46,34 @@ namespace Microsoft.AspNet.Http public async Task AuthenticateWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Authenticate("Foo")); - await Assert.ThrowsAsync(async () => await context.AuthenticateAsync("Foo")); + Assert.Throws(() => context.Authentication.Authenticate("Foo")); + await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); } [Fact] public void ChallengeWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Response.Challenge(); + context.Authentication.Challenge(); Assert.Equal(401, context.Response.StatusCode); - Assert.Throws(() => context.Response.Challenge("Foo")); + Assert.Throws(() => context.Authentication.Challenge("Foo")); } [Fact] public void SignInWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Response.SignIn("Foo", new ClaimsPrincipal())); + Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); } [Fact] public void SignOutWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Response.SignOut(); + context.Authentication.SignOut(); - Assert.Throws(() => context.Response.SignOut("Foo")); + Assert.Throws(() => context.Authentication.SignOut("Foo")); } [Fact] @@ -83,13 +83,13 @@ namespace Microsoft.AspNet.Http var handler = new AuthHandler(); context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); var user = new ClaimsPrincipal(); - context.Response.SignIn("ignored", user); + context.Authentication.SignIn("ignored", user); Assert.True(handler.SignedIn); - context.Response.SignOut("ignored"); + context.Authentication.SignOut("ignored"); Assert.False(handler.SignedIn); - context.Response.SignIn("ignored", user); + context.Authentication.SignIn("ignored", user); Assert.True(handler.SignedIn); - context.Response.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); Assert.False(handler.SignedIn); } From a174bb299e202b6364889324ae4c78650d16f3ae Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 10:05:32 -0700 Subject: [PATCH 301/846] #270 Rename auth wrapper's internal collections to Items. --- .../AuthenticationDescription.cs | 16 +++--- .../AuthenticationProperties.cs | 52 +++++++++---------- .../DefaultAuthenticationManager.cs | 6 +-- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs index 81653dd166..16b2c43247 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs @@ -21,22 +21,22 @@ namespace Microsoft.AspNet.Http.Authentication /// public AuthenticationDescription() { - Dictionary = new Dictionary(StringComparer.Ordinal); + Items = new Dictionary(StringComparer.Ordinal); } /// /// Initializes a new instance of the class /// - /// - public AuthenticationDescription([NotNull] IDictionary properties) + /// + public AuthenticationDescription([NotNull] IDictionary items) { - Dictionary = properties; + Items = items; } /// /// Contains metadata about the authentication provider. /// - public IDictionary Dictionary { get; private set; } + public IDictionary Items { get; private set; } /// /// Gets or sets the name used to reference the authentication middleware instance. @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Authentication public string AuthenticationScheme { get { return GetString(AuthenticationSchemePropertyKey); } - set { Dictionary[AuthenticationSchemePropertyKey] = value; } + set { Items[AuthenticationSchemePropertyKey] = value; } } /// @@ -53,13 +53,13 @@ namespace Microsoft.AspNet.Http.Authentication public string Caption { get { return GetString(CaptionPropertyKey); } - set { Dictionary[CaptionPropertyKey] = value; } + set { Items[CaptionPropertyKey] = value; } } private string GetString(string name) { object value; - if (Dictionary.TryGetValue(name, out value)) + if (Items.TryGetValue(name, out value)) { return Convert.ToString(value, CultureInfo.InvariantCulture); } diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs index 475dd027d9..f6574163c7 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs @@ -24,51 +24,51 @@ namespace Microsoft.AspNet.Http.Authentication /// Initializes a new instance of the class /// public AuthenticationProperties() - : this(dictionary: null) + : this(items: null) { } /// /// Initializes a new instance of the class /// - /// - public AuthenticationProperties(IDictionary dictionary) + /// + public AuthenticationProperties(IDictionary items) { - Dictionary = dictionary ?? new Dictionary(StringComparer.Ordinal); + Items = items ?? new Dictionary(StringComparer.Ordinal); } /// /// State values about the authentication session. /// - public IDictionary Dictionary { get; private set; } + public IDictionary Items { get; private set; } /// /// Gets or sets whether the authentication session is persisted across multiple requests. /// public bool IsPersistent { - get { return Dictionary.ContainsKey(IsPersistentKey); } + get { return Items.ContainsKey(IsPersistentKey); } set { - if (Dictionary.ContainsKey(IsPersistentKey)) + if (Items.ContainsKey(IsPersistentKey)) { if (!value) { - Dictionary.Remove(IsPersistentKey); + Items.Remove(IsPersistentKey); } } else { if (value) { - Dictionary.Add(IsPersistentKey, string.Empty); + Items.Add(IsPersistentKey, string.Empty); } } } } /// - /// Gets or sets the full path or absolute URI to be used as an http redirect response value. + /// Gets or sets the full path or absolute URI to be used as an http redirect response value. /// [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] public string RedirectUri @@ -76,19 +76,19 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; + return Items.TryGetValue(RedirectUriKey, out value) ? value : null; } set { if (value != null) { - Dictionary[RedirectUriKey] = value; + Items[RedirectUriKey] = value; } else { - if (Dictionary.ContainsKey(RedirectUriKey)) + if (Items.ContainsKey(RedirectUriKey)) { - Dictionary.Remove(RedirectUriKey); + Items.Remove(RedirectUriKey); } } } @@ -102,7 +102,7 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - if (Dictionary.TryGetValue(IssuedUtcKey, out value)) + if (Items.TryGetValue(IssuedUtcKey, out value)) { DateTimeOffset dateTimeOffset; if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) @@ -116,13 +116,13 @@ namespace Microsoft.AspNet.Http.Authentication { if (value.HasValue) { - Dictionary[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + Items[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); } else { - if (Dictionary.ContainsKey(IssuedUtcKey)) + if (Items.ContainsKey(IssuedUtcKey)) { - Dictionary.Remove(IssuedUtcKey); + Items.Remove(IssuedUtcKey); } } } @@ -136,7 +136,7 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) + if (Items.TryGetValue(ExpiresUtcKey, out value)) { DateTimeOffset dateTimeOffset; if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) @@ -150,13 +150,13 @@ namespace Microsoft.AspNet.Http.Authentication { if (value.HasValue) { - Dictionary[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + Items[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); } else { - if (Dictionary.ContainsKey(ExpiresUtcKey)) + if (Items.ContainsKey(ExpiresUtcKey)) { - Dictionary.Remove(ExpiresUtcKey); + Items.Remove(ExpiresUtcKey); } } } @@ -170,7 +170,7 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - if (Dictionary.TryGetValue(RefreshKey, out value)) + if (Items.TryGetValue(RefreshKey, out value)) { bool refresh; if (bool.TryParse(value, out refresh)) @@ -184,13 +184,13 @@ namespace Microsoft.AspNet.Http.Authentication { if (value.HasValue) { - Dictionary[RefreshKey] = value.Value.ToString(); + Items[RefreshKey] = value.Value.ToString(); } else { - if (Dictionary.ContainsKey(RefreshKey)) + if (Items.ContainsKey(RefreshKey)) { - Dictionary.Remove(RefreshKey); + Items.Remove(RefreshKey); } } } diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 76369f246d..9fccca6116 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Authentication HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); + var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Items); if (handler != null) { handler.Challenge(challengeContext); @@ -103,7 +103,7 @@ namespace Microsoft.AspNet.Http.Authentication { var handler = HttpAuthenticationFeature.Handler; - var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); + var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Items); if (handler != null) { handler.SignIn(signInContext); @@ -120,7 +120,7 @@ namespace Microsoft.AspNet.Http.Authentication { var handler = HttpAuthenticationFeature.Handler; - var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); + var signOutContext = new SignOutContext(authenticationScheme, properties?.Items); if (handler != null) { handler.SignOut(signOutContext); From cc1a24b949a000856fabdaa683a526949251ba45 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 20 Apr 2015 10:35:46 -0700 Subject: [PATCH 302/846] #273 - Use POCOs for auth context objects. --- .../Authentication/AuthenticateContext.cs | 40 ++++++++++++++++++ .../Authentication/ChallengeContext.cs | 21 +++------- .../Authentication/DescribeSchemesContext.cs | 12 +++--- .../Authentication/IAuthenticateContext.cs | 17 -------- .../Authentication/IAuthenticationHandler.cs | 15 ++++--- .../Authentication/IChallengeContext.cs | 15 ------- .../Authentication/IDescribeSchemesContext.cs | 12 ------ .../Authentication/ISignInContext.cs | 18 -------- .../Authentication/ISignOutContext.cs | 16 -------- .../Authentication/SignInContext.cs | 21 ++++------ .../Authentication/SignOutContext.cs | 13 ++---- .../project.json | 31 ++++++++------ .../Authentication/AuthenticateContext.cs | 41 ------------------- .../DefaultAuthenticationManager.cs | 30 ++++++++------ .../DefaultHttpContextTests.cs | 14 +++---- 15 files changed, 116 insertions(+), 200 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/ChallengeContext.cs (54%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/DescribeSchemesContext.cs (60%) delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/SignInContext.cs (70%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/SignOutContext.cs (79%) delete mode 100644 src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs new file mode 100644 index 0000000000..e76a501d73 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.Http.Authentication +{ + public class AuthenticateContext + { + public AuthenticateContext([NotNull] string authenticationScheme) + { + AuthenticationScheme = authenticationScheme; + } + + public string AuthenticationScheme { get; } + + public bool Accepted { get; private set; } + + public ClaimsPrincipal Principal { get; private set; } + + public IDictionary Properties { get; private set; } + + public IDictionary Description { get; private set; } + + public virtual void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) + { + Accepted = true; + Principal = principal; + Properties = properties; + Description = description; + } + + public virtual void NotAuthenticated() + { + Accepted = true; + } + } +} diff --git a/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs similarity index 54% rename from src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs index 0a137bb645..e1b6bf8c04 100644 --- a/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs @@ -3,35 +3,26 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { - public class ChallengeContext : IChallengeContext + public class ChallengeContext { - private bool _accepted; - public ChallengeContext(string authenticationScheme, IDictionary properties) { AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - - // The default Challenge with no scheme is always accepted - _accepted = string.IsNullOrEmpty(authenticationScheme); } - public string AuthenticationScheme { get; private set; } + public string AuthenticationScheme { get; } - public IDictionary Properties { get; private set; } + public IDictionary Properties { get; } - public bool Accepted - { - get { return _accepted; } - } + public bool Accepted { get; private set; } public void Accept() { - _accepted = true; + Accepted = true; } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs similarity index 60% rename from src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs index 6e4907949d..38daa0a856 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs @@ -5,23 +5,23 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http.Authentication { - public class DescribeSchemesContext : IDescribeSchemesContext + public class DescribeSchemesContext { - private List _results; + private List> _results; public DescribeSchemesContext() { - _results = new List(); + _results = new List>(); } - public IEnumerable Results + public IEnumerable> Results { get { return _results; } } public void Accept(IDictionary description) { - _results.Add(new AuthenticationDescription(description)); + _results.Add(description); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs deleted file mode 100644 index ecf8b56788..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Security.Claims; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface IAuthenticateContext - { - string AuthenticationScheme { get; } - - void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description); - - void NotAuthenticated(); - } -} diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs index 76b3e8cb1b..04a7039a80 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs @@ -7,13 +7,16 @@ namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticationHandler { - void GetDescriptions(IDescribeSchemesContext context); + void GetDescriptions(DescribeSchemesContext context); - void Authenticate(IAuthenticateContext context); - Task AuthenticateAsync(IAuthenticateContext context); + void Authenticate(AuthenticateContext context); - void Challenge(IChallengeContext context); - void SignIn(ISignInContext context); - void SignOut(ISignOutContext context); + Task AuthenticateAsync(AuthenticateContext context); + + void Challenge(ChallengeContext context); + + void SignIn(SignInContext context); + + void SignOut(SignOutContext context); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs deleted file mode 100644 index 26a90fefb2..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface IChallengeContext - { - string AuthenticationScheme { get; } - IDictionary Properties { get; } - - void Accept(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs deleted file mode 100644 index 96f395cb37..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface IDescribeSchemesContext - { - void Accept(IDictionary description); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs deleted file mode 100644 index c79860279d..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Security.Claims; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface ISignInContext - { - //IEnumerable Principals { get; } - ClaimsPrincipal Principal { get; } - IDictionary Properties { get; } - string AuthenticationScheme { get; } - - void Accept(IDictionary description); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs deleted file mode 100644 index 2bb7036026..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface ISignOutContext - { - string AuthenticationScheme { get; } - - IDictionary Properties { get; } - - void Accept(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs similarity index 70% rename from src/Microsoft.AspNet.Http/Authentication/SignInContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs index 1a77db412b..d5d74c3186 100644 --- a/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs @@ -8,31 +8,26 @@ using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { - public class SignInContext : ISignInContext + public class SignInContext { - private bool _accepted; - - public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary dictionary) + public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary properties) { AuthenticationScheme = authenticationScheme; Principal = principal; - Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + Properties = properties ?? new Dictionary(StringComparer.Ordinal); } + public string AuthenticationScheme { get; } + public ClaimsPrincipal Principal { get; } public IDictionary Properties { get; } - public string AuthenticationScheme { get; } + public bool Accepted { get; private set; } - public bool Accepted + public void Accept() { - get { return _accepted; } - } - - public void Accept(IDictionary description) - { - _accepted = true; + Accepted = true; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs similarity index 79% rename from src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs index d78820980e..27a7d2941b 100644 --- a/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs @@ -7,10 +7,8 @@ using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { - public class SignOutContext : ISignOutContext + public class SignOutContext { - private bool _accepted; - public SignOutContext([NotNull] string authenticationScheme, IDictionary properties) { AuthenticationScheme = authenticationScheme; @@ -21,14 +19,11 @@ namespace Microsoft.AspNet.Http.Authentication public IDictionary Properties { get; } - public bool Accepted - { - get { return _accepted; } - } + public bool Accepted { get; private set; } public void Accept() { - _accepted = true; + Accepted = true; } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index 3af7b3bdfb..d4d113923c 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -1,16 +1,21 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature interface definitions.", - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "System.Net.Primitives": "4.0.10-beta-*", - "System.Net.WebSockets" : "4.0.0-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*" - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature interface definitions.", + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Collections": "4.0.10-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets": "4.0.0-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*" + } + } } - } } diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs deleted file mode 100644 index 91d530dfad..0000000000 --- a/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Security.Claims; -using Microsoft.Framework.Internal; - -namespace Microsoft.AspNet.Http.Authentication -{ - public class AuthenticateContext : IAuthenticateContext - { - private AuthenticationResult _result; - private bool _accepted; - - public AuthenticateContext([NotNull] string authenticationScheme) - { - AuthenticationScheme = authenticationScheme; - } - - public string AuthenticationScheme { get; private set; } - - public AuthenticationResult Result { get; set; } - - public bool Accepted - { - get { return _accepted; } - } - - public void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) - { - var descrip = new AuthenticationDescription(description); - _accepted = true; - Result = new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip); - } - - public void NotAuthenticated() - { - _accepted = true; - } - } -} diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 9fccca6116..e21bea9634 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; @@ -42,7 +43,7 @@ namespace Microsoft.AspNet.Http.Authentication var describeContext = new DescribeSchemesContext(); handler.GetDescriptions(describeContext); - return describeContext.Results; + return describeContext.Results.Select(description => new AuthenticationDescription(description)); } public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) @@ -57,10 +58,12 @@ namespace Microsoft.AspNet.Http.Authentication if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } - return authenticateContext.Result; + return new AuthenticationResult(authenticateContext.Principal, + new AuthenticationProperties(authenticateContext.Properties), + new AuthenticationDescription(authenticateContext.Description)); } public override async Task AuthenticateAsync([NotNull] string authenticationScheme) @@ -76,10 +79,12 @@ namespace Microsoft.AspNet.Http.Authentication // Verify all types ack'd if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } - return authenticateContext.Result; + return new AuthenticationResult(authenticateContext.Principal, + new AuthenticationProperties(authenticateContext.Properties), + new AuthenticationDescription(authenticateContext.Description)); } public override void Challenge(AuthenticationProperties properties, string authenticationScheme) @@ -87,23 +92,24 @@ namespace Microsoft.AspNet.Http.Authentication HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Items); + var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items); if (handler != null) { handler.Challenge(challengeContext); } - if (!challengeContext.Accepted) + // The default Challenge with no scheme is always accepted + if (!challengeContext.Accepted && !string.IsNullOrEmpty(authenticationScheme)) { - throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } - public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + public override void SignIn([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; - var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Items); + var signInContext = new SignInContext(authenticationScheme, principal, properties?.Items); if (handler != null) { handler.SignIn(signInContext); @@ -112,7 +118,7 @@ namespace Microsoft.AspNet.Http.Authentication // Verify all types ack'd if (!signInContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } @@ -129,7 +135,7 @@ namespace Microsoft.AspNet.Http.Authentication // Verify all types ack'd if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index c53c3c73c2..ea887b711b 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -97,33 +97,33 @@ namespace Microsoft.AspNet.Http { public bool SignedIn { get; set; } - public void Authenticate(IAuthenticateContext context) + public void Authenticate(AuthenticateContext context) { throw new NotImplementedException(); } - public Task AuthenticateAsync(IAuthenticateContext context) + public Task AuthenticateAsync(AuthenticateContext context) { throw new NotImplementedException(); } - public void Challenge(IChallengeContext context) + public void Challenge(ChallengeContext context) { throw new NotImplementedException(); } - public void GetDescriptions(IDescribeSchemesContext context) + public void GetDescriptions(DescribeSchemesContext context) { throw new NotImplementedException(); } - public void SignIn(ISignInContext context) + public void SignIn(SignInContext context) { SignedIn = true; - context.Accept(new Dictionary()); + context.Accept(); } - public void SignOut(ISignOutContext context) + public void SignOut(SignOutContext context) { SignedIn = false; context.Accept(); From 0ed2692ef415653a4b2174397bc274908ef5a51f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 21 Apr 2015 12:34:32 -0700 Subject: [PATCH 303/846] #267, #273, Move WebSocket APIs to their own object, fix context object. --- src/Microsoft.AspNet.Http.Core/HttpContext.cs | 13 +--- .../WebSocketManager.cs | 23 +++++++ .../IHttpWebSocketFeature.cs | 2 +- .../IWebSocketAcceptContext.cs | 10 --- .../WebSocketAcceptContext.cs | 2 +- .../DefaultHttpContext.cs | 40 +++--------- .../DefaultWebSocketManager.cs | 63 +++++++++++++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +- .../OwinFeatureCollection.cs | 4 +- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 4 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 4 +- .../WebSockets/WebSocketAcceptAdapter.cs | 8 +-- 12 files changed, 108 insertions(+), 69 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Core/WebSocketManager.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/WebSocketAcceptContext.cs (81%) create mode 100644 src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpContext.cs b/src/Microsoft.AspNet.Http.Core/HttpContext.cs index 83457e775c..14646bf069 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpContext.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.Net.WebSockets; using System.Security.Claims; using System.Threading; -using System.Threading.Tasks; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http @@ -33,9 +31,7 @@ namespace Microsoft.AspNet.Http public abstract ISessionCollection Session { get; } - public abstract bool IsWebSocketRequest { get; } - - public abstract IList WebSocketRequestedProtocols { get; } + public abstract WebSocketManager WebSockets { get; } public abstract void Abort(); @@ -54,12 +50,5 @@ namespace Microsoft.AspNet.Http { SetFeature(typeof(T), instance); } - - public virtual Task AcceptWebSocketAsync() - { - return AcceptWebSocketAsync(subProtocol: null); - } - - public abstract Task AcceptWebSocketAsync(string subProtocol); } } diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs new file mode 100644 index 0000000000..cf7fd11f63 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + public abstract class WebSocketManager + { + public abstract bool IsWebSocketRequest { get; } + + public abstract IList WebSocketRequestedProtocols { get; } + + public virtual Task AcceptWebSocketAsync() + { + return AcceptWebSocketAsync(subProtocol: null); + } + + public abstract Task AcceptWebSocketAsync(string subProtocol); + } +} diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index 3e86058140..eb64b4bea9 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -10,6 +10,6 @@ namespace Microsoft.AspNet.Http { bool IsWebSocketRequest { get; } - Task AcceptAsync(IWebSocketAcceptContext context); + Task AcceptAsync(WebSocketAcceptContext context); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs deleted file mode 100644 index 81f041bb27..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http -{ - public interface IWebSocketAcceptContext - { - string SubProtocol { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs similarity index 81% rename from src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs index 34747f900f..210ec0c2b0 100644 --- a/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs @@ -3,7 +3,7 @@ namespace Microsoft.AspNet.Http { - public class WebSocketAcceptContext : IWebSocketAcceptContext + public class WebSocketAcceptContext { public virtual string SubProtocol { get; set; } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 7dc14893b5..65365e98b8 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -3,22 +3,17 @@ using System; using System.Collections.Generic; -using System.Net.WebSockets; using System.Security.Claims; using System.Threading; -using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http { public class DefaultHttpContext : HttpContext { - private static IList EmptyList = new List(); - private readonly HttpRequest _request; private readonly HttpResponse _response; private readonly ConnectionInfo _connection; @@ -28,8 +23,8 @@ namespace Microsoft.AspNet.Http private FeatureReference _serviceProviders; private FeatureReference _authentication; private FeatureReference _lifetime; - private FeatureReference _webSockets; private FeatureReference _session; + private WebSocketManager _websockets; private IFeatureCollection _features; public DefaultHttpContext() @@ -51,7 +46,6 @@ namespace Microsoft.AspNet.Http _serviceProviders = FeatureReference.Default; _authentication = FeatureReference.Default; _lifetime = FeatureReference.Default; - _webSockets = FeatureReference.Default; _session = FeatureReference.Default; } @@ -75,11 +69,6 @@ namespace Microsoft.AspNet.Http get { return _lifetime.Fetch(_features); } } - private IHttpWebSocketFeature WebSocketFeature - { - get { return _webSockets.Fetch(_features); } - } - private ISessionFeature SessionFeature { get { return _session.Fetch(_features); } @@ -161,20 +150,15 @@ namespace Microsoft.AspNet.Http } } - public override bool IsWebSocketRequest + public override WebSocketManager WebSockets { get { - var webSocketFeature = WebSocketFeature; - return webSocketFeature != null && webSocketFeature.IsWebSocketRequest; - } - } - - public override IList WebSocketRequestedProtocols - { - get - { - return Request.Headers.GetValues(HeaderNames.WebSocketSubProtocols) ?? EmptyList; + if (_websockets == null) + { + _websockets = new DefaultWebSocketManager(_features); + } + return _websockets; } } @@ -203,15 +187,5 @@ namespace Microsoft.AspNet.Http { _features[type] = instance; } - - public override Task AcceptWebSocketAsync(string subProtocol) - { - var webSocketFeature = WebSocketFeature; - if (WebSocketFeature == null) - { - throw new NotSupportedException("WebSockets are not supported"); - } - return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol } ); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs new file mode 100644 index 0000000000..c1845c66e5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http +{ + public class DefaultWebSocketManager : WebSocketManager + { + private static IList EmptyList = new List(); + + private IFeatureCollection _features; + private FeatureReference _request = FeatureReference.Default; + private FeatureReference _webSockets = FeatureReference.Default; + + public DefaultWebSocketManager(IFeatureCollection features) + { + _features = features; + } + + private IHttpRequestFeature HttpRequestFeature + { + get { return _request.Fetch(_features); } + } + + private IHttpWebSocketFeature WebSocketFeature + { + get { return _webSockets.Fetch(_features); } + } + + public override bool IsWebSocketRequest + { + get + { + return WebSocketFeature != null && WebSocketFeature.IsWebSocketRequest; + } + } + + public override IList WebSocketRequestedProtocols + { + get + { + return ParsingHelpers.GetHeaderUnmodified(HttpRequestFeature.Headers, + HeaderNames.WebSocketSubProtocols) ?? EmptyList; + } + } + + public override Task AcceptWebSocketAsync(string subProtocol) + { + if (WebSocketFeature == null) + { + throw new NotSupportedException("WebSockets are not supported"); + } + return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol }); + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 75b1c88067..9dfae8a833 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Owin using WebSocketAcceptAlt = Func < - IWebSocketAcceptContext, // WebSocket Accept parameters + WebSocketAcceptContext, // WebSocket Accept parameters Task >; @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Owin feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } - if (context.IsWebSocketRequest) + if (context.WebSockets.IsWebSocketRequest) { _entries.Add(OwinConstants.WebSocket.AcceptAlt, new FeatureMap(feature => new WebSocketAcceptAlt(feature.AcceptAsync))); } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 50d58adb9c..195fb04cb0 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -277,14 +277,14 @@ namespace Microsoft.AspNet.Owin } } - Task IHttpWebSocketFeature.AcceptAsync(IWebSocketAcceptContext context) + Task IHttpWebSocketFeature.AcceptAsync(WebSocketAcceptContext context) { object obj; if (!Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj)) { throw new NotSupportedException("WebSockets are not supported"); // TODO: LOC } - var accept = (Func>)obj; + var accept = (Func>)obj; return accept(context); } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 07b58bc27e..50448cd560 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Owin using WebSocketAcceptAlt = Func < - IWebSocketAcceptContext, // WebSocket Accept parameters + WebSocketAcceptContext, // WebSocket Accept parameters Task >; @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Owin private Task UpstreamTask { get; set; } private TaskCompletionSource UpstreamWentAsyncTcs { get { return _upstreamWentAsync; } } - private async Task AcceptWebSocketAsync(IWebSocketAcceptContext context) + private async Task AcceptWebSocketAsync(WebSocketAcceptContext context) { IDictionary options = null; if (context is OwinWebSocketAcceptContext) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 56bc445f77..45cacf76ab 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -6,7 +6,7 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { - public class OwinWebSocketAcceptContext : IWebSocketAcceptContext + public class OwinWebSocketAcceptContext : WebSocketAcceptContext { private IDictionary _options; @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Owin _options = options; } - public string SubProtocol + public override string SubProtocol { get { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 8a7d7aa0cf..71efc5490b 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Owin using WebSocketAcceptAlt = Func < - IWebSocketAcceptContext, // WebSocket Accept parameters + WebSocketAcceptContext, // WebSocket Accept parameters Task >; @@ -65,11 +65,11 @@ namespace Microsoft.AspNet.Owin await next(environment); if ((int)environment[OwinConstants.ResponseStatusCode] == 101 && adapter._callback != null) { - IWebSocketAcceptContext acceptContext = null; + WebSocketAcceptContext acceptContext = null; object obj; - if (adapter._options != null && adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) + if (adapter._options != null && adapter._options.TryGetValue(typeof(WebSocketAcceptContext).FullName, out obj)) { - acceptContext = obj as IWebSocketAcceptContext; + acceptContext = obj as WebSocketAcceptContext; } else if (adapter._options != null) { From 06e24a8fdfbaf7e23a274bb26ba02f52596986d0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 23 Apr 2015 16:05:05 -0700 Subject: [PATCH 304/846] Handle null auth, null descriptions. --- .../Authentication/AuthenticationDescription.cs | 6 +++--- .../Authentication/DefaultAuthenticationManager.cs | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs index 16b2c43247..97ca3fe18e 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs @@ -20,17 +20,17 @@ namespace Microsoft.AspNet.Http.Authentication /// Initializes a new instance of the class /// public AuthenticationDescription() + : this(items: null) { - Items = new Dictionary(StringComparer.Ordinal); } /// /// Initializes a new instance of the class /// /// - public AuthenticationDescription([NotNull] IDictionary items) + public AuthenticationDescription(IDictionary items) { - Items = items; + Items = items ?? new Dictionary(StringComparer.Ordinal); ; } /// diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index e21bea9634..6f1c3ba419 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -61,6 +61,11 @@ namespace Microsoft.AspNet.Http.Authentication throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } + if (authenticateContext.Principal == null) + { + return null; + } + return new AuthenticationResult(authenticateContext.Principal, new AuthenticationProperties(authenticateContext.Properties), new AuthenticationDescription(authenticateContext.Description)); @@ -82,6 +87,11 @@ namespace Microsoft.AspNet.Http.Authentication throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } + if (authenticateContext.Principal == null) + { + return null; + } + return new AuthenticationResult(authenticateContext.Principal, new AuthenticationProperties(authenticateContext.Properties), new AuthenticationDescription(authenticateContext.Description)); From 43a38c1b58d7466d1d4747ec47bf1187a8e2efdd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 24 Apr 2015 08:51:30 -0700 Subject: [PATCH 305/846] Reorder Challenge parameters. --- .../Authentication/AuthenticationManager.cs | 15 ++++++++++----- .../DefaultAuthenticationManager.cs | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs index 219e909221..f7b4342b59 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs @@ -17,22 +17,27 @@ namespace Microsoft.AspNet.Http.Authentication public virtual void Challenge() { - Challenge(properties: null, authenticationScheme: null); + Challenge(authenticationScheme: null, properties: null); } public virtual void Challenge(AuthenticationProperties properties) { - Challenge(properties, ""); + Challenge(authenticationScheme: null, properties: properties); } public virtual void Challenge(string authenticationScheme) { - Challenge(properties: null, authenticationScheme: authenticationScheme); + Challenge(authenticationScheme: authenticationScheme, properties: null); } - public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); + public abstract void Challenge(string authenticationScheme, AuthenticationProperties properties); - public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); + public void SignIn(string authenticationScheme, ClaimsPrincipal principal) + { + SignIn(authenticationScheme, principal, properties: null); + } + + public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); public virtual void SignOut() { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 6f1c3ba419..f4d086b63d 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Http.Authentication new AuthenticationDescription(authenticateContext.Description)); } - public override void Challenge(AuthenticationProperties properties, string authenticationScheme) + public override void Challenge(string authenticationScheme, AuthenticationProperties properties) { HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; From 117486de94fadcda9f93165e678b4c352b45e808 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 27 Apr 2015 14:18:02 -0700 Subject: [PATCH 306/846] #277 Rename IHttpClientCertificateFeature. #279 prefer X509Certificate2. --- src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs | 4 ++-- ...ficateFeature.cs => ITlsConnectionFeature.cs} | 6 +++--- .../DefaultConnectionInfo.cs | 16 ++++++++-------- ...ificateFeature.cs => TlsConnectionFeature.cs} | 8 ++++---- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 6 +++--- .../OwinFeatureCollection.cs | 14 +++++++------- 6 files changed, 27 insertions(+), 27 deletions(-) rename src/Microsoft.AspNet.Http.Interfaces/{IHttpClientCertificateFeature.cs => ITlsConnectionFeature.cs} (74%) rename src/Microsoft.AspNet.Http/{HttpClientCertificateFeature.cs => TlsConnectionFeature.cs} (60%) diff --git a/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs index 54175ec2f2..0587fde7ca 100644 --- a/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs @@ -20,8 +20,8 @@ namespace Microsoft.AspNet.Http public abstract bool IsLocal { get; set; } - public abstract X509Certificate ClientCertificate { get; set; } + public abstract X509Certificate2 ClientCertificate { get; set; } - public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); + public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs similarity index 74% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs index da8fd38115..fdac0526e2 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs @@ -7,17 +7,17 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { - public interface IHttpClientCertificateFeature + public interface ITlsConnectionFeature { /// /// Synchronously retrieves the client certificate, if any. /// - X509Certificate ClientCertificate { get; set; } + X509Certificate2 ClientCertificate { get; set; } /// /// Asynchronously retrieves the client certificate, if any. /// /// - Task GetClientCertificateAsync(CancellationToken cancellationToken); + Task GetClientCertificateAsync(CancellationToken cancellationToken); } } diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index f400f6aaff..a01cee053e 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http private readonly IFeatureCollection _features; private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _clientCertificate = FeatureReference.Default; + private FeatureReference _tlsConnectoin = FeatureReference.Default; public DefaultConnectionInfo(IFeatureCollection features) { @@ -27,9 +27,9 @@ namespace Microsoft.AspNet.Http get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); } } - private IHttpClientCertificateFeature HttpClientCertificateFeature + private ITlsConnectionFeature TlsConnectionFeature { - get { return _clientCertificate.Fetch(_features) ?? _clientCertificate.Update(_features, new HttpClientCertificateFeature()); } + get { return _tlsConnectoin.Fetch(_features) ?? _tlsConnectoin.Update(_features, new TlsConnectionFeature()); } } public override IPAddress RemoteIpAddress @@ -62,15 +62,15 @@ namespace Microsoft.AspNet.Http set { HttpConnectionFeature.IsLocal = value; } } - public override X509Certificate ClientCertificate + public override X509Certificate2 ClientCertificate { - get { return HttpClientCertificateFeature.ClientCertificate; } - set { HttpClientCertificateFeature.ClientCertificate = value; } + get { return TlsConnectionFeature.ClientCertificate; } + set { TlsConnectionFeature.ClientCertificate = value; } } - public override Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()) + public override Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()) { - return HttpClientCertificateFeature.GetClientCertificateAsync(cancellationToken); + return TlsConnectionFeature.GetClientCertificateAsync(cancellationToken); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs similarity index 60% rename from src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http/TlsConnectionFeature.cs index 22ef21f704..bf22639161 100644 --- a/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs @@ -7,15 +7,15 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { - public class HttpClientCertificateFeature : IHttpClientCertificateFeature + public class TlsConnectionFeature : ITlsConnectionFeature { - public HttpClientCertificateFeature() + public TlsConnectionFeature() { } - public X509Certificate ClientCertificate { get; set; } + public X509Certificate2 ClientCertificate { get; set; } - public Task GetClientCertificateAsync(CancellationToken cancellationToken) + public Task GetClientCertificateAsync(CancellationToken cancellationToken) { return Task.FromResult(ClientCertificate); } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 9dfae8a833..f35bedcd34 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -99,9 +99,9 @@ namespace Microsoft.AspNet.Owin if (context.Request.IsHttps) { - _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, - (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap( + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + (feature, value) => feature.ClientCertificate = (X509Certificate2)value)); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap( feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 195fb04cb0..0c270bfc3a 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Owin IHttpResponseFeature, IHttpConnectionFeature, IHttpSendFileFeature, - IHttpClientCertificateFeature, + ITlsConnectionFeature, IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, IHttpWebSocketFeature, @@ -228,20 +228,20 @@ namespace Microsoft.AspNet.Owin } } - X509Certificate IHttpClientCertificateFeature.ClientCertificate + X509Certificate2 ITlsConnectionFeature.ClientCertificate { - get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } + get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - async Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) + async Task ITlsConnectionFeature.GetClientCertificateAsync(CancellationToken cancellationToken) { var loadAsync = Prop>(OwinConstants.CommonKeys.LoadClientCertAsync); if (loadAsync != null) { await loadAsync(); } - return Prop(OwinConstants.CommonKeys.ClientCertificate); + return Prop(OwinConstants.CommonKeys.ClientCertificate); } CancellationToken IHttpRequestLifetimeFeature.RequestAborted @@ -308,7 +308,7 @@ namespace Microsoft.AspNet.Owin { return SupportsSendFile; } - else if (key == typeof(IHttpClientCertificateFeature)) + else if (key == typeof(ITlsConnectionFeature)) { return SupportsClientCerts; } @@ -342,7 +342,7 @@ namespace Microsoft.AspNet.Owin } if (SupportsClientCerts) { - keys.Add(typeof(IHttpClientCertificateFeature)); + keys.Add(typeof(ITlsConnectionFeature)); } if (SupportsWebSockets) { From 86f94b7590daf4ca24ba37f17d30b41df60c9be3 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 28 Apr 2015 13:44:40 -0700 Subject: [PATCH 307/846] Fix typo. --- src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index a01cee053e..feae42f1f4 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http private readonly IFeatureCollection _features; private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _tlsConnectoin = FeatureReference.Default; + private FeatureReference _tlsConnection = FeatureReference.Default; public DefaultConnectionInfo(IFeatureCollection features) { @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Http private ITlsConnectionFeature TlsConnectionFeature { - get { return _tlsConnectoin.Fetch(_features) ?? _tlsConnectoin.Update(_features, new TlsConnectionFeature()); } + get { return _tlsConnection.Fetch(_features) ?? _tlsConnection.Update(_features, new TlsConnectionFeature()); } } public override IPAddress RemoteIpAddress From 06584a31b4b6d963fbe2130c915d75d3f9c4c152 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 29 Apr 2015 09:59:29 -0700 Subject: [PATCH 308/846] #276 Remove unused IHttpApplicationFeature. --- .../IHttpApplicationFeature.cs | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs deleted file mode 100644 index 3032d47b6e..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Threading; - -namespace Microsoft.AspNet.Http -{ - public interface IHttpApplicationFeature - { - string AppName { get; set; } - string AppMode { get; set; } - CancellationToken OnAppDisposing { get; set; } - } -} From 5bce14068164c47ce2ad12fe3354246201184bbe Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 29 Apr 2015 14:38:26 -0700 Subject: [PATCH 309/846] #295 Rename Core->Abstractions and Interfaces->Features. --- HttpAbstractions.sln | 8 ++++---- .../Authentication/AuthenticateResult.cs | 0 .../Authentication/AuthenticationDescription.cs | 0 .../Authentication/AuthenticationManager.cs | 0 .../Authentication/AuthenticationProperties.cs | 0 .../ConnectionInfo.cs | 0 .../CookieOptions.cs | 0 .../Extensions/MapExtensions.cs | 0 .../Extensions/MapMiddleware.cs | 0 .../Extensions/MapOptions.cs | 0 .../Extensions/MapWhenExtensions.cs | 0 .../Extensions/MapWhenMiddleware.cs | 0 .../Extensions/MapWhenOptions.cs | 0 .../Extensions/RunExtensions.cs | 0 .../Extensions/UseExtensions.cs | 0 .../FragmentString.cs | 0 .../HostString.cs | 0 .../HttpContext.cs | 0 .../HttpRequest.cs | 0 .../HttpResponse.cs | 0 .../HttpResponseWritingExtensions.cs | 0 .../IApplicationBuilder.cs | 0 .../IFormCollection.cs | 0 .../IFormFile.cs | 0 .../IFormFileCollection.cs | 0 .../IHeaderDictionary.cs | 0 .../IReadableStringCollection.cs | 0 .../IResponseCookies.cs | 0 .../ISessionCollection.cs | 0 .../Microsoft.AspNet.Http.Abstractions.xproj} | 0 .../PathString.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryString.cs | 0 .../RequestDelegate.cs | 0 .../WebSocketManager.cs | 0 .../project.json | 0 src/Microsoft.AspNet.Http.Extensions/project.json | 4 ++-- .../Authentication/AuthenticateContext.cs | 0 .../Authentication/ChallengeContext.cs | 0 .../Authentication/DescribeSchemesContext.cs | 0 .../Authentication/IAuthenticationHandler.cs | 0 .../Authentication/IHttpAuthenticationFeature.cs | 0 .../Authentication/SignInContext.cs | 0 .../Authentication/SignOutContext.cs | 0 .../IHttpBufferingFeature.cs | 0 .../IHttpConnectionFeature.cs | 0 .../IHttpRequestFeature.cs | 0 .../IHttpRequestLifetimeFeature.cs | 0 .../IHttpResponseFeature.cs | 0 .../IHttpSendFileFeature.cs | 0 .../IHttpUpgradeFeature.cs | 0 .../IHttpWebSocketFeature.cs | 0 .../IRequestIdentifierFeature.cs | 0 .../ISession.cs | 0 .../ISessionFactory.cs | 0 .../ISessionFeature.cs | 0 .../ITlsConnectionFeature.cs | 0 .../ITlsTokenBindingFeature.cs | 0 .../Microsoft.AspNet.Http.Features.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../WebSocketAcceptContext.cs | 0 .../project.json | 0 src/Microsoft.AspNet.Http/project.json | 4 ++-- .../Microsoft.AspNet.FeatureModel.Tests.xproj | 3 +++ .../HttpResponseWritingExtensionsTests.cs | 0 .../MapPathMiddlewareTests.cs | 0 .../MapPredicateMiddlewareTests.cs | 0 .../Microsoft.AspNet.Http.Abstractions.Tests.xproj} | 3 +++ .../PathStringTests.cs | 0 .../project.json | 0 .../Microsoft.AspNet.Http.Extensions.Tests.xproj | 3 +++ .../Microsoft.AspNet.Http.Tests.xproj | 3 +++ .../Microsoft.AspNet.Owin.Tests.xproj | 3 +++ .../Microsoft.AspNet.WebUtilities.Tests.xproj | 3 +++ .../Microsoft.Framework.WebEncoders.Tests.xproj | 3 +++ .../Microsoft.Net.Http.Headers.Tests.xproj | 3 +++ 76 files changed, 32 insertions(+), 8 deletions(-) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticateResult.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticationDescription.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticationManager.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/ConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/CookieOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapWhenExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapWhenMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapWhenOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/RunExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/UseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/FragmentString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HostString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpContext.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpResponseWritingExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IFormCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IFormFile.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IHeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IReadableStringCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/ISessionCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj => Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/PathString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/QueryString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/RequestDelegate.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/WebSocketManager.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/project.json (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/AuthenticateContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/ChallengeContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/DescribeSchemesContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/IAuthenticationHandler.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/IHttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/SignInContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/SignOutContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpBufferingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpSendFileFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpUpgradeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpWebSocketFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ISession.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ISessionFactory.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ISessionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ITlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ITlsTokenBindingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj => Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj} (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/WebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/project.json (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/HttpResponseWritingExtensionsTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/MapPathMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/MapPredicateMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj => Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj} (91%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/PathStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/project.json (100%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 18c4d05c9f..aa66e840ca 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22807.0 +VisualStudioVersion = 14.0.22823.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -9,9 +9,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-3 EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions", "src\Microsoft.AspNet.Http.Abstractions\Microsoft.AspNet.Http.Abstractions.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features", "src\Microsoft.AspNet.Http.Features\Microsoft.AspNet.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject @@ -19,7 +19,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions.Tests", "test\Microsoft.AspNet.Http.Abstractions.Tests\Microsoft.AspNet.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs rename to src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http.Core/CookieOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/CookieOptions.cs rename to src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/FragmentString.cs rename to src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs diff --git a/src/Microsoft.AspNet.Http.Core/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HostString.cs rename to src/Microsoft.AspNet.Http.Abstractions/HostString.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpContext.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpRequest.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpResponse.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs rename to src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IFormCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IFormFile.cs rename to src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs rename to src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/IResponseCookies.cs b/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IResponseCookies.cs rename to src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http.Core/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/ISessionCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj b/src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj rename to src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/PathString.cs rename to src/Microsoft.AspNet.Http.Abstractions/PathString.cs diff --git a/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Core/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/QueryString.cs rename to src/Microsoft.AspNet.Http.Abstractions/QueryString.cs diff --git a/src/Microsoft.AspNet.Http.Core/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/RequestDelegate.cs rename to src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/WebSocketManager.cs rename to src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Core/project.json rename to src/Microsoft.AspNet.Http.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 4055d3b43d..2656106881 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -2,8 +2,8 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs rename to src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ISession.cs rename to src/Microsoft.AspNet.Http.Features/ISession.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs rename to src/Microsoft.AspNet.Http.Features/ISessionFactory.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs rename to src/Microsoft.AspNet.Http.Features/ISessionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs rename to src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs rename to src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj b/src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj rename to src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj diff --git a/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Features/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/project.json rename to src/Microsoft.AspNet.Http.Features/project.json diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index b554c9eabe..0188f4ff3d 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -3,8 +3,8 @@ "description": "ASP.NET 5 HTTP feature implementations.", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj index 6bd0b3bd59..0e9350ca4e 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj b/test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj similarity index 91% rename from test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj rename to test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj index 424d3a7f9b..7989ec74c0 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/project.json rename to test/Microsoft.AspNet.Http.Abstractions.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj index 38294666a7..258c09d86a 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj index c438cb7050..278ef825da 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj index 0a5d033908..a923e01d9a 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj index 8476f5e9a6..0042456e89 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj index d456c7e180..9b0698e3cc 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj +++ b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj index a0a2089ec3..819024d5ea 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file From 89ccdf56bf772f6076271bc064bed74d5a9d1fdd Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 30 Apr 2015 08:45:24 -0700 Subject: [PATCH 310/846] React to interface renames --- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.Framework.WebEncoders/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 2656106881..1c0b74dcab 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 612cd69ddd..e39ec75adc 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "Contains registration and configuration APIs for the core framework encoders.", "dependencies": { - "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" From 602f638a8c08c8473eeb299380036d4cd74615d3 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Thu, 30 Apr 2015 13:21:14 -0700 Subject: [PATCH 311/846] Remove EncoderServices and add default services directly in the service collection extension --- .../EncoderServiceCollectionExtensions.cs | 26 +++++++++++++++- .../EncoderServices.cs | 31 ------------------- 2 files changed, 25 insertions(+), 32 deletions(-) delete mode 100644 src/Microsoft.Framework.WebEncoders/EncoderServices.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index aae3ffbcf2..3d0851e9d4 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -3,6 +3,7 @@ using System; using Microsoft.Framework.Internal; +using Microsoft.Framework.OptionsModel; using Microsoft.Framework.WebEncoders; namespace Microsoft.Framework.DependencyInjection @@ -17,12 +18,35 @@ namespace Microsoft.Framework.DependencyInjection public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, Action configureOptions) { services.AddOptions(); - services.TryAdd(EncoderServices.GetDefaultServices()); + + // Register the default encoders + // We want to call the 'Default' property getters lazily since they perform static caching + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter)))); + if (configureOptions != null) { services.Configure(configureOptions); } + return services; } + + private static Func CreateFactory( + Func defaultFactory, + Func customFilterFactory) + { + return serviceProvider => + { + var codePointFilter = serviceProvider?.GetService>()? + .Options? + .CodePointFilter; + return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); + }; + } } } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs deleted file mode 100644 index d7759f5134..0000000000 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.OptionsModel; - -namespace Microsoft.Framework.WebEncoders -{ - public static class EncoderServices - { - public static IEnumerable GetDefaultServices() - { - // Register the default encoders - // We want to call the 'Default' property getters lazily since they perform static caching - yield return ServiceDescriptor.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); - yield return ServiceDescriptor.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); - yield return ServiceDescriptor.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); - } - - private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) - { - return serviceProvider => - { - var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; - return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); - }; - } - } -} From 8703e2d7f21d09b50d20cc764e11d6bb0268aad2 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 1 May 2015 13:52:04 -0700 Subject: [PATCH 312/846] Update LICENSE.txt and license header on files. --- LICENSE.txt | 2 +- src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs | 2 +- src/Microsoft.AspNet.FeatureModel/FeatureObject.cs | 2 +- src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs | 2 +- src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs | 2 +- .../Authentication/AuthenticateResult.cs | 2 +- .../Authentication/AuthenticationDescription.cs | 2 +- .../Authentication/AuthenticationManager.cs | 2 +- .../Authentication/AuthenticationProperties.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs | 2 +- .../Extensions/MapExtensions.cs | 2 +- .../Extensions/MapMiddleware.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs | 2 +- .../Extensions/MapWhenExtensions.cs | 2 +- .../Extensions/MapWhenMiddleware.cs | 2 +- .../Extensions/MapWhenOptions.cs | 2 +- .../Extensions/RunExtensions.cs | 2 +- .../Extensions/UseExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HostString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs | 2 +- .../HttpResponseWritingExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs | 2 +- .../IReadableStringCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/PathString.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/QueryString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs | 2 +- .../HeaderDictionaryTypeExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs | 2 +- .../SendFileResponseExtensions.cs | 2 +- .../SessionCollectionExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs | 2 +- .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/IAuthenticationHandler.cs | 2 +- .../Authentication/IHttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISession.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFactory.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 2 +- .../Authentication/DefaultAuthenticationManager.cs | 2 +- .../Authentication/HttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.Http/BufferingHelper.cs | 2 +- src/Microsoft.AspNet.Http/Collections/FormCollection.cs | 2 +- src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs | 2 +- src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs | 2 +- src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 2 +- .../Collections/RequestCookiesCollection.cs | 2 +- src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs | 2 +- src/Microsoft.AspNet.Http/Collections/SessionCollection.cs | 2 +- src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpResponse.cs | 2 +- src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs | 2 +- src/Microsoft.AspNet.Http/FormFeature.cs | 2 +- src/Microsoft.AspNet.Http/FormFile.cs | 2 +- src/Microsoft.AspNet.Http/HttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http/HttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.Http/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http/IFormFeature.cs | 2 +- src/Microsoft.AspNet.Http/IItemsFeature.cs | 2 +- src/Microsoft.AspNet.Http/IQueryFeature.cs | 2 +- src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs | 2 +- src/Microsoft.AspNet.Http/Infrastructure/Constants.cs | 2 +- src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs | 2 +- src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs | 2 +- src/Microsoft.AspNet.Http/ItemsFeature.cs | 2 +- src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http/QueryFeature.cs | 2 +- src/Microsoft.AspNet.Http/ReferenceReadStream.cs | 2 +- src/Microsoft.AspNet.Http/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs | 2 +- src/Microsoft.AspNet.Http/TlsConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinConstants.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Owin/Utilities.cs | 2 +- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs | 2 +- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs | 2 +- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 2 +- src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs | 2 +- src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs | 2 +- src/Microsoft.AspNet.WebUtilities/FormReader.cs | 2 +- src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs | 2 +- src/Microsoft.AspNet.WebUtilities/MultipartReader.cs | 2 +- src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs | 2 +- src/Microsoft.AspNet.WebUtilities/MultipartSection.cs | 2 +- src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 2 +- src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs | 2 +- src/Microsoft.AspNet.WebUtilities/StatusCodes.cs | 2 +- src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs | 2 +- src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs | 2 +- .../EncoderServiceProviderExtensions.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs | 2 +- .../IJavaScriptStringEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs | 2 +- .../JavaScriptStringEncoder.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs | 2 +- .../UnicodeRanges.generated.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs | 2 +- .../EncoderServiceCollectionExtensions.cs | 2 +- src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderQuality.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderUtilities.cs | 2 +- src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/HttpParseResult.cs | 2 +- src/Microsoft.Net.Http.Headers/HttpRuleParser.cs | 2 +- src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs | 2 +- src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ObjectCollection.cs | 2 +- src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs | 2 +- .../StringWithQualityHeaderValueComparer.cs | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs | 2 +- .../InterfaceDictionaryTests.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 2 +- .../MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- .../Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs | 2 +- .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs | 2 +- .../SendFileResponseExtensionsTests.cs | 2 +- .../UseWithServicesTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs | 2 +- .../Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs | 2 +- .../AllowedCharsBitmapTests.cs | 2 +- .../CodePointFilterTests.cs | 2 +- .../Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs | 2 +- .../EncoderExtensionsTests.cs | 2 +- .../EncoderServiceCollectionExtensionsTests.cs | 2 +- .../EncoderServiceProviderExtensionsTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/Entities.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs | 2 +- .../JavaScriptStringEncoderTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs | 2 +- .../UnicodeEncoderBaseTests.cs | 2 +- .../UnicodeHelpersTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs | 2 +- .../Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs | 2 +- .../CacheControlHeaderValueTest.cs | 2 +- .../ContentDispositionHeaderValueTest.cs | 2 +- .../ContentRangeHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs | 2 +- .../EntityTagHeaderValueTest.cs | 2 +- .../MediaTypeHeaderValueComparerTests.cs | 2 +- .../MediaTypeHeaderValueTest.cs | 2 +- .../NameValueHeaderValueTest.cs | 2 +- .../RangeConditionHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs | 2 +- .../RangeItemHeaderValueTest.cs | 2 +- .../SetCookieHeaderValueTest.cs | 2 +- .../StringWithQualityHeaderValueComparerTest.cs | 2 +- .../StringWithQualityHeaderValueTest.cs | 2 +- 238 files changed, 238 insertions(+), 238 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index d85a1524ad..0bdc1962b6 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +Copyright (c) .NET Foundation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. You may obtain a copy of the diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 28e01101ff..7c4a0e0017 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 40e873e2e3..bc6bc2b2d6 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs index a6c5c2da9d..e4b26818d1 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs index 9488cd52c4..28060a24e2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs index 97ca3fe18e..0ee24024e5 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index f7b4342b59..331c4c8fe1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs index f6574163c7..ab17713ab0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs index 0587fde7ca..2d14071ebc 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs index 9dab37f844..d2785db947 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 3a53395fda..8885632152 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index 5e2d8891b7..569938516d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs index f3c85a1086..d0453902f4 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs index 30564a114b..e3ac00274f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs index ab0e2d3dbf..09024a11db 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs index 86967a2c70..dead7f4de8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index ad103c3d1e..b87b2797e3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs index 4be750be47..b5741c310e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 32b4ba6f52..3e5544407b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index 55fdb988ec..15af914718 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 14646bf069..0ad675693c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 5252c8649f..80caec4502 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 4721f9a4b4..a3317f873d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs index 1035c1aaaa..896a6a11b4 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index 79e11d5a5c..77fa4f20e1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 4ec7437877..3781736c58 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index a77a495d5e..e85ee75f7f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs index 56f1d5879d..236614815e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index e1304b5e5f..b10101cb3d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs index 8f18b618ba..589b758895 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs index 53b1d3da60..fb2528dc36 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs index 5dd3029c78..a446704d33 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index cff6e1d3c6..7bc00e6ab1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 48d68b292a..068782cdae 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs index b590996e17..c4c2f8d94e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs index cf7fd11f63..b1dd679ef0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index 358be0ad3a..e83402f101 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index db8eb01b76..69f94e984e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index 98550eb832..fa23ebeced 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index fb10af0bab..ac9e542575 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 3f4103ab83..94e1270c9d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 029ce3d4be..bad90b7cf8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs index 6a94e0f20c..fbdbd02e40 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index e271d41380..5223071dce 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index 6425c20dc2..9d98b85e6f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index e76a501d73..e5d6fa8cb8 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index e1b6bf8c04..30483c1325 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs index 38daa0a856..a8d8523310 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs index 04a7039a80..f026bcbbc4 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs index fb14959790..90733cc815 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index d5d74c3186..68ca854a2c 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index 27a7d2941b..55a7e32de3 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs index 1ce5e33dd0..806aa3588b 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs index bf3a370357..6a2b643b08 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index 0e85c3e60a..4a77d6f9c2 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs index bd7a6012a3..825ace8bed 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index 921e70700e..bd74d2f7ff 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs index c5b3ddceec..a8957def8b 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs index 0d6a0bd33a..9a68578ed1 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs index eb64b4bea9..fc59321032 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net.WebSockets; diff --git a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs index e7fe2c20f6..f9fd6027ac 100644 --- a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs index cc8e6cd886..8227616234 100644 --- a/src/Microsoft.AspNet.Http.Features/ISession.cs +++ b/src/Microsoft.AspNet.Http.Features/ISession.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs index ece1363017..a026a2446f 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs index 3173f44e3d..bc97c7d175 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs index fdac0526e2..751a046461 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; diff --git a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs index 111f6ec8fc..7115b2ef33 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs index 210ec0c2b0..9ee15c929f 100644 --- a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index 3a284eb52a..e400adae49 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index f4d086b63d..863974c0fb 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs index 0a56cf4eaf..087da8544d 100644 --- a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 37c93d8392..3f95a169ad 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs index fed0bb1b1c..a15e109093 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs index 2844d1c60d..df4175f312 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs index ffff7d724f..0cbe3e4ef3 100644 --- a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs index ead480bdf1..ac0e574af2 100644 --- a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; diff --git a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs index 4977d04e08..cc4fe12d27 100644 --- a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; diff --git a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs index 0610faa880..859a63b3ee 100644 --- a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs index 1636d4e739..d98decdb5a 100644 --- a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs index d2147c6c4b..c47095d3c5 100644 --- a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index feae42f1f4..b512c2a2eb 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 65365e98b8..cf9c3334c7 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 8f2a20e55c..319d88ff26 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 026ce3b2f1..34ed6004a3 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index c1845c66e5..2fa8272dbc 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/FormFeature.cs b/src/Microsoft.AspNet.Http/FormFeature.cs index a8c490100f..a32e192504 100644 --- a/src/Microsoft.AspNet.Http/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/FormFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/FormFile.cs b/src/Microsoft.AspNet.Http/FormFile.cs index 25e1081b2a..d02ed1a7a0 100644 --- a/src/Microsoft.AspNet.Http/FormFile.cs +++ b/src/Microsoft.AspNet.Http/FormFile.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs index 8f1a7c0123..a5364d2acd 100644 --- a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs index e17746cc7d..fcb4054d37 100644 --- a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs index f0b9c7faeb..26e19b3a99 100644 --- a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/IFormFeature.cs b/src/Microsoft.AspNet.Http/IFormFeature.cs index 0f8e97eb67..6b275ecf83 100644 --- a/src/Microsoft.AspNet.Http/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http/IFormFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Http/IItemsFeature.cs b/src/Microsoft.AspNet.Http/IItemsFeature.cs index 876580ef79..d37b2a9057 100644 --- a/src/Microsoft.AspNet.Http/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/IItemsFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/IQueryFeature.cs b/src/Microsoft.AspNet.Http/IQueryFeature.cs index 086e9f189b..7f6716f629 100644 --- a/src/Microsoft.AspNet.Http/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/IQueryFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs index 5ba34bb9a0..2b4f6b5eee 100644 --- a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs index b10b1c40c9..f2ef604430 100644 --- a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs index d2bb79b6c8..46b223c558 100644 --- a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs index 67c3aecb76..00a2065274 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http.Infrastructure diff --git a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs index cea473a4ef..835d2b95f7 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs index 549bf51777..c8a7c745db 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/ItemsFeature.cs b/src/Microsoft.AspNet.Http/ItemsFeature.cs index bb9d94ae15..5d278c2291 100644 --- a/src/Microsoft.AspNet.Http/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/ItemsFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http/QueryFeature.cs b/src/Microsoft.AspNet.Http/QueryFeature.cs index 34643cf128..faf7612480 100644 --- a/src/Microsoft.AspNet.Http/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/QueryFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 5030e59ef3..7d78b72847 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs index eb5e95ec79..9796357057 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs index 651beded8d..38d7cfa615 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs index 8a8c4b1551..95f22d90cc 100644 --- a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs index bf22639161..220c015540 100644 --- a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; diff --git a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs index 53e61267e0..f5eabc9992 100644 --- a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 98ed1c42bd..47761c96c2 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Owin diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index f35bedcd34..e664c9f080 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs index 1675852e5f..9fae247f6b 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index cfb647d88a..3ade1d3d1c 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 0c270bfc3a..823e98bbea 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index ba3a4d4180..fd3c69033f 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 50448cd560..2cb8b74c8d 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 45cacf76ab..fd77da5841 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs index d77fd57295..bdaeef8eda 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 71efc5490b..d175e49fa5 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 9577785639..8102528ae4 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 2ffc33ad46..0b3ec59363 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 26fba82548..b6df361dc4 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index dd11b0cff2..0f9900432c 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index 286f2a8a6f..9fb4b2b61f 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index d9966ffd48..244117e34c 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index bb8e07c25e..02d99a33d4 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index b35bcfee2a..5618b826fb 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 8266dc4fb5..95750a3753 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs index 487437d6a3..93270c5fb2 100644 --- a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs index 959d9593d9..70d515f264 100644 --- a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs +++ b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.WebUtilities diff --git a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs index c5a2432db6..a865976274 100644 --- a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs +++ b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index de801b29d4..bef8b5463a 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs index 3ad3312ae9..5d396a473a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs index da5991e7e2..a5d5b21c3a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs index 5bb405240a..3ec108fff2 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs index e8ed2cdcf1..df01877f6d 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs index c9f57a59a9..7d2b81a8fe 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs b/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs index e4b512d1a5..a2a350b9a9 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs index b176b66346..68b492f55a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs index 1a4fc58774..f39c3580f8 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs index 4a24158263..16e4ff5f05 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs index 99f011ff9a..e88aafce79 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs index 2b4a8cbd57..9b38b6a65e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs index 189d9ac08f..71e8a68246 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs index 694179e207..c09b9bdbba 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs index 6a382b8a4d..1588ec0e19 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs index 2aa3dac0e0..61367e2d03 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs index 04474ef759..78a3c41a2f 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs index ccfac4b876..60ed2c5311 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs index d5aced410b..6a3c5ebabf 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index d347345303..0e0de56c7a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs b/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs index a172ca954c..0e06693f3c 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 3d0851e9d4..7b855f6038 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs index 679394e42d..dbd18b82d6 100644 --- a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index 1de23f206f..48dfc913a9 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index 8a96da2efd..b6b1aabe8c 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index 53fd996b9f..634278e3a9 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs index 3c2e9635f3..2143f299b0 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Diagnostics.Contracts; diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index a7911d164f..11c5500a31 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs index af10ff345e..4cc5c38dfa 100644 --- a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs index 5796d89fae..669ec464de 100644 --- a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.Framework.Internal; diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index d7f83090b8..7f6432c363 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/HeaderQuality.cs b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs index c5247e1aca..da86450726 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderQuality.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index aaf2d57470..d344d992aa 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs index af19f3421c..2c05296a98 100644 --- a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/HttpParseResult.cs b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs index 76713cf1cc..709ae0ce84 100644 --- a/src/Microsoft.Net.Http.Headers/HttpParseResult.cs +++ b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 66f6361da7..188ffe1389 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 1fa7535452..4113f44598 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs index 0125b2dbc4..a64b12e6b0 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index fc943f7822..668a4ccef4 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index f6746df140..6ec2883d3b 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs index 65f976a21c..189d775d61 100644 --- a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs index 3045a8b387..445752a13d 100644 --- a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index 21c46f004c..f4893ba5dc 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 568f204fa7..b470471e4e 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index 41cacc9380..e845c84fe8 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 982a97b131..37873c476c 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs index c82223ad06..fca3041bb8 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index 9309814aa7..27d2f565a2 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index 604b34761c..898c5f8fe7 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs index e064589fdc..217833d5af 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs index 2388da9973..51224bc8ef 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index a54a89d09e..aa0a6d5ac7 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 29b6eac3ff..d0cd1eacb3 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs index 720b3b0814..245ce693e2 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Testing; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index 4495cbb364..c96508a4ea 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs index 2f52599c83..4ff9cb103f 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index 07b6ed7163..c123db4b09 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. See License.txt in the project root for license information. using System; using System.Threading; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 0fa5e071cc..c6fd4207ca 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 21c1bd640d..7c28c99174 100644 --- a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs index 7f35d274db..a618da3cfb 100644 --- a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index ea887b711b..ea8699ee43 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 69c0ea85e8..9ddb91d9d5 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 270c364301..e26a4f0222 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 02082c9ec3..1e40ae0e8a 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 4a53e6205b..74b7cd37b0 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 68f7d7a103..95c1d7fd81 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index f86ce513dc..eb05bd0dc5 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs index 2dd618cdf1..397d279b5e 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index e90c78305a..807e99f6ac 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs index 9813a780c3..efc17118fc 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs index e26046b239..faf6d4c982 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs index d8de51865d..64e517a6f0 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs index 5e3e9f3817..debec372ac 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs index 8c5cfd83ac..5b7797340f 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index b8ddbef391..f45951277e 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index 3a6b144b29..9d44a41697 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs index e46df90876..e10ff951b0 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs index 4c9ec94198..14d0f21e9d 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs index ee0c3231d9..471ea4f385 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs index dbb9f91e68..4acee36980 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs index b8c36b57ad..e7bf1f49a6 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index 07944d7c35..e6661686c0 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 4d34a40e96..7504d52125 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs index cb3197ae71..fd64048673 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs index ac9e55bdac..c56b57feb8 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs index 0d37e4f934..54ad81839e 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs index 0ac0fe3d2c..51e8ce5f58 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index da906e8171..02e233a53d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs index d479f4d46f..d8abdbdbf6 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs index 9a25389a50..f649cce09e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs index 61479e9adf..0fffc0c134 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs index d94ce6409f..303b910fcb 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs index 8ef17a55aa..44d723cd9e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 140d629497..5c73d9b607 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index 3ae04a9212..3d342dea9b 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs index 14a65efdd2..1f69a9605e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs index 22dc5dc749..92a1d72521 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs index 573ae8964e..b8818752ac 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index ee3e12292b..e21fb4e089 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs index df4e729493..8cda48eef3 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs index 0a57c61958..ceb29fed10 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; From 568d0d91063e86ae19a92bdd098d6fffe7d0c071 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 30 Apr 2015 15:18:24 -0700 Subject: [PATCH 313/846] #275 Reduce UriHelper to static methods. --- .../ResponseHeaders.cs | 6 +- .../UriHelper.cs | 135 +++++++----------- 2 files changed, 51 insertions(+), 90 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 94e1270c9d..8b8607a2b7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -126,20 +126,20 @@ namespace Microsoft.AspNet.Http.Headers } } - public UriHelper Location + public Uri Location { get { Uri uri; if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) { - return new UriHelper(uri); + return uri; } return null; } set { - Headers.Set(HeaderNames.Location, value); + Headers.Set(HeaderNames.Location, value == null ? null : UriHelper.Encode(value)); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 5223071dce..33f589cb44 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -8,107 +8,68 @@ namespace Microsoft.AspNet.Http.Extensions /// /// A helper class for constructing encoded Uris for use in headers and other Uris. /// - public class UriHelper + public static class UriHelper { - public UriHelper() - { - } - - public UriHelper(HttpRequest request) - { - Scheme = request.Scheme; - Host = request.Host; - PathBase = request.PathBase; - Path = request.Path; - Query = request.QueryString; - // Fragment is not a valid request field. - } - - public UriHelper(Uri uri) - { - Scheme = uri.Scheme; - Host = HostString.FromUriComponent(uri); - // Assume nothing is being put in PathBase - Path = PathString.FromUriComponent(uri); - Query = QueryString.FromUriComponent(uri); - Fragment = FragmentString.FromUriComponent(uri); - } - - public string Scheme { get; set; } - - public HostString Host { get; set; } - - public PathString PathBase { get; set; } - - public PathString Path { get; set; } - - public QueryString Query { get; set; } - - public FragmentString Fragment { get; set; } - - public bool IsFullUri - { - get { return !string.IsNullOrEmpty(Scheme) && Host.HasValue; } - } - - // Always returns at least '/' - public string GetPartialUri() - { - string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; - return path + Query + Fragment; - } - - // Always returns at least 'scheme://host/' - public string GetFullUri() - { - if (string.IsNullOrEmpty(Scheme)) - { - throw new InvalidOperationException("Missing Scheme"); - } - if (!Host.HasValue) - { - throw new InvalidOperationException("Missing Host"); - } - - string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; - return Scheme + "://" + Host + path + Query + Fragment; - } - - public override string ToString() - { - return IsFullUri ? GetFullUri() : GetPartialUri(); - } - - public static string Create(PathString pathBase, + /// + /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. + /// + /// + /// + /// + /// + /// + public static string Encode(PathString pathBase = new PathString(), PathString path = new PathString(), QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { - return new UriHelper() - { - PathBase = pathBase, - Path = path, - Query = query, - Fragment = fragment - }.GetPartialUri(); + string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; + return combinePath + query + fragment; } - public static string Create(string scheme, + /// + /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. + /// Note that unicode in the HostString will be encoded as punycode. + /// + /// + /// + /// + /// + /// + /// + /// + public static string Encode(string scheme, HostString host, PathString pathBase = new PathString(), PathString path = new PathString(), QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { - return new UriHelper() + string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; + return scheme + "://" + host + combinePath + query + fragment; + } + + /// + /// Generates a string from the given absolute or relative Uri that is appropriately encoded for use in + /// HTTP headers. Note that a unicode host name will be encoded as punycode. + /// + /// + /// + public static string Encode(Uri uri) + { + if (uri.IsAbsoluteUri) { - Scheme = scheme, - Host = host, - PathBase = pathBase, - Path = path, - Query = query, - Fragment = fragment - }.GetFullUri(); + return Encode( + scheme: uri.Scheme, + host: HostString.FromUriComponent(uri), + pathBase: PathString.FromUriComponent(uri), + query: QueryString.FromUriComponent(uri), + fragment: FragmentString.FromUriComponent(uri)); + } + else + { + return uri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped); + } } } } \ No newline at end of file From c9c09fb4e51ad193db2c510e4feb80b03194bf3d Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 6 May 2015 10:55:20 -0700 Subject: [PATCH 314/846] #269 Clean up QueryString APIs, add tests. --- .../QueryString.cs | 78 ++++++++++-- .../QueryStringTests.cs | 111 ++++++++++++++++++ 2 files changed, 179 insertions(+), 10 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 068782cdae..6d156bc7ee 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Text; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; @@ -33,16 +35,6 @@ namespace Microsoft.AspNet.Http _value = value; } - /// - /// Initialize a query string with a single given parameter name and value. - /// - /// The un-encoded parameter name - /// The un-encoded parameter value - public QueryString(string name, string value) - { - _value = "?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value); - } - /// /// The escaped query string with the leading '?' character /// @@ -114,6 +106,67 @@ namespace Microsoft.AspNet.Http return new QueryString(queryValue); } + /// + /// Create a query string with a single given parameter name and value. + /// + /// The un-encoded parameter name + /// The un-encoded parameter value + public static QueryString Create(string name, string value) + { + return new QueryString("?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value)); + } + + /// + /// Creates a query string composed from the given name value pairs. + /// + /// + /// + public static QueryString Create(IEnumerable> parameters) + { + var builder = new StringBuilder(); + bool first = true; + foreach (var pair in parameters) + { + builder.Append(first ? "?" : "&"); + first = false; + builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append("="); + builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); + } + + return new QueryString(builder.ToString()); + } + + public QueryString Add(QueryString other) + { + if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) + { + return other; + } + if (!other.HasValue || other.Value.Equals("?", StringComparison.Ordinal)) + { + return this; + } + + // ?name1=value1 Add ?name2=value2 returns ?name1=value1&name2=value2 + return new QueryString(_value + "&" + other.Value.Substring(1)); + } + + public QueryString Add(string name, string value) + { + if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) + { + return Create(name, value); + } + + var builder = new StringBuilder(Value); + builder.Append("&"); + builder.Append(UrlEncoder.Default.UrlEncode(name)); + builder.Append("="); + builder.Append(UrlEncoder.Default.UrlEncode(value)); + return new QueryString(builder.ToString()); + } + public bool Equals(QueryString other) { return string.Equals(_value, other._value); @@ -142,5 +195,10 @@ namespace Microsoft.AspNet.Http { return !left.Equals(right); } + + public static QueryString operator +(QueryString left, QueryString right) + { + return left.Add(right); + } } } diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs new file mode 100644 index 0000000000..f36b8eeefc --- /dev/null +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs @@ -0,0 +1,111 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNet.Testing; +using Xunit; + +namespace Microsoft.AspNet.Http.Abstractions +{ + public class QueryStringTests + { + [Fact] + public void CtorThrows_IfQueryDoesNotHaveLeadingQuestionMark() + { + // Act and Assert + ExceptionAssert.ThrowsArgument(() => new QueryString("hello"), "value", "The leading '?' must be included for a non-empty query."); + } + + [Fact] + public void CtorNullOrEmpty_Success() + { + var query = new QueryString(); + Assert.False(query.HasValue); + Assert.Null(query.Value); + + query = new QueryString(null); + Assert.False(query.HasValue); + Assert.Null(query.Value); + + query = new QueryString(string.Empty); + Assert.False(query.HasValue); + Assert.Equal(string.Empty, query.Value); + } + + [Fact] + public void CtorJustAQuestionMark_Success() + { + var query = new QueryString("?"); + Assert.True(query.HasValue); + Assert.Equal("?", query.Value); + } + + [Fact] + public void ToString_EncodesHash() + { + var query = new QueryString("?Hello=Wor#ld"); + Assert.Equal("?Hello=Wor%23ld", query.ToString()); + } + + [Theory] + [InlineData("name", "value", "?name=value")] + [InlineData("na me", "val ue", "?na%20me=val%20ue")] + [InlineData("name", "", "?name=")] + [InlineData("", "value", "?=value")] + [InlineData("", "", "?=")] + [InlineData(null, null, "?=")] + public void CreateNameValue_Success(string name, string value, string exepcted) + { + var query = QueryString.Create(name, value); + Assert.Equal(exepcted, query.Value); + } + + [Fact] + public void CreateFromList_Success() + { + var query = QueryString.Create(new[] + { + new KeyValuePair("key1", "value1"), + new KeyValuePair("key2", "value2"), + new KeyValuePair("key3", "value3"), + }); + Assert.Equal("?key1=value1&key2=value2&key3=value3", query.Value); + } + + [Theory] + [InlineData(null, null, null)] + [InlineData("", "", "")] + [InlineData(null, "?name2=value2", "?name2=value2")] + [InlineData("", "?name2=value2", "?name2=value2")] + [InlineData("?", "?name2=value2", "?name2=value2")] + [InlineData("?name1=value1", null, "?name1=value1")] + [InlineData("?name1=value1", "", "?name1=value1")] + [InlineData("?name1=value1", "?", "?name1=value1")] + [InlineData("?name1=value1", "?name2=value2", "?name1=value1&name2=value2")] + public void AddQueryString_Success(string query1, string query2, string expected) + { + var q1 = new QueryString(query1); + var q2 = new QueryString(query2); + Assert.Equal(expected, q1.Add(q2).Value); + Assert.Equal(expected, (q1 + q2).Value); + } + + [Theory] + [InlineData(null, null, null, "?=")] + [InlineData("", "", "", "?=")] + [InlineData("?", "", "", "?=")] + [InlineData("?", "name2", "value2", "?name2=value2")] + [InlineData("?name1=value1", "name2", "value2", "?name1=value1&name2=value2")] + [InlineData("?name1=value1", "na me2", "val ue2", "?name1=value1&na%20me2=val%20ue2")] + [InlineData("?name1=value1", "", "", "?name1=value1&=")] + public void AddNameValue_Success(string query1, string name2, string value2, string expected) + { + var q1 = new QueryString(query1); + var q2 = q1.Add(name2, value2); + Assert.Equal(expected, q2.Value); + } + } +} From f7f4d490aa8ddb51ebd5abe6164ea9f797a9a231 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 7 May 2015 09:37:58 -0700 Subject: [PATCH 315/846] React to common package name change --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http.Features/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- src/Microsoft.Framework.WebEncoders.Core/project.json | 2 +- src/Microsoft.Framework.WebEncoders/project.json | 2 +- src/Microsoft.Net.Http.Headers/project.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 1d28c1258f..e744e62052 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": {}, diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 4f562544c9..a70ce73541 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1c0b74dcab..fde16b0159 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,7 +5,7 @@ "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index d4d113923c..9a441ab4dc 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 0188f4ff3d..3334f37142 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,7 @@ "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 2fa0fca43b..5363dfdbdd 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index d47cde29be..b3fb9c1ef6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index 5b43df9eb3..dc8f3406f5 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -5,7 +5,7 @@ "allowUnsafe": true }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "net45": { }, diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index e39ec75adc..37e882873a 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 07da653d6f..15f82024e2 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,7 +1,7 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks" : { "net45" : { }, From 550b2252ea4f5d44844f6988db05c1aaeed86b35 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 6 May 2015 15:31:16 -0700 Subject: [PATCH 316/846] #265 Remove Use extensions that take services. --- .../Extensions/UseExtensions.cs | 120 --------------- .../UseWithServicesTests.cs | 138 ------------------ 2 files changed, 258 deletions(-) delete mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs index b5741c310e..1a14048128 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs @@ -26,125 +26,5 @@ namespace Microsoft.AspNet.Builder }; }); } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider)); - }); - } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider)); - }); - } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// Per-request service required by middleware - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider)); - }); - } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// Per-request service required by middleware - /// Per-request service required by middleware - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, TService4, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider)); - }); - } - - private static TService GetRequiredService(IServiceProvider serviceProvider) - { - var service = (TService)serviceProvider.GetService(typeof(TService)); - - if (service == null) - { - throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", typeof(TService))); - } - - return service; - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs deleted file mode 100644 index c6fd4207ca..0000000000 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; -using Xunit; - -namespace Microsoft.AspNet.Http.Extensions.Tests -{ - public class UseWithServicesTests - { - [Fact] - public async Task CallingUseThatAlsoTakesServices() - { - var builder = new ApplicationBuilder(new ServiceCollection() - .AddScoped() - .BuildServiceProvider()); - - ITestService theService = null; - builder.Use(async (ctx, next, testService) => - { - theService = testService; - await next(); - }); - - var app = builder.Build(); - await app(new DefaultHttpContext()); - - Assert.IsType(theService); - } - - [Fact] - public async Task ServicesArePerRequest() - { - var services = new ServiceCollection() - .AddScoped() - .BuildServiceProvider(); - var builder = new ApplicationBuilder(services); - - builder.Use(async (ctx, next) => - { - var serviceScopeFactory = services.GetRequiredService(); - using (var serviceScope = serviceScopeFactory.CreateScope()) - { - var priorApplicationServices = ctx.ApplicationServices; - var priorRequestServices = ctx.ApplicationServices; - ctx.ApplicationServices = services; - ctx.RequestServices = serviceScope.ServiceProvider; - try - { - await next(); - } - finally - { - ctx.ApplicationServices = priorApplicationServices; - ctx.RequestServices = priorRequestServices; - } - } - }); - - var testServicesA = new List(); - builder.Use(async (HttpContext ctx, Func next, ITestService testService) => - { - testServicesA.Add(testService); - await next(); - }); - - var testServicesB = new List(); - builder.Use(async (ctx, next, testService) => - { - testServicesB.Add(testService); - await next(); - }); - - var app = builder.Build(); - await app(new DefaultHttpContext()); - await app(new DefaultHttpContext()); - - Assert.Equal(2, testServicesA.Count); - Assert.IsType(testServicesA[0]); - Assert.IsType(testServicesA[1]); - - Assert.Equal(2, testServicesB.Count); - Assert.IsType(testServicesB[0]); - Assert.IsType(testServicesB[1]); - - Assert.Same(testServicesA[0], testServicesB[0]); - Assert.Same(testServicesA[1], testServicesB[1]); - - Assert.NotSame(testServicesA[0], testServicesA[1]); - Assert.NotSame(testServicesB[0], testServicesB[1]); - } - - [Fact] - public async Task InvokeMethodWillAllowPerRequestServices() - { - var services = new ServiceCollection() - .AddScoped() - .BuildServiceProvider(); - var builder = new ApplicationBuilder(services); - builder.UseMiddleware(); - var app = builder.Build(); - - var ctx1 = new DefaultHttpContext(); - await app(ctx1); - - var testService = ctx1.Items[typeof(ITestService)]; - Assert.IsType(testService); - } - } - - public interface ITestService - { - } - - public class TestService : ITestService - { - } - - public class TestMiddleware - { - RequestDelegate _next; - - public TestMiddleware(RequestDelegate next) - { - _next = next; - } - - public Task Invoke(HttpContext context, ITestService testService) - { - context.Items[typeof(ITestService)] = testService; - return Task.FromResult(0); - } - } -} \ No newline at end of file From eb0fe6a92ada31440e6db44d23b64f4d3d7240c0 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 6 May 2015 16:24:50 -0700 Subject: [PATCH 317/846] #281 Reorganise files, namespaces for internal and features. --- .../FeatureReference.cs | 6 ++---- .../{ => Extensions}/HttpResponseWritingExtensions.cs | 0 .../IFormCollection.cs | 2 -- .../SendFileResponseExtensions.cs | 1 + .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/IAuthenticationHandler.cs | 2 +- .../Authentication/IHttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- .../IHttpBufferingFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- .../IHttpSendFileFeature.cs | 2 +- .../IHttpUpgradeFeature.cs | 2 +- .../IHttpWebSocketFeature.cs | 2 +- .../IRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISession.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFactory.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFeature.cs | 2 +- .../ITlsConnectionFeature.cs | 2 +- .../ITlsTokenBindingFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 4 ++-- .../Authentication/DefaultAuthenticationManager.cs | 6 ++++-- src/Microsoft.AspNet.Http/BufferingHelper.cs | 2 +- .../{Infrastructure => }/Constants.cs | 2 +- src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 5 +++-- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 9 ++++++--- src/Microsoft.AspNet.Http/DefaultHttpRequest.cs | 6 +++--- src/Microsoft.AspNet.Http/DefaultHttpResponse.cs | 6 +++--- src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs | 4 ++-- .../Authentication/HttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.Http/{ => Features}/FormFeature.cs | 4 ++-- src/Microsoft.AspNet.Http/{ => Features}/FormFile.cs | 3 ++- .../{ => Features}/HttpConnectionFeature.cs | 2 +- .../{ => Features}/HttpRequestFeature.cs | 2 +- .../{ => Features}/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http/{ => Features}/IFormFeature.cs | 2 +- .../{ => Features}/IItemsFeature.cs | 2 +- .../{ => Features}/IQueryFeature.cs | 2 +- .../{ => Features}/IRequestCookiesFeature.cs | 2 +- .../{ => Features}/IResponseCookiesFeature.cs | 2 +- .../{ => Features}/IServiceProvidersFeature.cs | 2 +- src/Microsoft.AspNet.Http/{ => Features}/ItemsFeature.cs | 3 ++- src/Microsoft.AspNet.Http/{ => Features}/QueryFeature.cs | 5 ++--- .../{ => Features}/RequestCookiesFeature.cs | 5 ++--- .../{ => Features}/ResponseCookiesFeature.cs | 5 ++--- .../{ => Features}/ServiceProvidersFeature.cs | 2 +- .../{ => Features}/TlsConnectionFeature.cs | 2 +- .../{Collections => }/FormCollection.cs | 2 +- .../{Collections => }/FormFileCollection.cs | 2 +- .../{Collections => }/HeaderDictionary.cs | 4 ++-- .../{Collections => }/ItemsDictionary.cs | 2 +- .../{Infrastructure => }/ParsingHelpers.cs | 2 +- .../{Collections => }/ReadableStringCollection.cs | 2 +- src/Microsoft.AspNet.Http/ReferenceReadStream.cs | 2 +- .../{Collections => }/RequestCookiesCollection.cs | 2 +- .../{Collections => }/ResponseCookies.cs | 2 +- .../{Collections => }/SessionCollection.cs | 3 ++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +++- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 ++ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 6 +++--- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 1 + .../MapPathMiddlewareTests.cs | 2 ++ .../MapPredicateMiddlewareTests.cs | 2 ++ .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../SendFileResponseExtensionsTests.cs | 2 ++ .../ApplicationBuilderTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs | 2 +- .../DefaultHttpContextTests.cs | 5 +++-- .../DefaultHttpRequestTests.cs | 3 ++- test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs | 4 ++-- .../Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs | 3 +-- test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 1 + .../OwinFeatureCollectionTests.cs | 2 +- 83 files changed, 118 insertions(+), 102 deletions(-) rename src/{Microsoft.AspNet.Http/Infrastructure => Microsoft.AspNet.FeatureModel}/FeatureReference.cs (90%) rename src/Microsoft.AspNet.Http.Abstractions/{ => Extensions}/HttpResponseWritingExtensions.cs (100%) rename src/Microsoft.AspNet.Http/{Infrastructure => }/Constants.cs (91%) rename src/Microsoft.AspNet.Http/{ => Features}/Authentication/HttpAuthenticationFeature.cs (89%) rename src/Microsoft.AspNet.Http/{ => Features}/FormFeature.cs (98%) rename src/Microsoft.AspNet.Http/{ => Features}/FormFile.cs (93%) rename src/Microsoft.AspNet.Http/{ => Features}/HttpConnectionFeature.cs (91%) rename src/Microsoft.AspNet.Http/{ => Features}/HttpRequestFeature.cs (95%) rename src/Microsoft.AspNet.Http/{ => Features}/HttpResponseFeature.cs (95%) rename src/Microsoft.AspNet.Http/{ => Features}/IFormFeature.cs (95%) rename src/Microsoft.AspNet.Http/{ => Features}/IItemsFeature.cs (85%) rename src/Microsoft.AspNet.Http/{ => Features}/IQueryFeature.cs (84%) rename src/Microsoft.AspNet.Http/{ => Features}/IRequestCookiesFeature.cs (84%) rename src/Microsoft.AspNet.Http/{ => Features}/IResponseCookiesFeature.cs (84%) rename src/Microsoft.AspNet.Http/{ => Features}/IServiceProvidersFeature.cs (87%) rename src/Microsoft.AspNet.Http/{ => Features}/ItemsFeature.cs (82%) rename src/Microsoft.AspNet.Http/{ => Features}/QueryFeature.cs (93%) rename src/Microsoft.AspNet.Http/{ => Features}/RequestCookiesFeature.cs (94%) rename src/Microsoft.AspNet.Http/{ => Features}/ResponseCookiesFeature.cs (89%) rename src/Microsoft.AspNet.Http/{ => Features}/ServiceProvidersFeature.cs (88%) rename src/Microsoft.AspNet.Http/{ => Features}/TlsConnectionFeature.cs (92%) rename src/Microsoft.AspNet.Http/{Collections => }/FormCollection.cs (94%) rename src/Microsoft.AspNet.Http/{Collections => }/FormFileCollection.cs (96%) rename src/Microsoft.AspNet.Http/{Collections => }/HeaderDictionary.cs (99%) rename src/Microsoft.AspNet.Http/{Collections => }/ItemsDictionary.cs (98%) rename src/Microsoft.AspNet.Http/{Infrastructure => }/ParsingHelpers.cs (99%) rename src/Microsoft.AspNet.Http/{Collections => }/ReadableStringCollection.cs (98%) rename src/Microsoft.AspNet.Http/{Collections => }/RequestCookiesCollection.cs (98%) rename src/Microsoft.AspNet.Http/{Collections => }/ResponseCookies.cs (99%) rename src/Microsoft.AspNet.Http/{Collections => }/SessionCollection.cs (95%) diff --git a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs similarity index 90% rename from src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs rename to src/Microsoft.AspNet.FeatureModel/FeatureReference.cs index 835d2b95f7..fba03637be 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs @@ -1,11 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; - -namespace Microsoft.AspNet.Http.Infrastructure +namespace Microsoft.AspNet.FeatureModel { - internal struct FeatureReference + public struct FeatureReference { private T _feature; private int _revision; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 3781736c58..68505962c2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -1,8 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; - namespace Microsoft.AspNet.Http { /// diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index bad90b7cf8..3c5f183c53 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNet.Http.Features; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index e5d6fa8cb8..a259ce8489 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class AuthenticateContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index 30483c1325..592086e83c 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class ChallengeContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs index a8d8523310..251d9dfb8c 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class DescribeSchemesContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs index f026bcbbc4..9f551b8bdd 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public interface IAuthenticationHandler { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs index 90733cc815..0c76210a26 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index 68ca854a2c..0eade92638 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class SignInContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index 55a7e32de3..d260afea84 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class SignOutContext { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs index 806aa3588b..947e77782b 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpBufferingFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs index 6a2b643b08..ef76d69815 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index 4a77d6f9c2..c80ca29b5f 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs index 825ace8bed..b30704650e 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index bd74d2f7ff..e93a9d1c03 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs index a8957def8b..328d901903 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpSendFileFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs index 9a68578ed1..77d4ffa501 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs @@ -4,7 +4,7 @@ using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpUpgradeFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs index fc59321032..674161abc1 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs @@ -4,7 +4,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpWebSocketFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs index f9fd6027ac..b34afe8f96 100644 --- a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { /// /// Feature to identify a request. diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs index 8227616234..ba80fc7324 100644 --- a/src/Microsoft.AspNet.Http.Features/ISession.cs +++ b/src/Microsoft.AspNet.Http.Features/ISession.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface ISession { diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs index a026a2446f..441f96eeb5 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface ISessionFactory { diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs index bc97c7d175..bd3a66883e 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { // TODO: Is there any reason not to flatten the Factory down into the Feature? public interface ISessionFeature diff --git a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs index 751a046461..f5d786f8b4 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface ITlsConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs index 7115b2ef33..7b8535eb72 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { /// /// Provides information regarding TLS token binding parameters. diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs index 9ee15c929f..df11f93766 100644 --- a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public class WebSocketAcceptContext { diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index e400adae49..80041077c3 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNet.Builder.Internal { public class ApplicationBuilder : IApplicationBuilder { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 863974c0fb..9f534a6ada 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -7,10 +7,12 @@ using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager { diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 3f95a169ad..3335203e29 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -6,7 +6,7 @@ using System.IO; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public static class BufferingHelper { diff --git a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http/Constants.cs similarity index 91% rename from src/Microsoft.AspNet.Http/Infrastructure/Constants.cs rename to src/Microsoft.AspNet.Http/Constants.cs index 00a2065274..376bb55abd 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.Http/Constants.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Infrastructure +namespace Microsoft.AspNet.Http.Internal { internal static class Constants { diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index b512c2a2eb..5237739aa9 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -6,9 +6,10 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultConnectionInfo : ConnectionInfo { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index cf9c3334c7..4c0174e5b1 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -7,10 +7,13 @@ using System.Security.Claims; using System.Threading; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Authentication.Internal; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNet.Http.Features.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContext : HttpContext { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 319d88ff26..f06e2d396e 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -6,11 +6,11 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 34ed6004a3..d264ff97a3 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -4,11 +4,11 @@ using System; using System.IO; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 2fa8272dbc..c329ffe05e 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -6,10 +6,10 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { diff --git a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs similarity index 89% rename from src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs index 087da8544d..92713e1c87 100644 --- a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication.Internal { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs similarity index 98% rename from src/Microsoft.AspNet.Http/FormFeature.cs rename to src/Microsoft.AspNet.Http/Features/FormFeature.cs index a32e192504..593cd274c4 100644 --- a/src/Microsoft.AspNet.Http/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -7,12 +7,12 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNet.Http/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs similarity index 93% rename from src/Microsoft.AspNet.Http/FormFile.cs rename to src/Microsoft.AspNet.Http/Features/FormFile.cs index d02ed1a7a0..557dc9d518 100644 --- a/src/Microsoft.AspNet.Http/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs similarity index 91% rename from src/Microsoft.AspNet.Http/HttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs index a5364d2acd..9f826d18c0 100644 --- a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class HttpConnectionFeature : IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs similarity index 95% rename from src/Microsoft.AspNet.Http/HttpRequestFeature.cs rename to src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index fcb4054d37..bce7570916 100644 --- a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class HttpRequestFeature : IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs similarity index 95% rename from src/Microsoft.AspNet.Http/HttpResponseFeature.cs rename to src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 26e19b3a99..500f8e6e5b 100644 --- a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class HttpResponseFeature : IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http/IFormFeature.cs b/src/Microsoft.AspNet.Http/Features/IFormFeature.cs similarity index 95% rename from src/Microsoft.AspNet.Http/IFormFeature.cs rename to src/Microsoft.AspNet.Http/Features/IFormFeature.cs index 6b275ecf83..095c14a9e4 100644 --- a/src/Microsoft.AspNet.Http/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IFormFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IFormFeature { diff --git a/src/Microsoft.AspNet.Http/IItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs similarity index 85% rename from src/Microsoft.AspNet.Http/IItemsFeature.cs rename to src/Microsoft.AspNet.Http/Features/IItemsFeature.cs index d37b2a9057..96b2ce78fe 100644 --- a/src/Microsoft.AspNet.Http/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IItemsFeature { diff --git a/src/Microsoft.AspNet.Http/IQueryFeature.cs b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs similarity index 84% rename from src/Microsoft.AspNet.Http/IQueryFeature.cs rename to src/Microsoft.AspNet.Http/Features/IQueryFeature.cs index 7f6716f629..a1143fb8cd 100644 --- a/src/Microsoft.AspNet.Http/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IQueryFeature { diff --git a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs similarity index 84% rename from src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs index 2b4f6b5eee..6b2f7c742e 100644 --- a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs similarity index 84% rename from src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs index f2ef604430..2d47300b79 100644 --- a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs similarity index 87% rename from src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs index 46b223c558..b5d192c503 100644 --- a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http/ItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs similarity index 82% rename from src/Microsoft.AspNet.Http/ItemsFeature.cs rename to src/Microsoft.AspNet.Http/Features/ItemsFeature.cs index 5d278c2291..fc839357a7 100644 --- a/src/Microsoft.AspNet.Http/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNet.Http/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs similarity index 93% rename from src/Microsoft.AspNet.Http/QueryFeature.cs rename to src/Microsoft.AspNet.Http/Features/QueryFeature.cs index faf7612480..9fb2bd4a4b 100644 --- a/src/Microsoft.AspNet.Http/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -3,12 +3,11 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http/RequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 9796357057..eed8fc2d95 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -5,12 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs similarity index 89% rename from src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index 38d7cfa615..410fce7a25 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs similarity index 88% rename from src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs index 95f22d90cc..d9082df7a2 100644 --- a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs b/src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs similarity index 92% rename from src/Microsoft.AspNet.Http/TlsConnectionFeature.cs rename to src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs index 220c015540..9c7d75f483 100644 --- a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class TlsConnectionFeature : ITlsConnectionFeature { diff --git a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs similarity index 94% rename from src/Microsoft.AspNet.Http/Collections/FormCollection.cs rename to src/Microsoft.AspNet.Http/FormCollection.cs index a15e109093..ad829cd70c 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http/FormFileCollection.cs similarity index 96% rename from src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs rename to src/Microsoft.AspNet.Http/FormFileCollection.cs index df4175f312..bd624df355 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/FormFileCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs rename to src/Microsoft.AspNet.Http/HeaderDictionary.cs index 0cbe3e4ef3..04c2d556bd 100644 --- a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -5,10 +5,10 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. diff --git a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/ItemsDictionary.cs similarity index 98% rename from src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs rename to src/Microsoft.AspNet.Http/ItemsDictionary.cs index ac0e574af2..e191516849 100644 --- a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http/ParsingHelpers.cs index c8a7c745db..45ac370eb4 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Infrastructure +namespace Microsoft.AspNet.Http.Internal { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.Http/ReadableStringCollection.cs index cc4fe12d27..7a07ea603c 100644 --- a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -5,7 +5,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 7d78b72847..6fa2c34f04 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -7,7 +7,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.Http/RequestCookiesCollection.cs index 859a63b3ee..1dc603b518 100644 --- a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs rename to src/Microsoft.AspNet.Http/ResponseCookies.cs index d98decdb5a..b47b48d505 100644 --- a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -8,7 +8,7 @@ using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http/SessionCollection.cs similarity index 95% rename from src/Microsoft.AspNet.Http/Collections/SessionCollection.cs rename to src/Microsoft.AspNet.Http/SessionCollection.cs index c47095d3c5..8123e2fb0b 100644 --- a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http/SessionCollection.cs @@ -4,8 +4,9 @@ using System; using System.Collections; using System.Collections.Generic; +using Microsoft.AspNet.Http.Features; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { public class SessionCollection : ISessionCollection { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index e664c9f080..96102f6bf4 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,7 +14,9 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 3ade1d3d1c..93b487006e 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 823e98bbea..7aee9b3c78 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -15,12 +15,12 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Owin { - using Microsoft.Framework.Internal; using SendFileFunc = Func; public class OwinFeatureCollection : diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 2cb8b74c8d..a36e9377f3 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index fd77da5841..9bdaa91588 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index d175e49fa5..2da6ea7774 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Owin { diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs index 51224bc8ef..330b2867ea 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,6 +3,7 @@ using System.IO; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Http diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index aa0a6d5ac7..cbdc1d9845 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -3,7 +3,9 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index d0cd1eacb3..0fcc04c997 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Builder.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index c96508a4ea..fb2ef452f1 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Internal; using Microsoft.Net.Http.Headers; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index c123db4b09..ef8aa04c56 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -3,6 +3,8 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Http.Extensions.Tests diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 7c28c99174..4284bb9c1d 100644 --- a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -4,7 +4,7 @@ using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNet.Builder.Internal { public class ApplicationBuilderTests { diff --git a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs index a618da3cfb..0728d65d80 100644 --- a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs @@ -4,7 +4,7 @@ using System.IO; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class BufferingHelperTests { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index ea8699ee43..cffbc5c385 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -2,15 +2,16 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 9ddb91d9d5..a3115bf5ee 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -4,9 +4,10 @@ using System; using System.Collections.Generic; using System.Globalization; +using Microsoft.AspNet.Http.Features; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index e26a4f0222..61dfda82f5 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -1,15 +1,15 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class FormFeatureTests { diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 1e40ae0e8a..79cbac89c5 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,10 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Collections; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 74b7cd37b0..5a1214338f 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -5,7 +5,7 @@ using Microsoft.AspNet.FeatureModel; using Moq; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class QueryFeatureTests { diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 95c1d7fd81..3676fb2941 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index eb05bd0dc5..03f2258a0c 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Xunit; namespace Microsoft.AspNet.Owin From c4df4a0a151ee9512f3a6d784e5f63211c0faadd Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 8 May 2015 10:52:43 -0700 Subject: [PATCH 318/846] #303 Enable tests for CoreCLR. --- .../project.json | 7 +--- .../MapPathMiddlewareTests.cs | 3 +- .../project.json | 7 +--- .../project.json | 7 +--- .../ApplicationBuilderTests.cs | 11 ++--- .../QueryFeatureTests.cs | 14 +++---- test/Microsoft.AspNet.Http.Tests/project.json | 28 +++++-------- test/Microsoft.AspNet.Owin.Tests/project.json | 7 +--- .../EncoderServiceProviderExtensionsTests.cs | 39 ++++++++++-------- .../UnicodeEncoderBaseTests.cs | 18 ++++----- .../project.json | 40 ++++++++++--------- 11 files changed, 82 insertions(+), 99 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 320d7f0186..a09a4171c6 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -7,10 +7,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index cbdc1d9845..aaa4467fe9 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; -using Shouldly; using Xunit; namespace Microsoft.AspNet.Builder.Extensions @@ -98,7 +97,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); + Assert.Throws(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); } [Theory] diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json index 7faf925aae..21eb7701ae 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json @@ -8,10 +8,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 4287829625..bac140231f 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -9,10 +9,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 4284bb9c1d..52d0fadfe2 100644 --- a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Builder.Internal @@ -14,13 +14,10 @@ namespace Microsoft.AspNet.Builder.Internal var builder = new ApplicationBuilder(null); var app = builder.Build(); - var mockHttpContext = new Moq.Mock(); - var mockHttpResponse = new Moq.Mock(); - mockHttpContext.SetupGet(x => x.Response).Returns(mockHttpResponse.Object); - mockHttpResponse.SetupProperty(x => x.StatusCode); + var httpContext = new DefaultHttpContext(); - app.Invoke(mockHttpContext.Object); - Assert.Equal(mockHttpContext.Object.Response.StatusCode, 404); + app.Invoke(httpContext); + Assert.Equal(httpContext.Response.StatusCode, 404); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 5a1214338f..a110b09946 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Moq; using Xunit; namespace Microsoft.AspNet.Http.Features.Internal @@ -13,15 +12,12 @@ namespace Microsoft.AspNet.Http.Features.Internal public void QueryReturnsParsedQueryCollection() { // Arrange - var features = new Mock(); - var request = new Mock(); - request.SetupGet(r => r.QueryString).Returns("foo=bar"); + var features = new FeatureCollection(); + var request = new HttpRequestFeature(); + request.QueryString = "foo=bar"; + features.Add(typeof(IHttpRequestFeature), request); - object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) - .Returns(true); - - var provider = new QueryFeature(features.Object); + var provider = new QueryFeature(features); // Act var queryCollection = provider.Query; diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 42315e13eb..cde6b4f819 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,19 +1,13 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { - "dependencies": { - "Moq": "4.2.1312.1622" - }, - "frameworkAssemblies": { - "System.Net.Http": "" - } - } - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 79f1cafd16..05c31c8a00 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -8,10 +8,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index 9d44a41697..07b23933e1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.IO; -using Moq; using Xunit; namespace Microsoft.Framework.WebEncoders @@ -14,7 +12,7 @@ namespace Microsoft.Framework.WebEncoders public void GetHtmlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange - var serviceProvider = new Mock().Object; + var serviceProvider = new TestServiceProvider(); // Act var retVal = serviceProvider.GetHtmlEncoder(); @@ -27,12 +25,11 @@ namespace Microsoft.Framework.WebEncoders public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new Mock().Object; - var mockServiceProvider = new Mock(); - mockServiceProvider.Setup(o => o.GetService(typeof(IHtmlEncoder))).Returns(expectedEncoder); + var expectedEncoder = new HtmlEncoder(); + var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = mockServiceProvider.Object.GetHtmlEncoder(); + var retVal = serviceProvider.GetHtmlEncoder(); // Assert Assert.Same(expectedEncoder, retVal); @@ -42,7 +39,7 @@ namespace Microsoft.Framework.WebEncoders public void GetJavaScriptStringEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange - var serviceProvider = new Mock().Object; + var serviceProvider = new TestServiceProvider(); // Act var retVal = serviceProvider.GetJavaScriptStringEncoder(); @@ -55,12 +52,11 @@ namespace Microsoft.Framework.WebEncoders public void GetJavaScriptStringEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new Mock().Object; - var mockServiceProvider = new Mock(); - mockServiceProvider.Setup(o => o.GetService(typeof(IJavaScriptStringEncoder))).Returns(expectedEncoder); + var expectedEncoder = new JavaScriptStringEncoder(); + var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = mockServiceProvider.Object.GetJavaScriptStringEncoder(); + var retVal = serviceProvider.GetJavaScriptStringEncoder(); // Assert Assert.Same(expectedEncoder, retVal); @@ -70,7 +66,7 @@ namespace Microsoft.Framework.WebEncoders public void GetUrlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange - var serviceProvider = new Mock().Object; + var serviceProvider = new TestServiceProvider(); // Act var retVal = serviceProvider.GetUrlEncoder(); @@ -83,15 +79,24 @@ namespace Microsoft.Framework.WebEncoders public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new Mock().Object; - var mockServiceProvider = new Mock(); - mockServiceProvider.Setup(o => o.GetService(typeof(IUrlEncoder))).Returns(expectedEncoder); + var expectedEncoder = new UrlEncoder(); + var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = mockServiceProvider.Object.GetUrlEncoder(); + var retVal = serviceProvider.GetUrlEncoder(); // Assert Assert.Same(expectedEncoder, retVal); } + + private class TestServiceProvider : IServiceProvider + { + public object Service { get; set; } + + public object GetService(Type serviceType) + { + return Service; + } + } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index e6661686c0..6ee48c5954 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; -using Moq; using Xunit; namespace Microsoft.Framework.WebEncoders @@ -208,8 +207,9 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_ZeroCount_DoesNotCallIntoTextWriter() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - TextWriter output = new Mock(MockBehavior.Strict).Object; + var encoder = new CustomUnicodeEncoderBase(); + var output = new StringWriter(); + output.Dispose(); // Throws ODE if written to. // Act encoder.Encode("abc".ToCharArray(), 2, 0, output); @@ -280,8 +280,9 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_ZeroCount_DoesNotCallIntoTextWriter() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - TextWriter output = new Mock(MockBehavior.Strict).Object; + var encoder = new CustomUnicodeEncoderBase(); + var output = new StringWriter(); + output.Dispose(); // Throws ODE if written to. // Act encoder.Encode("abc", 2, 0, output); @@ -309,14 +310,13 @@ namespace Microsoft.Framework.WebEncoders { // Arrange CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - var mockWriter = new Mock(MockBehavior.Strict); - mockWriter.Setup(o => o.Write("abc")).Verifiable(); + StringWriter output = new StringWriter(); // Act - encoder.Encode("abc", 0, 3, mockWriter.Object); + encoder.Encode("abc", 0, 3, output); // Assert - mockWriter.Verify(); + Assert.Equal("abc", output.ToString()); } [Fact] diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 4acf0c6ad2..b0ba4aa9fe 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,20 +1,24 @@ { - "dependencies": { - "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.WebEncoders": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", - "Moq": "4.2.1312.1622", - "Newtonsoft.Json": "6.0.6", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "compilationOptions": { - "allowUnsafe": "true" - }, - "frameworks": { - "dnx451": { } - }, - "resources": "..\\..\\unicode\\UnicodeData.txt" + "dependencies": { + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", + "Newtonsoft.Json": "6.0.6", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "compilationOptions": { + "allowUnsafe": true + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Text.Encoding.Extensions": "4.0.10-beta-*" + } + } + }, + "resources": "..\\..\\unicode\\UnicodeData.txt" } From dce1d0e88fa75c001b41260ab5653b924cbd4060 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 12 May 2015 11:02:58 -0700 Subject: [PATCH 319/846] #272 Make more properties settable (Items, RequestAborted, IsHttps, Query, Cookies). --- .../HttpContext.cs | 8 +- .../HttpRequest.cs | 6 +- .../QueryString.cs | 27 ++++- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Http/Constants.cs | 3 +- .../DefaultHttpContext.cs | 22 +--- .../DefaultHttpRequest.cs | 3 + .../Features/HttpRequestLifetimeFeature.cs | 17 +++ .../Features/IItemsFeature.cs | 2 +- .../Features/IQueryFeature.cs | 2 +- .../Features/IRequestCookiesFeature.cs | 2 +- .../Features/ItemsFeature.cs | 2 +- .../Features/QueryFeature.cs | 12 +- .../Features/RequestCookiesFeature.cs | 34 ++++-- .../OwinFeatureCollection.cs | 1 + .../DefaultAuthenticationManagerTests.cs | 111 ++++++++++++++++++ .../DefaultHttpContextTests.cs | 107 ++++------------- .../DefaultHttpRequestTests.cs | 72 ++++++++++++ 18 files changed, 308 insertions(+), 125 deletions(-) create mode 100644 src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs create mode 100644 test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 0ad675693c..1b853075da 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -17,22 +17,22 @@ namespace Microsoft.AspNet.Http public abstract ConnectionInfo Connection { get; } + public abstract WebSocketManager WebSockets { get; } + public abstract AuthenticationManager Authentication { get; } public abstract ClaimsPrincipal User { get; set; } - public abstract IDictionary Items { get; } + public abstract IDictionary Items { get; set; } public abstract IServiceProvider ApplicationServices { get; set; } public abstract IServiceProvider RequestServices { get; set; } - public abstract CancellationToken RequestAborted { get; } + public abstract CancellationToken RequestAborted { get; set; } public abstract ISessionCollection Session { get; } - public abstract WebSocketManager WebSockets { get; } - public abstract void Abort(); public abstract void Dispose(); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 80caec4502..4cbbf62a6f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Http /// Returns true if the owin.RequestScheme is https. /// /// true if this request is using https; otherwise, false. - public abstract bool IsHttps { get; } + public abstract bool IsHttps { get; set; } /// /// Gets or set the Host header. May include the port. @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Http /// Gets the query value collection parsed from owin.RequestQueryString. /// /// The query value collection parsed from owin.RequestQueryString. - public abstract IReadableStringCollection Query { get; } + public abstract IReadableStringCollection Query { get; set; } /// /// Gets or set the owin.RequestProtocol. @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Http /// Gets the collection of Cookies for this request. /// /// The collection of Cookies for this request. - public abstract IReadableStringCollection Cookies { get; } + public abstract IReadableStringCollection Cookies { get; set; } /// /// Gets or sets the Content-Length header diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 6d156bc7ee..7ad1300622 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -111,6 +111,7 @@ namespace Microsoft.AspNet.Http /// /// The un-encoded parameter name /// The un-encoded parameter value + /// The resulting QueryString public static QueryString Create(string name, string value) { return new QueryString("?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value)); @@ -120,7 +121,7 @@ namespace Microsoft.AspNet.Http /// Creates a query string composed from the given name value pairs. /// /// - /// + /// The resulting QueryString public static QueryString Create(IEnumerable> parameters) { var builder = new StringBuilder(); @@ -137,6 +138,30 @@ namespace Microsoft.AspNet.Http return new QueryString(builder.ToString()); } + /// + /// Creates a query string composed from the given name value pairs. + /// + /// + /// The resulting QueryString + public static QueryString Create(IEnumerable> parameters) + { + var builder = new StringBuilder(); + bool first = true; + foreach (var pair in parameters) + { + foreach (var value in pair.Value) + { + builder.Append(first ? "?" : "&"); + first = false; + builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append("="); + builder.Append(UrlEncoder.Default.UrlEncode(value)); + } + } + + return new QueryString(builder.ToString()); + } + public QueryString Add(QueryString other) { if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs index b30704650e..e007c4a818 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Http.Features { public interface IHttpRequestLifetimeFeature { - CancellationToken RequestAborted { get; } + CancellationToken RequestAborted { get; set; } void Abort(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Constants.cs b/src/Microsoft.AspNet.Http/Constants.cs index 376bb55abd..d01466f549 100644 --- a/src/Microsoft.AspNet.Http/Constants.cs +++ b/src/Microsoft.AspNet.Http/Constants.cs @@ -5,7 +5,8 @@ namespace Microsoft.AspNet.Http.Internal { internal static class Constants { - internal const string Https = "HTTPS"; + internal const string Http = "http"; + internal const string Https = "https"; internal static class BuilderProperties { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 4c0174e5b1..6090eed1b9 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -69,7 +69,7 @@ namespace Microsoft.AspNet.Http.Internal private IHttpRequestLifetimeFeature LifetimeFeature { - get { return _lifetime.Fetch(_features); } + get { return _lifetime.Fetch(_features) ?? _lifetime.Update(_features, new HttpRequestLifetimeFeature()); } } private ISessionFeature SessionFeature @@ -103,6 +103,7 @@ namespace Microsoft.AspNet.Http.Internal public override IDictionary Items { get { return ItemsFeature.Items; } + set { ItemsFeature.Items = value; } } public override IServiceProvider ApplicationServices @@ -117,19 +118,10 @@ namespace Microsoft.AspNet.Http.Internal set { ServiceProvidersFeature.RequestServices = value; } } - public int Revision { get { return _features.Revision; } } - public override CancellationToken RequestAborted { - get - { - var lifetime = LifetimeFeature; - if (lifetime != null) - { - return lifetime.RequestAborted; - } - return CancellationToken.None; - } + get { return LifetimeFeature.RequestAborted; } + set { LifetimeFeature.RequestAborted = value; } } public override ISessionCollection Session @@ -167,11 +159,7 @@ namespace Microsoft.AspNet.Http.Internal public override void Abort() { - var lifetime = LifetimeFeature; - if (lifetime != null) - { - lifetime.Abort(); - } + LifetimeFeature.Abort(); } public override void Dispose() diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index f06e2d396e..bf374999b9 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -101,6 +101,7 @@ namespace Microsoft.AspNet.Http.Internal public override bool IsHttps { get { return string.Equals(Constants.Https, Scheme, StringComparison.OrdinalIgnoreCase); } + set { Scheme = value ? Constants.Https : Constants.Http; } } public override HostString Host @@ -112,6 +113,7 @@ namespace Microsoft.AspNet.Http.Internal public override IReadableStringCollection Query { get { return QueryFeature.Query; } + set { QueryFeature.Query = value; } } public override string Protocol @@ -128,6 +130,7 @@ namespace Microsoft.AspNet.Http.Internal public override IReadableStringCollection Cookies { get { return RequestCookiesFeature.Cookies; } + set { RequestCookiesFeature.Cookies = value; } } public override string ContentType diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs new file mode 100644 index 0000000000..1b773b93f1 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs @@ -0,0 +1,17 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http.Features.Internal +{ + public class HttpRequestLifetimeFeature : IHttpRequestLifetimeFeature + { + public CancellationToken RequestAborted { get; set; } + + public void Abort() + { + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs index 96b2ce78fe..a30c3ac6fb 100644 --- a/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs @@ -7,6 +7,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IItemsFeature { - IDictionary Items { get; } + IDictionary Items { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs index a1143fb8cd..a814e38501 100644 --- a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IQueryFeature { - IReadableStringCollection Query { get; } + IReadableStringCollection Query { get; set; } } } diff --git a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs index 6b2f7c742e..73f23d032d 100644 --- a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IRequestCookiesFeature { - IReadableStringCollection Cookies { get; } + IReadableStringCollection Cookies { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs index fc839357a7..c80abe6d65 100644 --- a/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs @@ -13,6 +13,6 @@ namespace Microsoft.AspNet.Http.Features.Internal Items = new ItemsDictionary(); } - public IDictionary Items { get; private set; } + public IDictionary Items { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 9fb2bd4a4b..a46b6ecb83 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; @@ -41,13 +42,22 @@ namespace Microsoft.AspNet.Http.Features.Internal } var queryString = _request.Fetch(_features).QueryString; - if (_query == null || _queryString != queryString) + if (_query == null || !string.Equals(_queryString, queryString, StringComparison.Ordinal)) { _queryString = queryString; _query = new ReadableStringCollection(QueryHelpers.ParseQuery(queryString)); } return _query; } + set + { + _query = value; + if (_features != null) + { + _queryString = _query == null ? string.Empty : QueryString.Create(_query).ToString(); + _request.Fetch(_features).QueryString = _queryString; + } + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index eed8fc2d95..e0ba1dcc3e 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -50,19 +50,37 @@ namespace Microsoft.AspNet.Http.Features.Internal values = new string[0]; } - if (_cookiesCollection == null) - { - _cookieHeaders = values; - _cookiesCollection = new RequestCookiesCollection(); - _cookiesCollection.Reparse(values); - } - else if (!Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) + if (_cookieHeaders == null || !Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) { _cookieHeaders = values; + if (_cookiesCollection == null) + { + _cookiesCollection = new RequestCookiesCollection(); + _cookies = _cookiesCollection; + } _cookiesCollection.Reparse(values); } - return _cookiesCollection; + return _cookies; + } + set + { + _cookies = value; + _cookieHeaders = null; + _cookiesCollection = _cookies as RequestCookiesCollection; + if (_cookies != null && _features != null) + { + var headers = new List(); + foreach (var pair in _cookies) + { + foreach (var cookieValue in pair.Value) + { + headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); + } + } + _cookieHeaders = headers.ToArray(); + _request.Fetch(_features).Headers[HeaderNames.Cookie] = _cookieHeaders; + } } } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 7aee9b3c78..b54f38b69a 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -247,6 +247,7 @@ namespace Microsoft.AspNet.Owin CancellationToken IHttpRequestLifetimeFeature.RequestAborted { get { return Prop(OwinConstants.CallCancelled); } + set { Prop(OwinConstants.CallCancelled, value); } } void IHttpRequestLifetimeFeature.Abort() diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs new file mode 100644 index 0000000000..652f3a1091 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -0,0 +1,111 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNet.Http.Internal; +using Xunit; + +namespace Microsoft.AspNet.Http.Authentication.Internal +{ + public class AuthenticationManagerTests + { + + [Fact] + public async Task AuthenticateWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Authentication.Authenticate("Foo")); + await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); + } + + [Fact] + public void ChallengeWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Authentication.Challenge(); + Assert.Equal(401, context.Response.StatusCode); + + Assert.Throws(() => context.Authentication.Challenge("Foo")); + } + + [Fact] + public void SignInWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); + } + + [Fact] + public void SignOutWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Authentication.SignOut(); + + Assert.Throws(() => context.Authentication.SignOut("Foo")); + } + + [Fact] + public void SignInOutIn() + { + var context = CreateContext(); + var handler = new AuthHandler(); + context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); + var user = new ClaimsPrincipal(); + context.Authentication.SignIn("ignored", user); + Assert.True(handler.SignedIn); + context.Authentication.SignOut("ignored"); + Assert.False(handler.SignedIn); + context.Authentication.SignIn("ignored", user); + Assert.True(handler.SignedIn); + context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + Assert.False(handler.SignedIn); + } + + private class AuthHandler : IAuthenticationHandler + { + public bool SignedIn { get; set; } + + public void Authenticate(AuthenticateContext context) + { + throw new NotImplementedException(); + } + + public Task AuthenticateAsync(AuthenticateContext context) + { + throw new NotImplementedException(); + } + + public void Challenge(ChallengeContext context) + { + throw new NotImplementedException(); + } + + public void GetDescriptions(DescribeSchemesContext context) + { + throw new NotImplementedException(); + } + + public void SignIn(SignInContext context) + { + SignedIn = true; + context.Accept(); + } + + public void SignOut(SignOutContext context) + { + SignedIn = false; + context.Accept(); + } + } + + private HttpContext CreateContext() + { + var context = new DefaultHttpContext(); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index cffbc5c385..0caea097ec 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -1,14 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Collections.Generic; using System.Linq; using System.Security.Claims; -using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNet.Http.Features.Internal; using Xunit; namespace Microsoft.AspNet.Http.Internal @@ -44,91 +41,31 @@ namespace Microsoft.AspNet.Http.Internal } [Fact] - public async Task AuthenticateWithNoAuthMiddlewareThrows() + public void GetItems_DefaultCollectionProvided() { - var context = CreateContext(); - Assert.Throws(() => context.Authentication.Authenticate("Foo")); - await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.Null(context.GetFeature()); + var items = context.Items; + Assert.NotNull(context.GetFeature()); + Assert.NotNull(items); + Assert.Same(items, context.Items); + var item = new object(); + context.Items["foo"] = item; + Assert.Same(item, context.Items["foo"]); } [Fact] - public void ChallengeWithNoAuthMiddlewareMayThrow() + public void SetItems_NewCollectionUsed() { - var context = CreateContext(); - context.Authentication.Challenge(); - Assert.Equal(401, context.Response.StatusCode); - - Assert.Throws(() => context.Authentication.Challenge("Foo")); - } - - [Fact] - public void SignInWithNoAuthMiddlewareThrows() - { - var context = CreateContext(); - Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); - } - - [Fact] - public void SignOutWithNoAuthMiddlewareMayThrow() - { - var context = CreateContext(); - context.Authentication.SignOut(); - - Assert.Throws(() => context.Authentication.SignOut("Foo")); - } - - [Fact] - public void SignInOutIn() - { - var context = CreateContext(); - var handler = new AuthHandler(); - context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); - var user = new ClaimsPrincipal(); - context.Authentication.SignIn("ignored", user); - Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored"); - Assert.False(handler.SignedIn); - context.Authentication.SignIn("ignored", user); - Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); - Assert.False(handler.SignedIn); - } - - private class AuthHandler : IAuthenticationHandler - { - public bool SignedIn { get; set; } - - public void Authenticate(AuthenticateContext context) - { - throw new NotImplementedException(); - } - - public Task AuthenticateAsync(AuthenticateContext context) - { - throw new NotImplementedException(); - } - - public void Challenge(ChallengeContext context) - { - throw new NotImplementedException(); - } - - public void GetDescriptions(DescribeSchemesContext context) - { - throw new NotImplementedException(); - } - - public void SignIn(SignInContext context) - { - SignedIn = true; - context.Accept(); - } - - public void SignOut(SignOutContext context) - { - SignedIn = false; - context.Accept(); - } + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.Null(context.GetFeature()); + var items = new Dictionary(); + context.Items = items; + Assert.NotNull(context.GetFeature()); + Assert.Same(items, context.Items); + var item = new object(); + items["foo"] = item; + Assert.Same(item, context.Items["foo"]); } private HttpContext CreateContext() diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index a3115bf5ee..81b268ba1f 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -115,6 +115,78 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal(expected, headers["Host"][0]); } + [Fact] + public void IsHttps_CorrectlyReflectsScheme() + { + var request = new DefaultHttpContext().Request; + Assert.Equal(string.Empty, request.Scheme); + Assert.False(request.IsHttps); + request.IsHttps = true; + Assert.Equal("https", request.Scheme); + request.IsHttps = false; + Assert.Equal("http", request.Scheme); + request.Scheme = "ftp"; + Assert.False(request.IsHttps); + request.Scheme = "HTTPS"; + Assert.True(request.IsHttps); + } + + [Fact] + public void Query_GetAndSet() + { + var request = new DefaultHttpContext().Request; + var requestFeature = request.HttpContext.GetFeature(); + Assert.Equal(string.Empty, requestFeature.QueryString); + Assert.Equal(QueryString.Empty, request.QueryString); + var query0 = request.Query; + Assert.NotNull(query0); + Assert.Equal(0, query0.Count); + + requestFeature.QueryString = "?name0=value0&name1=value1"; + var query1 = request.Query; + Assert.NotSame(query0, query1); + Assert.Equal(2, query1.Count); + Assert.Equal("value0", query1["name0"]); + Assert.Equal("value1", query1["name1"]); + + var query2 = new ReadableStringCollection(new Dictionary() + { + { "name2", new[] { "value2" } } + }); + + request.Query = query2; + Assert.Same(query2, request.Query); + Assert.Equal("?name2=value2", requestFeature.QueryString); + Assert.Equal(new QueryString("?name2=value2"), request.QueryString); + } + + [Fact] + public void Cookies_GetAndSet() + { + var request = new DefaultHttpContext().Request; + var cookieHeaders = request.Headers.GetValues("Cookie"); + Assert.Null(cookieHeaders); + var cookies0 = request.Cookies; + Assert.Equal(0, cookies0.Count); + + request.Headers.SetValues("Cookie", new[] { "name0=value0", "name1=value1" }); + var cookies1 = request.Cookies; + Assert.Same(cookies0, cookies1); + Assert.Equal(2, cookies1.Count); + Assert.Equal("value0", cookies1["name0"]); + Assert.Equal("value1", cookies1["name1"]); + + var cookies2 = new ReadableStringCollection(new Dictionary() + { + { "name2", new[] { "value2" } } + }); + request.Cookies = cookies2; + Assert.Same(cookies2, request.Cookies); + Assert.Equal("value2", request.Cookies["name2"]); + cookieHeaders = request.Headers.GetValues("Cookie"); + Assert.Equal(new[] { "name2=value2" }, cookieHeaders); + } + private static HttpRequest CreateRequest(IDictionary headers) { var context = new DefaultHttpContext(); From 54fbf51894b97076897eb153bb82a7d6577f75cd Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 12 May 2015 11:46:51 -0700 Subject: [PATCH 320/846] Update Home master -> Home dev --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eac4268e4c..64ff041d5c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ Contributing ====== -Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. +Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/dev/CONTRIBUTING.md) in the Home repo. From 99ea4fed8aa07b87d51ea1dd54186cf24d4fedd9 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 14 May 2015 22:23:12 -0700 Subject: [PATCH 321/846] #176 Add Clone() to MediaTypeHeaderValue and NameValueHeaderValue. --- .../MediaTypeHeaderValue.cs | 21 ++++++++++++++ .../NameValueHeaderValue.cs | 13 +++++++++ .../MediaTypeHeaderValueTest.cs | 28 +++++++++++++++++++ .../NameValueHeaderValueTest.cs | 26 +++++++++++++++++ 4 files changed, 88 insertions(+) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 4113f44598..173bf7c404 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -248,6 +248,27 @@ namespace Microsoft.Net.Http.Headers return true; } + /// + /// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components, + /// while avoiding the cost of revalidating the components. + /// + /// A deep copy. + public MediaTypeHeaderValue Clone() + { + var other = new MediaTypeHeaderValue(); + other._mediaType = _mediaType; + + if (_parameters != null) + { + other._parameters = new ObjectCollection(); + foreach (var pair in _parameters) + { + other._parameters.Add(pair.Clone()); + } + } + return other; + } + public override string ToString() { return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true); diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index 668a4ccef4..08a08f96ef 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -54,6 +54,19 @@ namespace Microsoft.Net.Http.Headers } } + /// + /// Provides a copy of this object without the cost of re-validating the values. + /// + /// A copy. + public NameValueHeaderValue Clone() + { + return new NameValueHeaderValue() + { + _name = _name, + _value = _value + }; + } + public override int GetHashCode() { Contract.Assert(_name != null); diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 5c73d9b607..92ec8f9726 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -64,6 +64,34 @@ namespace Microsoft.Net.Http.Headers Assert.Throws(() => mediaType.Parameters.Add(null)); } + [Fact] + public void Clone_SimpleMediaType_Copied() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + var mediaType1 = mediaType0.Clone(); + Assert.NotSame(mediaType0, mediaType1); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + } + + [Fact] + public void Clone_WithParameters_Copied() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType1 = mediaType0.Clone(); + Assert.NotSame(mediaType0, mediaType1); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + var pair0 = mediaType0.Parameters.First(); + var pair1 = mediaType1.Parameters.First(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + } + [Fact] public void MediaType_SetAndGetMediaType_MatchExpectations() { diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index 3d342dea9b..a1e1a935f9 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -59,6 +59,32 @@ namespace Microsoft.Net.Http.Headers CheckValue("\"quoted string with quoted \\\" quote-pair\""); } + [Fact] + public void Clone_NameOnly_SuccesfullyCopied() + { + var pair0 = new NameValueHeaderValue("name"); + var pair1 = pair0.Clone(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Null(pair0.Value); + Assert.Null(pair1.Value); + } + + [Fact] + public void Clone_NameAndValue_SuccesfullyCopied() + { + var pair0 = new NameValueHeaderValue("name", "value"); + var pair1 = pair0.Clone(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + + // Change one value and verify the other is unchanged. + pair1.Value = "othervalue"; + Assert.Equal("value", pair0.Value); + Assert.Equal("othervalue", pair1.Value); + } + [Fact] public void Value_CallSetterWithInvalidValues_Throw() { From 06d3333ed3a5c97c7dafc6225746a6164e863fed Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 15 May 2015 09:59:42 -0700 Subject: [PATCH 322/846] React to CoreCLR dependency changes. --- src/Microsoft.AspNet.WebUtilities/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index b3fb9c1ef6..5837682b5e 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -13,6 +13,7 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", + "System.IO.FileSystem.Primitives": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*" } From 7b9cb14a108034192c026168f9adbfd83806cdc3 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 15 May 2015 12:20:28 -0700 Subject: [PATCH 323/846] Revert "React to CoreCLR dependency changes." This reverts commit 06d3333ed3a5c97c7dafc6225746a6164e863fed. --- src/Microsoft.AspNet.WebUtilities/project.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 5837682b5e..b3fb9c1ef6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -13,7 +13,6 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", - "System.IO.FileSystem.Primitives": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*" } From 83a8fd136f5f0590bc81e627c4b4927af6b22647 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 17 May 2015 08:55:46 -0700 Subject: [PATCH 324/846] Fix tabs --- src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 500f8e6e5b..70b9128737 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -9,8 +9,8 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class HttpResponseFeature : IHttpResponseFeature { - public HttpResponseFeature() - { + public HttpResponseFeature() + { StatusCode = 200; Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; @@ -39,4 +39,4 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new NotSupportedException(); } } -} \ No newline at end of file +} From 69849cc37c2d1cb99715c6abec124dadcb1e51ef Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 20 May 2015 12:42:54 -0700 Subject: [PATCH 325/846] #311 Move UseMiddleware to Http.Abstractions. --- .../Extensions}/UseMiddlewareExtensions.cs | 8 ++++---- src/Microsoft.AspNet.Http.Abstractions/project.json | 2 ++ src/Microsoft.AspNet.Http.Extensions/project.json | 2 -- 3 files changed, 6 insertions(+), 6 deletions(-) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions/Extensions}/UseMiddlewareExtensions.cs (85%) diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs similarity index 85% rename from src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 9d98b85e6f..b247ab3cac 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -4,9 +4,9 @@ using System; using System.Linq; using System.Reflection; -using Microsoft.Framework.DependencyInjection; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Builder var parameters = methodinfo.GetParameters(); if (parameters[0].ParameterType != typeof(HttpContext)) { - throw new Exception("TODO: Middleware Invoke method must take first argument of HttpContext"); + throw new Exception("Middleware Invoke method must take first argument of HttpContext"); } if (parameters.Length == 1) { @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Builder var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; if (serviceProvider == null) { - throw new Exception("TODO: IServiceProvider is not available"); + throw new Exception("IServiceProvider is not available"); } var arguments = new object[parameters.Length]; arguments[0] = context; @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Builder arguments[index] = serviceProvider.GetService(serviceType); if (arguments[index] == null) { - throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", serviceType)); + throw new Exception(string.Format("No service for type '{0}' has been registered.", serviceType)); } } return (Task)methodinfo.Invoke(instance, arguments); diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index a70ce73541..71b44dabe2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { + "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, @@ -16,6 +17,7 @@ "System.Linq": "4.0.0-beta-*", "System.Net.Primitives": "4.0.10-beta-*", "System.Net.WebSockets" : "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index fde16b0159..780809de7b 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,6 @@ "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" @@ -15,7 +14,6 @@ "dnxcore50": { "dependencies": { "System.IO.FileSystem": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } } From eb182fdafdd7b1e63a07cd67b4872f30abacdae8 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 21 May 2015 03:46:18 -0700 Subject: [PATCH 326/846] Fixed dependencies --- .../project.json | 55 ++++++++++--------- .../project.json | 36 ++++++------ 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 71b44dabe2..75763424c1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -1,30 +1,31 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP object model. HttpContext and family.", - "dependencies": { - "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", - "System.Net.WebSockets" : "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "dependencies": { + "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Collections": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Linq.Expressions": "4.0.10-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" + } } + } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 780809de7b..aca989fb05 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,21 +1,21 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", - "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" - }, - "frameworks": { - "dnx451": { - }, - "dnxcore50": { - "dependencies": { - "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", + "dependencies": { + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.IO.FileSystem": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Resources.ResourceManager": "4.0.0-beta-*" + } } + } } From fd07e666e45d71fe1f2ae7c096feed486fb9aea6 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 27 May 2015 16:22:53 -0700 Subject: [PATCH 327/846] Updating to release NuGet.config --- NuGet.Config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..0e74a4912d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,8 @@  - + + - \ No newline at end of file + From d9839bcc43af2f3af612db5bb691d538c4b7f689 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 29 May 2015 01:12:54 -0700 Subject: [PATCH 328/846] Removed bookeeping for duck typing feature interfaces - Removed interlocked increment since the version was being incremented within the lock #317 --- .../FeatureCollection.cs | 50 ++----------------- 1 file changed, 5 insertions(+), 45 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 7c4a0e0017..0c43b0afa1 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -4,8 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Reflection; -using System.Threading; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.FeatureModel @@ -14,8 +12,7 @@ namespace Microsoft.AspNet.FeatureModel { private readonly IFeatureCollection _defaults; private readonly IDictionary _featureByFeatureType = new Dictionary(); - private readonly IDictionary _featureTypeByName = new Dictionary(); - private readonly object _containerSync = new Object(); + private readonly object _containerSync = new object(); private int _containerRevision; public FeatureCollection() @@ -40,22 +37,6 @@ namespace Microsoft.AspNet.FeatureModel return feature; } - Type actualType; - if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) - { - if (_featureByFeatureType.TryGetValue(actualType, out feature)) - { - var isInstanceOfType = type.IsInstanceOfType(feature); - - if (isInstanceOfType) - { - return feature; - } - - return null; - } - } - if (_defaults != null && _defaults.TryGetValue(type, out feature)) { return feature; @@ -73,26 +54,8 @@ namespace Microsoft.AspNet.FeatureModel lock (_containerSync) { - Type priorFeatureType; - if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) - { - if (priorFeatureType == type) - { - _featureByFeatureType[type] = feature; - } - else - { - _featureTypeByName[type.FullName] = type; - _featureByFeatureType.Remove(priorFeatureType); - _featureByFeatureType.Add(type, feature); - } - } - else - { - _featureTypeByName.Add(type.FullName, type); - _featureByFeatureType.Add(type, feature); - } - Interlocked.Increment(ref _containerRevision); + _featureByFeatureType[type] = feature; + _containerRevision++; } } @@ -169,12 +132,9 @@ namespace Microsoft.AspNet.FeatureModel { lock (_containerSync) { - Type priorFeatureType; - if (_featureTypeByName.TryGetValue(key.FullName, out priorFeatureType)) + if (_featureByFeatureType.Remove(key)) { - _featureTypeByName.Remove(key.FullName); - _featureByFeatureType.Remove(priorFeatureType); - Interlocked.Increment(ref _containerRevision); + _containerRevision++; return true; } return false; From ed339a35d2a0ae6137c12e9bc8e8b037ed429bc1 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 29 May 2015 14:14:36 -0700 Subject: [PATCH 329/846] Made container verison volatile --- src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 0c43b0afa1..40e386a491 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.FeatureModel private readonly IFeatureCollection _defaults; private readonly IDictionary _featureByFeatureType = new Dictionary(); private readonly object _containerSync = new object(); - private int _containerRevision; + private volatile int _containerRevision; public FeatureCollection() { From 6407a1672d92d89c4140fd1e5c07052599d4b97e Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Wed, 27 May 2015 15:17:38 -0700 Subject: [PATCH 330/846] Session API review changes. --- .../HttpContext.cs | 3 +- .../ISessionCollection.cs | 21 ---- .../project.json | 1 + ...tionExtensions.cs => SessionExtensions.cs} | 19 ++- .../project.json | 1 - .../ISession.cs | 8 +- .../ISessionFactory.cs | 12 -- .../ISessionFeature.cs | 3 - .../WebSocketAcceptContext.cs | 2 +- .../DefaultHttpContext.cs | 21 ++-- .../Features/DefaultSessionFeature.cs | 14 +++ .../SessionCollection.cs | 74 ------------ src/Microsoft.AspNet.Http/project.json | 1 - .../DefaultHttpContextTests.cs | 109 ++++++++++++++++++ 14 files changed, 150 insertions(+), 139 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs rename src/Microsoft.AspNet.Http.Extensions/{SessionCollectionExtensions.cs => SessionExtensions.cs} (63%) delete mode 100644 src/Microsoft.AspNet.Http.Features/ISessionFactory.cs create mode 100644 src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs delete mode 100644 src/Microsoft.AspNet.Http/SessionCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 1b853075da..c7a63c8356 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { @@ -31,7 +32,7 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken RequestAborted { get; set; } - public abstract ISessionCollection Session { get; } + public abstract ISession Session { get; set; } public abstract void Abort(); diff --git a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs deleted file mode 100644 index a446704d33..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http -{ - public interface ISessionCollection : IEnumerable> - { - byte[] this[string key] { get; set; } - - bool TryGetValue(string key, out byte[] value); - - void Set(string key, ArraySegment value); - - void Remove(string key); - - void Clear(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 75763424c1..1f9e83a30c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { + "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs similarity index 63% rename from src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs rename to src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs index fbdbd02e40..b2908aed80 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs @@ -1,14 +1,14 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Text; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { - public static class SessionCollectionExtensions + public static class SessionExtensions { - public static void SetInt32(this ISessionCollection session, string key, int value) + public static void SetInt32(this ISession session, string key, int value) { var bytes = new byte[] { @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Http session.Set(key, bytes); } - public static int? GetInt32(this ISessionCollection session, string key) + public static int? GetInt32(this ISession session, string key) { var data = session.Get(key); if (data == null || data.Length < 4) @@ -30,12 +30,12 @@ namespace Microsoft.AspNet.Http return data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; } - public static void SetString(this ISessionCollection session, string key, string value) + public static void SetString(this ISession session, string key, string value) { session.Set(key, Encoding.UTF8.GetBytes(value)); } - public static string GetString(this ISessionCollection session, string key) + public static string GetString(this ISession session, string key) { var data = session.Get(key); if (data == null) @@ -45,16 +45,11 @@ namespace Microsoft.AspNet.Http return Encoding.UTF8.GetString(data); } - public static byte[] Get(this ISessionCollection session, string key) + public static byte[] Get(this ISession session, string key) { byte[] value = null; session.TryGetValue(key, out value); return value; } - - public static void Set(this ISessionCollection session, string key, byte[] value) - { - session.Set(key, new ArraySegment(value)); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index aca989fb05..6f5855192b 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,6 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs index ba80fc7324..058853ffc9 100644 --- a/src/Microsoft.AspNet.Http.Features/ISession.cs +++ b/src/Microsoft.AspNet.Http.Features/ISession.cs @@ -1,20 +1,20 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http.Features { public interface ISession { - void Load(); + Task LoadAsync(); - void Commit(); + Task CommitAsync(); bool TryGetValue(string key, out byte[] value); - void Set(string key, ArraySegment value); + void Set(string key, byte[] value); void Remove(string key); diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs deleted file mode 100644 index 441f96eeb5..0000000000 --- a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http.Features -{ - public interface ISessionFactory - { - bool IsAvailable { get; } - - ISession Create(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs index bd3a66883e..4406b8809f 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs @@ -3,11 +3,8 @@ namespace Microsoft.AspNet.Http.Features { - // TODO: Is there any reason not to flatten the Factory down into the Feature? public interface ISessionFeature { - ISessionFactory Factory { get; set; } - ISession Session { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs index df11f93766..1bc7c2e470 100644 --- a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http.Features diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 6090eed1b9..5dc1c96cfe 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -124,24 +124,27 @@ namespace Microsoft.AspNet.Http.Internal set { LifetimeFeature.RequestAborted = value; } } - public override ISessionCollection Session + public override ISession Session { get { var feature = SessionFeature; if (feature == null) { - throw new InvalidOperationException("Session has not been configured for this application or request."); + throw new InvalidOperationException("Session has not been configured for this application " + + "or request."); } - if (feature.Session == null) + return feature.Session; + } + set + { + var feature = SessionFeature; + if (feature == null) { - if (feature.Factory == null) - { - throw new InvalidOperationException("No ISessionFactory available to create the ISession."); - } - feature.Session = feature.Factory.Create(); + feature = new DefaultSessionFeature(); + _session.Update(_features, feature); } - return new SessionCollection(feature.Session); + feature.Session = value; } } diff --git a/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs b/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs new file mode 100644 index 0000000000..041794c7b5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs @@ -0,0 +1,14 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features.Internal +{ + /// + /// This type exists only for the purpose of unit testing where the user can directly set the + /// property without the need for creating a . + /// + public class DefaultSessionFeature : ISessionFeature + { + public ISession Session { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Http/SessionCollection.cs b/src/Microsoft.AspNet.Http/SessionCollection.cs deleted file mode 100644 index 8123e2fb0b..0000000000 --- a/src/Microsoft.AspNet.Http/SessionCollection.cs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using Microsoft.AspNet.Http.Features; - -namespace Microsoft.AspNet.Http.Internal -{ - public class SessionCollection : ISessionCollection - { - private readonly ISession _session; - - public SessionCollection(ISession session) - { - _session = session; - } - - public byte[] this[string key] - { - get - { - byte[] value; - TryGetValue(key, out value); - return value; - } - set - { - if (value == null) - { - Remove(key); - } - else - { - Set(key, new ArraySegment(value)); - } - } - } - - public bool TryGetValue(string key, out byte[] value) - { - return _session.TryGetValue(key, out value); - } - - public void Set(string key, ArraySegment value) - { - _session.Set(key, value); - } - - public void Remove(string key) - { - _session.Remove(key); - } - - public void Clear() - { - _session.Clear(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IEnumerator> GetEnumerator() - { - foreach (var key in _session.Keys) - { - yield return new KeyValuePair(key, this[key]); - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3334f37142..b8a689a4d2 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -4,7 +4,6 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 0caea097ec..c8c1b0bc47 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -1,10 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Xunit; @@ -12,6 +15,69 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContextTests { + [Fact] + public void GetOnSessionProperty_ThrowsOnMissingSessionFeature() + { + // Arrange + var context = new DefaultHttpContext(); + + // Act & Assert + var exception = Assert.Throws(() => context.Session); + Assert.Equal("Session has not been configured for this application or request.", exception.Message); + } + + [Fact] + public void GetOnSessionProperty_ReturnsAvailableSession() + { + // Arrange + var context = new DefaultHttpContext(); + var session = new TestSession(); + session.Set("key1", null); + session.Set("key2", null); + var feature = new BlahSessionFeature(); + feature.Session = session; + context.SetFeature(feature); + + // Act & Assert + Assert.Same(session, context.Session); + context.Session.Set("key3", null); + Assert.Equal(3, context.Session.Keys.Count()); + } + + [Fact] + public void AllowsSettingSession_WithoutSettingUpSessionFeature_Upfront() + { + // Arrange + var session = new TestSession(); + var context = new DefaultHttpContext(); + + // Act + context.Session = session; + + // Assert + Assert.Same(session, context.Session); + } + + [Fact] + public void SettingSession_OverridesAvailableSession() + { + // Arrange + var context = new DefaultHttpContext(); + var session = new TestSession(); + session.Set("key1", null); + session.Set("key2", null); + var feature = new BlahSessionFeature(); + feature.Session = session; + context.SetFeature(feature); + + // Act + context.Session = new TestSession(); + + // Assert + Assert.NotSame(session, context.Session); + Assert.Empty(context.Session.Keys); + } + [Fact] public void EmptyUserIsNeverNull() { @@ -73,5 +139,48 @@ namespace Microsoft.AspNet.Http.Internal var context = new DefaultHttpContext(); return context; } + + private class TestSession : ISession + { + private Dictionary _store + = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public IEnumerable Keys { get { return _store.Keys; } } + + public void Clear() + { + _store.Clear(); + } + + public Task CommitAsync() + { + return Task.FromResult(0); + } + + public Task LoadAsync() + { + return Task.FromResult(0); + } + + public void Remove(string key) + { + _store.Remove(key); + } + + public void Set(string key, byte[] value) + { + _store[key] = value; + } + + public bool TryGetValue(string key, out byte[] value) + { + return _store.TryGetValue(key, out value); + } + } + + private class BlahSessionFeature : ISessionFeature + { + public ISession Session { get; set; } + } } } \ No newline at end of file From 40cfc238fe9f855645107d4a7c057deb29e899ce Mon Sep 17 00:00:00 2001 From: Henk Mollema Date: Thu, 4 Jun 2015 14:54:30 +0200 Subject: [PATCH 331/846] Use nameof operator --- .../Extensions/MapExtensions.cs | 2 +- .../FragmentString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/PathString.cs | 2 +- .../QueryString.cs | 2 +- src/Microsoft.AspNet.Http/ReferenceReadStream.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- .../WebSockets/OwinWebSocketAdapter.cs | 4 ++-- .../BufferedReadStream.cs | 2 +- .../MultipartReaderStream.cs | 4 ++-- src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 4 ++-- .../ContentDispositionHeaderValue.cs | 4 ++-- .../ContentRangeHeaderValue.cs | 12 ++++++------ .../EntityTagHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderUtilities.cs | 2 +- src/Microsoft.Net.Http.Headers/ObjectCollection.cs | 2 +- .../RangeConditionHeaderValue.cs | 2 +- .../RangeItemHeaderValue.cs | 6 +++--- .../StringWithQualityHeaderValue.cs | 2 +- 19 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 8885632152..3af199d519 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Builder { if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) { - throw new ArgumentException("The path must not end with a '/'", "pathMatch"); + throw new ArgumentException("The path must not end with a '/'", nameof(pathMatch)); } // create branch diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 3e5544407b..794b800b63 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Http { if (!string.IsNullOrEmpty(value) && value[0] != '#') { - throw new ArgumentException("The leading '#' must be included for a non-empty fragment.", "value"); + throw new ArgumentException("The leading '#' must be included for a non-empty fragment.", nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 7bc00e6ab1..62cfd74bd6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Http { if (!String.IsNullOrEmpty(value) && value[0] != '/') { - throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, "value"); + throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 7ad1300622..8717638aa5 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Http { if (!string.IsNullOrEmpty(value) && value[0] != '?') { - throw new ArgumentException("The leading '?' must be included for a non-empty query.", "value"); + throw new ArgumentException("The leading '?' must be included for a non-empty query.", nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 6fa2c34f04..87f2959eef 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Http.Internal ThrowIfDisposed(); if (value < 0 || value > Length) { - throw new ArgumentOutOfRangeException("value", value, "The Position must be within the length of the Stream: " + Length); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be within the length of the Stream: " + Length); } VerifyPosition(); _position = value; diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 96102f6bf4..b96396f73a 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,11 +37,11 @@ namespace Microsoft.AspNet.Owin { if (context.GetFeature() == null) { - throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", nameof(context)); } if (context.GetFeature() == null) { - throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", nameof(context)); } _context = context; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index b54f38b69a..ec50c50928 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -411,7 +411,7 @@ namespace Microsoft.AspNet.Owin { if (arrayIndex < 0 || arrayIndex > array.Length) { - throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); + throw new ArgumentOutOfRangeException(nameof(arrayIndex), arrayIndex, string.Empty); } var keys = Keys; if (keys.Count > array.Length - arrayIndex) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs index bdaeef8eda..4a7a056463 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.Owin case 0x8: return WebSocketMessageType.Close; default: - throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(messageType), messageType, string.Empty); } } @@ -184,7 +184,7 @@ namespace Microsoft.AspNet.Owin case WebSocketMessageType.Close: return 0x8; default: - throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(webSocketMessageType), webSocketMessageType, string.Empty); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 0b3ec59363..94bb03efce 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -64,7 +64,7 @@ namespace Microsoft.AspNet.WebUtilities { if (value < 0) { - throw new ArgumentOutOfRangeException("value", value, "Position must be positive."); + throw new ArgumentOutOfRangeException(nameof(value), value, "Position must be positive."); } if (value == Position) { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 02d99a33d4..5e3059280d 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -70,11 +70,11 @@ namespace Microsoft.AspNet.WebUtilities { if (value < 0) { - throw new ArgumentOutOfRangeException("value", value, "The Position must be positive."); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be positive."); } if (value > _observedLength) { - throw new ArgumentOutOfRangeException("value", value, "The Position must be less than length."); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be less than length."); } _position = value; if (_position < _observedLength) diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index bef8b5463a..132f106e07 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -175,11 +175,11 @@ namespace Microsoft.AspNet.WebUtilities { if (offset < 0) { - throw new ArgumentOutOfRangeException("offset"); + throw new ArgumentOutOfRangeException(nameof(offset)); } if (count < 0) { - throw new ArgumentOutOfRangeException("count"); + throw new ArgumentOutOfRangeException(nameof(count)); } if (bufferLength - offset < count) { diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index b6b1aabe8c..25fe03cd9a 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -127,7 +127,7 @@ namespace Microsoft.Net.Http.Headers } else if (value < 0) { - throw new ArgumentOutOfRangeException("value"); + throw new ArgumentOutOfRangeException(nameof(value)); } else if (sizeParameter != null) { @@ -656,7 +656,7 @@ namespace Microsoft.Net.Http.Headers { if ((index < 0) || (index >= pattern.Length)) { - throw new ArgumentOutOfRangeException("index"); + throw new ArgumentOutOfRangeException(nameof(index)); } if ((pattern[index] == '%') && (pattern.Length - index >= 3)) diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index 634278e3a9..abce604280 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -29,15 +29,15 @@ namespace Microsoft.Net.Http.Headers if (length < 0) { - throw new ArgumentOutOfRangeException("length"); + throw new ArgumentOutOfRangeException(nameof(length)); } if ((to < 0) || (to > length)) { - throw new ArgumentOutOfRangeException("to"); + throw new ArgumentOutOfRangeException(nameof(to)); } if ((from < 0) || (from > to)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(from)); } _from = from; @@ -52,7 +52,7 @@ namespace Microsoft.Net.Http.Headers if (length < 0) { - throw new ArgumentOutOfRangeException("length"); + throw new ArgumentOutOfRangeException(nameof(length)); } _length = length; @@ -65,11 +65,11 @@ namespace Microsoft.Net.Http.Headers if (to < 0) { - throw new ArgumentOutOfRangeException("to"); + throw new ArgumentOutOfRangeException(nameof(to)); } if ((from < 0) || (from > to)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(@from)); } _from = from; diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs index 4cc5c38dfa..216fa942a8 100644 --- a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -39,7 +39,7 @@ namespace Microsoft.Net.Http.Headers { if (string.IsNullOrEmpty(tag)) { - throw new ArgumentException("An empty string is not allowed.", "tag"); + throw new ArgumentException("An empty string is not allowed.", nameof(tag)); } int length = 0; diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index d344d992aa..e42240a1dd 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -27,7 +27,7 @@ namespace Microsoft.Net.Http.Headers // value. if ((value < 0) || (value > 1)) { - throw new ArgumentOutOfRangeException("value"); + throw new ArgumentOutOfRangeException(nameof(value)); } var qualityString = ((double)value).ToString("0.0##", NumberFormatInfo.InvariantInfo); diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index 6ec2883d3b..90e7718c4c 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers // null values cannot be added to the collection. if (item == null) { - throw new ArgumentNullException("item"); + throw new ArgumentNullException(nameof(item)); } } } diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs index 189d775d61..c564722d51 100644 --- a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -28,7 +28,7 @@ namespace Microsoft.Net.Http.Headers { if (entityTag == null) { - throw new ArgumentNullException("entityTag"); + throw new ArgumentNullException(nameof(entityTag)); } _entityTag = entityTag; diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index f4893ba5dc..772a1c923a 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -21,15 +21,15 @@ namespace Microsoft.Net.Http.Headers } if (from.HasValue && (from.Value < 0)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(from)); } if (to.HasValue && (to.Value < 0)) { - throw new ArgumentOutOfRangeException("to"); + throw new ArgumentOutOfRangeException(nameof(to)); } if (from.HasValue && to.HasValue && (from.Value > to.Value)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(from)); } _from = from; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index e845c84fe8..ab33ba4a0f 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -36,7 +36,7 @@ namespace Microsoft.Net.Http.Headers if ((quality < 0) || (quality > 1)) { - throw new ArgumentOutOfRangeException("quality"); + throw new ArgumentOutOfRangeException(nameof(quality)); } _value = value; From a79b05bf2400809778b77440fbf683bd422a891c Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 12 Jun 2015 12:59:07 -0700 Subject: [PATCH 332/846] #320 Rename OnSendingHeaders to OnResponseStarting and HeadersSent to HasStarted. --- src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs | 4 ++-- .../IHttpResponseFeature.cs | 4 ++-- src/Microsoft.AspNet.Http/DefaultHttpResponse.cs | 8 ++++---- src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index a3317f873d..a0a92fb823 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -22,9 +22,9 @@ namespace Microsoft.AspNet.Http public abstract IResponseCookies Cookies { get; } - public abstract bool HeadersSent { get; } + public abstract bool HasStarted { get; } - public abstract void OnSendingHeaders(Action callback, object state); + public abstract void OnResponseStarting(Action callback, object state); public abstract void OnResponseCompleted(Action callback, object state); diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index e93a9d1c03..9057a9991f 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -13,8 +13,8 @@ namespace Microsoft.AspNet.Http.Features string ReasonPhrase { get; set; } IDictionary Headers { get; set; } Stream Body { get; set; } - bool HeadersSent { get; } - void OnSendingHeaders(Action callback, object state); + bool HasStarted { get; } + void OnResponseStarting(Action callback, object state); void OnResponseCompleted(Action callback, object state); } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index d264ff97a3..2f38ac9cbe 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -89,14 +89,14 @@ namespace Microsoft.AspNet.Http.Internal get { return ResponseCookiesFeature.Cookies; } } - public override bool HeadersSent + public override bool HasStarted { - get { return HttpResponseFeature.HeadersSent; } + get { return HttpResponseFeature.HasStarted; } } - public override void OnSendingHeaders(Action callback, object state) + public override void OnResponseStarting(Action callback, object state) { - HttpResponseFeature.OnSendingHeaders(callback, state); + HttpResponseFeature.OnResponseStarting(callback, state); } public override void OnResponseCompleted(Action callback, object state) diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 70b9128737..5e32a938be 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -24,12 +24,12 @@ namespace Microsoft.AspNet.Http.Features.Internal public Stream Body { get; set; } - public bool HeadersSent + public bool HasStarted { get { return false; } } - public void OnSendingHeaders(Action callback, object state) + public void OnResponseStarting(Action callback, object state) { throw new NotSupportedException(); } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index b96396f73a..0f5237ffbd 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Owin { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnResponseStarting)) }, { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index ec50c50928..c4030d9ed6 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -142,12 +142,12 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseBody, value); } } - bool IHttpResponseFeature.HeadersSent + bool IHttpResponseFeature.HasStarted { get { return _headersSent; } } - void IHttpResponseFeature.OnSendingHeaders(Action callback, object state) + void IHttpResponseFeature.OnResponseStarting(Action callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); if (register == null) From af6a17710b4e7f0b0165e4beb02d61cbad6e9da2 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 16 Jun 2015 16:26:37 -0700 Subject: [PATCH 333/846] #310 Refactor IRequestIdentifierFeature. --- ...re.cs => IHttpRequestIdentifierFeature.cs} | 4 ++-- .../Features/HttpRequestIdentifierFeature.cs | 10 ++++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 9 ++++++--- .../OwinFeatureCollection.cs | 20 +++++-------------- 4 files changed, 23 insertions(+), 20 deletions(-) rename src/Microsoft.AspNet.Http.Features/{IRequestIdentifierFeature.cs => IHttpRequestIdentifierFeature.cs} (80%) create mode 100644 src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs similarity index 80% rename from src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs index b34afe8f96..163988d832 100644 --- a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs @@ -8,11 +8,11 @@ namespace Microsoft.AspNet.Http.Features /// /// Feature to identify a request. /// - public interface IRequestIdentifierFeature + public interface IHttpRequestIdentifierFeature { /// /// Identifier to trace a request. /// - Guid TraceIdentifier { get; } + string TraceIdentifier { get; set; } } } diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs new file mode 100644 index 0000000000..01dd9d0ee5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features.Internal +{ + public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature + { + public string TraceIdentifier { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 0f5237ffbd..5d1f95119c 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -15,6 +15,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; @@ -80,6 +81,11 @@ namespace Microsoft.AspNet.Owin { OwinConstants.Security.User, new FeatureMap(feature => feature.User, ()=> null, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), () => new HttpAuthenticationFeature()) + }, + + { OwinConstants.RequestId, new FeatureMap(feature => feature.TraceIdentifier, + ()=> null, (feature, value) => feature.TraceIdentifier = (string)value, + () => new HttpRequestIdentifierFeature()) } }; @@ -113,9 +119,6 @@ namespace Microsoft.AspNet.Owin } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN - - // The request identifier is a string per the spec. - _entries[OwinConstants.RequestId] = new FeatureMap(feature => feature.TraceIdentifier.ToString()); } // Public in case there's a new/custom feature interface that needs to be added. diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index c4030d9ed6..b7e6598383 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -30,11 +30,11 @@ namespace Microsoft.AspNet.Owin IHttpConnectionFeature, IHttpSendFileFeature, ITlsConnectionFeature, + IHttpRequestIdentifierFeature, IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, IHttpWebSocketFeature, - IOwinEnvironmentFeature, - IRequestIdentifierFeature + IOwinEnvironmentFeature { public IDictionary Environment { get; set; } private bool _headersSent; @@ -435,20 +435,10 @@ namespace Microsoft.AspNet.Owin get { return true; } } - Guid IRequestIdentifierFeature.TraceIdentifier + string IHttpRequestIdentifierFeature.TraceIdentifier { - get - { - var requestId = Prop(OwinConstants.RequestId); - Guid requestIdentifier; - - if (requestId != null && Guid.TryParse(requestId, out requestIdentifier)) - { - return requestIdentifier; - } - - return Guid.Empty; - } + get { return Prop(OwinConstants.RequestId); } + set { Prop(OwinConstants.RequestId, value); } } public bool Remove(KeyValuePair item) From 1abb33d4bc3748782de554a0d90e37c19fd21733 Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 16 Jun 2015 09:14:37 -0700 Subject: [PATCH 334/846] Adding a couple mono tests back in --- .../RangeConditionHeaderValueTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs index 1f69a9605e..ce7c73997b 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -112,7 +112,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] @@ -141,7 +141,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] From c83ff60275670282c2b19741669dc25e63477162 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 23 Jun 2015 10:58:52 -0700 Subject: [PATCH 335/846] Change hardcoded `bash` shebang to `env` - aspnet/Home#695 - support various `bash` installation locations - in particular, enable building on FreeBSD --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index d81164353c..3ef874f9bd 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild From 12b78a31bf1bc9df893ca93252cded57654e19c0 Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Fri, 19 Jun 2015 12:32:53 -0700 Subject: [PATCH 336/846] Added more tests and error handling for construction of middleware classes #236 --- .../Extensions/UseMiddlewareExtensions.cs | 34 ++++- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/Resources.Designer.cs | 110 ++++++++++++++ .../Resources.resx | 135 ++++++++++++++++++ .../UseMiddlewareTest.cs | 112 +++++++++++++++ 5 files changed, 388 insertions(+), 7 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs create mode 100644 src/Microsoft.AspNet.Http.Abstractions/Resources.resx create mode 100644 test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index b247ab3cac..04430164df 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -6,12 +6,14 @@ using System.Linq; using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Abstractions; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { public static class UseMiddlewareExtensions { + const string InvokeMethodName = "Invoke"; public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) { return builder.UseMiddleware(typeof(T), args); @@ -22,24 +24,44 @@ namespace Microsoft.AspNet.Builder var applicationServices = builder.ApplicationServices; return builder.Use(next => { - var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); - var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); - var parameters = methodinfo.GetParameters(); - if (parameters[0].ParameterType != typeof(HttpContext)) + var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public); + var invokeMethods = methods.Where(m => string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal)).ToArray(); + if (invokeMethods.Length > 1) { - throw new Exception("Middleware Invoke method must take first argument of HttpContext"); + throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName)); } + + if (invokeMethods.Length == 0) + { + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName)); + } + + var methodinfo = invokeMethods[0]; + if (!typeof(Task).IsAssignableFrom(methodinfo.ReturnType)) + { + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNonTaskReturnType(InvokeMethodName, nameof(Task))); + } + + var parameters = methodinfo.GetParameters(); + if (parameters.Length == 0 || parameters[0].ParameterType != typeof(HttpContext)) + { + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName,nameof(HttpContext))); + } + + var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); if (parameters.Length == 1) { return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); } + return context => { var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; if (serviceProvider == null) { - throw new Exception("IServiceProvider is not available"); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); } + var arguments = new object[parameters.Length]; arguments[0] = context; for(var index = 1; index != parameters.Length; ++index) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index 025a94598c..2565f9261e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Runtime.CompilerServices; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..9fb86a30c6 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs @@ -0,0 +1,110 @@ +// +namespace Microsoft.AspNet.Http.Abstractions +{ + using System.Globalization; + using System.Reflection; + using System.Resources; + + internal static class Resources + { + private static readonly ResourceManager _resourceManager + = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); + + /// + /// '{0}' is not available. + /// + internal static string Exception_UseMiddlewareIServiceProviderNotAvailable + { + get { return GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"); } + } + + /// + /// '{0}' is not available. + /// + internal static string FormatException_UseMiddlewareIServiceProviderNotAvailable(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"), p0); + } + + /// + /// No public '{0}' method found. + /// + internal static string Exception_UseMiddlewareNoInvokeMethod + { + get { return GetString("Exception_UseMiddlewareNoInvokeMethod"); } + } + + /// + /// No public '{0}' method found. + /// + internal static string FormatException_UseMiddlewareNoInvokeMethod(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0); + } + + /// + /// '{0}' does not return an object of type '{1}'. + /// + internal static string Exception_UseMiddlewareNonTaskReturnType + { + get { return GetString("Exception_UseMiddlewareNonTaskReturnType"); } + } + + /// + /// '{0}' does not return an object of type '{1}'. + /// + internal static string FormatException_UseMiddlewareNonTaskReturnType(object p0, object p1) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNonTaskReturnType"), p0, p1); + } + + /// + /// The '{0}' method's first argument must be of type '{1}'. + /// + internal static string Exception_UseMiddlewareNoParameters + { + get { return GetString("Exception_UseMiddlewareNoParameters"); } + } + + /// + /// The '{0}' method's first argument must be of type '{1}'. + /// + internal static string FormatException_UseMiddlewareNoParameters(object p0, object p1) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoParameters"), p0, p1); + } + + /// + /// Multiple public '{0}' methods are available. + /// + internal static string Exception_UseMiddleMutlipleInvokes + { + get { return GetString("Exception_UseMiddleMutlipleInvokes"); } + } + + /// + /// Multiple public '{0}' methods are available. + /// + internal static string FormatException_UseMiddleMutlipleInvokes(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0); + } + + private static string GetString(string name, params string[] formatterNames) + { + var value = _resourceManager.GetString(name); + + System.Diagnostics.Debug.Assert(value != null); + + if (formatterNames != null) + { + for (var i = 0; i < formatterNames.Length; i++) + { + value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}"); + } + } + + return value; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx new file mode 100644 index 0000000000..bdd74fd6de --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + '{0}' is not available. + + + No public '{0}' method found. + + + '{0}' does not return an object of type '{1}'. + + + The '{0}' method's first argument must be of type '{1}'. + + + Multiple public '{0}' methods are available. + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs new file mode 100644 index 0000000000..1839631d61 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -0,0 +1,112 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Builder.Internal; +using Microsoft.AspNet.Http.Abstractions; +using Xunit; + +namespace Microsoft.AspNet.Http +{ + public class UseMiddlewareTest + { + [Fact] + public void UseMiddleware_WithNoParameters_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareNoParametersStub)); + var exception = Assert.Throws(() => builder.Build()); + + Assert.Equal(Resources.FormatException_UseMiddlewareNoParameters("Invoke",nameof(HttpContext)), exception.Message); + } + + [Fact] + public void UseMiddleware_NonTaskReturnType_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareNonTaskReturnStub)); + var exception = Assert.Throws(() => builder.Build()); + Assert.Equal(Resources.FormatException_UseMiddlewareNonTaskReturnType("Invoke", nameof(Task)), exception.Message); + } + + [Fact] + public void UseMiddleware_NoInvokeMethod_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareNoInvokeStub)); + var exception = Assert.Throws(() => builder.Build()); + Assert.Equal(Resources.FormatException_UseMiddlewareNoInvokeMethod("Invoke"), exception.Message); + } + + [Fact] + public void UseMiddleware_MutlipleInvokeMethods_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareMultipleInvokesStub)); + var exception = Assert.Throws(() => builder.Build()); + Assert.Equal(Resources.FormatException_UseMiddleMutlipleInvokes("Invoke"), exception.Message); + } + + private class DummyServiceProvider : IServiceProvider + { + public object GetService(Type serviceType) + { + return null; + } + } + + private class MiddlewareNoParametersStub + { + public MiddlewareNoParametersStub(RequestDelegate next) + { + } + + public Task Invoke() + { + return Task.FromResult(0); + } + } + + private class MiddlewareNonTaskReturnStub + { + public MiddlewareNonTaskReturnStub(RequestDelegate next) + { + } + + public int Invoke() + { + return 0; + } + } + + private class MiddlewareNoInvokeStub + { + public MiddlewareNoInvokeStub(RequestDelegate next) + { + } + } + + private class MiddlewareMultipleInvokesStub + { + public MiddlewareMultipleInvokesStub(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context) + { + return Task.FromResult(0); + } + + public Task Invoke(HttpContext context, int i) + { + return Task.FromResult(0); + } + } + } +} \ No newline at end of file From 652d885402c204e468c22baf46d118c7ec8ca86c Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 25 Jun 2015 09:34:14 -0700 Subject: [PATCH 337/846] #177 Immutable HeaderValue objects. --- .../HeaderUtilities.cs | 8 +++ .../MediaTypeHeaderValue.cs | 61 +++++++++++++++--- .../NameValueHeaderValue.cs | 26 +++++++- .../ObjectCollection.cs | 64 +++++++++++++++---- src/Microsoft.Net.Http.Headers/project.json | 1 + .../project.json | 2 +- .../MediaTypeHeaderValueTest.cs | 51 +++++++++++++-- .../NameValueHeaderValueTest.cs | 56 ++++++++++++++-- 8 files changed, 233 insertions(+), 36 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index e42240a1dd..630e02b93f 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -228,5 +228,13 @@ namespace Microsoft.Net.Http.Headers } return input; } + + internal static void ThrowIfReadOnly(bool isReadOnly) + { + if (isReadOnly) + { + throw new InvalidOperationException("The object cannot be modified because it is read-only."); + } + } } } diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 173bf7c404..968eb4c6cc 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; +using System.Linq; using System.Text; namespace Microsoft.Net.Http.Headers @@ -19,9 +20,10 @@ namespace Microsoft.Net.Http.Headers private static readonly HttpHeaderParser MultipleValueParser = new GenericHeaderParser(true, GetMediaTypeLength); - // Use list instead of dictionary since we may have multiple parameters with the same name. - private ICollection _parameters; + // Use a collection instead of a dictionary since we may have multiple parameters with the same name. + private ObjectCollection _parameters; private string _mediaType; + private bool _isReadOnly; private MediaTypeHeaderValue() { @@ -48,6 +50,7 @@ namespace Microsoft.Net.Http.Headers } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); // We don't prevent a user from setting whitespace-only charsets. Like we can't prevent a user from // setting a non-existing charset. var charsetParameter = NameValueHeaderValue.Find(_parameters, CharsetString); @@ -93,6 +96,7 @@ namespace Microsoft.Net.Http.Headers } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); if (value == null) { Charset = null; @@ -112,6 +116,7 @@ namespace Microsoft.Net.Http.Headers } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); var boundaryParameter = NameValueHeaderValue.Find(_parameters, BoundaryString); if (string.IsNullOrEmpty(value)) { @@ -141,7 +146,14 @@ namespace Microsoft.Net.Http.Headers { if (_parameters == null) { - _parameters = new ObjectCollection(); + if (IsReadOnly) + { + _parameters = ObjectCollection.EmptyReadOnlyCollection; + } + else + { + _parameters = new ObjectCollection(); + } } return _parameters; } @@ -158,6 +170,7 @@ namespace Microsoft.Net.Http.Headers get { return _mediaType; } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); CheckMediaTypeFormat(value, "value"); _mediaType = value; } @@ -201,6 +214,11 @@ namespace Microsoft.Net.Http.Headers } } + public bool IsReadOnly + { + get { return _isReadOnly; } + } + public bool IsSubsetOf(MediaTypeHeaderValue otherMediaType) { if (otherMediaType == null) @@ -253,22 +271,47 @@ namespace Microsoft.Net.Http.Headers /// while avoiding the cost of revalidating the components. /// /// A deep copy. - public MediaTypeHeaderValue Clone() + public MediaTypeHeaderValue Copy() { + if (IsReadOnly) + { + return this; + } + var other = new MediaTypeHeaderValue(); other._mediaType = _mediaType; if (_parameters != null) { - other._parameters = new ObjectCollection(); - foreach (var pair in _parameters) - { - other._parameters.Add(pair.Clone()); - } + other._parameters = new ObjectCollection( + _parameters.Select(item => item.Copy())); } return other; } + /// + /// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components, + /// while avoiding the cost of revalidating the components. This copy is read-only. + /// + /// A deep, read-only, copy. + public MediaTypeHeaderValue CopyAsReadOnly() + { + if (IsReadOnly) + { + return this; + } + + var other = new MediaTypeHeaderValue(); + other._mediaType = _mediaType; + if (_parameters != null) + { + other._parameters = new ObjectCollection( + _parameters.Select(item => item.CopyAsReadOnly()), isReadOnly: true); + } + other._isReadOnly = true; + return other; + } + public override string ToString() { return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true); diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index 08a08f96ef..a91b98e358 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -20,6 +20,7 @@ namespace Microsoft.Net.Http.Headers private string _name; private string _value; + private bool _isReadOnly; private NameValueHeaderValue() { @@ -49,17 +50,25 @@ namespace Microsoft.Net.Http.Headers get { return _value; } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); CheckValueFormat(value); _value = value; } } + public bool IsReadOnly { get { return _isReadOnly; } } + /// /// Provides a copy of this object without the cost of re-validating the values. /// /// A copy. - public NameValueHeaderValue Clone() + public NameValueHeaderValue Copy() { + if (IsReadOnly) + { + return this; + } + return new NameValueHeaderValue() { _name = _name, @@ -67,6 +76,21 @@ namespace Microsoft.Net.Http.Headers }; } + public NameValueHeaderValue CopyAsReadOnly() + { + if (IsReadOnly) + { + return this; + } + + return new NameValueHeaderValue() + { + _name = _name, + _value = _value, + _isReadOnly = true + }; + } + public override int GetHashCode() { Contract.Assert(_name != null); diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index 90e7718c4c..24237b6ff1 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; +using System.Collections.Generic; using System.Collections.ObjectModel; namespace Microsoft.Net.Http.Headers @@ -10,40 +12,74 @@ namespace Microsoft.Net.Http.Headers // type to throw if 'null' gets added. Collection internally uses List which comes at some cost. In addition // Collection.Add() calls List.InsertItem() which is an O(n) operation (compared to O(1) for List.Add()). // This type is only used for very small collections (1-2 items) to keep the impact of using Collection small. - internal class ObjectCollection : Collection where T : class + internal class ObjectCollection : ICollection where T : class { - private static readonly Action DefaultValidator = CheckNotNull; + internal static readonly Action DefaultValidator = CheckNotNull; + internal static readonly ObjectCollection EmptyReadOnlyCollection + = new ObjectCollection(DefaultValidator, isReadOnly: true); - private Action _validator; + private readonly Collection _collection = new Collection(); + private readonly Action _validator; + private readonly bool _isReadOnly; public ObjectCollection() : this(DefaultValidator) { } - public ObjectCollection(Action validator) + public ObjectCollection(Action validator, bool isReadOnly = false) { _validator = validator; + _isReadOnly = isReadOnly; } - protected override void InsertItem(int index, T item) + public ObjectCollection(IEnumerable other, bool isReadOnly = false) { - if (_validator != null) + _validator = DefaultValidator; + foreach (T item in other) { - _validator(item); + Add(item); } - base.InsertItem(index, item); + _isReadOnly = isReadOnly; } - protected override void SetItem(int index, T item) + public int Count { - if (_validator != null) - { - _validator(item); - } - base.SetItem(index, item); + get { return _collection.Count; } } + public bool IsReadOnly + { + get { return _isReadOnly; } + } + + public void Add(T item) + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + _validator(item); + _collection.Add(item); + } + + public bool Remove(T item) + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + return _collection.Remove(item); + } + + public void Clear() + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + _collection.Clear(); + } + + public bool Contains(T item) => _collection.Contains(item); + + public void CopyTo(T[] array, int arrayIndex) => _collection.CopyTo(array, arrayIndex); + + public IEnumerator GetEnumerator() => _collection.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => _collection.GetEnumerator(); + private static void CheckNotNull(T item) { // null values cannot be added to the collection. diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 15f82024e2..fcbada8643 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -12,6 +12,7 @@ "System.Diagnostics.Contracts": "4.0.0-beta-*", "System.Globalization": "4.0.10-beta-*", "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", "System.Text.Encoding": "4.0.10-beta-*", "System.Runtime": "4.0.20-beta-*" } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index b0ba4aa9fe..e44f880a72 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -20,5 +20,5 @@ } } }, - "resources": "..\\..\\unicode\\UnicodeData.txt" + "resource": "..\\..\\unicode\\UnicodeData.txt" } diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 92ec8f9726..cfd389e4d4 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -65,10 +65,10 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void Clone_SimpleMediaType_Copied() + public void Copy_SimpleMediaType_Copied() { var mediaType0 = new MediaTypeHeaderValue("text/plain"); - var mediaType1 = mediaType0.Clone(); + var mediaType1 = mediaType0.Copy(); Assert.NotSame(mediaType0, mediaType1); Assert.Same(mediaType0.MediaType, mediaType1.MediaType); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); @@ -76,11 +76,26 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void Clone_WithParameters_Copied() + public void CopyAsReadOnly_SimpleMediaType_CopiedAndReadOnly() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + var mediaType1 = mediaType0.CopyAsReadOnly(); + Assert.NotSame(mediaType0, mediaType1); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + + Assert.False(mediaType0.IsReadOnly); + Assert.True(mediaType1.IsReadOnly); + Assert.Throws(() => { mediaType1.MediaType = "some/value"; }); + } + + [Fact] + public void Copy_WithParameters_Copied() { var mediaType0 = new MediaTypeHeaderValue("text/plain"); mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); - var mediaType1 = mediaType0.Clone(); + var mediaType1 = mediaType0.Copy(); Assert.NotSame(mediaType0, mediaType1); Assert.Same(mediaType0.MediaType, mediaType1.MediaType); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); @@ -92,6 +107,34 @@ namespace Microsoft.Net.Http.Headers Assert.Same(pair0.Value, pair1.Value); } + [Fact] + public void CopyAsReadOnly_WithParameters_CopiedAndReadOnly() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType1 = mediaType0.CopyAsReadOnly(); + Assert.NotSame(mediaType0, mediaType1); + Assert.False(mediaType0.IsReadOnly); + Assert.True(mediaType1.IsReadOnly); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.False(mediaType0.Parameters.IsReadOnly); + Assert.True(mediaType1.Parameters.IsReadOnly); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + Assert.Throws(() => mediaType1.Parameters.Add(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Remove(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Clear()); + + var pair0 = mediaType0.Parameters.First(); + var pair1 = mediaType1.Parameters.First(); + Assert.NotSame(pair0, pair1); + Assert.False(pair0.IsReadOnly); + Assert.True(pair1.IsReadOnly); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + } + [Fact] public void MediaType_SetAndGetMediaType_MatchExpectations() { diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index a1e1a935f9..a5bf8c9b66 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -60,29 +60,71 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void Clone_NameOnly_SuccesfullyCopied() + public void Copy_NameOnly_SuccesfullyCopied() { var pair0 = new NameValueHeaderValue("name"); - var pair1 = pair0.Clone(); + var pair1 = pair0.Copy(); Assert.NotSame(pair0, pair1); Assert.Same(pair0.Name, pair1.Name); Assert.Null(pair0.Value); Assert.Null(pair1.Value); + + // Change one value and verify the other is unchanged. + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal(null, pair1.Value); } [Fact] - public void Clone_NameAndValue_SuccesfullyCopied() + public void CopyAsReadOnly_NameOnly_CopiedAndReadOnly() + { + var pair0 = new NameValueHeaderValue("name"); + var pair1 = pair0.CopyAsReadOnly(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Null(pair0.Value); + Assert.Null(pair1.Value); + Assert.False(pair0.IsReadOnly); + Assert.True(pair1.IsReadOnly); + + // Change one value and verify the other is unchanged. + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal(null, pair1.Value); + Assert.Throws(() => { pair1.Value = "othervalue"; }); + } + + [Fact] + public void Copy_NameAndValue_SuccesfullyCopied() { var pair0 = new NameValueHeaderValue("name", "value"); - var pair1 = pair0.Clone(); + var pair1 = pair0.Copy(); Assert.NotSame(pair0, pair1); Assert.Same(pair0.Name, pair1.Name); Assert.Same(pair0.Value, pair1.Value); // Change one value and verify the other is unchanged. - pair1.Value = "othervalue"; - Assert.Equal("value", pair0.Value); - Assert.Equal("othervalue", pair1.Value); + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal("value", pair1.Value); + } + + [Fact] + public void CopyAsReadOnly_NameAndValue_CopiedAndReadOnly() + { + var pair0 = new NameValueHeaderValue("name", "value"); + var pair1 = pair0.CopyAsReadOnly(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + Assert.False(pair0.IsReadOnly); + Assert.True(pair1.IsReadOnly); + + // Change one value and verify the other is unchanged. + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal("value", pair1.Value); + Assert.Throws(() => { pair1.Value = "othervalue"; }); } [Fact] From eb423e57d69a575c71173f0df33c2bcad6ec5082 Mon Sep 17 00:00:00 2001 From: Hisham Abdullah Bin Ateya Date: Fri, 12 Jun 2015 04:12:30 +0300 Subject: [PATCH 338/846] Using 'nameof' operator instead of magic strings Fix back-end field issue Fix back-end field issue --- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 2 +- src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs | 4 ++-- src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs | 4 ++-- .../StringWithQualityHeaderValue.cs | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 8102528ae4..c9262718d1 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Owin _webSocket.Abort(); break; default: - throw new ArgumentOutOfRangeException("state", _webSocket.State, string.Empty); + throw new ArgumentOutOfRangeException(nameof(_webSocket.State), _webSocket.State, string.Empty); } } diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index 48dfc913a9..c1940754ba 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -597,7 +597,7 @@ namespace Microsoft.Net.Http.Headers private static void CheckIsValidToken(string item) { - HeaderUtilities.CheckValidToken(item, "item"); + HeaderUtilities.CheckValidToken(item, nameof(item)); } } } diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index abce604280..092bb83320 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -82,7 +82,7 @@ namespace Microsoft.Net.Http.Headers get { return _unit; } set { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); _unit = value; } } diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index 11c5500a31..5006792814 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -39,7 +39,7 @@ namespace Microsoft.Net.Http.Headers get { return _name; } set { - CheckNameFormat(value, "name"); + CheckNameFormat(value, nameof(value)); _name = value; } } @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers get { return _value; } set { - CheckValueFormat(value, "value"); + CheckValueFormat(value, nameof(value)); _value = value; } } diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index a91b98e358..c2e38e643c 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -363,7 +363,7 @@ namespace Microsoft.Net.Http.Headers private static void CheckNameValueFormat(string name, string value) { - HeaderUtilities.CheckValidToken(name, "name"); + HeaderUtilities.CheckValidToken(name, nameof(name)); CheckValueFormat(value); } diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs index 445752a13d..3657e24c27 100644 --- a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs @@ -33,7 +33,7 @@ namespace Microsoft.Net.Http.Headers get { return _unit; } set { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); _unit = value; } } diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index b470471e4e..52fdd46a36 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers get { return _name; } set { - CookieHeaderValue.CheckNameFormat(value, "name"); + CookieHeaderValue.CheckNameFormat(value, nameof(value)); _name = value; } } @@ -59,7 +59,7 @@ namespace Microsoft.Net.Http.Headers get { return _value; } set { - CookieHeaderValue.CheckValueFormat(value, "value"); + CookieHeaderValue.CheckValueFormat(value, nameof(value)); _value = value; } } diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index ab33ba4a0f..36e9a3fd58 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -25,14 +25,14 @@ namespace Microsoft.Net.Http.Headers public StringWithQualityHeaderValue(string value) { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); _value = value; } public StringWithQualityHeaderValue(string value, double quality) { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); if ((quality < 0) || (quality > 1)) { From 641a7fb82bf04438356abce8301cc17fe73ddb20 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 25 Jun 2015 12:20:53 -0700 Subject: [PATCH 339/846] Correct exception type. --- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index c9262718d1..1ddc83a499 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Owin _webSocket.Abort(); break; default: - throw new ArgumentOutOfRangeException(nameof(_webSocket.State), _webSocket.State, string.Empty); + throw new NotSupportedException($"Unsupported {nameof(WebSocketState)} value: {_webSocket.State}."); } } From 5fe8037281bb826e0708abdcdafbc76571dc21f5 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 25 Jun 2015 17:03:10 -0700 Subject: [PATCH 340/846] Auth API changes (Async, ChallengeBehavior) --- .../Authentication/AuthenticateResult.cs | 44 ------------- .../Authentication/AuthenticationManager.cs | 60 +++++++++++------ .../HttpResponse.cs | 24 +++++-- .../Authentication/ChallengeBehavior.cs | 12 ++++ .../Authentication/ChallengeContext.cs | 10 ++- .../Authentication/IAuthenticationHandler.cs | 8 +-- .../IHttpResponseFeature.cs | 5 +- .../DefaultAuthenticationManager.cs | 66 ++++--------------- .../DefaultHttpResponse.cs | 9 +-- .../Features/HttpResponseFeature.cs | 9 +-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 10 ++- .../OwinFeatureCollection.cs | 8 ++- .../DefaultAuthenticationManagerTests.cs | 43 +++++------- 13 files changed, 139 insertions(+), 169 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs create mode 100644 src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs deleted file mode 100644 index 28060a24e2..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Security.Claims; -using Microsoft.Framework.Internal; - -namespace Microsoft.AspNet.Http.Authentication -{ - /// - /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. - /// - public class AuthenticationResult - { - /// - /// Create an instance of the result object - /// - /// Assigned to Identity. May be null. - /// Assigned to Properties. Contains extra information carried along with the identity. - /// Assigned to Description. Contains information describing the authentication provider. - public AuthenticationResult(ClaimsPrincipal principal, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) - { - Principal = principal; - Properties = properties; - Description = description; - } - - /// - /// Contains the claims that were authenticated by the given AuthenticationScheme. If the authentication - /// scheme was not successful the Identity property will be null. - /// - public ClaimsPrincipal Principal { get; private set; } - - /// - /// Contains extra values that were provided with the original SignIn call. - /// - public AuthenticationProperties Properties { get; private set; } - - /// - /// Contains description properties for the middleware authentication type in general. Does not - /// vary per request. - /// - public AuthenticationDescription Description { get; private set; } - } -} diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index 331c4c8fe1..e10e081717 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { @@ -11,41 +13,61 @@ namespace Microsoft.AspNet.Http.Authentication { public abstract IEnumerable GetAuthenticationSchemes(); - public abstract AuthenticationResult Authenticate(string authenticationScheme); + public abstract Task AuthenticateAsync([NotNull] AuthenticateContext context); - public abstract Task AuthenticateAsync(string authenticationScheme); - - public virtual void Challenge() + public virtual async Task AuthenticateAsync([NotNull] string authenticationScheme) { - Challenge(authenticationScheme: null, properties: null); + var context = new AuthenticateContext(authenticationScheme); + await AuthenticateAsync(context); + return context.Principal; } - public virtual void Challenge(AuthenticationProperties properties) + public virtual Task ChallengeAsync() { - Challenge(authenticationScheme: null, properties: properties); + return ChallengeAsync(properties: null); } - public virtual void Challenge(string authenticationScheme) + public virtual Task ChallengeAsync(AuthenticationProperties properties) { - Challenge(authenticationScheme: authenticationScheme, properties: null); + return ChallengeAsync(authenticationScheme: string.Empty, properties: properties); } - public abstract void Challenge(string authenticationScheme, AuthenticationProperties properties); - - public void SignIn(string authenticationScheme, ClaimsPrincipal principal) + public virtual Task ChallengeAsync([NotNull] string authenticationScheme) { - SignIn(authenticationScheme, principal, properties: null); + return ChallengeAsync(authenticationScheme: authenticationScheme, properties: null); } - public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); - - public virtual void SignOut() + // Leave it up to authentication handler to do the right thing for the challenge + public virtual Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) { - SignOut(authenticationScheme: null, properties: null); + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Automatic); } - public abstract void SignOut(string authenticationScheme); + public virtual Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal) + { + return SignInAsync(authenticationScheme, principal, properties: null); + } - public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); + public virtual Task ForbidAsync([NotNull] string authenticationScheme) + { + return ForbidAsync(authenticationScheme, properties: null); + } + + // Deny access (typically a 403) + public virtual Task ForbidAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + { + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Forbidden); + } + + public abstract Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); + + public abstract Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties); + + public virtual Task SignOutAsync([NotNull] string authenticationScheme) + { + return SignOutAsync(authenticationScheme, properties: null); + } + + public abstract Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index a0a92fb823..914e9604c9 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -3,11 +3,20 @@ using System; using System.IO; +using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { public abstract class HttpResponse { + private static readonly Func _callbackDelegate = callback => ((Func)callback)(); + private static readonly Func _disposeDelegate = disposable => + { + ((IDisposable)disposable).Dispose(); + return Task.FromResult(0); + }; + public abstract HttpContext HttpContext { get; } public abstract int StatusCode { get; set; } @@ -24,14 +33,17 @@ namespace Microsoft.AspNet.Http public abstract bool HasStarted { get; } - public abstract void OnResponseStarting(Action callback, object state); + public abstract void OnStarting([NotNull] Func callback, object state); - public abstract void OnResponseCompleted(Action callback, object state); + public virtual void OnStarting([NotNull] Func callback) => OnStarting(_callbackDelegate, callback); - public virtual void Redirect(string location) - { - Redirect(location, permanent: false); - } + public abstract void OnCompleted([NotNull] Func callback, object state); + + public virtual void OnCompletedDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + + public virtual void OnCompleted([NotNull] Func callback) => OnCompleted(_callbackDelegate, callback); + + public virtual void Redirect(string location) => Redirect(location, permanent: false); public abstract void Redirect(string location, bool permanent); } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs new file mode 100644 index 0000000000..1be42f700b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs @@ -0,0 +1,12 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features.Authentication +{ + public enum ChallengeBehavior + { + Automatic, + Unauthorized, + Forbidden + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index 592086e83c..5dfcd16914 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -3,19 +3,27 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class ChallengeContext { - public ChallengeContext(string authenticationScheme, IDictionary properties) + public ChallengeContext([NotNull] string authenticationScheme) : this(authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) + { + } + + public ChallengeContext([NotNull] string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) { AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); + Behavior = behavior; } public string AuthenticationScheme { get; } + public ChallengeBehavior Behavior { get; } + public IDictionary Properties { get; } public bool Accepted { get; private set; } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs index 9f551b8bdd..155cd87380 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs @@ -9,14 +9,12 @@ namespace Microsoft.AspNet.Http.Features.Authentication { void GetDescriptions(DescribeSchemesContext context); - void Authenticate(AuthenticateContext context); - Task AuthenticateAsync(AuthenticateContext context); - void Challenge(ChallengeContext context); + Task ChallengeAsync(ChallengeContext context); - void SignIn(SignInContext context); + Task SignInAsync(SignInContext context); - void SignOut(SignOutContext context); + Task SignOutAsync(SignOutContext context); } } diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index 9057a9991f..d530718b17 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http.Features { @@ -14,7 +15,7 @@ namespace Microsoft.AspNet.Http.Features IDictionary Headers { get; set; } Stream Body { get; set; } bool HasStarted { get; } - void OnResponseStarting(Action callback, object state); - void OnResponseCompleted(Action callback, object state); + void OnStarting(Func callback, object state); + void OnCompleted(Func callback, object state); } } diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 9f534a6ada..526dfea4f3 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -48,66 +48,29 @@ namespace Microsoft.AspNet.Http.Authentication.Internal return describeContext.Results.Select(description => new AuthenticationDescription(description)); } - public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) + public override async Task AuthenticateAsync([NotNull] AuthenticateContext context) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationScheme); if (handler != null) { - handler.Authenticate(authenticateContext); + await handler.AuthenticateAsync(context); } - if (!authenticateContext.Accepted) + if (!context.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {context.AuthenticationScheme}"); } - - if (authenticateContext.Principal == null) - { - return null; - } - - return new AuthenticationResult(authenticateContext.Principal, - new AuthenticationProperties(authenticateContext.Properties), - new AuthenticationDescription(authenticateContext.Description)); } - public override async Task AuthenticateAsync([NotNull] string authenticationScheme) + public override async Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationScheme); + var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items, behavior); if (handler != null) { - await handler.AuthenticateAsync(authenticateContext); - } - - // Verify all types ack'd - if (!authenticateContext.Accepted) - { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); - } - - if (authenticateContext.Principal == null) - { - return null; - } - - return new AuthenticationResult(authenticateContext.Principal, - new AuthenticationProperties(authenticateContext.Properties), - new AuthenticationDescription(authenticateContext.Description)); - } - - public override void Challenge(string authenticationScheme, AuthenticationProperties properties) - { - HttpResponseFeature.StatusCode = 401; - var handler = HttpAuthenticationFeature.Handler; - - var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items); - if (handler != null) - { - handler.Challenge(challengeContext); + await handler.ChallengeAsync(challengeContext); } // The default Challenge with no scheme is always accepted @@ -117,43 +80,36 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override void SignIn([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + public override async Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(authenticationScheme, principal, properties?.Items); if (handler != null) { - handler.SignIn(signInContext); + await handler.SignInAsync(signInContext); } - // Verify all types ack'd if (!signInContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } - public override void SignOut(string authenticationScheme, AuthenticationProperties properties) + public override async Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationScheme, properties?.Items); if (handler != null) { - handler.SignOut(signOutContext); + await handler.SignOutAsync(signOutContext); } - // Verify all types ack'd if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } - - public override void SignOut(string authenticationScheme) - { - SignOut(authenticationScheme, properties: null); - } } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 2f38ac9cbe..cf3b006945 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; @@ -94,14 +95,14 @@ namespace Microsoft.AspNet.Http.Internal get { return HttpResponseFeature.HasStarted; } } - public override void OnResponseStarting(Action callback, object state) + public override void OnStarting(Func callback, object state) { - HttpResponseFeature.OnResponseStarting(callback, state); + HttpResponseFeature.OnStarting(callback, state); } - public override void OnResponseCompleted(Action callback, object state) + public override void OnCompleted(Func callback, object state) { - HttpResponseFeature.OnResponseCompleted(callback, state); + HttpResponseFeature.OnCompleted(callback, state); } public override void Redirect(string location, bool permanent) diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 5e32a938be..84f8196f93 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http.Features.Internal { @@ -29,14 +30,14 @@ namespace Microsoft.AspNet.Http.Features.Internal get { return false; } } - public void OnResponseStarting(Action callback, object state) + public void OnStarting(Func callback, object state) { - throw new NotSupportedException(); + throw new NotImplementedException(); } - public void OnResponseCompleted(Action callback, object state) + public void OnCompleted(Func callback, object state) { - throw new NotSupportedException(); + throw new NotImplementedException(); } } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5d1f95119c..5c231eb0e8 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -62,7 +62,15 @@ namespace Microsoft.AspNet.Owin { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnResponseStarting)) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap( + feature => new Action, object>((cb, state) => { + feature.OnStarting(s => + { + cb(s); + return Task.FromResult(0); + }, state); + })) + }, { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index b7e6598383..b718d36097 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -147,17 +147,19 @@ namespace Microsoft.AspNet.Owin get { return _headersSent; } } - void IHttpResponseFeature.OnResponseStarting(Action callback, object state) + void IHttpResponseFeature.OnStarting(Func callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); if (register == null) { throw new NotSupportedException(OwinConstants.CommonKeys.OnSendingHeaders); } - register(callback, state); + + // Need to block on the callback since we can't change the OWIN signature to be async + register(s => callback(s).GetAwaiter().GetResult(), state); } - void IHttpResponseFeature.OnResponseCompleted(Action callback, object state) + void IHttpResponseFeature.OnCompleted(Func callback, object state) { throw new NotSupportedException(); } diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 652f3a1091..2871c27ec3 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -18,50 +18,46 @@ namespace Microsoft.AspNet.Http.Authentication.Internal public async Task AuthenticateWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Authentication.Authenticate("Foo")); await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); } [Fact] - public void ChallengeWithNoAuthMiddlewareMayThrow() + public async Task ChallengeWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Authentication.Challenge(); - Assert.Equal(401, context.Response.StatusCode); - - Assert.Throws(() => context.Authentication.Challenge("Foo")); + await context.Authentication.ChallengeAsync(); + Assert.Equal(200, context.Response.StatusCode); + await Assert.ThrowsAsync(() => context.Authentication.ChallengeAsync("Foo")); } [Fact] - public void SignInWithNoAuthMiddlewareThrows() + public async Task SignInWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); + await Assert.ThrowsAsync(() => context.Authentication.SignInAsync("Foo", new ClaimsPrincipal())); } [Fact] - public void SignOutWithNoAuthMiddlewareMayThrow() + public async Task SignOutWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Authentication.SignOut(); - - Assert.Throws(() => context.Authentication.SignOut("Foo")); + await Assert.ThrowsAsync(() => context.Authentication.SignOutAsync("Foo")); } [Fact] - public void SignInOutIn() + public async Task SignInOutIn() { var context = CreateContext(); var handler = new AuthHandler(); context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); var user = new ClaimsPrincipal(); - context.Authentication.SignIn("ignored", user); + await context.Authentication.SignInAsync("ignored", user); Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored"); + await context.Authentication.SignOutAsync("ignored"); Assert.False(handler.SignedIn); - context.Authentication.SignIn("ignored", user); + await context.Authentication.SignInAsync("ignored", user); Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + await context.Authentication.SignOutAsync("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); Assert.False(handler.SignedIn); } @@ -69,17 +65,12 @@ namespace Microsoft.AspNet.Http.Authentication.Internal { public bool SignedIn { get; set; } - public void Authenticate(AuthenticateContext context) - { - throw new NotImplementedException(); - } - public Task AuthenticateAsync(AuthenticateContext context) { throw new NotImplementedException(); } - public void Challenge(ChallengeContext context) + public Task ChallengeAsync(ChallengeContext context) { throw new NotImplementedException(); } @@ -89,16 +80,18 @@ namespace Microsoft.AspNet.Http.Authentication.Internal throw new NotImplementedException(); } - public void SignIn(SignInContext context) + public Task SignInAsync(SignInContext context) { SignedIn = true; context.Accept(); + return Task.FromResult(0); } - public void SignOut(SignOutContext context) + public Task SignOutAsync(SignOutContext context) { SignedIn = false; context.Accept(); + return Task.FromResult(0); } } From 40719b37f66e94f1295928bc942282cff9529a35 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 26 Jun 2015 14:34:22 -0700 Subject: [PATCH 341/846] #177 Enable Copy to return non-read-only. --- .../MediaTypeHeaderValue.cs | 5 ---- .../NameValueHeaderValue.cs | 5 ---- .../MediaTypeHeaderValueTest.cs | 23 +++++++++++++++++++ .../NameValueHeaderValueTest.cs | 16 +++++++++++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 968eb4c6cc..aebf80e00b 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -273,11 +273,6 @@ namespace Microsoft.Net.Http.Headers /// A deep copy. public MediaTypeHeaderValue Copy() { - if (IsReadOnly) - { - return this; - } - var other = new MediaTypeHeaderValue(); other._mediaType = _mediaType; diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index c2e38e643c..f5b1c72435 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -64,11 +64,6 @@ namespace Microsoft.Net.Http.Headers /// A copy. public NameValueHeaderValue Copy() { - if (IsReadOnly) - { - return this; - } - return new NameValueHeaderValue() { _name = _name, diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index cfd389e4d4..9ca74a3632 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -135,6 +135,29 @@ namespace Microsoft.Net.Http.Headers Assert.Same(pair0.Value, pair1.Value); } + [Fact] + public void CopyFromReadOnly_WithParameters_CopiedAsNonReadOnly() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType1 = mediaType0.CopyAsReadOnly(); + var mediaType2 = mediaType1.Copy(); + + Assert.NotSame(mediaType2, mediaType1); + Assert.Same(mediaType2.MediaType, mediaType1.MediaType); + Assert.True(mediaType1.IsReadOnly); + Assert.False(mediaType2.IsReadOnly); + Assert.NotSame(mediaType2.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType2.Parameters.Count, mediaType1.Parameters.Count); + var pair2 = mediaType2.Parameters.First(); + var pair1 = mediaType1.Parameters.First(); + Assert.NotSame(pair2, pair1); + Assert.True(pair1.IsReadOnly); + Assert.False(pair2.IsReadOnly); + Assert.Same(pair2.Name, pair1.Name); + Assert.Same(pair2.Value, pair1.Value); + } + [Fact] public void MediaType_SetAndGetMediaType_MatchExpectations() { diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index a5bf8c9b66..46d1d30d75 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -127,6 +127,22 @@ namespace Microsoft.Net.Http.Headers Assert.Throws(() => { pair1.Value = "othervalue"; }); } + [Fact] + public void CopyFromReadOnly_NameAndValue_CopiedAsNonReadOnly() + { + var pair0 = new NameValueHeaderValue("name", "value"); + var pair1 = pair0.CopyAsReadOnly(); + var pair2 = pair1.Copy(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + + // Change one value and verify the other is unchanged. + pair2.Value = "othervalue"; + Assert.Equal("othervalue", pair2.Value); + Assert.Equal("value", pair1.Value); + } + [Fact] public void Value_CallSetterWithInvalidValues_Throw() { From bbbd0d9f35765cf815924ef679d5b7975dd995b4 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 1 Jul 2015 20:02:24 -0700 Subject: [PATCH 342/846] Add repository information to project files --- src/Microsoft.AspNet.FeatureModel/project.json | 4 ++++ src/Microsoft.AspNet.Http.Abstractions/project.json | 4 ++++ src/Microsoft.AspNet.Http.Extensions/project.json | 4 ++++ src/Microsoft.AspNet.Http.Features/project.json | 4 ++++ src/Microsoft.AspNet.Http/project.json | 4 ++++ src/Microsoft.AspNet.Owin/project.json | 4 ++++ src/Microsoft.AspNet.WebUtilities/project.json | 4 ++++ src/Microsoft.Framework.WebEncoders.Core/project.json | 4 ++++ src/Microsoft.Framework.WebEncoders/project.json | 4 ++++ src/Microsoft.Net.Http.Headers/project.json | 4 ++++ 10 files changed, 40 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index e744e62052..8ae4b384ed 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 1f9e83a30c..2054277592 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 6f5855192b..e068ff06cd 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 9a441ab4dc..26fb66f00a 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index b8a689a4d2..f2d6728745 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 5363dfdbdd..792f5641ee 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 component for running OWIN middleware.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index b3fb9c1ef6..c1d8fad748 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index dc8f3406f5..d2d4b85976 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "compilationOptions": { "allowUnsafe": true }, diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 37e882873a..d39cd992f4 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "Contains registration and configuration APIs for the core framework encoders.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index fcbada8643..e4ae3012b7 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -3,6 +3,10 @@ "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "frameworks" : { "net45" : { }, "dnx451" : { }, From 534becad6bb342c6ddd9f3de63dd6e9964ce663d Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 1 Jul 2015 12:04:43 -0700 Subject: [PATCH 343/846] #182 Move StatusCodes from WebUtilities to Http.Abstractions. --- .../StatusCodes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.Http.Abstractions}/StatusCodes.cs (98%) diff --git a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs b/src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs similarity index 98% rename from src/Microsoft.AspNet.WebUtilities/StatusCodes.cs rename to src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs index 70d515f264..ca0d903d87 100644 --- a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNet.Http { public static class StatusCodes { From 24f90cc91427e89aeea6ac5b127014dc09f9ff6b Mon Sep 17 00:00:00 2001 From: sornaks Date: Tue, 7 Jul 2015 15:51:53 -0700 Subject: [PATCH 344/846] Introducing IHtmlContent - an interface which lets any content define how to write itself. --- HttpAbstractions.sln | 17 +++++++++++++- .../IHtmlContent.cs | 22 +++++++++++++++++++ .../Microsoft.AspNet.Html.Abstractions.xproj | 19 ++++++++++++++++ .../project.json | 16 ++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs create mode 100644 src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj create mode 100644 src/Microsoft.AspNet.Html.Abstractions/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index aa66e840ca..8dc4e20435 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 +VisualStudioVersion = 14.0.23017.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -43,6 +43,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEnco EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Core", "src\Microsoft.Framework.WebEncoders.Core\Microsoft.Framework.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -243,6 +245,18 @@ Global {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.ActiveCfg = Release|Any CPU {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.Build.0 = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.ActiveCfg = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.Build.0 = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.Build.0 = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.ActiveCfg = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -266,5 +280,6 @@ Global {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs new file mode 100644 index 0000000000..fc77f9edf4 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using Microsoft.Framework.WebEncoders; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// HTML content which can be written to a TextWriter. + /// + public interface IHtmlContent + { + /// + /// Writes the content by encoding it with the specified + /// to the specified . + /// + /// The to which the content is written. + /// The which encodes the content to be written. + void WriteTo(TextWriter writer, IHtmlEncoder encoder); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj b/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj new file mode 100644 index 0000000000..564c800504 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj @@ -0,0 +1,19 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 68a28e4a-3ade-4187-9625-4ff185887cb3 + Microsoft.AspNet.Html.Abstractions + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json new file mode 100644 index 0000000000..a2a7420401 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -0,0 +1,16 @@ +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 HTML content interface.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "dependencies": { + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net45" : { }, + "dnx451": { }, + "dnxcore50": { } + } +} \ No newline at end of file From 25ea93de9e03f1b0be8922bf727163f8ac3be499 Mon Sep 17 00:00:00 2001 From: sornaks Date: Mon, 29 Jun 2015 15:28:19 -0700 Subject: [PATCH 345/846] Making QueryHelpers.AddQueryString support # in the URL. --- .../QueryHelpers.cs | 31 ++++++++-- .../QueryHelpersTests.cs | 60 ++++++++++++++++++- 2 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 95750a3753..34195e8016 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -20,8 +20,8 @@ namespace Microsoft.AspNet.WebUtilities /// The combined result. public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { - bool hasQuery = uri.IndexOf('?') != -1; - return uri + (hasQuery ? "&" : "?") + UrlEncoder.Default.UrlEncode(name) + "=" + UrlEncoder.Default.UrlEncode(value); + return AddQueryString( + uri, new List> { new KeyValuePair(name, value) }); } /// @@ -29,12 +29,31 @@ namespace Microsoft.AspNet.WebUtilities /// /// The base uri. /// A collection of name value query pairs to append. - /// The combine result. + /// The combined result. public static string AddQueryString([NotNull] string uri, [NotNull] IDictionary queryString) { + return AddQueryString(uri, (IEnumerable>)queryString); + } + + private static string AddQueryString( + [NotNull] string uri, + [NotNull] IEnumerable> queryString) + { + var anchorIndex = uri.IndexOf('#'); + var uriToBeAppended = uri; + var anchorText = ""; + // If there is an anchor, then the query string must be inserted before its first occurance. + if (anchorIndex != -1) + { + anchorText = uri.Substring(anchorIndex); + uriToBeAppended = uri.Substring(0, anchorIndex); + } + + var queryIndex = uriToBeAppended.IndexOf('?'); + var hasQuery = queryIndex != -1; + var sb = new StringBuilder(); - sb.Append(uri); - bool hasQuery = uri.IndexOf('?') != -1; + sb.Append(uriToBeAppended); foreach (var parameter in queryString) { sb.Append(hasQuery ? '&' : '?'); @@ -43,6 +62,8 @@ namespace Microsoft.AspNet.WebUtilities sb.Append(UrlEncoder.Default.UrlEncode(parameter.Value)); hasQuery = true; } + + sb.Append(anchorText); return sb.ToString(); } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index 807e99f6ac..35a68f1a0b 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Collections.Generic; using System.Linq; using Xunit; @@ -52,5 +52,63 @@ namespace Microsoft.AspNet.WebUtilities Assert.Equal(1, collection.Count); Assert.Equal(new[] { "value1", "" }, collection[""]); } + + [Theory] + [InlineData("http://contoso.com/", "http://contoso.com/?hello=world")] + [InlineData("http://contoso.com/someaction", "http://contoso.com/someaction?hello=world")] + [InlineData("http://contoso.com/someaction?q=test", "http://contoso.com/someaction?q=test&hello=world")] + [InlineData( + "http://contoso.com/someaction?q=test#anchor", + "http://contoso.com/someaction?q=test&hello=world#anchor")] + [InlineData("http://contoso.com/someaction#anchor", "http://contoso.com/someaction?hello=world#anchor")] + [InlineData("http://contoso.com/#anchor", "http://contoso.com/?hello=world#anchor")] + [InlineData( + "http://contoso.com/someaction?q=test#anchor?value", + "http://contoso.com/someaction?q=test&hello=world#anchor?value")] + [InlineData( + "http://contoso.com/someaction#anchor?stuff", + "http://contoso.com/someaction?hello=world#anchor?stuff")] + [InlineData( + "http://contoso.com/someaction?name?something", + "http://contoso.com/someaction?name?something&hello=world")] + [InlineData( + "http://contoso.com/someaction#name#something", + "http://contoso.com/someaction?hello=world#name#something")] + public void AddQueryStringWithKeyAndValue(string uri, string expectedUri) + { + var result = QueryHelpers.AddQueryString(uri, "hello", "world"); + Assert.Equal(expectedUri, result); + } + + [Theory] + [InlineData("http://contoso.com/", "http://contoso.com/?hello=world&some=text")] + [InlineData("http://contoso.com/someaction", "http://contoso.com/someaction?hello=world&some=text")] + [InlineData("http://contoso.com/someaction?q=1", "http://contoso.com/someaction?q=1&hello=world&some=text")] + [InlineData("http://contoso.com/some#action", "http://contoso.com/some?hello=world&some=text#action")] + [InlineData("http://contoso.com/some?q=1#action", "http://contoso.com/some?q=1&hello=world&some=text#action")] + [InlineData("http://contoso.com/#action", "http://contoso.com/?hello=world&some=text#action")] + [InlineData( + "http://contoso.com/someaction?q=test#anchor?value", + "http://contoso.com/someaction?q=test&hello=world&some=text#anchor?value")] + [InlineData( + "http://contoso.com/someaction#anchor?stuff", + "http://contoso.com/someaction?hello=world&some=text#anchor?stuff")] + [InlineData( + "http://contoso.com/someaction?name?something", + "http://contoso.com/someaction?name?something&hello=world&some=text")] + [InlineData( + "http://contoso.com/someaction#name#something", + "http://contoso.com/someaction?hello=world&some=text#name#something")] + public void AddQueryStringWithDictionary(string uri, string expectedUri) + { + var queryStrings = new Dictionary() + { + { "hello", "world" }, + { "some", "text" } + }; + + var result = QueryHelpers.AddQueryString(uri, queryStrings); + Assert.Equal(expectedUri, result); + } } } \ No newline at end of file From d142160f470178e1044dd6e94a4043117479c195 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 13 Jul 2015 12:23:03 -0700 Subject: [PATCH 346/846] OnCompletedDispose => RegisterForDispose --- src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 914e9604c9..22c4daae06 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Http public abstract void OnCompleted([NotNull] Func callback, object state); - public virtual void OnCompletedDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + public virtual void RegisterForDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); public virtual void OnCompleted([NotNull] Func callback) => OnCompleted(_callbackDelegate, callback); From ad4783314f635e80e8703f05d4663d2a00a86210 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 16 Jul 2015 08:57:10 -0700 Subject: [PATCH 347/846] Updating to release NuGet.config --- NuGet.Config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..0e74a4912d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,8 @@  - + + - \ No newline at end of file + From b8af07e3c18e1c831d33df3538dc112af476f650 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 16 Jul 2015 15:10:48 -0700 Subject: [PATCH 348/846] #60 Merge FeatureModel into Http.Features. Remove unused FeatureObject. --- HttpAbstractions.sln | 17 +- .../FeatureObject.cs | 166 ------------------ .../Microsoft.AspNet.FeatureModel.xproj | 17 -- .../Properties/AssemblyInfo.cs | 6 - .../project.json | 25 --- .../FeatureCollection.cs | 2 +- .../FeatureReference.cs | 2 +- .../IFeatureCollection.cs | 2 +- .../DefaultAuthenticationManager.cs | 1 - .../DefaultConnectionInfo.cs | 1 - .../DefaultHttpContext.cs | 1 - .../DefaultHttpRequest.cs | 1 - .../DefaultHttpResponse.cs | 1 - .../DefaultWebSocketManager.cs | 1 - .../Features/QueryFeature.cs | 1 - .../Features/RequestCookiesFeature.cs | 1 - .../Features/ResponseCookiesFeature.cs | 1 - src/Microsoft.AspNet.Http/project.json | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- .../OwinFeatureCollection.cs | 1 - .../IThing.cs | 2 +- .../InterfaceDictionaryTests.cs | 2 +- ...icrosoft.AspNet.Http.Features.Tests.xproj} | 0 .../Properties/AssemblyInfo.cs | 4 +- .../Thing.cs | 2 +- .../project.json | 2 +- .../DefaultHttpContextTests.cs | 1 - .../QueryFeatureTests.cs | 1 - .../OwinFeatureCollectionTests.cs | 8 +- 29 files changed, 15 insertions(+), 257 deletions(-) delete mode 100644 src/Microsoft.AspNet.FeatureModel/FeatureObject.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj delete mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/project.json rename src/{Microsoft.AspNet.FeatureModel => Microsoft.AspNet.Http.Features}/FeatureCollection.cs (99%) rename src/{Microsoft.AspNet.FeatureModel => Microsoft.AspNet.Http.Features}/FeatureReference.cs (96%) rename src/{Microsoft.AspNet.FeatureModel => Microsoft.AspNet.Http.Features}/IFeatureCollection.cs (89%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/IThing.cs (83%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/InterfaceDictionaryTests.cs (98%) rename test/{Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj => Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj} (100%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/Properties/AssemblyInfo.cs (91%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/Thing.cs (86%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/project.json (79%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 8dc4e20435..872a0e3ada 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23017.0 +VisualStudioVersion = 14.0.22823.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -13,11 +13,9 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstr EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features", "src\Microsoft.AspNet.Http.Features\Microsoft.AspNet.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features.Tests", "test\Microsoft.AspNet.Http.Features.Tests\Microsoft.AspNet.Http.Features.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions.Tests", "test\Microsoft.AspNet.Http.Abstractions.Tests\Microsoft.AspNet.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject @@ -85,16 +83,6 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|Any CPU {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.Build.0 = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|Any CPU {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|Any CPU {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -265,7 +253,6 @@ Global {BCF0F967-8753-4438-BD07-AADCA9CE509A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {22071333-15BA-4D16-A1D5-4D5B1A83FBDD} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs deleted file mode 100644 index bc6bc2b2d6..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Linq; - -namespace Microsoft.AspNet.FeatureModel -{ - public class FeatureObject : IFeatureCollection - { - private readonly object _instance; - - public FeatureObject(object instance) - { - _instance = instance; - } - - public void Dispose() - { - var disposable = _instance as IDisposable; - if (disposable != null) - { - disposable.Dispose(); - } - } - - public object GetInterface(Type type) - { - if (type.IsInstanceOfType(_instance)) - { - return _instance; - } - - return null; - } - - public void SetInterface(Type type, object feature) - { - throw new NotImplementedException(); - } - - public int Revision - { - get { return 0; } - } - - public IEnumerator> GetEnumerator() - { - return GetTypeInterfaces() - .Select(interfaceType => new KeyValuePair(interfaceType, _instance)) - .GetEnumerator(); - } - - private IEnumerable GetTypeInterfaces() - { - return _instance.GetType() - .GetTypeInfo() - .ImplementedInterfaces; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Add(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public void Clear() - { - throw new NotImplementedException(); - } - - public bool Contains(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - var enumerator = GetTypeInterfaces().GetEnumerator(); - for (var index = 0; index != arrayIndex; ++index) - { - if (!enumerator.MoveNext()) - { - throw new IndexOutOfRangeException(); - } - } - - for (var index = 0; index != array.Length; ++index) - { - if (!enumerator.MoveNext()) - { - throw new IndexOutOfRangeException(); - } - array[index] = new KeyValuePair(enumerator.Current, _instance); - } - } - - public bool Remove(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public int Count - { - get { return GetTypeInterfaces().Count(); } - } - - public bool IsReadOnly - { - get { return true; } - } - - public bool ContainsKey(Type key) - { - return key.GetTypeInfo().IsAssignableFrom(_instance.GetType().GetTypeInfo()); - } - - public void Add(Type key, object value) - { - throw new NotImplementedException(); - } - - public bool Remove(Type key) - { - throw new NotImplementedException(); - } - - public bool TryGetValue(Type key, out object value) - { - value = GetInterface(key); - return value != null; - } - - public object this[Type key] - { - get { return GetInterface(key); } - set { throw new NotImplementedException(); } - } - - public ICollection Keys - { - get { return GetTypeInterfaces().ToArray(); } - } - - public ICollection Values - { - get - { - var length = GetTypeInterfaces().Count(); - var array = new object[length]; - for (var index = 0; index != length; ++index) - { - array[index] = _instance; - } - return array; - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj deleted file mode 100644 index bd9dcea294..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 32a4c918-30ee-41db-8e26-8a3bb88ed231 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs deleted file mode 100644 index 025a94598c..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; - -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json deleted file mode 100644 index 8ae4b384ed..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature infrastructure.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } - }, - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Reflection": "4.0.10-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Threading": "4.0.10-beta-*" - } - } - } -} diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs similarity index 99% rename from src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs rename to src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 40e386a491..1fbbaf4288 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.FeatureModel +namespace Microsoft.AspNet.Http.Features { public class FeatureCollection : IFeatureCollection { diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs similarity index 96% rename from src/Microsoft.AspNet.FeatureModel/FeatureReference.cs rename to src/Microsoft.AspNet.Http.Features/FeatureReference.cs index fba03637be..7ffb94d555 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.FeatureModel +namespace Microsoft.AspNet.Http.Features { public struct FeatureReference { diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs similarity index 89% rename from src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs rename to src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index e4b26818d1..70f91770e1 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.FeatureModel +namespace Microsoft.AspNet.Http.Features { public interface IFeatureCollection : IDictionary, IDisposable { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 526dfea4f3..d0cec090c0 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 5237739aa9..30a7ace398 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -5,7 +5,6 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 5dc1c96cfe..0ff8ae2b89 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication.Internal; using Microsoft.AspNet.Http.Features; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index bf374999b9..479ead6ebf 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -5,7 +5,6 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index cf3b006945..0dae9253b9 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index c329ffe05e..7a8f87d125 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index a46b6ecb83..02545c50a1 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index e0ba1dcc3e..08317fdd50 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index 410fce7a25..96504f1ff7 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index f2d6728745..991ddf3103 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,6 @@ "url": "git://github.com/aspnet/httpabstractions" }, "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 93b487006e..770f02fb46 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -6,8 +6,8 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; namespace Microsoft.AspNet.Builder diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index b718d36097..ca1cca500b 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -14,7 +14,6 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.Framework.Internal; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.Http.Features.Tests/IThing.cs similarity index 83% rename from test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs rename to test/Microsoft.AspNet.Http.Features.Tests/IThing.cs index fca3041bb8..7210b9821a 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/IThing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.FeatureModel.Tests +namespace Microsoft.AspNet.Http.Features { public interface IThing { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs similarity index 98% rename from test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs rename to test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs index 27d2f565a2..3d4879f0a3 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.AspNet.FeatureModel.Tests +namespace Microsoft.AspNet.Http.Features { public class InterfaceDictionaryTests { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj b/test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj rename to test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs similarity index 91% rename from test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs index 898c5f8fe7..86561ba516 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs @@ -8,11 +8,11 @@ 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: AssemblyTitle("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyTitle("Microsoft.AspNet.Http.Features.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyProduct("Microsoft.AspNet.Http.Features.Tests")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.Http.Features.Tests/Thing.cs similarity index 86% rename from test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs rename to test/Microsoft.AspNet.Http.Features.Tests/Thing.cs index 217833d5af..7f39f86a71 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/Thing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.FeatureModel.Tests +namespace Microsoft.AspNet.Http.Features { public class Thing : IThing { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.Http.Features.Tests/project.json similarity index 79% rename from test/Microsoft.AspNet.FeatureModel.Tests/project.json rename to test/Microsoft.AspNet.Http.Features.Tests/project.json index a09a4171c6..12e00145bc 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Features.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index c8c1b0bc47..f24035e672 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index a110b09946..61d2ed4d34 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; using Xunit; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 03f2258a0c..74ddec0d46 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Xunit; @@ -32,7 +31,7 @@ namespace Microsoft.AspNet.Owin { "owin.RequestPathBase", "/pathBase" }, { "owin.RequestQueryString", "name=value" }, }; - var features = new FeatureObject(new OwinFeatureCollection(env)); + var features = new OwinFeatureCollection(env); var requestFeature = Get(features); Assert.Equal(requestFeature.Method, "POST"); @@ -51,7 +50,7 @@ namespace Microsoft.AspNet.Owin { "owin.RequestPathBase", "/pathBase" }, { "owin.RequestQueryString", "name=value" }, }; - var features = new FeatureObject(new OwinFeatureCollection(env)); + var features = new OwinFeatureCollection(env); var requestFeature = Get(features); requestFeature.Method = "GET"; @@ -72,11 +71,10 @@ namespace Microsoft.AspNet.Owin { {"owin.RequestMethod", "POST"} }; - var features = new FeatureObject(new OwinFeatureCollection(env)); + var features = new OwinFeatureCollection(env); var entries = features.ToArray(); var keys = features.Keys.ToArray(); - var values = features.Values.ToArray(); Assert.Contains(typeof(IHttpRequestFeature), keys); Assert.Contains(typeof(IHttpResponseFeature), keys); From 5d7ec0e2c60c2a849a0cbd93cc5a07eb2d1c3115 Mon Sep 17 00:00:00 2001 From: sornaks Date: Mon, 3 Aug 2015 11:08:54 -0700 Subject: [PATCH 349/846] Changing QueryHelpers.AddQueryString to use Array instead of List. --- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 34195e8016..6df0e2d701 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.WebUtilities public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { return AddQueryString( - uri, new List> { new KeyValuePair(name, value) }); + uri, new [] { new KeyValuePair(name, value) }); } /// From ac945a0bcf43334f163a66223dd4d7bb10cff6aa Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 28 Jul 2015 12:24:42 -0700 Subject: [PATCH 350/846] #339 Reduce IFeatureCollection surface area. --- .../FeatureCollection.cs | 167 ++++++------------ .../FeatureReference.cs | 14 +- .../IFeatureCollection.cs | 18 +- .../project.json | 1 + .../DefaultHttpContext.cs | 3 +- .../OwinFeatureCollection.cs | 167 +++++------------- .../FeatureCollectionTests.cs | 48 +++++ .../InterfaceDictionaryTests.cs | 83 --------- .../QueryFeatureTests.cs | 2 +- .../OwinFeatureCollectionTests.cs | 20 +-- 10 files changed, 174 insertions(+), 349 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs delete mode 100644 test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 1fbbaf4288..16b4d6fb44 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -4,15 +4,16 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { public class FeatureCollection : IFeatureCollection { + private static KeyComparer FeatureKeyComparer = new FeatureCollection.KeyComparer(); private readonly IFeatureCollection _defaults; - private readonly IDictionary _featureByFeatureType = new Dictionary(); - private readonly object _containerSync = new object(); + private IDictionary _features; private volatile int _containerRevision; public FeatureCollection() @@ -24,53 +25,38 @@ namespace Microsoft.AspNet.Http.Features _defaults = defaults; } - public object GetInterface() - { - return GetInterface(null); - } - - public object GetInterface([NotNull] Type type) - { - object feature; - if (_featureByFeatureType.TryGetValue(type, out feature)) - { - return feature; - } - - if (_defaults != null && _defaults.TryGetValue(type, out feature)) - { - return feature; - } - return null; - } - - void SetInterface([NotNull] Type type, object feature) - { - if (feature == null) - { - Remove(type); - return; - } - - lock (_containerSync) - { - _featureByFeatureType[type] = feature; - _containerRevision++; - } - } - public virtual int Revision { - get { return _containerRevision; } + get { return _containerRevision + (_defaults?.Revision ?? 0); } } - public void Dispose() - { - } + public bool IsReadOnly { get { return false; } } - public IEnumerator> GetEnumerator() + public object this[[NotNull] Type key] { - throw new NotImplementedException(); + get + { + object result; + return _features != null && _features.TryGetValue(key, out result) ? result : _defaults?[key]; + } + set + { + if (value == null) + { + if (_features != null && _features.Remove(key)) + { + _containerRevision++; + } + return; + } + + if (_features == null) + { + _features = new Dictionary(); + } + _features[key] = value; + _containerRevision++; + } } IEnumerator IEnumerable.GetEnumerator() @@ -78,89 +64,42 @@ namespace Microsoft.AspNet.Http.Features return GetEnumerator(); } - public void Add(KeyValuePair item) + public IEnumerator> GetEnumerator() { - SetInterface(item.Key, item.Value); - } - - public void Clear() - { - throw new NotImplementedException(); - } - - public bool Contains(KeyValuePair item) - { - object value; - return TryGetValue(item.Key, out value) && Equals(item.Value, value); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - throw new NotImplementedException(); - } - - public bool Remove(KeyValuePair item) - { - return Contains(item) && Remove(item.Key); - } - - public int Count - { - get { throw new NotImplementedException(); } - } - - public bool IsReadOnly - { - get { return false; } - } - - public bool ContainsKey([NotNull] Type key) - { - return GetInterface(key) != null; - } - - public void Add([NotNull] Type key, [NotNull] object value) - { - if (ContainsKey(key)) + if (_features != null) { - throw new ArgumentException(); - } - SetInterface(key, value); - } - - public bool Remove([NotNull] Type key) - { - lock (_containerSync) - { - if (_featureByFeatureType.Remove(key)) + foreach (var pair in _features) { - _containerRevision++; - return true; + yield return pair; + } + } + + if (_defaults != null) + { + // Don't return features masked by the wrapper. + foreach (var pair in _features == null ? _defaults : _defaults.Except(_features, FeatureKeyComparer)) + { + yield return pair; } - return false; } } - public bool TryGetValue([NotNull] Type key, out object value) + public virtual void Dispose() { - value = GetInterface(key); - return value != null; + _defaults?.Dispose(); } - public object this[Type key] + private class KeyComparer : IEqualityComparer> { - get { return GetInterface(key); } - set { SetInterface(key, value); } - } + public bool Equals(KeyValuePair x, KeyValuePair y) + { + return x.Key.Equals(y.Key); + } - public ICollection Keys - { - get { throw new NotImplementedException(); } - } - - public ICollection Values - { - get { throw new NotImplementedException(); } + public int GetHashCode(KeyValuePair obj) + { + throw new NotImplementedException(); + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReference.cs b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs index 7ffb94d555..538297a3a0 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs @@ -18,23 +18,19 @@ namespace Microsoft.AspNet.Http.Features public T Fetch(IFeatureCollection features) { - if (_revision == features.Revision) return _feature; - object value; - if (features.TryGetValue(typeof(T), out value)) + if (_revision == features.Revision) { - _feature = (T)value; - } - else - { - _feature = default(T); + return _feature; } + _feature = (T)features[typeof(T)]; _revision = features.Revision; return _feature; } public T Update(IFeatureCollection features, T feature) { - features[typeof(T)] = _feature = feature; + features[typeof(T)] = feature; + _feature = feature; _revision = features.Revision; return feature; } diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index 70f91770e1..ba612b10c6 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -3,11 +3,27 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { - public interface IFeatureCollection : IDictionary, IDisposable + public interface IFeatureCollection : IEnumerable>, IDisposable { + /// + /// Indicates if the collection can be modified. + /// + bool IsReadOnly { get; } + + /// + /// Incremented for each modification and can be used verify cached results. + /// int Revision { get; } + + /// + /// Gets or sets a given feature. Setting a null value removes the feature. + /// + /// + /// The requested feature, or null if it is not present. + object this[[NotNull] Type key] { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 26fb66f00a..a44172292c 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -13,6 +13,7 @@ "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", "System.Net.Primitives": "4.0.10-beta-*", "System.Net.WebSockets": "4.0.0-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 0ff8ae2b89..c3caf8ec66 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -172,8 +172,7 @@ namespace Microsoft.AspNet.Http.Internal public override object GetFeature(Type type) { - object value; - return _features.TryGetValue(type, out value) ? value : null; + return _features[type]; } public override void SetFeature(Type type, object instance) diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index ca1cca500b..6dd44e52e6 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using System.Net; using System.Net.WebSockets; using System.Reflection; @@ -16,7 +16,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Owin { @@ -111,6 +110,12 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.RequestHeaders, value); } } + string IHttpRequestIdentifierFeature.TraceIdentifier + { + get { return Prop(OwinConstants.RequestId); } + set { Prop(OwinConstants.RequestId, value); } + } + Stream IHttpRequestFeature.Body { get { return Prop(OwinConstants.RequestBody); } @@ -266,7 +271,7 @@ namespace Microsoft.AspNet.Owin /// /// Gets or sets if the underlying server supports WebSockets. This is enabled by default. - /// The value should be consistant across requests. + /// The value should be consistent across requests. /// public bool SupportsWebSockets { get; set; } @@ -290,17 +295,25 @@ namespace Microsoft.AspNet.Owin return accept(context); } + // IFeatureCollection + public int Revision { get { return 0; } // Not modifiable } - public void Add(Type key, object value) + public bool IsReadOnly { - throw new NotSupportedException(); + get { return true; } } - public bool ContainsKey(Type key) + public object this[Type key] + { + get { return Get(key); } + set { throw new NotSupportedException(); } + } + + private bool SupportsInterface(Type key) { // Does this type implement the requested interface? if (key.GetTypeInfo().IsAssignableFrom(GetType().GetTypeInfo())) @@ -325,136 +338,48 @@ namespace Microsoft.AspNet.Owin return false; } - public ICollection Keys + public object Get(Type key) { - get + if (SupportsInterface(key)) { - var keys = new List() - { - typeof(IHttpRequestFeature), - typeof(IHttpResponseFeature), - typeof(IHttpConnectionFeature), - typeof(IOwinEnvironmentFeature), - typeof(IHttpRequestLifetimeFeature), - typeof(IHttpAuthenticationFeature), - }; - if (SupportsSendFile) - { - keys.Add(typeof(IHttpSendFileFeature)); - } - if (SupportsClientCerts) - { - keys.Add(typeof(ITlsConnectionFeature)); - } - if (SupportsWebSockets) - { - keys.Add(typeof(IHttpWebSocketFeature)); - } - return keys; + return this; } + return null; } - public bool Remove(Type key) + public void Set(Type key, object value) { throw new NotSupportedException(); } - public bool TryGetValue(Type key, out object value) + IEnumerator IEnumerable.GetEnumerator() { - if (ContainsKey(key)) - { - value = this; - return true; - } - value = null; - return false; - } - - public ICollection Values - { - get { throw new NotSupportedException(); } - } - - public object this[Type key] - { - get - { - object value; - if (TryGetValue(key, out value)) - { - return value; - } - throw new KeyNotFoundException(key.FullName); - } - set - { - throw new NotSupportedException(); - } - } - - public void Add(KeyValuePair item) - { - throw new NotSupportedException(); - } - - public void Clear() - { - throw new NotSupportedException(); - } - - public bool Contains(KeyValuePair item) - { - object result; - return TryGetValue(item.Key, out result) && result.Equals(item.Value); - } - - public void CopyTo([NotNull] KeyValuePair[] array, int arrayIndex) - { - if (arrayIndex < 0 || arrayIndex > array.Length) - { - throw new ArgumentOutOfRangeException(nameof(arrayIndex), arrayIndex, string.Empty); - } - var keys = Keys; - if (keys.Count > array.Length - arrayIndex) - { - throw new ArgumentException(); - } - - foreach (var key in keys) - { - array[arrayIndex++] = new KeyValuePair(key, this[key]); - } - } - - public int Count - { - get { return Keys.Count; } - } - - public bool IsReadOnly - { - get { return true; } - } - - string IHttpRequestIdentifierFeature.TraceIdentifier - { - get { return Prop(OwinConstants.RequestId); } - set { Prop(OwinConstants.RequestId, value); } - } - - public bool Remove(KeyValuePair item) - { - throw new NotSupportedException(); + return GetEnumerator(); } public IEnumerator> GetEnumerator() { - return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); - } + yield return new KeyValuePair(typeof(IHttpRequestFeature), this); + yield return new KeyValuePair(typeof(IHttpResponseFeature), this); + yield return new KeyValuePair(typeof(IHttpConnectionFeature), this); + yield return new KeyValuePair(typeof(IHttpRequestIdentifierFeature), this); + yield return new KeyValuePair(typeof(IHttpRequestLifetimeFeature), this); + yield return new KeyValuePair(typeof(IHttpAuthenticationFeature), this); + yield return new KeyValuePair(typeof(IOwinEnvironmentFeature), this); - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); + // Check for conditional features + if (SupportsSendFile) + { + yield return new KeyValuePair(typeof(IHttpSendFileFeature), this); + } + if (SupportsClientCerts) + { + yield return new KeyValuePair(typeof(ITlsConnectionFeature), this); + } + if (SupportsWebSockets) + { + yield return new KeyValuePair(typeof(IHttpWebSocketFeature), this); + } } public void Dispose() diff --git a/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs b/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs new file mode 100644 index 0000000000..2cc0ed6448 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs @@ -0,0 +1,48 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.AspNet.Http.Features +{ + public class FeatureCollectionTests + { + [Fact] + public void AddedInterfaceIsReturned() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + + object thing2 = interfaces[typeof(IThing)]; + Assert.Equal(thing2, thing); + } + + [Fact] + public void IndexerAlsoAddsItems() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + + Assert.Equal(interfaces[typeof(IThing)], thing); + } + + [Fact] + public void SetNullValueRemoves() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + Assert.Equal(interfaces[typeof(IThing)], thing); + + interfaces[typeof(IThing)] = null; + + object thing2 = interfaces[typeof(IThing)]; + Assert.Null(thing2); + } + } +} diff --git a/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs deleted file mode 100644 index 3d4879f0a3..0000000000 --- a/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.AspNet.Http.Features -{ - public class InterfaceDictionaryTests - { - [Fact] - public void AddedInterfaceIsReturned() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - - Assert.Equal(interfaces[typeof(IThing)], thing); - - object thing2; - Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); - Assert.Equal(thing2, thing); - } - - [Fact] - public void IndexerAlsoAddsItems() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces[typeof(IThing)] = thing; - - Assert.Equal(interfaces[typeof(IThing)], thing); - - object thing2; - Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); - Assert.Equal(thing2, thing); - } - - [Fact] - public void SecondCallToAddThrowsException() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - - Assert.Throws(() => interfaces.Add(typeof(IThing), thing)); - } - - [Fact] - public void RemovedInterfaceIsRemoved() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - - Assert.Equal(interfaces[typeof(IThing)], thing); - - Assert.True(interfaces.Remove(typeof(IThing))); - - object thing2; - Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); - } - - [Fact] - public void SetNullValueRemoves() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - Assert.Equal(interfaces[typeof(IThing)], thing); - - interfaces[typeof(IThing)] = null; - - object thing2; - Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); - } - } -} diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 61d2ed4d34..9c5a84a9f5 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var features = new FeatureCollection(); var request = new HttpRequestFeature(); request.QueryString = "foo=bar"; - features.Add(typeof(IHttpRequestFeature), request); + features[typeof(IHttpRequestFeature)] = request; var provider = new QueryFeature(features); diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 74ddec0d46..b4958629f7 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -12,9 +12,9 @@ namespace Microsoft.AspNet.Owin { private T Get(IFeatureCollection features) { - object value; - return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); + return (T)features[typeof(T)]; } + private T Get(IDictionary env, string key) { object value; @@ -63,22 +63,6 @@ namespace Microsoft.AspNet.Owin Assert.Equal("/pathBase2", Get(env, "owin.RequestPathBase")); Assert.Equal("name=value2", Get(env, "owin.RequestQueryString")); } - - [Fact] - public void ImplementedInterfacesAreEnumerated() - { - var env = new Dictionary - { - {"owin.RequestMethod", "POST"} - }; - var features = new OwinFeatureCollection(env); - - var entries = features.ToArray(); - var keys = features.Keys.ToArray(); - - Assert.Contains(typeof(IHttpRequestFeature), keys); - Assert.Contains(typeof(IHttpResponseFeature), keys); - } } } From 9c3a39123a381ac2636749e04f955eced72f5739 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 3 Aug 2015 14:01:03 -0700 Subject: [PATCH 351/846] #341 Add HttpReqeuest GetEncodedUrl and GetDecodedUrl extensions. --- .../UriHelper.cs | 22 ++++++ .../UriHelperTests.cs | 71 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 33f589cb44..3e137acc2e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -71,5 +71,27 @@ namespace Microsoft.AspNet.Http.Extensions return uri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped); } } + + /// + /// Returns the combined components of the request URL in a fully escaped form suitable for use in HTTP headers + /// and other HTTP operations. + /// + /// + /// + public static string GetEncodedUrl(this HttpRequest request) + { + return Encode(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); + } + + /// + /// Returns the combined components of the request URL in a fully un-escaped form (except for the QueryString) + /// suitable only for display. This format should not be used in HTTP headers or other HTTP operations. + /// + /// + /// + public static string GetDisplayUrl(this HttpRequest request) + { + return request.Scheme + "://" + request.Host.Value + request.PathBase.Value + request.Path.Value + request.QueryString.Value; + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs new file mode 100644 index 0000000000..0846dd7172 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs @@ -0,0 +1,71 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Internal; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions +{ + public class UriHelperTests + { + [Fact] + public void EncodeEmptyPartialUrl() + { + var result = UriHelper.Encode(); + + Assert.Equal("/", result); + } + + [Fact] + public void EncodePartialUrl() + { + var result = UriHelper.Encode(new PathString("/un?escaped/base"), new PathString("/un?escaped"), + new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); + + Assert.Equal("/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); + } + + [Fact] + public void EncodeEmptyFullUrl() + { + var result = UriHelper.Encode("http", new HostString(string.Empty)); + + Assert.Equal("http:///", result); + } + + [Fact] + public void EncodeFullUrl() + { + var result = UriHelper.Encode("http", new HostString("my.HoΨst:80"), new PathString("/un?escaped/base"), new PathString("/un?escaped"), + new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); + + Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); + } + + [Fact] + public void GetEncodedUrlFromRequest() + { + var request = new DefaultHttpContext().Request; + request.Scheme = "http"; + request.Host = new HostString("my.HoΨst:80"); + request.PathBase = new PathString("/un?escaped/base"); + request.Path = new PathString("/un?escaped"); + request.QueryString = new QueryString("?name=val%23ue"); + + Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue", request.GetEncodedUrl()); + } + + [Fact] + public void GetDisplayUrlFromRequest() + { + var request = new DefaultHttpContext().Request; + request.Scheme = "http"; + request.Host = new HostString("my.HoΨst:80"); + request.PathBase = new PathString("/un?escaped/base"); + request.Path = new PathString("/un?escaped"); + request.QueryString = new QueryString("?name=val%23ue"); + + Assert.Equal("http://my.hoψst:80/un?escaped/base/un?escaped?name=val%23ue", request.GetDisplayUrl()); + } + } +} From 3cd5907fc5b9f7795c832f4a938790dbb58c1f7e Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Tue, 4 Aug 2015 10:15:27 -0700 Subject: [PATCH 352/846] Update CoreCLR versions --- .../project.json | 30 +++++++++---------- .../project.json | 6 ++-- .../project.json | 12 ++++---- src/Microsoft.AspNet.Http/project.json | 8 ++--- src/Microsoft.AspNet.Owin/project.json | 26 ++++++++-------- .../project.json | 12 ++++---- src/Microsoft.Net.Http.Headers/project.json | 14 ++++----- .../project.json | 2 +- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 2054277592..da09379110 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "repository": { @@ -15,22 +15,22 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Linq.Expressions": "4.0.10-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Tools": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.Globalization.Extensions": "4.0.1-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Linq.Expressions": "4.0.11-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", "System.Net.WebSockets": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.InteropServices": "4.0.21-beta-*", + "System.Security.Claims": "4.0.1-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Security.Principal": "4.0.1-beta-*", + "System.Threading.Tasks": "4.0.11-beta-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index e068ff06cd..767da562d9 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -15,9 +15,9 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Resources.ResourceManager": "4.0.0-beta-*" + "System.IO.FileSystem": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Resources.ResourceManager": "4.0.1-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index a44172292c..3af9685e65 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -12,14 +12,14 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", + "System.Collections": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", "System.Net.WebSockets": "4.0.0-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Security.Claims": "4.0.0-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Security.Claims": "4.0.1-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*" + "System.Security.Principal": "4.0.1-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 991ddf3103..53e3ece572 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", "repository": { @@ -15,9 +15,9 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Text.Encoding": "4.0.10-beta-*" + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.Text.Encoding": "4.0.11-beta-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 792f5641ee..7a496619ae 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -13,20 +13,20 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", + "System.Collections": "4.0.11-beta-*", + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Tools": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Runtime.InteropServices": "4.0.21-beta-*", + "System.Security.Claims": "4.0.1-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Security.Principal": "4.0.1-beta-*", + "System.Threading.Tasks": "4.0.11-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index c1d8fad748..496449f4f6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -13,12 +13,12 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*" + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.IO.FileSystem": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*" } } } diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index e4ae3012b7..ae39f93621 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -12,13 +12,13 @@ "dnx451" : { }, "dnxcore50" : { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Contracts": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Text.Encoding": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*" + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Contracts": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.Globalization.Extensions": "4.0.1-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Text.Encoding": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*" } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index e44f880a72..0968582e6b 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -16,7 +16,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Text.Encoding.Extensions": "4.0.10-beta-*" + "System.Text.Encoding.Extensions": "4.0.11-beta-*" } } }, From 4576481a32acd2a732da358f522f3596ff52712b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 11 Aug 2015 12:57:06 -0700 Subject: [PATCH 353/846] Reacting to DI changes --- .../EncoderServiceCollectionExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 7b855f6038..c7d1c32b0d 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.DependencyInjection.Extensions; using Microsoft.Framework.Internal; using Microsoft.Framework.OptionsModel; using Microsoft.Framework.WebEncoders; From 67803d2f419c067cc9043ad26173bceea2467d89 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 5 Aug 2015 12:15:45 -0700 Subject: [PATCH 354/846] Challenge now always checks for accept --- .../Authentication/DefaultAuthenticationManager.cs | 5 ++--- .../DefaultAuthenticationManagerTests.cs | 11 ++++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index d0cec090c0..821a67395a 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -72,8 +72,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal await handler.ChallengeAsync(challengeContext); } - // The default Challenge with no scheme is always accepted - if (!challengeContext.Accepted && !string.IsNullOrEmpty(authenticationScheme)) + if (!challengeContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } @@ -105,7 +104,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal await handler.SignOutAsync(signOutContext); } - if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) + if (!signOutContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 2871c27ec3..3430382e8a 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -21,13 +21,14 @@ namespace Microsoft.AspNet.Http.Authentication.Internal await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); } - [Fact] - public async Task ChallengeWithNoAuthMiddlewareMayThrow() + [Theory] + [InlineData("")] + [InlineData(null)] + [InlineData("Foo")] + public async Task ChallengeWithNoAuthMiddlewareMayThrow(string scheme) { var context = CreateContext(); - await context.Authentication.ChallengeAsync(); - Assert.Equal(200, context.Response.StatusCode); - await Assert.ThrowsAsync(() => context.Authentication.ChallengeAsync("Foo")); + await Assert.ThrowsAsync(() => context.Authentication.ChallengeAsync(scheme)); } [Fact] From 282c50876bacbd0eb32c560ef202f5f89651e731 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Tue, 11 Aug 2015 16:53:01 -0700 Subject: [PATCH 355/846] Enable pinning build script --- build.cmd | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 41025afb26..ccf195aee8 100644 --- a/build.cmd +++ b/build.cmd @@ -3,6 +3,8 @@ cd %~dp0 SETLOCAL SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe +SET BUILDCMD_KOREBUILD_VERSION="" +SET BUILDCMD_DNX_VERSION="" IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... @@ -16,13 +18,21 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run -.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre +IF %BUILDCMD_KOREBUILD_VERSION%=="" ( + .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre +) ELSE ( + .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre +) .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +IF %BUILDCMD_DNX_VERSION%=="" ( + CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +) ELSE ( + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -a default +) CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 :run CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* +packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* \ No newline at end of file From 8487e42a6874eef8e0cd85b4c9f44eb6f9ec330e Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 12 Aug 2015 13:08:58 -0700 Subject: [PATCH 356/846] Hello HttpContextAccessor --- .../IHttpContextAccessor.cs | 10 ++++ .../HttpContextAccessor.cs | 47 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs create mode 100644 src/Microsoft.AspNet.Http/HttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs new file mode 100644 index 0000000000..8f4046da2b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http +{ + public interface IHttpContextAccessor + { + HttpContext HttpContext { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs new file mode 100644 index 0000000000..384bb961ca --- /dev/null +++ b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs @@ -0,0 +1,47 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +#if DNX451 +using System.Runtime.Remoting.Messaging; +using System.Runtime.Remoting; +#elif DNXCORE50 +using System.Threading; +#endif + +namespace Microsoft.AspNet.Http.Internal +{ + public class HttpContextAccessor : IHttpContextAccessor + { +#if DNX451 + private const string LogicalDataKey = "__HttpContext_Current__"; + + public HttpContext HttpContext + { + get + { + var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; + return handle != null ? handle.Unwrap() as HttpContext : null; + } + set + { + CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(value)); + } + } + +#elif DNXCORE50 + private AsyncLocal _httpContextCurrent = new AsyncLocal(); + public HttpContext HttpContext + { + get + { + return _httpContextCurrent.Value; + } + set + { + _httpContextCurrent.Value = value; + } + } +#endif + } +} From e4722b0bef21c2a8058da5a9df713609b4b052bf Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Mon, 17 Aug 2015 11:11:16 -0700 Subject: [PATCH 357/846] Update packages' versions --- src/Microsoft.Framework.WebEncoders.Core/project.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index d2d4b85976..7cee739e6e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -16,12 +16,12 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.ComponentModel": "4.0.0-*", - "System.Diagnostics.Debug": "4.0.10-*", - "System.IO": "4.0.10-*", + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", "System.Reflection": "4.0.10-*", - "System.Runtime.Extensions": "4.0.10-*", - "System.Threading": "4.0.10-*" + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*" } } } From 7ca6982883dfce755e98d51d0f6eb4c6332d9a39 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 17 Aug 2015 14:48:02 -0700 Subject: [PATCH 358/846] Updating to release NuGet.config. --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..3b8d545754 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From bbeea8ba4aa998fa8d2e2e00064cf219402a001b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 18 Aug 2015 14:00:18 -0700 Subject: [PATCH 359/846] Updating to aspnetliterelease. --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 3b8d545754..e2378fe359 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + \ No newline at end of file From aa0f6c37bb9eedb2dd0c205c2de133330db560b5 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 18 Aug 2015 14:00:19 -0700 Subject: [PATCH 360/846] Updating to aspnetlitedev. --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..6685c5330a 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From 5b3d7230b38b052308aa3c8448e16b8f1e1274c3 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 19 Aug 2015 14:52:58 -0700 Subject: [PATCH 361/846] Update NuGet feed from v2 => v3. --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 6685c5330a..10cec18a32 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,6 +2,6 @@ - + \ No newline at end of file From 1655fbf03a7a3d41c32e1fa31b87699425e028a2 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 20 Aug 2015 15:37:08 -0700 Subject: [PATCH 362/846] Update 'build.cmd' to pull Sake from v2 NuGet feed. --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index ccf195aee8..b54d91cf74 100644 --- a/build.cmd +++ b/build.cmd @@ -23,7 +23,7 @@ IF %BUILDCMD_KOREBUILD_VERSION%=="" ( ) ELSE ( .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion +.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( From d013bdfbf647375f16922d1b66417e99c7b38e25 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 20 Aug 2015 20:46:08 -0700 Subject: [PATCH 363/846] Update 'build.sh' to pull Sake from v2 NuGet feed. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 3ef874f9bd..68c3e8cb52 100755 --- a/build.sh +++ b/build.sh @@ -24,7 +24,7 @@ fi if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion + mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages fi if ! type dnvm > /dev/null 2>&1; then From 68eb9646ea18808504e06e1c5ef9c16a53a33aea Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Thu, 20 Aug 2015 00:08:14 +0200 Subject: [PATCH 364/846] Added asserts to tests --- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 3676fb2941..6cd3e7a844 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -39,7 +39,9 @@ namespace Microsoft.AspNet.Owin IDictionary env = new OwinEnvironment(context); Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); + // User property should set both server.User (non-standard) and owin.RequestUser. Assert.Equal("Foo", Get(env, "server.User").Identity.AuthenticationType); + Assert.Equal("Foo", Get(env, "owin.RequestUser").Identity.AuthenticationType); Assert.Same(Stream.Null, Get(env, "owin.RequestBody")); var requestHeaders = Get>(env, "owin.RequestHeaders"); Assert.NotNull(requestHeaders); @@ -65,6 +67,10 @@ namespace Microsoft.AspNet.Owin env["owin.RequestMethod"] = "SomeMethod"; env["server.User"] = new ClaimsPrincipal(new ClaimsIdentity("Foo")); + Assert.Equal("Foo", context.User.Identity.AuthenticationType); + // User property should fall back from owin.RequestUser to server.User. + env["owin.RequestUser"] = new ClaimsPrincipal(new ClaimsIdentity("Bar")); + Assert.Equal("Bar", context.User.Identity.AuthenticationType); env["owin.RequestBody"] = Stream.Null; var requestHeaders = Get>(env, "owin.RequestHeaders"); Assert.NotNull(requestHeaders); @@ -81,7 +87,6 @@ namespace Microsoft.AspNet.Owin env["owin.ResponseStatusCode"] = 201; Assert.Equal("SomeMethod", context.Request.Method); - Assert.Equal("Foo", context.User.Identity.AuthenticationType); Assert.Same(Stream.Null, context.Request.Body); Assert.Equal("CustomRequestValue", context.Request.Headers["CustomRequestHeader"]); Assert.Equal("/path", context.Request.Path.Value); From 138bc6a20f638eb9993c4e9c606ac7b4e322f947 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Thu, 20 Aug 2015 00:10:40 +0200 Subject: [PATCH 365/846] Added owin.RequestUser --- src/Microsoft.AspNet.Owin/OwinConstants.cs | 5 +++-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 ++ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 12 ++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 47761c96c2..039209c098 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -20,11 +20,12 @@ namespace Microsoft.AspNet.Owin #endregion - #region OWIN v1.1.0 - 3.2.1 Request Data + #region OWIN v1.0.1 - 3.2.1 Request Data - // OWIN 1.1.0 http://owin.org/html/owin.html + // OWIN 1.0.1 http://owin.org/html/owin.html public const string RequestId = "owin.RequestId"; + public const string RequestUser = "owin.RequestUser"; #endregion diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5c231eb0e8..2b331b0d57 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -9,6 +9,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.WebSockets; +using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; @@ -57,6 +58,7 @@ namespace Microsoft.AspNet.Owin (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.RequestUser, new FeatureMap(feature => feature.User, () => null, (feature, value) => feature.User = (ClaimsPrincipal)value) }, { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 6dd44e52e6..614bccf333 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -263,8 +263,16 @@ namespace Microsoft.AspNet.Owin ClaimsPrincipal IHttpAuthenticationFeature.User { - get { return Utilities.MakeClaimsPrincipal(Prop(OwinConstants.Security.User)); } - set { Prop(OwinConstants.Security.User, value); } + get + { + return Prop(OwinConstants.RequestUser) + ?? Utilities.MakeClaimsPrincipal(Prop(OwinConstants.Security.User)); + } + set + { + Prop(OwinConstants.RequestUser, value); + Prop(OwinConstants.Security.User, value); + } } IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } From 516a435ea5f64105d5a5e04c727f5cd1b542f48b Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Wed, 19 Aug 2015 16:27:04 -0700 Subject: [PATCH 366/846] Fix #365 - Make IFormFileCollection implmenent IReadOnlyList --- src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs | 4 ++-- src/Microsoft.AspNet.Http/FormFileCollection.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs index 236614815e..4950758b44 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs @@ -5,12 +5,12 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http { - public interface IFormFileCollection : IList + public interface IFormFileCollection : IReadOnlyList { IFormFile this[string name] { get; } IFormFile GetFile(string name); - IList GetFiles(string name); + IReadOnlyList GetFiles(string name); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/FormFileCollection.cs b/src/Microsoft.AspNet.Http/FormFileCollection.cs index bd624df355..43dbf0cb12 100644 --- a/src/Microsoft.AspNet.Http/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/FormFileCollection.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Http.Internal return Find(file => string.Equals(name, GetName(file.ContentDisposition))); } - public IList GetFiles(string name) + public IReadOnlyList GetFiles(string name) { return FindAll(file => string.Equals(name, GetName(file.ContentDisposition))); } From 15687ab80a87378a1d465d1f8fdabadf4577ce1a Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 27 Aug 2015 21:48:13 -0700 Subject: [PATCH 367/846] Fix #343 - Avoid going to disk when reading the form This change tries to avoid looking up the TEMP directory for most reads of the form data. We'll now only hit the disk when necessary. --- src/Microsoft.AspNet.Http/BufferingHelper.cs | 27 ++++++++++++------- .../FileBufferingReadStream.cs | 22 ++++++++++++++- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 3335203e29..47b08915c4 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -12,21 +12,30 @@ namespace Microsoft.AspNet.Http.Internal { internal const int DefaultBufferThreshold = 1024 * 30; + private readonly static Func _getTempDirectory = () => TempDirectory; + + private static string _tempDirectory; + public static string TempDirectory { get { - // Look for folders in the following order. - var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP") ?? // ASPNET_TEMP - User set temporary location. - Path.GetTempPath(); // Fall back. - - if (!Directory.Exists(temp)) + if (_tempDirectory == null) { - // TODO: ??? - throw new DirectoryNotFoundException(temp); + // Look for folders in the following order. + var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP") ?? // ASPNET_TEMP - User set temporary location. + Path.GetTempPath(); // Fall back. + + if (!Directory.Exists(temp)) + { + // TODO: ??? + throw new DirectoryNotFoundException(temp); + } + + _tempDirectory = temp; } - return temp; + return _tempDirectory; } } @@ -37,7 +46,7 @@ namespace Microsoft.AspNet.Http.Internal { // TODO: Register this buffer for disposal at the end of the request to ensure the temp file is deleted. // Otherwise it won't get deleted until GC closes the stream. - request.Body = new FileBufferingReadStream(body, bufferThreshold, TempDirectory); + request.Body = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); } return request; } diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index b6df361dc4..9bed427578 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -18,7 +19,8 @@ namespace Microsoft.AspNet.WebUtilities { private readonly Stream _inner; private readonly int _memoryThreshold; - private readonly string _tempFileDirectory; + private string _tempFileDirectory; + private readonly Func _tempFileDirectoryAccessor; private Stream _buffer = new MemoryStream(); // TODO: We could have a more efficiently expanding buffer stream. private bool _inMemory = true; @@ -26,6 +28,17 @@ namespace Microsoft.AspNet.WebUtilities private bool _disposed; + // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? + public FileBufferingReadStream( + [NotNull] Stream inner, + int memoryThreshold, + [NotNull] Func tempFileDirectoryAccessor) + { + _inner = inner; + _memoryThreshold = memoryThreshold; + _tempFileDirectoryAccessor = tempFileDirectoryAccessor; + } + // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? public FileBufferingReadStream([NotNull] Stream inner, int memoryThreshold, [NotNull] string tempFileDirectory) { @@ -88,6 +101,13 @@ namespace Microsoft.AspNet.WebUtilities private Stream CreateTempFile() { + if (_tempFileDirectory == null) + { + Debug.Assert(_tempFileDirectoryAccessor != null); + _tempFileDirectory = _tempFileDirectoryAccessor(); + Debug.Assert(_tempFileDirectory != null); + } + var fileName = Path.Combine(_tempFileDirectory, "ASPNET_" + Guid.NewGuid().ToString() + ".tmp"); return new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete, 1024 * 16, FileOptions.Asynchronous | FileOptions.DeleteOnClose | FileOptions.SequentialScan); From 456277fe1d83acd1bbc8fd56c0a98a30bb907ab5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 20 Aug 2015 16:11:47 -0700 Subject: [PATCH 368/846] #361 Introduce StringValues to replace string[] usage. --- HttpAbstractions.sln | 49 +++- samples/SampleApp/Program.cs | 30 +++ samples/SampleApp/SampleApp.xproj | 20 ++ samples/SampleApp/project.json | 15 ++ .../IHeaderDictionary.cs | 45 +--- .../IReadableStringCollection.cs | 27 +- .../QueryString.cs | 3 +- .../HeaderDictionaryTypeExtensions.cs | 13 +- .../RequestHeaders.cs | 2 +- .../ResponseHeaders.cs | 2 +- .../IHttpRequestFeature.cs | 3 +- .../IHttpResponseFeature.cs | 3 +- .../project.json | 6 +- .../DefaultHttpResponse.cs | 7 +- .../DefaultWebSocketManager.cs | 5 +- .../Features/FormFeature.cs | 11 +- .../Features/HttpRequestFeature.cs | 5 +- .../Features/HttpResponseFeature.cs | 5 +- .../Features/QueryFeature.cs | 38 +-- .../Features/RequestCookiesFeature.cs | 66 ++--- src/Microsoft.AspNet.Http/FormCollection.cs | 5 +- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 99 ++------ src/Microsoft.AspNet.Http/ParsingHelpers.cs | 104 +++----- .../ReadableStringCollection.cs | 56 ++--- .../RequestCookiesCollection.cs | 7 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 46 ++-- .../DictionaryStringArrayWrapper.cs | 80 ++++++ .../DictionaryStringValuesWrapper.cs | 80 ++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +- .../OwinFeatureCollection.cs | 14 +- src/Microsoft.AspNet.Owin/Utilities.cs | 26 +- .../FormReader.cs | 11 +- .../KeyValueAccumulator.cs | 23 +- .../MultipartReader.cs | 5 +- .../MultipartSection.cs | 11 +- .../QueryHelpers.cs | 5 +- .../project.json | 2 +- .../Microsoft.Framework.Primitives.xproj | 20 ++ .../StringValues.cs | 233 ++++++++++++++++++ .../project.json | 23 ++ .../DefaultHttpRequestTests.cs | 33 +-- .../HeaderDictionaryTests.cs | 8 +- ...Microsoft.Framework.Primitives.Tests.xproj | 21 ++ .../StringValuesTests.cs | 117 +++++++++ .../project.json | 13 + 45 files changed, 1010 insertions(+), 391 deletions(-) create mode 100644 samples/SampleApp/Program.cs create mode 100644 samples/SampleApp/SampleApp.xproj create mode 100644 samples/SampleApp/project.json create mode 100644 src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs create mode 100644 src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs create mode 100644 src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj create mode 100644 src/Microsoft.Framework.Primitives/StringValues.cs create mode 100644 src/Microsoft.Framework.Primitives/project.json create mode 100644 test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj create mode 100644 test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs create mode 100644 test/Microsoft.Framework.Primitives.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 872a0e3ada..4a5ef774ab 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -43,6 +43,14 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEnco EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives", "src\Microsoft.Framework.Primitives\Microsoft.Framework.Primitives.xproj", "{E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives.Tests", "test\Microsoft.Framework.Primitives.Tests\Microsoft.Framework.Primitives.Tests.xproj", "{61F72E92-B3AE-4A10-B838-44F80AED40AE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -245,6 +253,42 @@ Global {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.Build.0 = Release|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.ActiveCfg = Release|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.Build.0 = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|x86.ActiveCfg = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|x86.Build.0 = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Any CPU.Build.0 = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.ActiveCfg = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.Build.0 = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.Build.0 = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.ActiveCfg = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.Build.0 = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.Build.0 = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.Build.0 = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.ActiveCfg = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -268,5 +312,8 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {61F72E92-B3AE-4A10-B838-44F80AED40AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/samples/SampleApp/Program.cs b/samples/SampleApp/Program.cs new file mode 100644 index 0000000000..c434e6c0a6 --- /dev/null +++ b/samples/SampleApp/Program.cs @@ -0,0 +1,30 @@ +using System; +using System.Diagnostics; +using Microsoft.Framework.Primitives; + +namespace SampleApp +{ + public class Program + { + public void Main(string[] args) + { + for (int i = 0; i < 10; i++) + { + Stopwatch timer = new Stopwatch(); + timer.Start(); + string myString; + string[] myArray; + StringValues myValues; + for (int j = 0; j < 100000000; j++) + { + myString = new string('a', 40); + myArray = new[] { myString }; + // myValues = new StringValues(myString); + myValues = new StringValues(myArray); + } + timer.Stop(); + Console.WriteLine(timer.Elapsed + ", " + Environment.WorkingSet); + } + } + } +} diff --git a/samples/SampleApp/SampleApp.xproj b/samples/SampleApp/SampleApp.xproj new file mode 100644 index 0000000000..dcc1bdf260 --- /dev/null +++ b/samples/SampleApp/SampleApp.xproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + 1d0764b4-1deb-4232-a714-d4b7e846918a + SampleApp + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json new file mode 100644 index 0000000000..b3b5f51ed7 --- /dev/null +++ b/samples/SampleApp/project.json @@ -0,0 +1,15 @@ +{ + "version": "1.0.0-*", + + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + + "commands": { + "SampleApp": "SampleApp" + }, + + "frameworks": { + "dnx451": { } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index b10101cb3d..d2192475fa 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -2,29 +2,30 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http { /// /// Represents request and response headers /// - public interface IHeaderDictionary : IReadableStringCollection, IDictionary + public interface IHeaderDictionary : IReadableStringCollection, IDictionary { + // This property is duplicated to resolve an ambiguity between IReadableStringCollection and IDictionary /// - /// Get or sets the associated value from the collection as a single string. + /// /// - /// The header name. - /// the associated value from the collection as a single string or null if the key is not present. - new string this[string key] { get; set; } + /// + /// The stored value, or StringValues.Empty if the key is not present. + new StringValues this[string key] { get; set; } - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count /// /// Gets the number of elements contained in the collection. /// new int Count { get; } - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys /// /// Gets a collection containing the keys. /// @@ -36,21 +37,14 @@ namespace Microsoft.AspNet.Http /// /// The header name. /// the associated values from the collection separated into individual values, or null if the key is not present. - IList GetCommaSeparatedValues(string key); + StringValues GetCommaSeparatedValues(string key); /// - /// Add a new value. Appends to the header if already present + /// Add a new value. Appends to the header list if already present /// /// The header name. /// The header value. - void Append(string key, string value); - - /// - /// Add new values. Each item remains a separate array entry. - /// - /// The header name. - /// The header values. - void AppendValues(string key, params string[] values); + void Append(string key, StringValues value); /// /// Quotes any values containing comas, and then coma joins all of the values with any existing values. @@ -59,21 +53,6 @@ namespace Microsoft.AspNet.Http /// The header values. void AppendCommaSeparatedValues(string key, params string[] values); - /// - /// Sets a specific header value. - /// - /// The header name. - /// The header value. - [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Set", Justification = "Re-evaluate later.")] - void Set(string key, string value); - - /// - /// Sets the specified header values without modification. - /// - /// The header name. - /// The header values. - void SetValues(string key, params string[] values); - /// /// Quotes any values containing comas, and then coma joins all of the values. /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs index 589b758895..d85e960d9b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs @@ -2,22 +2,22 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http { /// /// Accessors for headers, query, forms, etc. /// - public interface IReadableStringCollection : IEnumerable> + public interface IReadableStringCollection : IEnumerable> { /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. + /// Get the associated value from the collection. + /// Returns StringValues.Empty if the key is not present. /// /// /// - string this[string key] { get; } + StringValues this[string key] { get; } /// /// Gets the number of elements contained in the collection. @@ -35,22 +35,5 @@ namespace Microsoft.AspNet.Http /// /// bool ContainsKey(string key); - - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. - /// - /// - /// - [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "Re-evaluate later.")] - string Get(string key); - - /// - /// Get the associated values from the collection in their original format. - /// Returns null if the key is not present. - /// - /// - /// - IList GetValues(string key); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 8717638aa5..2844c90213 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Text; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http @@ -143,7 +144,7 @@ namespace Microsoft.AspNet.Http /// /// /// The resulting QueryString - public static QueryString Create(IEnumerable> parameters) + public static QueryString Create(IEnumerable> parameters) { var builder = new StringBuilder(); bool first = true; diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 69f94e984e..803a0a5080 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http @@ -50,7 +51,7 @@ namespace Microsoft.AspNet.Http } else { - headers.SetValues(name, values.Select(value => value.ToString()).ToArray()); + headers[name] = values.Select(value => value.ToString()).ToArray(); } } @@ -98,7 +99,7 @@ namespace Microsoft.AspNet.Http } var value = headers[name]; - if (string.IsNullOrWhiteSpace(value)) + if (StringValues.IsNullOrEmpty(value)) { return default(T); } @@ -112,11 +113,11 @@ namespace Microsoft.AspNet.Http if (KnownListParsers.TryGetValue(typeof(T), out temp)) { var func = (Func, IList>)temp; - return func(headers.GetValues(name)); + return func(headers[name]); } - var values = headers.GetValues(name); - if (values == null || !values.Any()) + var values = headers[name]; + if (StringValues.IsNullOrEmpty(values)) { return null; } @@ -158,7 +159,7 @@ namespace Microsoft.AspNet.Http return default(T); } - private static IList GetListViaReflection(IList values) + private static IList GetListViaReflection(StringValues values) { // TODO: Cache the reflected type for later? Only if success? var type = typeof(T); diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index ac9e542575..c718ada981 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -285,7 +285,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList([NotNull] string name, [NotNull] IList values) { - Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 8b8607a2b7..7ee2bb79a5 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -182,7 +182,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList([NotNull] string name, [NotNull] IList values) { - Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index c80ca29b5f..7e61bb915a 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -14,7 +15,7 @@ namespace Microsoft.AspNet.Http.Features string PathBase { get; set; } string Path { get; set; } string QueryString { get; set; } - IDictionary Headers { get; set; } + IDictionary Headers { get; set; } Stream Body { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index d530718b17..b46b4ae4b6 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -12,7 +13,7 @@ namespace Microsoft.AspNet.Http.Features { int StatusCode { get; set; } string ReasonPhrase { get; set; } - IDictionary Headers { get; set; } + IDictionary Headers { get; set; } Stream Body { get; set; } bool HasStarted { get; } void OnStarting(Func callback, object state); diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 3af9685e65..b2b95c92a0 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -6,7 +6,11 @@ "url": "git://github.com/aspnet/httpabstractions" }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { + "type": "build", + "version": "1.0.0-*" + }, + "Microsoft.Framework.Primitives": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 0dae9253b9..b47279bfd8 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -68,8 +68,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - var contentType = Headers[HeaderNames.ContentType]; - return contentType; + return Headers[HeaderNames.ContentType]; } set { @@ -79,7 +78,7 @@ namespace Microsoft.AspNet.Http.Internal } else { - HttpResponseFeature.Headers[HeaderNames.ContentType] = new[] { value }; + HttpResponseFeature.Headers[HeaderNames.ContentType] = value; } } } @@ -115,7 +114,7 @@ namespace Microsoft.AspNet.Http.Internal HttpResponseFeature.StatusCode = 302; } - Headers.Set(HeaderNames.Location, location); + Headers[HeaderNames.Location] = location; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 7a8f87d125..9493859f7c 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -12,8 +12,6 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { - private static IList EmptyList = new List(); - private IFeatureCollection _features; private FeatureReference _request = FeatureReference.Default; private FeatureReference _webSockets = FeatureReference.Default; @@ -45,8 +43,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return ParsingHelpers.GetHeaderUnmodified(HttpRequestFeature.Headers, - HeaderNames.WebSocketSubProtocols) ?? EmptyList; + return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols); } } diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index 593cd274c4..b50d58c415 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal @@ -87,7 +88,7 @@ namespace Microsoft.AspNet.Http.Features.Internal _request.EnableRewind(); - IDictionary formFields = null; + IDictionary formFields = null; var files = new FormFileCollection(); // Some of these code paths use StreamReader which does not support cancellation tokens. @@ -102,7 +103,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } else if (HasMultipartFormContentType(contentType)) { - var formAccumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var formAccumulator = new KeyValueAccumulator(); var boundary = GetBoundary(contentType); var multipartReader = new MultipartReader(boundary, _request.Body); @@ -111,7 +112,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { var headers = new HeaderDictionary(section.Headers); ContentDispositionHeaderValue contentDisposition; - ContentDispositionHeaderValue.TryParse(headers.Get(HeaderNames.ContentDisposition), out contentDisposition); + ContentDispositionHeaderValue.TryParse(headers[HeaderNames.ContentDisposition], out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { // Find the end @@ -131,7 +132,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); MediaTypeHeaderValue mediaType; - MediaTypeHeaderValue.TryParse(headers.Get(HeaderNames.ContentType), out mediaType); + MediaTypeHeaderValue.TryParse(headers[HeaderNames.ContentType], out mediaType); var encoding = FilterEncoding(mediaType?.Encoding); using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { @@ -141,7 +142,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } else { - System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers.Get(HeaderNames.ContentDisposition)); + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers[HeaderNames.ContentDisposition]); } section = await multipartReader.ReadNextSectionAsync(cancellationToken); diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index bce7570916..73bf244cbf 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -11,7 +12,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { public HttpRequestFeature() { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; Protocol = string.Empty; Scheme = string.Empty; @@ -27,7 +28,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string PathBase { get; set; } public string Path { get; set; } public string QueryString { get; set; } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public Stream Body { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 84f8196f93..010a13c86c 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -13,7 +14,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public HttpResponseFeature() { StatusCode = 200; - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; } @@ -21,7 +22,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 02545c50a1..39c842b83e 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -13,17 +14,18 @@ namespace Microsoft.AspNet.Http.Features.Internal { private readonly IFeatureCollection _features; private FeatureReference _request = FeatureReference.Default; - private string _queryString; - private IReadableStringCollection _query; - public QueryFeature([NotNull] IDictionary query) - : this (new ReadableStringCollection(query)) + private string _original; + private IReadableStringCollection _parsedValues; + + public QueryFeature([NotNull] IDictionary query) + : this(new ReadableStringCollection(query)) { } public QueryFeature([NotNull] IReadableStringCollection query) { - _query = query; + _parsedValues = query; } public QueryFeature([NotNull] IFeatureCollection features) @@ -37,24 +39,32 @@ namespace Microsoft.AspNet.Http.Features.Internal { if (_features == null) { - return _query; + return _parsedValues ?? ReadableStringCollection.Empty; } - var queryString = _request.Fetch(_features).QueryString; - if (_query == null || !string.Equals(_queryString, queryString, StringComparison.Ordinal)) + var current = _request.Fetch(_features).QueryString; + if (_parsedValues == null || !string.Equals(_original, current, StringComparison.Ordinal)) { - _queryString = queryString; - _query = new ReadableStringCollection(QueryHelpers.ParseQuery(queryString)); + _original = current; + _parsedValues = new ReadableStringCollection(QueryHelpers.ParseQuery(current)); } - return _query; + return _parsedValues; } set { - _query = value; + _parsedValues = value; if (_features != null) { - _queryString = _query == null ? string.Empty : QueryString.Create(_query).ToString(); - _request.Fetch(_features).QueryString = _queryString; + if (value == null) + { + _original = string.Empty; + _request.Fetch(_features).QueryString = string.Empty; + } + else + { + _original = QueryString.Create(_parsedValues).ToString(); + _request.Fetch(_features).QueryString = _original; + } } } } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 08317fdd50..cc0a9df3ed 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal @@ -14,18 +15,18 @@ namespace Microsoft.AspNet.Http.Features.Internal { private readonly IFeatureCollection _features; private readonly FeatureReference _request = FeatureReference.Default; - private string[] _cookieHeaders; - private RequestCookiesCollection _cookiesCollection; - private IReadableStringCollection _cookies; - public RequestCookiesFeature([NotNull] IDictionary cookies) - : this (new ReadableStringCollection(cookies)) + private StringValues _original; + private IReadableStringCollection _parsedValues; + + public RequestCookiesFeature([NotNull] IDictionary cookies) + : this(new ReadableStringCollection(cookies)) { } public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) { - _cookies = cookies; + _parsedValues = cookies; } public RequestCookiesFeature([NotNull] IFeatureCollection features) @@ -39,46 +40,53 @@ namespace Microsoft.AspNet.Http.Features.Internal { if (_features == null) { - return _cookies; + return _parsedValues ?? ReadableStringCollection.Empty; } var headers = _request.Fetch(_features).Headers; - string[] values; - if (!headers.TryGetValue(HeaderNames.Cookie, out values)) + StringValues current; + if (!headers.TryGetValue(HeaderNames.Cookie, out current)) { - values = new string[0]; + current = StringValues.Empty; } - if (_cookieHeaders == null || !Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) + if (_parsedValues == null || !Enumerable.SequenceEqual(_original, current, StringComparer.Ordinal)) { - _cookieHeaders = values; - if (_cookiesCollection == null) + _original = current; + var collectionParser = _parsedValues as RequestCookiesCollection; + if (collectionParser == null) { - _cookiesCollection = new RequestCookiesCollection(); - _cookies = _cookiesCollection; + collectionParser = new RequestCookiesCollection(); + _parsedValues = collectionParser; } - _cookiesCollection.Reparse(values); + collectionParser.Reparse(current); } - return _cookies; + return _parsedValues; } set { - _cookies = value; - _cookieHeaders = null; - _cookiesCollection = _cookies as RequestCookiesCollection; - if (_cookies != null && _features != null) + _parsedValues = value; + _original = StringValues.Empty; + if (_features != null) { - var headers = new List(); - foreach (var pair in _cookies) + if (_parsedValues == null || _parsedValues.Count == 0) { - foreach (var cookieValue in pair.Value) - { - headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); - } + _request.Fetch(_features).Headers.Remove(HeaderNames.Cookie); + } + else + { + var headers = new List(); + foreach (var pair in _parsedValues) + { + foreach (var cookieValue in pair.Value) + { + headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); + } + } + _original = headers.ToArray(); + _request.Fetch(_features).Headers[HeaderNames.Cookie] = _original; } - _cookieHeaders = headers.ToArray(); - _request.Fetch(_features).Headers[HeaderNames.Cookie] = _cookieHeaders; } } } diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index ad829cd70c..15de4dee62 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { @@ -11,12 +12,12 @@ namespace Microsoft.AspNet.Http.Internal /// public class FormCollection : ReadableStringCollection, IFormCollection { - public FormCollection([NotNull] IDictionary store) + public FormCollection([NotNull] IDictionary store) : this(store, new FormFileCollection()) { } - public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) + public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) : base(store) { Files = files; diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 04c2d556bd..d7cb70c481 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -4,9 +4,8 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { @@ -15,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal /// public class HeaderDictionary : IHeaderDictionary { - public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) + public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) { } @@ -23,12 +22,12 @@ namespace Microsoft.AspNet.Http.Internal /// Initializes a new instance of the class. /// /// The underlying data store. - public HeaderDictionary([NotNull] IDictionary store) + public HeaderDictionary([NotNull] IDictionary store) { Store = store; } - private IDictionary Store { get; set; } + private IDictionary Store { get; set; } /// /// Gets an that contains the keys in the ;. @@ -42,7 +41,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// /// - public ICollection Values + public ICollection Values { get { return Store.Values; } } @@ -69,11 +68,11 @@ namespace Microsoft.AspNet.Http.Internal /// Get or sets the associated value from the collection as a single string. /// /// The header name. - /// the associated value from the collection as a single string or null if the key is not present. - public string this[string key] + /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. + public StringValues this[string key] { - get { return Get(key); } - set { Set(key, value); } + get { return ParsingHelpers.GetHeader(Store, key); } + set { ParsingHelpers.SetHeader(Store, key, value); } } /// @@ -81,7 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// - string[] IDictionary.this[string key] + StringValues IDictionary.this[string key] { get { return Store[key]; } set { Store[key] = value; } @@ -91,7 +90,7 @@ namespace Microsoft.AspNet.Http.Internal /// Returns an enumerator that iterates through a collection. /// /// An object that can be used to iterate through the collection. - public IEnumerator> GetEnumerator() + IEnumerator> IEnumerable>.GetEnumerator() { return Store.GetEnumerator(); } @@ -102,59 +101,29 @@ namespace Microsoft.AspNet.Http.Internal /// An object that can be used to iterate through the collection. IEnumerator IEnumerable.GetEnumerator() { - return GetEnumerator(); + return Store.GetEnumerator(); } - /// - /// Get the associated value from the collection as a single string. - /// - /// The header name. - /// the associated value from the collection as a single string or null if the key is not present. - public string Get(string key) - { - return ParsingHelpers.GetHeader(Store, key); - } - - /// - /// Get the associated values from the collection without modification. - /// - /// The header name. - /// the associated value from the collection without modification, or null if the key is not present. - public IList GetValues(string key) - { - return ParsingHelpers.GetHeaderUnmodified(Store, key); - } /// /// Get the associated values from the collection separated into individual values. /// Quoted values will not be split, and the quotes will be removed. /// /// The header name. - /// the associated values from the collection separated into individual values, or null if the key is not present. - public IList GetCommaSeparatedValues(string key) + /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. + public StringValues GetCommaSeparatedValues(string key) { - IEnumerable values = ParsingHelpers.GetHeaderSplit(Store, key); - return values == null ? null : values.ToList(); - } - - /// - /// Add a new value. Appends to the header if already present - /// - /// The header name. - /// The header value. - public void Append(string key, string value) - { - ParsingHelpers.AppendHeader(Store, key, value); + return ParsingHelpers.GetHeaderSplit(Store, key); } /// /// Add new values. Each item remains a separate array entry. /// /// The header name. - /// The header values. - public void AppendValues(string key, params string[] values) + /// The header value. + public void Append(string key, StringValues value) { - ParsingHelpers.AppendHeaderUnmodified(Store, key, values); + ParsingHelpers.AppendHeaderUnmodified(Store, key, value); } /// @@ -167,26 +136,6 @@ namespace Microsoft.AspNet.Http.Internal ParsingHelpers.AppendHeaderJoined(Store, key, values); } - /// - /// Sets a specific header value. - /// - /// The header name. - /// The header value. - public void Set(string key, string value) - { - ParsingHelpers.SetHeader(Store, key, value); - } - - /// - /// Sets the specified header values without modification. - /// - /// The header name. - /// The header values. - public void SetValues(string key, params string[] values) - { - ParsingHelpers.SetHeaderUnmodified(Store, key, values); - } - /// /// Quotes any values containing comas, and then coma joins all of the values. /// @@ -202,7 +151,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The header values. - public void Add(string key, string[] value) + public void Add(string key, StringValues value) { Store.Add(key, value); } @@ -233,7 +182,7 @@ namespace Microsoft.AspNet.Http.Internal /// The header name. /// The value. /// true if the contains the key; otherwise, false. - public bool TryGetValue(string key, out string[] value) + public bool TryGetValue(string key, out StringValues value) { return Store.TryGetValue(key, out value); } @@ -242,7 +191,7 @@ namespace Microsoft.AspNet.Http.Internal /// Adds a new list of items to the collection. /// /// The item to add. - public void Add(KeyValuePair item) + public void Add(KeyValuePair item) { Store.Add(item); } @@ -260,7 +209,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The item. /// true if the specified object occurs within this collection; otherwise, false. - public bool Contains(KeyValuePair item) + public bool Contains(KeyValuePair item) { return Store.Contains(item); } @@ -270,7 +219,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The one-dimensional Array that is the destination of the specified objects copied from the . /// The zero-based index in at which copying begins. - public void CopyTo(KeyValuePair[] array, int arrayIndex) + public void CopyTo(KeyValuePair[] array, int arrayIndex) { Store.CopyTo(array, arrayIndex); } @@ -280,7 +229,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The item. /// true if the specified object was removed from the collection; otherwise, false. - public bool Remove(KeyValuePair item) + public bool Remove(KeyValuePair item) { return Store.Remove(item); } diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 45ac370eb4..bc373b4094 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal @@ -76,9 +77,9 @@ namespace Microsoft.AspNet.Http.Internal [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] internal struct HeaderSegmentCollection : IEnumerable, IEquatable { - private readonly string[] _headers; + private readonly StringValues _headers; - public HeaderSegmentCollection(string[] headers) + public HeaderSegmentCollection(StringValues headers) { _headers = headers; } @@ -102,7 +103,7 @@ namespace Microsoft.AspNet.Http.Internal public override int GetHashCode() { - return (_headers != null ? _headers.GetHashCode() : 0); + return (!StringValues.IsNullOrEmpty(_headers) ? _headers.GetHashCode() : 0); } public static bool operator ==(HeaderSegmentCollection left, HeaderSegmentCollection right) @@ -134,7 +135,7 @@ namespace Microsoft.AspNet.Http.Internal internal struct Enumerator : IEnumerator { - private readonly string[] _headers; + private readonly StringValues _headers; private int _index; private string _header; @@ -149,11 +150,9 @@ namespace Microsoft.AspNet.Http.Internal private Mode _mode; - private static readonly string[] NoHeaders = new string[0]; - - public Enumerator(string[] headers) + public Enumerator(StringValues headers) { - _headers = headers ?? NoHeaders; + _headers = headers; _header = string.Empty; _headerLength = -1; _index = -1; @@ -237,7 +236,7 @@ namespace Microsoft.AspNet.Http.Internal _trailingStart = -1; // if that was the last string - if (_index == _headers.Length) + if (_index == _headers.Count) { // no more move nexts return false; @@ -496,19 +495,19 @@ namespace Microsoft.AspNet.Http.Internal internal static class ParsingHelpers { - public static string GetHeader(IDictionary headers, string key) + public static StringValues GetHeader(IDictionary headers, string key) { - string[] values = GetHeaderUnmodified(headers, key); - return values == null ? null : string.Join(",", values); + StringValues value; + return headers.TryGetValue(key, out value) ? value : StringValues.Empty; } - public static IEnumerable GetHeaderSplit(IDictionary headers, string key) + public static StringValues GetHeaderSplit(IDictionary headers, string key) { - string[] values = GetHeaderUnmodified(headers, key); - return values == null ? null : GetHeaderSplitImplementation(values); + var values = GetHeaderUnmodified(headers, key); + return new StringValues(GetHeaderSplitImplementation(values).ToArray()); } - private static IEnumerable GetHeaderSplitImplementation(string[] values) + private static IEnumerable GetHeaderSplitImplementation(StringValues values) { foreach (var segment in new HeaderSegmentCollection(values)) { @@ -519,41 +518,41 @@ namespace Microsoft.AspNet.Http.Internal } } - public static string[] GetHeaderUnmodified([NotNull] IDictionary headers, string key) + public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) { - string[] values; - return headers.TryGetValue(key, out values) ? values : null; + StringValues values; + return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, string value) + public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, StringValues value) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } - if (string.IsNullOrWhiteSpace(value)) + if (StringValues.IsNullOrEmpty(value)) { headers.Remove(key); } else { - headers[key] = new[] { value }; + headers[key] = value; } } - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } - if (values == null || values.Length == 0) + if (StringValues.IsNullOrEmpty(value)) { headers.Remove(key); } else { - headers[key] = new[] { string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); } } @@ -589,46 +588,23 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } - if (values == null || values.Length == 0) + if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) { headers.Remove(key); } else { - headers[key] = values; + headers[key] = values.Value; } } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, [NotNull] IEnumerable values) - { - headers[key] = values.ToArray(); - } - - public static void AppendHeader([NotNull] IDictionary headers, [NotNull] string key, string values) - { - if (string.IsNullOrWhiteSpace(values)) - { - return; - } - - string existing = GetHeader(headers, key); - if (existing == null) - { - SetHeader(headers, key, values); - } - else - { - headers[key] = new[] { existing + "," + values }; - } - } - - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { if (values == null || values.Length == 0) { @@ -642,35 +618,29 @@ namespace Microsoft.AspNet.Http.Internal } else { - headers[key] = new[] { existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); } } - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) { - if (values == null || values.Length == 0) + if (values.Count == 0) { return; } - string[] existing = GetHeaderUnmodified(headers, key); - if (existing == null) - { - SetHeaderUnmodified(headers, key, values); - } - else - { - SetHeaderUnmodified(headers, key, existing.Concat(values)); - } + var existing = GetHeaderUnmodified(headers, key); + SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); } public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; - string rawValue = headers.Get(HeaderNames.ContentLength); - if (!string.IsNullOrWhiteSpace(rawValue) && - long.TryParse(rawValue, styles, CultureInfo.InvariantCulture, out value)) + var rawValue = headers[HeaderNames.ContentLength]; + if (rawValue.Count == 1 && + !string.IsNullOrWhiteSpace(rawValue[0]) && + long.TryParse(rawValue[0], styles, CultureInfo.InvariantCulture, out value)) { return value; } diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs index 7a07ea603c..962804b723 100644 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -4,6 +4,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { @@ -12,16 +13,18 @@ namespace Microsoft.AspNet.Http.Internal /// public class ReadableStringCollection : IReadableStringCollection { + public static readonly IReadableStringCollection Empty = new ReadableStringCollection(new Dictionary(0)); + /// /// Create a new wrapper /// /// - public ReadableStringCollection([NotNull] IDictionary store) + public ReadableStringCollection([NotNull] IDictionary store) { Store = store; } - private IDictionary Store { get; set; } + private IDictionary Store { get; set; } /// /// Gets the number of elements contained in the collection. @@ -42,13 +45,21 @@ namespace Microsoft.AspNet.Http.Internal /// /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. + /// Returns StringValues.Empty if the key is not present. /// /// /// - public string this[string key] + public StringValues this[string key] { - get { return Get(key); } + get + { + StringValues value; + if (Store.TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } } /// @@ -61,35 +72,12 @@ namespace Microsoft.AspNet.Http.Internal return Store.ContainsKey(key); } - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. - /// - /// - /// - public string Get(string key) - { - return GetJoinedValue(Store, key); - } - - /// - /// Get the associated values from the collection in their original format. - /// Returns null if the key is not present. - /// - /// - /// - public IList GetValues(string key) - { - string[] values; - Store.TryGetValue(key, out values); - return values; - } /// /// /// /// - public IEnumerator> GetEnumerator() + public IEnumerator> GetEnumerator() { return Store.GetEnumerator(); } @@ -102,15 +90,5 @@ namespace Microsoft.AspNet.Http.Internal { return GetEnumerator(); } - - private static string GetJoinedValue(IDictionary store, string key) - { - string[] values; - if (store.TryGetValue(key, out values)) - { - return string.Join(",", values); - } - return null; - } } } diff --git a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs index 1dc603b518..8fb23def3d 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs @@ -4,6 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal @@ -17,7 +18,7 @@ namespace Microsoft.AspNet.Http.Internal _dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); } - public string this[string key] + public StringValues this[string key] { get { return Get(key); } } @@ -88,11 +89,11 @@ namespace Microsoft.AspNet.Http.Internal } } - public IEnumerator> GetEnumerator() + public IEnumerator> GetEnumerator() { foreach (var pair in _dictionary) { - yield return new KeyValuePair(pair.Key, new[] { pair.Value }); + yield return new KeyValuePair(pair.Key, pair.Value); } } diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index b47b48d505..7ead5dcc91 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Linq; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; @@ -33,11 +33,14 @@ namespace Microsoft.AspNet.Http.Internal /// public void Append(string key, string value) { - Headers.AppendValues(HeaderNames.SetCookie, - new SetCookieHeaderValue( + var setCookieHeaderValue = new SetCookieHeaderValue( UrlEncoder.Default.UrlEncode(key), UrlEncoder.Default.UrlEncode(value)) - { Path = "/" }.ToString()); + { + Path = "/" + }; + + Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], setCookieHeaderValue.ToString()); } /// @@ -48,17 +51,18 @@ namespace Microsoft.AspNet.Http.Internal /// public void Append(string key, string value, [NotNull] CookieOptions options) { - Headers.AppendValues(HeaderNames.SetCookie, - new SetCookieHeaderValue( + var setCookieHeaderValue = new SetCookieHeaderValue( UrlEncoder.Default.UrlEncode(key), UrlEncoder.Default.UrlEncode(value)) - { - Domain = options.Domain, - Path = options.Path, - Expires = options.Expires, - Secure = options.Secure, - HttpOnly = options.HttpOnly, - }.ToString()); + { + Domain = options.Domain, + Path = options.Path, + Expires = options.Expires, + Secure = options.Secure, + HttpOnly = options.HttpOnly, + }; + + Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], setCookieHeaderValue.ToString()); } /// @@ -70,15 +74,15 @@ namespace Microsoft.AspNet.Http.Internal var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - var deleteCookies = new[] { encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; - IList existingValues = Headers.GetValues(HeaderNames.SetCookie); - if (existingValues == null || existingValues.Count == 0) + StringValues deleteCookies = encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT"; + var existingValues = Headers[HeaderNames.SetCookie]; + if (StringValues.IsNullOrEmpty(existingValues)) { - Headers.SetValues(HeaderNames.SetCookie, deleteCookies); + Headers[HeaderNames.SetCookie] = deleteCookies; } else { - Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); + Headers[HeaderNames.SetCookie] = existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray(); } } @@ -111,10 +115,10 @@ namespace Microsoft.AspNet.Http.Internal rejectPredicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); } - IList existingValues = Headers.GetValues(HeaderNames.SetCookie); - if (existingValues != null) + var existingValues = Headers[HeaderNames.SetCookie]; + if (!StringValues.IsNullOrEmpty(existingValues)) { - Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); + Headers[HeaderNames.SetCookie] = existingValues.Where(value => !rejectPredicate(value)).ToArray(); } Append(key, string.Empty, new CookieOptions diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs new file mode 100644 index 0000000000..fb1e812cca --- /dev/null +++ b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs @@ -0,0 +1,80 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Owin +{ + internal class DictionaryStringArrayWrapper : IDictionary + { + public DictionaryStringArrayWrapper(IDictionary inner) + { + Inner = inner; + } + + public readonly IDictionary Inner; + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private StringValues Convert(string[] item) => item; + + private string[] Convert(StringValues item) => item; + + string[] IDictionary.this[string key] + { + get { return Inner[key]; } + set { Inner[key] = value; } + } + + int ICollection>.Count => Inner.Count; + + bool ICollection>.IsReadOnly => Inner.IsReadOnly; + + ICollection IDictionary.Keys => Inner.Keys; + + ICollection IDictionary.Values => Inner.Values.Select(Convert).ToList(); + + void ICollection>.Add(KeyValuePair item) => Inner.Add(Convert(item)); + + void IDictionary.Add(string key, string[] value) => Inner.Add(key, value); + + void ICollection>.Clear() => Inner.Clear(); + + bool ICollection>.Contains(KeyValuePair item) => Inner.Contains(Convert(item)); + + bool IDictionary.ContainsKey(string key) => Inner.ContainsKey(key); + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + foreach(var kv in Inner) + { + array[arrayIndex++] = Convert(kv); + } + } + + IEnumerator IEnumerable.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + IEnumerator> IEnumerable>.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + bool ICollection>.Remove(KeyValuePair item) => Inner.Remove(Convert(item)); + + bool IDictionary.Remove(string key) => Inner.Remove(key); + + bool IDictionary.TryGetValue(string key, out string[] value) + { + StringValues temp; + if (Inner.TryGetValue(key, out temp)) + { + value = temp; + return true; + } + value = default(StringValues); + return false; + } + } +} diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs new file mode 100644 index 0000000000..e94ecbcb30 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs @@ -0,0 +1,80 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Owin +{ + internal class DictionaryStringValuesWrapper : IDictionary + { + public DictionaryStringValuesWrapper(IDictionary inner) + { + Inner = inner; + } + + public readonly IDictionary Inner; + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private StringValues Convert(string[] item) => item; + + private string[] Convert(StringValues item) => item; + + StringValues IDictionary.this[string key] + { + get { return Inner[key]; } + set { Inner[key] = value; } + } + + int ICollection>.Count => Inner.Count; + + bool ICollection>.IsReadOnly => Inner.IsReadOnly; + + ICollection IDictionary.Keys => Inner.Keys; + + ICollection IDictionary.Values => Inner.Values.Select(Convert).ToList(); + + void ICollection>.Add(KeyValuePair item) => Inner.Add(Convert(item)); + + void IDictionary.Add(string key, StringValues value) => Inner.Add(key, value); + + void ICollection>.Clear() => Inner.Clear(); + + bool ICollection>.Contains(KeyValuePair item) => Inner.Contains(Convert(item)); + + bool IDictionary.ContainsKey(string key) => Inner.ContainsKey(key); + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + foreach (var kv in Inner) + { + array[arrayIndex++] = Convert(kv); + } + } + + IEnumerator IEnumerable.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + IEnumerator> IEnumerable>.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + bool ICollection>.Remove(KeyValuePair item) => Inner.Remove(Convert(item)); + + bool IDictionary.Remove(string key) => Inner.Remove(key); + + bool IDictionary.TryGetValue(string key, out StringValues value) + { + string[] temp; + if (Inner.TryGetValue(key, out temp)) + { + value = temp; + return true; + } + value = default(StringValues); + return false; + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 2b331b0d57..62ca09b84e 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -56,13 +56,13 @@ namespace Microsoft.AspNet.Owin { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, () => string.Empty, (feature, value) => feature.Path = Convert.ToString(value)) }, { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), () => string.Empty, (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, - { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.RequestUser, new FeatureMap(feature => feature.User, () => null, (feature, value) => feature.User = (ClaimsPrincipal)value) }, { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, - { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap( feature => new Action, object>((cb, state) => { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 614bccf333..de01c47052 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -14,8 +14,10 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Owin { @@ -104,10 +106,10 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.RequestQueryString, Utilities.RemoveQuestionMark(value)); } } - IDictionary IHttpRequestFeature.Headers + IDictionary IHttpRequestFeature.Headers { - get { return Prop>(OwinConstants.RequestHeaders); } - set { Prop(OwinConstants.RequestHeaders, value); } + get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.RequestHeaders)); } + set { Prop(OwinConstants.RequestHeaders, Utilities.MakeDictionaryStringArray(value)); } } string IHttpRequestIdentifierFeature.TraceIdentifier @@ -134,10 +136,10 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseReasonPhrase, value); } } - IDictionary IHttpResponseFeature.Headers + IDictionary IHttpResponseFeature.Headers { - get { return Prop>(OwinConstants.ResponseHeaders); } - set { Prop(OwinConstants.ResponseHeaders, value); } + get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.ResponseHeaders)); } + set { Prop(OwinConstants.ResponseHeaders, Utilities.MakeDictionaryStringArray(value)); } } Stream IHttpResponseFeature.Body diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index fd3c69033f..98fc30ea26 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -1,8 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Collections.Generic; using System.Security.Claims; using System.Security.Principal; +using Microsoft.AspNet.Http; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Owin { @@ -41,5 +45,25 @@ namespace Microsoft.AspNet.Owin } return new ClaimsPrincipal(principal); } + + internal static IDictionary MakeDictionaryStringValues(IDictionary dictionary) + { + var wrapper = dictionary as DictionaryStringArrayWrapper; + if (wrapper != null) + { + return wrapper.Inner; + } + return new DictionaryStringValuesWrapper(dictionary); + } + + internal static IDictionary MakeDictionaryStringArray(IDictionary dictionary) + { + var wrapper = dictionary as DictionaryStringValuesWrapper; + if (wrapper != null) + { + return wrapper.Inner; + } + return new DictionaryStringArrayWrapper(dictionary); + } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 0f9900432c..e475522646 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -8,6 +8,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { @@ -150,11 +151,11 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static IDictionary ReadForm(string text) + public static IDictionary ReadForm(string text) { var reader = new FormReader(text); - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); var pair = reader.ReadNextPair(); while (pair.HasValue) { @@ -170,7 +171,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) { return ReadFormAsync(stream, Encoding.UTF8, cancellationToken); } @@ -180,11 +181,11 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) + public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) { var reader = new FormReader(stream, encoding); - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); var pair = await reader.ReadNextPairAsync(cancellationToken); while (pair.HasValue) { diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index 9fb4b2b61f..eb8f311c50 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -1,38 +1,37 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { - public class KeyValueAccumulator + public class KeyValueAccumulator { - private Dictionary> _accumulator; - IEqualityComparer _comparer; + private Dictionary> _accumulator; - public KeyValueAccumulator([NotNull] IEqualityComparer comparer) + public KeyValueAccumulator() { - _comparer = comparer; - _accumulator = new Dictionary>(comparer); + _accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); } - public void Append(TKey key, TValue value) + public void Append(string key, string value) { - List values; + List values; if (_accumulator.TryGetValue(key, out values)) { values.Add(value); } else { - _accumulator[key] = new List(1) { value }; + _accumulator[key] = new List(1) { value }; } } - public IDictionary GetResults() + public IDictionary GetResults() { - var results = new Dictionary(_comparer); + var results = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var kv in _accumulator) { results.Add(kv.Key, kv.Value.ToArray()); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 244117e34c..631908173b 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -8,6 +8,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { @@ -64,10 +65,10 @@ namespace Microsoft.AspNet.WebUtilities return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; } - private async Task> ReadHeadersAsync(CancellationToken cancellationToken) + private async Task> ReadHeadersAsync(CancellationToken cancellationToken) { int totalSize = 0; - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); var line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); while (!string.IsNullOrEmpty(line)) { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index 5618b826fb..c420073eef 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { @@ -12,10 +13,10 @@ namespace Microsoft.AspNet.WebUtilities { get { - string[] values; + StringValues values; if (Headers.TryGetValue("Content-Type", out values)) { - return string.Join(", ", values); + return values; } return null; } @@ -25,16 +26,16 @@ namespace Microsoft.AspNet.WebUtilities { get { - string[] values; + StringValues values; if (Headers.TryGetValue("Content-Disposition", out values)) { - return string.Join(", ", values); + return values; } return null; } } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 6df0e2d701..13cd1f4051 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Text; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.WebUtilities @@ -72,13 +73,13 @@ namespace Microsoft.AspNet.WebUtilities /// /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. - public static IDictionary ParseQuery(string queryString) + public static IDictionary ParseQuery(string queryString) { if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') { queryString = queryString.Substring(1); } - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); int textLength = queryString.Length; int equalIndex = queryString.IndexOf('='); diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 496449f4f6..4aa7a07c04 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -7,13 +7,13 @@ }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.Primitives": "1.0.0-*", "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.11-beta-*", "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.IO.FileSystem": "4.0.1-beta-*", diff --git a/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj b/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj new file mode 100644 index 0000000000..f7b40aaa14 --- /dev/null +++ b/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + e5faccd4-6327-43aa-80a9-ae6f4a3bfe6a + Microsoft.AspNet.Primitives + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + diff --git a/src/Microsoft.Framework.Primitives/StringValues.cs b/src/Microsoft.Framework.Primitives/StringValues.cs new file mode 100644 index 0000000000..a9904aac5c --- /dev/null +++ b/src/Microsoft.Framework.Primitives/StringValues.cs @@ -0,0 +1,233 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Microsoft.Framework.Primitives +{ + /// + /// Represents zero/null, one, or many strings in an efficient way. + /// + public struct StringValues : IList + { + private static readonly string[] EmptyArray = new string[0]; + public static readonly StringValues Empty = new StringValues(EmptyArray); + + private readonly string _value; + private readonly string[] _values; + + public StringValues(string value) + { + _value = value; + _values = null; + } + + public StringValues(string[] values) + { + _value = null; + _values = values; + } + + public static implicit operator StringValues(string value) + { + return new StringValues(value); + } + + public static implicit operator StringValues(string[] values) + { + return new StringValues(values); + } + + public static implicit operator string (StringValues values) + { + return values.GetStringValue(); + } + + public static implicit operator string[] (StringValues value) + { + return value.GetArrayValue(); + } + + public int Count => _values?.Length ?? (_value != null ? 1 : 0); + + bool ICollection.IsReadOnly + { + get { return true; } + } + + string IList.this[int index] + { + get { return this[index]; } + set { throw new NotSupportedException(); } + } + + public string this[int key] + { + get + { + if (_values != null) + { + return _values[key]; // may throw + } + if (key == 0 && _value != null) + { + return _value; + } + return EmptyArray[0]; // throws + } + } + + public override string ToString() + { + return GetStringValue() ?? string.Empty; + } + + private string GetStringValue() + { + if (_values == null) + { + return _value; + } + switch (_values.Length) + { + case 0: return null; + case 1: return _values[0]; + default: return string.Join(",", _values); + } + } + + public string[] ToArray() + { + return GetArrayValue() ?? EmptyArray; + } + + private string[] GetArrayValue() + { + if (_value != null) + { + return new[] { _value }; + } + return _values; + } + + int IList.IndexOf(string item) + { + var index = 0; + foreach (var value in this) + { + if (string.Equals(value, item, StringComparison.Ordinal)) + { + return index; + } + index += 1; + } + return -1; + } + + bool ICollection.Contains(string item) + { + return ((IList)this).IndexOf(item) >= 0; + } + + void ICollection.CopyTo(string[] array, int arrayIndex) + { + for(int i = 0; i < Count; i++) + { + array[arrayIndex + i] = this[i]; + } + } + + void ICollection.Add(string item) + { + throw new NotSupportedException(); + } + + void IList.Insert(int index, string item) + { + throw new NotSupportedException(); + } + + bool ICollection.Remove(string item) + { + throw new NotSupportedException(); + } + + void IList.RemoveAt(int index) + { + throw new NotSupportedException(); + } + + void ICollection.Clear() + { + throw new NotSupportedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)this).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + if (Count == 0) + { + yield break; + } + if (_values == null) + { + yield return _value; + } + else + { + for (int i = 0; i < _values.Length; i++) + { + yield return _values[i]; + } + } + } + + public static bool IsNullOrEmpty(StringValues value) + { + if (value._values == null) + { + return string.IsNullOrEmpty(value._value); + } + switch (value._values.Length) + { + case 0: return true; + case 1: return string.IsNullOrEmpty(value._values[0]); + default: return false; + } + } + + public static StringValues Concat(StringValues values1, StringValues values2) + { + var count1 = values1.Count; + var count2 = values2.Count; + + if (count1 == 0) + { + return values2; + } + + if (count2 == 0) + { + return values1; + } + + var combined = new string[count1 + count2]; + var index = 0; + foreach (var value in values1) + { + combined[index++] = value; + } + foreach (var value in values2) + { + combined[index++] = value; + } + return new StringValues(combined); + } + } +} diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json new file mode 100644 index 0000000000..3b870f7173 --- /dev/null +++ b/src/Microsoft.Framework.Primitives/project.json @@ -0,0 +1,23 @@ +{ + "version": "1.0.0-*", + "description": "Contains primitive types such as StringValues.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Sources": { + "type": "build", + "version": "1.0.0-*" + } + }, + "frameworks": { + "net451": { }, + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Collections": "4.0.11-beta-*" + } + } + } +} diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 81b268ba1f..16ac23f6ba 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http.Features; +using Microsoft.Framework.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal @@ -64,9 +65,9 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "localhost:9001"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Host", new string[] { expected } }, + { "Host", expected }, }; var request = CreateRequest(headers); @@ -84,9 +85,9 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "löcalhöst"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Host", new string[]{ "xn--lcalhst-90ae" } }, + { "Host", "xn--lcalhst-90ae" }, }; var request = CreateRequest(headers); @@ -104,7 +105,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "xn--lcalhst-90ae"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); var request = CreateRequest(headers); @@ -149,9 +150,9 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal("value0", query1["name0"]); Assert.Equal("value1", query1["name1"]); - var query2 = new ReadableStringCollection(new Dictionary() + var query2 = new ReadableStringCollection(new Dictionary() { - { "name2", new[] { "value2" } } + { "name2", "value2" } }); request.Query = query2; @@ -164,30 +165,30 @@ namespace Microsoft.AspNet.Http.Internal public void Cookies_GetAndSet() { var request = new DefaultHttpContext().Request; - var cookieHeaders = request.Headers.GetValues("Cookie"); - Assert.Null(cookieHeaders); + var cookieHeaders = request.Headers["Cookie"]; + Assert.Equal(0, cookieHeaders.Count); var cookies0 = request.Cookies; Assert.Equal(0, cookies0.Count); - request.Headers.SetValues("Cookie", new[] { "name0=value0", "name1=value1" }); + request.Headers["Cookie"] = new[] { "name0=value0", "name1=value1" }; var cookies1 = request.Cookies; Assert.Same(cookies0, cookies1); Assert.Equal(2, cookies1.Count); Assert.Equal("value0", cookies1["name0"]); Assert.Equal("value1", cookies1["name1"]); - var cookies2 = new ReadableStringCollection(new Dictionary() + var cookies2 = new ReadableStringCollection(new Dictionary() { - { "name2", new[] { "value2" } } + { "name2", "value2" } }); request.Cookies = cookies2; Assert.Same(cookies2, request.Cookies); Assert.Equal("value2", request.Cookies["name2"]); - cookieHeaders = request.Headers.GetValues("Cookie"); + cookieHeaders = request.Headers["Cookie"]; Assert.Equal(new[] { "name2=value2" }, cookieHeaders); } - private static HttpRequest CreateRequest(IDictionary headers) + private static HttpRequest CreateRequest(IDictionary headers) { var context = new DefaultHttpContext(); context.GetFeature().Headers = headers; @@ -216,10 +217,10 @@ namespace Microsoft.AspNet.Http.Internal private static HttpRequest GetRequestWithHeader(string headerName, string headerValue) { - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); if (headerValue != null) { - headers.Add(headerName, new[] { headerValue }); + headers.Add(headerName, headerValue); } return CreateRequest(headers); diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 79cbac89c5..c353d54d68 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal @@ -13,9 +14,9 @@ namespace Microsoft.AspNet.Http.Internal public void PropertiesAreAccessible() { var headers = new HeaderDictionary( - new Dictionary(StringComparer.OrdinalIgnoreCase) + new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Header1", new[] { "Value1" } } + { "Header1", "Value1" } }); Assert.Equal(1, headers.Count); @@ -23,8 +24,7 @@ namespace Microsoft.AspNet.Http.Internal Assert.True(headers.ContainsKey("header1")); Assert.False(headers.ContainsKey("header2")); Assert.Equal("Value1", headers["header1"]); - Assert.Equal("Value1", headers.Get("header1")); - Assert.Equal(new[] { "Value1" }, headers.GetValues("header1")); + Assert.Equal(new[] { "Value1" }, headers["header1"].ToArray()); } } } \ No newline at end of file diff --git a/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj b/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj new file mode 100644 index 0000000000..f1a2ba4182 --- /dev/null +++ b/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj @@ -0,0 +1,21 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 61f72e92-b3ae-4a10-b838-44f80aed40ae + Microsoft.AspNet.Primitives.Tests + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + \ No newline at end of file diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs new file mode 100644 index 0000000000..389d6f547d --- /dev/null +++ b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs @@ -0,0 +1,117 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Framework.Primitives +{ + public class StringValuesTests + { + [Fact] + public void IsReadOnly_True() + { + var stringValues = new StringValues(); + Assert.True(((IList)stringValues).IsReadOnly); + Assert.Throws(() => ((IList)stringValues)[0] = string.Empty); + Assert.Throws(() => ((ICollection)stringValues).Add(string.Empty)); + Assert.Throws(() => ((IList)stringValues).Insert(0, string.Empty)); + Assert.Throws(() => ((ICollection)stringValues).Remove(string.Empty)); + Assert.Throws(() => ((IList)stringValues).RemoveAt(0)); + Assert.Throws(() => ((ICollection)stringValues).Clear()); + } + + [Fact] + public void DefaultConstructor_ExpectedValues() + { + var stringValues = new StringValues(); + Assert.Equal(0, stringValues.Count); + Assert.Equal((string)null, stringValues); + Assert.Equal(new string[0], stringValues.ToArray()); + + Assert.True(StringValues.IsNullOrEmpty(stringValues)); + Assert.Throws(() => stringValues[0]); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(0, stringValues.Count()); + } + + [Fact] + public void Constructor_NullStringValue_ExpectedValues() + { + var stringValues = new StringValues((string)null); + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Null((string[])stringValues); + Assert.Equal(new string[0], stringValues.ToArray()); + + Assert.True(StringValues.IsNullOrEmpty(stringValues)); + Assert.Throws(() => stringValues[0]); + Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(0, stringValues.Count()); + } + + [Fact] + public void Constructor_NullStringArray_ExpectedValues() + { + var stringValues = new StringValues((string[])null); + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Null((string[])stringValues); + Assert.Equal(new string[0], stringValues.ToArray()); + + Assert.True(StringValues.IsNullOrEmpty(stringValues)); + Assert.Throws(() => stringValues[0]); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(0, stringValues.Count()); + } + + [Fact] + public void ImplicitStringConverter_Works() + { + string nullString = null; + StringValues stringValues = nullString; + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Null((string[])stringValues); + + string aString = "abc"; + stringValues = aString; + Assert.Equal(1, stringValues.Count); + Assert.Equal(aString, stringValues); + Assert.Equal(aString, stringValues[0]); + Assert.Equal(new string[] { aString }, stringValues); + } + + [Fact] + public void ImplicitStringArrayConverter_Works() + { + string[] nullStringArray = null; + StringValues stringValues = nullStringArray; + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Null((string[])stringValues); + + string aString = "abc"; + string[] aStringArray = new[] { aString }; + stringValues = aStringArray; + Assert.Equal(1, stringValues.Count); + Assert.Equal(aString, stringValues); + Assert.Equal(aString, stringValues[0]); + Assert.Equal(aStringArray, stringValues); + + aString = "abc"; + string bString = "bcd"; + aStringArray = new[] { aString, bString }; + stringValues = aStringArray; + Assert.Equal(2, stringValues.Count); + Assert.Equal("abc,bcd", stringValues); + Assert.Equal(aStringArray, stringValues); + } + } +} diff --git a/test/Microsoft.Framework.Primitives.Tests/project.json b/test/Microsoft.Framework.Primitives.Tests/project.json new file mode 100644 index 0000000000..1a5837820c --- /dev/null +++ b/test/Microsoft.Framework.Primitives.Tests/project.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "Microsoft.Framework.Primitives": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} From 59b44a4c245885ee910e3db14ec5041db80ae44d Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 25 Aug 2015 16:32:24 -0700 Subject: [PATCH 369/846] Move *CommaSeperatedValues APIs from IHeaderDictionary to extension. --- .../IHeaderDictionary.cs | 29 - .../HeaderDictionaryExtensions.cs | 52 ++ .../ParsingHelpers.cs | 618 ++++++++++++++++++ src/Microsoft.AspNet.Http/HeaderDictionary.cs | 42 -- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 79 --- 5 files changed, 670 insertions(+), 150 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index d2192475fa..36137ed45c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -30,34 +30,5 @@ namespace Microsoft.AspNet.Http /// Gets a collection containing the keys. /// new ICollection Keys { get; } - - /// - /// Get the associated values from the collection separated into individual values. - /// Quoted values will not be split, and the quotes will be removed. - /// - /// The header name. - /// the associated values from the collection separated into individual values, or null if the key is not present. - StringValues GetCommaSeparatedValues(string key); - - /// - /// Add a new value. Appends to the header list if already present - /// - /// The header name. - /// The header value. - void Append(string key, StringValues value); - - /// - /// Quotes any values containing comas, and then coma joins all of the values with any existing values. - /// - /// The header name. - /// The header values. - void AppendCommaSeparatedValues(string key, params string[] values); - - /// - /// Quotes any values containing comas, and then coma joins all of the values. - /// - /// The header name. - /// The header values. - void SetCommaSeparatedValues(string key, params string[] values); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs new file mode 100644 index 0000000000..c986a530c0 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -0,0 +1,52 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Internal; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Http +{ + public static class HeaderDictionaryExtensions + { + /// + /// Add new values. Each item remains a separate array entry. + /// + /// The header name. + /// The header value. + public static void Append(this IHeaderDictionary headers, string key, StringValues value) + { + ParsingHelpers.AppendHeaderUnmodified(headers, key, value); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values with any existing values. + /// + /// The header name. + /// The header values. + public static void AppendCommaSeparatedValues(this IHeaderDictionary headers, string key, params string[] values) + { + ParsingHelpers.AppendHeaderJoined(headers, key, values); + } + + /// + /// Get the associated values from the collection separated into individual values. + /// Quoted values will not be split, and the quotes will be removed. + /// + /// The header name. + /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. + public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) + { + return ParsingHelpers.GetHeaderSplit(headers, key); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values. + /// + /// The header name. + /// The header values. + public static void SetCommaSeparatedValues(this IHeaderDictionary headers, string key, params string[] values) + { + ParsingHelpers.SetHeaderJoined(headers, key, values); + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs new file mode 100644 index 0000000000..fcce4dd404 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs @@ -0,0 +1,618 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Http.Internal +{ + internal struct HeaderSegment : IEquatable + { + private readonly StringSegment _formatting; + private readonly StringSegment _data; + + // + // Initializes a new instance of the class. + // + public HeaderSegment(StringSegment formatting, StringSegment data) + { + _formatting = formatting; + _data = data; + } + + public StringSegment Formatting + { + get { return _formatting; } + } + + public StringSegment Data + { + get { return _data; } + } + + #region Equality members + + public bool Equals(HeaderSegment other) + { + return _formatting.Equals(other._formatting) && _data.Equals(other._data); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegment && Equals((HeaderSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); + } + } + + public static bool operator ==(HeaderSegment left, HeaderSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegment left, HeaderSegment right) + { + return !left.Equals(right); + } + + #endregion + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct HeaderSegmentCollection : IEnumerable, IEquatable + { + private readonly StringValues _headers; + + public HeaderSegmentCollection(StringValues headers) + { + _headers = headers; + } + + #region Equality members + + public bool Equals(HeaderSegmentCollection other) + { + return Equals(_headers, other._headers); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegmentCollection && Equals((HeaderSegmentCollection)obj); + } + + public override int GetHashCode() + { + return (!StringValues.IsNullOrEmpty(_headers) ? _headers.GetHashCode() : 0); + } + + public static bool operator ==(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return !left.Equals(right); + } + + #endregion + + public Enumerator GetEnumerator() + { + return new Enumerator(_headers); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + internal struct Enumerator : IEnumerator + { + private readonly StringValues _headers; + private int _index; + + private string _header; + private int _headerLength; + private int _offset; + + private int _leadingStart; + private int _leadingEnd; + private int _valueStart; + private int _valueEnd; + private int _trailingStart; + + private Mode _mode; + + public Enumerator(StringValues headers) + { + _headers = headers; + _header = string.Empty; + _headerLength = -1; + _index = -1; + _offset = -1; + _leadingStart = -1; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + _mode = Mode.Leading; + } + + private enum Mode + { + Leading, + Value, + ValueQuoted, + Trailing, + Produce, + } + + private enum Attr + { + Value, + Quote, + Delimiter, + Whitespace + } + + public HeaderSegment Current + { + get + { + return new HeaderSegment( + new StringSegment(_header, _leadingStart, _leadingEnd - _leadingStart), + new StringSegment(_header, _valueStart, _valueEnd - _valueStart)); + } + } + + object IEnumerator.Current + { + get { return Current; } + } + + public void Dispose() + { + } + + public bool MoveNext() + { + while (true) + { + if (_mode == Mode.Produce) + { + _leadingStart = _trailingStart; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + if (_offset == _headerLength && + _leadingStart != -1 && + _leadingStart != _offset) + { + // Also produce trailing whitespace + _leadingEnd = _offset; + return true; + } + _mode = Mode.Leading; + } + + // if end of a string + if (_offset == _headerLength) + { + ++_index; + _offset = -1; + _leadingStart = 0; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + // if that was the last string + if (_index == _headers.Count) + { + // no more move nexts + return false; + } + + // grab the next string + _header = _headers[_index] ?? string.Empty; + _headerLength = _header.Length; + } + while (true) + { + ++_offset; + char ch = _offset == _headerLength ? (char)0 : _header[_offset]; + // todo - array of attrs + Attr attr = char.IsWhiteSpace(ch) ? Attr.Whitespace : ch == '\"' ? Attr.Quote : (ch == ',' || ch == (char)0) ? Attr.Delimiter : Attr.Value; + + switch (_mode) + { + case Mode.Leading: + switch (attr) + { + case Attr.Delimiter: + _leadingEnd = _offset; + _mode = Mode.Produce; + break; + case Attr.Quote: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Value: + switch (attr) + { + case Attr.Quote: + _mode = Mode.ValueQuoted; + break; + case Attr.Delimiter: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + break; + case Attr.Value: + // more + break; + case Attr.Whitespace: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Trailing; + break; + } + break; + case Mode.ValueQuoted: + switch (attr) + { + case Attr.Quote: + _mode = Mode.Value; + break; + case Attr.Delimiter: + if (ch == (char)0) + { + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + } + break; + case Attr.Value: + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Trailing: + switch (attr) + { + case Attr.Delimiter: + _mode = Mode.Produce; + break; + case Attr.Quote: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + } + if (_mode == Mode.Produce) + { + return true; + } + } + } + } + + public void Reset() + { + _index = 0; + _offset = 0; + _leadingStart = 0; + _leadingEnd = 0; + _valueStart = 0; + _valueEnd = 0; + } + } + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct StringSegment : IEquatable + { + private readonly string _buffer; + private readonly int _offset; + private readonly int _count; + + // + // Initializes a new instance of the class. + // + public StringSegment(string buffer, int offset, int count) + { + _buffer = buffer; + _offset = offset; + _count = count; + } + + public string Buffer + { + get { return _buffer; } + } + + public int Offset + { + get { return _offset; } + } + + public int Count + { + get { return _count; } + } + + public string Value + { + get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } + } + + public bool HasValue + { + get { return _offset != -1 && _count != 0 && _buffer != null; } + } + + #region Equality members + + public bool Equals(StringSegment other) + { + return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is StringSegment && Equals((StringSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ _offset; + hashCode = (hashCode * 397) ^ _count; + return hashCode; + } + } + + public static bool operator ==(StringSegment left, StringSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(StringSegment left, StringSegment right) + { + return !left.Equals(right); + } + + #endregion + + public bool StartsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public bool EndsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; + } + + public bool Equals([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count != textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public string Substring(int offset, int length) + { + return _buffer.Substring(_offset + offset, length); + } + + public StringSegment Subsegment(int offset, int length) + { + return new StringSegment(_buffer, _offset + offset, length); + } + + public override string ToString() + { + return Value ?? string.Empty; + } + } + + internal static class ParsingHelpers + { + public static StringValues GetHeader(IDictionary headers, string key) + { + StringValues value; + return headers.TryGetValue(key, out value) ? value : StringValues.Empty; + } + + public static StringValues GetHeaderSplit(IDictionary headers, string key) + { + var values = GetHeaderUnmodified(headers, key); + return new StringValues(GetHeaderSplitImplementation(values).ToArray()); + } + + private static IEnumerable GetHeaderSplitImplementation(StringValues values) + { + foreach (var segment in new HeaderSegmentCollection(values)) + { + if (segment.Data.HasValue) + { + yield return DeQuote(segment.Data.Value); + } + } + } + + public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + { + StringValues values; + return headers.TryGetValue(key, out values) ? values : StringValues.Empty; + } + + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (StringValues.IsNullOrEmpty(value)) + { + headers.Remove(key); + } + else + { + headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); + } + } + + // Quote items that contain comas and are not already quoted. + private static string QuoteIfNeeded(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Contains(',')) + { + if (value[0] != '"' || value[value.Length - 1] != '"') + { + value = '"' + value + '"'; + } + } + + return value; + } + + private static string DeQuote(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + { + value = value.Substring(1, value.Length - 2); + } + + return value; + } + + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) + { + headers.Remove(key); + } + else + { + headers[key] = values.Value; + } + } + + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeaderJoined(headers, key, values); + } + else + { + headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); + } + } + + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) + { + if (values.Count == 0) + { + return; + } + + var existing = GetHeaderUnmodified(headers, key); + SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); + } + } +} diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index d7cb70c481..05d5d7fdf4 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -104,48 +104,6 @@ namespace Microsoft.AspNet.Http.Internal return Store.GetEnumerator(); } - - /// - /// Get the associated values from the collection separated into individual values. - /// Quoted values will not be split, and the quotes will be removed. - /// - /// The header name. - /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. - public StringValues GetCommaSeparatedValues(string key) - { - return ParsingHelpers.GetHeaderSplit(Store, key); - } - - /// - /// Add new values. Each item remains a separate array entry. - /// - /// The header name. - /// The header value. - public void Append(string key, StringValues value) - { - ParsingHelpers.AppendHeaderUnmodified(Store, key, value); - } - - /// - /// Quotes any values containing comas, and then coma joins all of the values with any existing values. - /// - /// The header name. - /// The header values. - public void AppendCommaSeparatedValues(string key, params string[] values) - { - ParsingHelpers.AppendHeaderJoined(Store, key, values); - } - - /// - /// Quotes any values containing comas, and then coma joins all of the values. - /// - /// The header name. - /// The header values. - public void SetCommaSeparatedValues(string key, params string[] values) - { - ParsingHelpers.SetHeaderJoined(Store, key, values); - } - /// /// Adds the given header and values to the collection. /// diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index bc373b4094..54455b90b3 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -540,40 +540,6 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (StringValues.IsNullOrEmpty(value)) - { - headers.Remove(key); - } - else - { - headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); - } - } - - // Quote items that contain comas and are not already quoted. - private static string QuoteIfNeeded(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Contains(',')) - { - if (value[0] != '"' || value[value.Length - 1] != '"') - { - value = '"' + value + '"'; - } - } - - return value; - } - private static string DeQuote(string value) { if (string.IsNullOrWhiteSpace(value)) @@ -588,51 +554,6 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) - { - headers.Remove(key); - } - else - { - headers[key] = values.Value; - } - } - - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) - { - if (values == null || values.Length == 0) - { - return; - } - - string existing = GetHeader(headers, key); - if (existing == null) - { - SetHeaderJoined(headers, key, values); - } - else - { - headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); - } - } - - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) - { - if (values.Count == 0) - { - return; - } - - var existing = GetHeaderUnmodified(headers, key); - SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); - } - public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; From f475e53ad235478b5ac35bab31a72e6cafb52156 Mon Sep 17 00:00:00 2001 From: Chris R Date: Sun, 30 Aug 2015 21:55:22 -0700 Subject: [PATCH 370/846] #367 Add HttpContext.Features, move Get/SetFeature. Take 1. --- .../HttpContext.cs | 2 ++ .../SendFileResponseExtensions.cs | 4 +-- .../FeatureCollectionExtensions.cs | 30 +++++++++++++++++++ .../DefaultHttpContext.cs | 6 ++-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 12 ++++---- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 6 ++-- .../SendFileResponseExtensionsTests.cs | 4 +-- .../DefaultAuthenticationManagerTests.cs | 3 +- .../DefaultHttpContextTests.cs | 12 ++++---- .../DefaultHttpRequestTests.cs | 4 +-- .../FormFeatureTests.cs | 20 ++++++------- 11 files changed, 69 insertions(+), 34 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index c7a63c8356..4e89caed71 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -12,6 +12,8 @@ namespace Microsoft.AspNet.Http { public abstract class HttpContext : IDisposable { + public abstract IFeatureCollection Features { get; } + public abstract HttpRequest Request { get; } public abstract HttpResponse Response { get; } diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 3c5f183c53..b60f1acad9 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Http /// True if sendfile feature exists in the response. public static bool SupportsSendFile([NotNull] this HttpResponse response) { - return response.HttpContext.GetFeature() != null; + return response.HttpContext.Features.Get() != null; } /// @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Http /// public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken) { - var sendFile = response.HttpContext.GetFeature(); + var sendFile = response.HttpContext.Features.Get(); if (sendFile == null) { throw new NotSupportedException(Resources.Exception_SendFileNotSupported); diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs new file mode 100644 index 0000000000..86681fde3f --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features +{ + public static class FeatureCollectionExtensions + { + /// + /// Retrieves the requested feature from the collection. + /// + /// The feature key. + /// The collection. + /// The requested feature, or null if it is not present. + public static TFeature Get(this IFeatureCollection features) + { + return (TFeature)features[typeof(TFeature)]; + } + + /// + /// Sets the given feature in the collection. + /// + /// The feature key. + /// The collection. + /// The feature value. + public static void Set(this IFeatureCollection features, TFeature instance) + { + features[typeof(TFeature)] = instance; + } + } +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index c3caf8ec66..fd9ad19459 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -32,8 +32,8 @@ namespace Microsoft.AspNet.Http.Internal public DefaultHttpContext() : this(new FeatureCollection()) { - SetFeature(new HttpRequestFeature()); - SetFeature(new HttpResponseFeature()); + _features.Set(new HttpRequestFeature()); + _features.Set(new HttpResponseFeature()); } public DefaultHttpContext(IFeatureCollection features) @@ -76,6 +76,8 @@ namespace Microsoft.AspNet.Http.Internal get { return _session.Fetch(_features); } } + public override IFeatureCollection Features { get { return _features; } } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 62ca09b84e..c6cdd63926 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,11 +37,11 @@ namespace Microsoft.AspNet.Owin public OwinEnvironment(HttpContext context) { - if (context.GetFeature() == null) + if (context.Features.Get() == null) { throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", nameof(context)); } - if (context.GetFeature() == null) + if (context.Features.Get() == null) { throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", nameof(context)); } @@ -100,7 +100,7 @@ namespace Microsoft.AspNet.Owin }; // owin.CallCancelled is required but the feature may not be present. - if (context.GetFeature() != null) + if (context.Features.Get() != null) { _entries[OwinConstants.CallCancelled] = new FeatureMap(feature => feature.RequestAborted); } @@ -334,7 +334,7 @@ namespace Microsoft.AspNet.Owin internal bool TryGet(HttpContext context, out object value) { - object featureInstance = context.GetFeature(FeatureInterface); + object featureInstance = context.Features[FeatureInterface]; if (featureInstance == null) { value = null; @@ -350,7 +350,7 @@ namespace Microsoft.AspNet.Owin internal void Set(HttpContext context, object value) { - var feature = context.GetFeature(FeatureInterface); + var feature = context.Features[FeatureInterface]; if (feature == null) { if (FeatureFactory == null) @@ -360,7 +360,7 @@ namespace Microsoft.AspNet.Owin else { feature = FeatureFactory(); - context.SetFeature(FeatureInterface, feature); + context.Features[FeatureInterface] = feature; } } Setter(feature, value); diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 770f02fb46..3f31ce5923 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Builder { // Use the existing OWIN env if there is one. IDictionary env; - var owinEnvFeature = httpContext.GetFeature(); + var owinEnvFeature = httpContext.Features.Get(); if (owinEnvFeature != null) { env = owinEnvFeature.Environment; @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Builder { var app = middleware(httpContext => { - return next(httpContext.GetFeature().Environment); + return next(httpContext.Features.Get().Environment); }); return env => @@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Builder if (env.TryGetValue(typeof(HttpContext).FullName, out obj)) { context = (HttpContext)obj; - context.SetFeature(new OwinEnvironmentFeature() { Environment = env }); + context.Features.Set(new OwinEnvironmentFeature() { Environment = env }); } else { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index ef8aa04c56..cd16acb06d 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Http.Extensions.Tests var context = new DefaultHttpContext(); var response = context.Response; Assert.False(response.SupportsSendFile()); - context.SetFeature(new FakeSendFileFeature()); + context.Features.Set(new FakeSendFileFeature()); Assert.True(response.SupportsSendFile()); } @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http.Extensions.Tests var context = new DefaultHttpContext(); var response = context.Response; var fakeFeature = new FakeSendFileFeature(); - context.SetFeature(fakeFeature); + context.Features.Set(fakeFeature); await response.SendFileAsync("bob", 1, 3, CancellationToken.None); diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 3430382e8a..db7e1f7f36 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -4,6 +4,7 @@ using System; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; using Microsoft.AspNet.Http.Internal; @@ -50,7 +51,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal { var context = CreateContext(); var handler = new AuthHandler(); - context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); + context.Features.Set(new HttpAuthenticationFeature() { Handler = handler }); var user = new ClaimsPrincipal(); await context.Authentication.SignInAsync("ignored", user); Assert.True(handler.SignedIn); diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index f24035e672..b8c9691e35 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -35,7 +35,7 @@ namespace Microsoft.AspNet.Http.Internal session.Set("key2", null); var feature = new BlahSessionFeature(); feature.Session = session; - context.SetFeature(feature); + context.Features.Set(feature); // Act & Assert Assert.Same(session, context.Session); @@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Http.Internal session.Set("key2", null); var feature = new BlahSessionFeature(); feature.Session = session; - context.SetFeature(feature); + context.Features.Set(feature); // Act context.Session = new TestSession(); @@ -109,9 +109,9 @@ namespace Microsoft.AspNet.Http.Internal public void GetItems_DefaultCollectionProvided() { var context = new DefaultHttpContext(new FeatureCollection()); - Assert.Null(context.GetFeature()); + Assert.Null(context.Features.Get()); var items = context.Items; - Assert.NotNull(context.GetFeature()); + Assert.NotNull(context.Features.Get()); Assert.NotNull(items); Assert.Same(items, context.Items); var item = new object(); @@ -123,10 +123,10 @@ namespace Microsoft.AspNet.Http.Internal public void SetItems_NewCollectionUsed() { var context = new DefaultHttpContext(new FeatureCollection()); - Assert.Null(context.GetFeature()); + Assert.Null(context.Features.Get()); var items = new Dictionary(); context.Items = items; - Assert.NotNull(context.GetFeature()); + Assert.NotNull(context.Features.Get()); Assert.Same(items, context.Items); var item = new object(); items["foo"] = item; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 16ac23f6ba..4a767821ff 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -136,7 +136,7 @@ namespace Microsoft.AspNet.Http.Internal public void Query_GetAndSet() { var request = new DefaultHttpContext().Request; - var requestFeature = request.HttpContext.GetFeature(); + var requestFeature = request.HttpContext.Features.Get(); Assert.Equal(string.Empty, requestFeature.QueryString); Assert.Equal(QueryString.Empty, request.QueryString); var query0 = request.Query; @@ -191,7 +191,7 @@ namespace Microsoft.AspNet.Http.Internal private static HttpRequest CreateRequest(IDictionary headers) { var context = new DefaultHttpContext(); - context.GetFeature().Headers = headers; + context.Features.Get().Headers = headers; return context.Request; } diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 61dfda82f5..6f3eb26111 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); // Act @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.Equal("2", formCollection["baz"]); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formFeature.Form, formCollection); @@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = context.Request.Form; @@ -140,7 +140,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formCollection, formFeature.Form); @@ -161,7 +161,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = context.Request.Form; @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formCollection, formFeature.Form); @@ -192,7 +192,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = await context.Request.ReadFormAsync(); @@ -200,7 +200,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formFeature.Form, formCollection); @@ -232,7 +232,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = await context.Request.ReadFormAsync(); @@ -240,7 +240,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formFeature.Form, formCollection); From e45e70da010de4e0140a6a9a7844a6f39c3a3513 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 31 Aug 2015 16:41:27 -0700 Subject: [PATCH 371/846] #367 Remove HttpContext.Get/SetFeature. Take 2. --- .../HttpContext.cs | 14 -------------- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 10 ---------- 2 files changed, 24 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 4e89caed71..8029c68641 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -39,19 +39,5 @@ namespace Microsoft.AspNet.Http public abstract void Abort(); public abstract void Dispose(); - - public abstract object GetFeature(Type type); - - public abstract void SetFeature(Type type, object instance); - - public virtual T GetFeature() - { - return (T)GetFeature(typeof(T)); - } - - public virtual void SetFeature(T instance) - { - SetFeature(typeof(T), instance); - } } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index fd9ad19459..db0a4d27ad 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -171,15 +171,5 @@ namespace Microsoft.AspNet.Http.Internal // REVIEW: is this necessary? is the environment "owned" by the context? _features.Dispose(); } - - public override object GetFeature(Type type) - { - return _features[type]; - } - - public override void SetFeature(Type type, object instance) - { - _features[type] = instance; - } } } \ No newline at end of file From c3290a029fc5e36eea1db445b7a081c3b61353a0 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 31 Aug 2015 11:25:59 -0700 Subject: [PATCH 372/846] Change IApplicationBuilder.Server to IFeatureCollection ServerFeatures. --- .../IApplicationBuilder.cs | 3 ++- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 7 ++++--- src/Microsoft.AspNet.Http/Constants.cs | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index 77fa4f20e1..e74bdec015 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Builder { @@ -10,7 +11,7 @@ namespace Microsoft.AspNet.Builder { IServiceProvider ApplicationServices { get; set; } - object Server { get; } + IFeatureCollection ServerFeatures { get; } IDictionary Properties { get; } diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index 80041077c3..49ed18f3f0 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Builder.Internal @@ -22,7 +23,7 @@ namespace Microsoft.AspNet.Builder.Internal public ApplicationBuilder(IServiceProvider serviceProvider, object server) : this(serviceProvider) { - SetProperty(Constants.BuilderProperties.ServerInformation, server); + SetProperty(Constants.BuilderProperties.ServerFeatures, server); } private ApplicationBuilder(ApplicationBuilder builder) @@ -42,11 +43,11 @@ namespace Microsoft.AspNet.Builder.Internal } } - public object Server + public IFeatureCollection ServerFeatures { get { - return GetProperty(Constants.BuilderProperties.ServerInformation); + return GetProperty(Constants.BuilderProperties.ServerFeatures); } } diff --git a/src/Microsoft.AspNet.Http/Constants.cs b/src/Microsoft.AspNet.Http/Constants.cs index d01466f549..9ae305ddf4 100644 --- a/src/Microsoft.AspNet.Http/Constants.cs +++ b/src/Microsoft.AspNet.Http/Constants.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Http.Internal internal static class BuilderProperties { - internal static string ServerInformation = "server.Information"; + internal static string ServerFeatures = "server.Features"; internal static string ApplicationServices = "application.Services"; } } From f3e828892df383053ccbe68217c6e96f9f0ac7ca Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 11 Aug 2015 15:56:33 -0700 Subject: [PATCH 373/846] React to options --- .../EncoderServiceCollectionExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index c7d1c32b0d..48e0e94c98 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -44,7 +44,7 @@ namespace Microsoft.Framework.DependencyInjection return serviceProvider => { var codePointFilter = serviceProvider?.GetService>()? - .Options? + .Value? .CodePointFilter; return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); }; From 43d0b0f65bb5abe453d5d54fec6d67c1c93f3fa8 Mon Sep 17 00:00:00 2001 From: Levi B Date: Sat, 5 Sep 2015 16:22:14 -0700 Subject: [PATCH 374/846] Update WebEncoders from Unicode 7.0 to Unicode 8.0 Add "how to update" file detailing update steps --- .../UnicodeHelpers.cs | 8 +- .../UnicodeRanges.cs | 2 +- .../UnicodeRanges.generated.cs | 11 +- ...aracters.bin => unicode-defined-chars.bin} | Bin 8192 -> 8192 bytes .../UnicodeHelpersTests.cs | 4 +- .../UnicodeRangesTests.cs | 1 + unicode/Blocks.txt | 25 +- unicode/UnicodeData.txt | 2161 ++++++++++++++++- unicode/how-to-update.txt | 94 + unicode/unicode-copyright.txt | 6 +- 10 files changed, 2189 insertions(+), 123 deletions(-) rename src/Microsoft.Framework.WebEncoders.Core/compiler/resources/{unicode-7.0.0-defined-characters.bin => unicode-defined-chars.bin} (91%) create mode 100644 unicode/how-to-update.txt diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs index 61367e2d03..fac3a2e4e1 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs @@ -28,14 +28,14 @@ namespace Microsoft.Framework.WebEncoders /// /// Helper method which creates a bitmap of all characters which are - /// defined per version 7.0.0 of the Unicode specification. + /// defined per version 8.0 of the Unicode specification. /// [MethodImpl(MethodImplOptions.NoInlining)] private static uint[] CreateDefinedCharacterBitmap() { // The stream should be exactly 8KB in size. var assembly = typeof(UnicodeHelpers).GetTypeInfo().Assembly; - var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-7.0.0-defined-characters.bin"; + var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-defined-chars.bin"; var stream = assembly.GetManifestResourceStream(resourceName); if (stream.Length != 8 * 1024) @@ -72,7 +72,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Returns a bitmap of all characters which are defined per version 7.0.0 + /// Returns a bitmap of all characters which are defined per version 8.0 /// of the Unicode specification. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -204,7 +204,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Returns a value stating whether a character is defined per version 7.0.0 + /// Returns a value stating whether a character is defined per version 8.0 /// of the Unicode specification. Certain classes of characters (control chars, /// private use, surrogates, some whitespace) are considered "undefined" for /// our purposes. diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs index 60ed2c5311..f78837bc6e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs @@ -10,7 +10,7 @@ namespace Microsoft.Framework.WebEncoders { /// /// Contains predefined instances which correspond to blocks - /// from the Unicode 7.0 specification. + /// from the Unicode 8.0 specification. /// public static partial class UnicodeRanges { diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs index 6a3c5ebabf..64d522f248 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs @@ -1277,6 +1277,15 @@ namespace Microsoft.Framework.WebEncoders public static UnicodeRange LatinExtendedE => Volatile.Read(ref _latinExtendedE) ?? CreateRange(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); private static UnicodeRange _latinExtendedE; + /// + /// A corresponding to the 'Cherokee Supplement' Unicode block (U+AB70..U+ABBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB70.pdf for the full set of characters in this block. + /// + public static UnicodeRange CherokeeSupplement => Volatile.Read(ref _cherokeeSupplement) ?? CreateRange(ref _cherokeeSupplement, first: '\uAB70', last: '\uABBF'); + private static UnicodeRange _cherokeeSupplement; + /// /// A corresponding to the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). /// @@ -1303,7 +1312,7 @@ namespace Microsoft.Framework.WebEncoders /// public static UnicodeRange HangulJamoExtendedB => Volatile.Read(ref _hangulJamoExtendedB) ?? CreateRange(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); private static UnicodeRange _hangulJamoExtendedB; - + /// /// A corresponding to the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). /// diff --git a/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin similarity index 91% rename from src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin rename to src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin index 06530d73cf6848c91b0f41b326dccf833192412a..48fa163f088cc88591c84b3e962c82fbfac136db 100644 GIT binary patch delta 157 zcmZp0XmHpd#>g(u00KWIDhf|FVAN-1nw-F>&B#8vhf$ufVe%TrOHB6mlP9tSY`(zc z&L~~a!0;ak7{Mfn1qb{S6@4eyv;1THu(^)4nveazJ=k2J)`^oRia1Tw;bCN$s3^*0 q|9|p#5e-KB$qJ%AlecjS0$Bzu{+lmwsT$IYCTf` delta 194 zcmZp0XmHpd#>mdj00JK-Dhf|FVAN-1n4G|<&B#2thfyBLUc-2aNuFWyM3#Wf7ns}` zrR^CQ{sRFcm;|xlfO(>#@8o)xe~b*9>sYJ#*yX{-g0xPYJW<3+Wj|cy|Noe}>w&WN r%#**1XfX0mRuJ_OF@R_XlVF|p|Cu)*_3#0wyWAau2)=OHv diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 7504d52125..cf170bf3f8 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -193,7 +193,7 @@ namespace Microsoft.Framework.WebEncoders } } - // Handle known spans from Unicode 7.0.0's UnicodeData.txt + // Handle known spans from Unicode 8.0's UnicodeData.txt // CJK Ideograph Extension A for (int i = '\u3400'; i <= '\u4DB5'; i++) @@ -201,7 +201,7 @@ namespace Microsoft.Framework.WebEncoders retVal[i] = true; } // CJK Ideograph - for (int i = '\u4E00'; i <= '\u9FCC'; i++) + for (int i = '\u4E00'; i <= '\u9FD5'; i++) { retVal[i] = true; } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs index c56b57feb8..208eb34c6b 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs @@ -172,6 +172,7 @@ namespace Microsoft.Framework.WebEncoders [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeRanges.MeeteiMayekExtensions))] [InlineData('\uAB00', '\uAB2F', nameof(UnicodeRanges.EthiopicExtendedA))] [InlineData('\uAB30', '\uAB6F', nameof(UnicodeRanges.LatinExtendedE))] + [InlineData('\uAB70', '\uABBF', nameof(UnicodeRanges.CherokeeSupplement))] [InlineData('\uABC0', '\uABFF', nameof(UnicodeRanges.MeeteiMayek))] [InlineData('\uAC00', '\uD7AF', nameof(UnicodeRanges.HangulSyllables))] [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeRanges.HangulJamoExtendedB))] diff --git a/unicode/Blocks.txt b/unicode/Blocks.txt index 3653af7a47..0a4a580763 100644 --- a/unicode/Blocks.txt +++ b/unicode/Blocks.txt @@ -1,14 +1,11 @@ -# Blocks-7.0.0.txt -# Date: 2014-04-03, 23:23:00 GMT [RP, KW] +# Blocks-8.0.0.txt +# Date: 2014-11-10, 23:04:00 GMT [KW] # # Unicode Character Database # Copyright (c) 1991-2014 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # -# Note: The casing of block names is not normative. -# For example, "Basic Latin" and "BASIC LATIN" are equivalent. -# # Format: # Start Code..End Code; Block Name @@ -20,6 +17,14 @@ # For more information on the comparison of property values, # see UAX #44: http://www.unicode.org/reports/tr44/ # +# All block ranges start with a value where (cp MOD 16) = 0, +# and end with a value where (cp MOD 16) = 15. In other words, +# the last hexadecimal digit of the start of range is ...0 +# and the last hexadecimal digit of the end of range is ...F. +# This constraint on block ranges guarantees that allocations +# are done in terms of whole columns, and that code chart display +# never involves splitting columns in the charts. +# # All code points not explicitly listed for Block # have the value No_Block. @@ -168,6 +173,7 @@ AA80..AADF; Tai Viet AAE0..AAFF; Meetei Mayek Extensions AB00..AB2F; Ethiopic Extended-A AB30..AB6F; Latin Extended-E +AB70..ABBF; Cherokee Supplement ABC0..ABFF; Meetei Mayek AC00..D7AF; Hangul Syllables D7B0..D7FF; Hangul Jamo Extended-B @@ -210,6 +216,7 @@ FFF0..FFFF; Specials 10840..1085F; Imperial Aramaic 10860..1087F; Palmyrene 10880..108AF; Nabataean +108E0..108FF; Hatran 10900..1091F; Phoenician 10920..1093F; Lydian 10980..1099F; Meroitic Hieroglyphs @@ -223,6 +230,7 @@ FFF0..FFFF; Specials 10B60..10B7F; Inscriptional Pahlavi 10B80..10BAF; Psalter Pahlavi 10C00..10C4F; Old Turkic +10C80..10CFF; Old Hungarian 10E60..10E7F; Rumi Numeral Symbols 11000..1107F; Brahmi 11080..110CF; Kaithi @@ -232,17 +240,21 @@ FFF0..FFFF; Specials 11180..111DF; Sharada 111E0..111FF; Sinhala Archaic Numbers 11200..1124F; Khojki +11280..112AF; Multani 112B0..112FF; Khudawadi 11300..1137F; Grantha 11480..114DF; Tirhuta 11580..115FF; Siddham 11600..1165F; Modi 11680..116CF; Takri +11700..1173F; Ahom 118A0..118FF; Warang Citi 11AC0..11AFF; Pau Cin Hau 12000..123FF; Cuneiform 12400..1247F; Cuneiform Numbers and Punctuation +12480..1254F; Early Dynastic Cuneiform 13000..1342F; Egyptian Hieroglyphs +14400..1467F; Anatolian Hieroglyphs 16800..16A3F; Bamum Supplement 16A40..16A6F; Mro 16AD0..16AFF; Bassa Vah @@ -257,6 +269,7 @@ FFF0..FFFF; Specials 1D300..1D35F; Tai Xuan Jing Symbols 1D360..1D37F; Counting Rod Numerals 1D400..1D7FF; Mathematical Alphanumeric Symbols +1D800..1DAAF; Sutton SignWriting 1E800..1E8DF; Mende Kikakui 1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols 1F000..1F02F; Mahjong Tiles @@ -271,9 +284,11 @@ FFF0..FFFF; Specials 1F700..1F77F; Alchemical Symbols 1F780..1F7FF; Geometric Shapes Extended 1F800..1F8FF; Supplemental Arrows-C +1F900..1F9FF; Supplemental Symbols and Pictographs 20000..2A6DF; CJK Unified Ideographs Extension B 2A700..2B73F; CJK Unified Ideographs Extension C 2B740..2B81F; CJK Unified Ideographs Extension D +2B820..2CEAF; CJK Unified Ideographs Extension E 2F800..2FA1F; CJK Compatibility Ideographs Supplement E0000..E007F; Tags E0100..E01EF; Variation Selectors Supplement diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt index 31c8a7eaa0..aa0e914f84 100644 --- a/unicode/UnicodeData.txt +++ b/unicode/UnicodeData.txt @@ -667,7 +667,7 @@ 029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; 029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; 029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; -029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; 02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; @@ -2091,6 +2091,9 @@ 08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; 08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; 08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; +08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; 08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; 08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; 08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; @@ -2503,6 +2506,7 @@ 0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; 0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2738,6 +2742,7 @@ 0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; 0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; 0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; 0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; @@ -2919,6 +2924,7 @@ 0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; 0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; 0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; @@ -4289,91 +4295,98 @@ 1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; 1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; 1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; -13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; -13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; -13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; -13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; -13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; -13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; -13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; -13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; -13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; -13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; -13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; -13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; -13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; -13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; -13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; -13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; -13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; -13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; -13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; -13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; -13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; -13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; -13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; -13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; -13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; -13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; -13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; -13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; -13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; -13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; -13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; -13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; -13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; -13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; -13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; -13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; -13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; -13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; -13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; -13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; -13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; -13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; -13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; -13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; -13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; -13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; -13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; -13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; -13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; -13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; -13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; -13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; -13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; -13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; -13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; -13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; -13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; -13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; -13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; -13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; -13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; -13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; -13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; -13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; -13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; -13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; -13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; -13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; -13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; -13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; -13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; -13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; -13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; -13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; -13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; -13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; -13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; -13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; -13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; -13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; -13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; -13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; -13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; -13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; -13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; +13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; +13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; +13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; +13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; +13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; +13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; +13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; +13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; +13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; +13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; +13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; +13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; +13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; +13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; +13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; +13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; +13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; +13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; +13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; +13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; +13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; +13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; +13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; +13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; +13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; +13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; +13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; +13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; +13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; +13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; +13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; +13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; +13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; +13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; +13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; +13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; +13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; +13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; +13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; +13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; +13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; +13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; +13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; +13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; +13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; +13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; +13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; +13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; +13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; +13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; +13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; +13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; +13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; +13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; +13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; +13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; +13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; +13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; +13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; +13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; +13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; +13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; +13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; +13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; +13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; +13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; +13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; +13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; +13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; +13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; +13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; +13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; +13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; +13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; +13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; +13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; +13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; +13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; +13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; +13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; +13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; +13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; +13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; +13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; +13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; +13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 +13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 +13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 +13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 +13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 +13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; 1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; 1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; @@ -5700,23 +5713,23 @@ 19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; 19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; 19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; -19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; -19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; -19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; -19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; -19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; -19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; -19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; -19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; -19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; -19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; 19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; 19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; 19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; @@ -5724,8 +5737,8 @@ 19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; 19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; 19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; -19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; -19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; 19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -7277,6 +7290,7 @@ 20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; 20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; 20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; +20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; @@ -7448,6 +7462,8 @@ 2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; 2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; 2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; +218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; +218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; 2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; 2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; 2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; @@ -10015,6 +10031,10 @@ 2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; 2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; 2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; 2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; 2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; @@ -11942,7 +11962,7 @@ 4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; 4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; 4E00;;Lo;0;L;;;;;N;;;;; -9FCC;;Lo;0;L;;;;;N;;;;; +9FD5;;Lo;0;L;;;;;N;;;;; A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; @@ -13605,6 +13625,7 @@ A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; +A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; @@ -13837,6 +13858,7 @@ A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; @@ -13869,6 +13891,12 @@ A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; +A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; +A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; +A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; +A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 +A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; +A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; @@ -14097,6 +14125,8 @@ A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -14610,7 +14640,7 @@ AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; -AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; @@ -14623,8 +14653,92 @@ AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; +AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; +AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; +AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; +AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 +AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 +AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 +AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 +AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 +AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 +AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 +AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 +AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 +AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 +AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA +AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB +AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC +AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD +AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE +AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF +AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 +AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 +AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 +AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 +AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 +AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 +AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 +AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 +AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 +AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 +AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA +AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB +AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC +AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD +AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE +AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF +AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 +AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 +AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 +AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 +AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 +AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 +AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 +AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 +AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 +AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 +AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA +AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB +AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC +AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD +AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE +AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF +ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 +ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 +ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 +ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 +ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 +ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 +ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 +ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 +ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 +ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 +ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA +ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB +ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC +ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD +ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE +ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF +ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 +ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 +ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 +ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 +ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 +ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 +ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 +ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 +ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 +ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 +ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA +ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB +ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC +ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED +ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE +ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; @@ -15944,6 +16058,8 @@ FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; @@ -17830,6 +17946,32 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; 108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; +108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; +108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; +108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; +108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; +108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; +108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; +108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; +108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; +108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; +108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; +108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; 10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; 10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; @@ -17942,8 +18084,72 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; 109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; 109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; +109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; 109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; 109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; +109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; +109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; +109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; +109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; +109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; +109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; +109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; +109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; +109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; +109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; +109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; +109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; +109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; +109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; +109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; +109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; +109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; +109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; +109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; +109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; +109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; +109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; +109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; +109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; +109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; +109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; +109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; +109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; +109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; +109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; +109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; +109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; +109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; +109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; +109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; +109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; +109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; +109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; +109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; +109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; +109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; +109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; +109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; +109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; +109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; +109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; +109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; +109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; +109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; +109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; +109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; +109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; +109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; +109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; +109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; +109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; +109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; 10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; 10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; @@ -18344,6 +18550,114 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; 10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; 10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; +10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; +10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; +10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; +10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; +10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; +10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; +10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; +10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; +10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; +10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; +10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; +10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; +10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; +10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; +10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; +10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; +10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; +10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; +10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; +10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; +10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; +10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; +10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; +10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; +10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; +10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; +10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; +10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; +10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; +10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; +10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; +10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; +10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; +10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; +10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; +10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; +10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; +10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; +10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; +10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; +10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; +10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; +10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; +10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; +10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; +10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; +10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; +10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; +10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; +10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; +10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 +10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 +10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 +10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 +10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 +10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 +10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 +10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 +10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 +10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 +10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A +10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B +10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C +10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D +10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E +10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F +10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 +10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 +10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 +10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 +10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 +10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 +10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 +10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 +10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 +10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 +10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A +10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B +10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C +10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D +10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E +10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F +10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 +10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 +10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 +10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 +10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 +10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 +10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 +10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 +10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 +10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 +10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA +10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB +10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC +10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD +10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE +10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF +10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 +10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 +10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 +10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; 10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; 10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; @@ -18764,6 +19078,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; 111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;; +111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; +111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; 111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; 111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; @@ -18776,6 +19094,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; +111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; +111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; +111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; 111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; 111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; 111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; @@ -18857,6 +19180,44 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; 1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; 1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; +11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; +11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; +11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; +11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; +11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; +11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; +1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; +1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; +1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; +1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; +11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; +11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; +11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; +11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; +11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; +11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; +1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; +1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; +1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; +1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; +112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; +112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; +112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; +112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; +112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; +112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; +112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; +112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; +112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; +112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; 112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; 112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; 112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; @@ -18926,6 +19287,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; 11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -18989,6 +19351,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; 1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; 1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; 11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; 1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; @@ -19163,6 +19526,26 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; 115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; 115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; +115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; +115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; +115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; +115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; +115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; +115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; +115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; +115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; +115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; 11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; 11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; 11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; @@ -19308,6 +19691,63 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; +11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; +11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; +11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; +11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; +11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; +11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; +11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; +11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; +11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; +1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; +1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; +1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; +1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; +1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; +1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; +11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; +11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; +11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; +11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; +11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; +11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; +11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; +11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; +11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; +11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; +1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; +1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; +11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; +11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; +1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; +11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; +1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; +1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; +1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; +1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; 118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; 118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; 118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; @@ -20370,6 +20810,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; 12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;; 12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; 12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; 12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; @@ -20486,6 +20927,202 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; 12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; 12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; +12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; +12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; +12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; +12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; +12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; +12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; +12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; +12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; +1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; +1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; +1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; +1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; +12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; +12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; +12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; +12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; +12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; +12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; +12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; +12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; +12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; +1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; +1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; +124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; +124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; +124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; +124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; +124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; +124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; +124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; +124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; +124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; +124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; +124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; +124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; +124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; +124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; +124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; +124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; +124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; +124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; +124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; +124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; +124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; +124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; +124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; +124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; +124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; +124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; +124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; +124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; +124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; +124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; +124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; +124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; +124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; +124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; +124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; +124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; +124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; +124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; +124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; +124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; +124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; +124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; +124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; +124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; +124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; +124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; +124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; +124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; +124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; +124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; +124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; +124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; +124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; +124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; +124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; +124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; +124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; +124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; +124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; +124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; +124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; +124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; +124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; +124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; +124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; +124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; +124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; +124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; +124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; +124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; +124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; +124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; +124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; +124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; +124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; +124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; +124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; +124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; +124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; +124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; +124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; +124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; +124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; +12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; +12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; +12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; +12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; +12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; +12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; +12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; +12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; +12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; +1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; +1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; +1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; +1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; +1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; +12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; +12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; +12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; +12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; +12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; +12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; +12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; +12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; +1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; +1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; +1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; +12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; +12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; +12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; +12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; +12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; +12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; +12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; +12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; +12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; +1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; +1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; +1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; +1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; +12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; +12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; +12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; +12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; +12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; +12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; +12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; +12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; +12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; +12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; +1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; +1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; +1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; +1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; +1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; +12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; +12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; +12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; +12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; 13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; 13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; 13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; @@ -21557,6 +22194,589 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; 1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; 1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; +1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; +1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; +1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; +1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; +14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; +14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; +1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; +1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; +1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; +14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; +14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; +14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; +14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; +14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; +14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; +14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; +14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; +14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; +1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; +1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; +1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; +1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; +1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; +1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; +14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; +14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; +14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; +14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; +14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; +14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; +14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; +14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; +14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; +14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; +1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; +1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; +1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; +1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; +1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; +1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; +14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; +14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; +14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; +14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; +14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; +14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; +14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; +14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; +14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; +14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; +1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; +1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; +1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; +1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; +1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; +1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; +14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; +14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; +14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; +14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; +14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; +14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; +14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; +14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; +14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; +14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; +1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; +1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; +1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; +1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; +1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; +1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; +14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; +14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; +14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; +14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; +14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; +14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; +14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; +14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; +14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; +14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; +1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; +1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; +1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; +1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; +1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; +1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; +144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; +144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; +144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; +144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; +144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; +144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; +144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; +144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; +144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; +144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; +144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; +144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; +144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; +144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; +144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; +144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; +144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; +144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; +144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; +144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; +144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; +144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; +144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; +144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; +144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; +144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; +144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; +144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; +144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; +144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; +144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; +144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; +144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; +144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; +144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; +144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; +144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; +144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; +144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; +144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; +144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; +144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; +144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; +144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; +144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; +144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; +144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; +144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; +144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; +144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; +144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; +144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; +144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; +144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; +144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; +144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; +144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; +144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; +144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; +144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; +144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; +144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; +144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; +144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; +144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; +144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; +144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; +144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; +144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; +144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; +144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; +144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; +144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; +144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; +144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; +144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; +144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; +144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; +144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; +144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; +144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; +144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; +144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; +144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; +144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; +144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; +144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; +144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; +144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; +144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; +144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; +144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; +144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; +144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; +144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; +144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; +14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; +14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; +14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; +14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; +14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; +14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; +14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; +14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; +14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; +14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; +1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; +1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; +1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; +1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; +1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; +1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; +14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; +14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; +14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; +14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; +14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; +14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; +14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; +14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; +14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; +14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; +1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; +1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; +1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; +1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; +1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; +1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; +14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; +14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; +14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; +14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; +14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; +14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; +14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; +14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; +14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; +14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; +1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; +1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; +1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; +1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; +1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; +1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; +14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; +14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; +14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; +14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; +14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; +14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; +14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; +14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; +14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; +14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; +1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; +1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; +1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; +1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; +1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; +1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; +14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; +14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; +14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; +14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; +14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; +14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; +14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; +14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; +14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; +14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; +1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; +1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; +1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; +1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; +1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; +1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; +14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; +14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; +14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; +14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; +14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; +14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; +14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; +14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; +14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; +14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; +1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; +1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; +1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; +1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; +1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; +1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; +14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; +14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; +14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; +14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; +14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; +14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; +14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; +14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; +14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; +14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; +1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; +1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; +1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; +1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; +1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; +1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; +14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; +14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; +14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; +14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; +14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; +14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; +14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; +14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; +14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; +14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; +1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; +1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; +1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; +1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; +1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; +1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; +14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; +14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; +14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; +14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; +14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; +14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; +14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; +14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; +14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; +14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; +1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; +1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; +1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; +1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; +1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; +1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; +14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; +14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; +14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; +14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; +14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; +14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; +14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; +14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; +14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; +14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; +1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; +1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; +1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; +1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; +1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; +1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; +145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; +145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; +145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; +145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; +145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; +145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; +145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; +145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; +145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; +145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; +145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; +145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; +145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; +145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; +145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; +145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; +145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; +145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; +145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; +145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; +145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; +145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; +145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; +145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; +145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; +145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; +145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; +145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; +145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; +145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; +145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; +145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; +145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; +145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; +145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; +145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; +145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; +145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; +145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; +145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; +145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; +145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; +145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; +145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; +145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; +145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; +145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; +145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; +145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; +145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; +145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; +145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; +145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; +145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; +145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; +145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; +145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; +145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; +145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; +145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; +145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; +145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; +145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; +145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; +145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; +145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; +145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; +145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; +145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; +145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; +145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; +145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; +145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; +145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; +145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; +145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; +145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; +145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; +145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; +145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; +145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; +145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; +145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; +145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; +145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; +145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; +145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; +145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; +145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; +145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; +145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; +145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; +145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; +145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; +14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; +14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; +14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; +14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; +14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; +14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; +14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; +14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; +14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; +14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; +1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; +1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; +1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; +1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; +1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; +1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; +14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; +14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; +14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; +14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; +14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; +14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; +14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; +14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; +14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; +14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; +1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; +1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; +1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; +1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; +1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; +1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; +14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; +14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; +14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; +14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; +14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; +14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; +14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; +14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; +14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; +14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; +1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; +1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; +1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; +1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; +1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; +1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; +14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; +14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; +14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; +14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; +14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; +14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; +14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; +14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; +14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; +14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; +1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; +1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; +1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; +1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; +1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; +1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; +14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; +14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; +14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; +14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; +14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; +14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; +14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; 16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; 16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; 16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; @@ -23080,6 +24300,17 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; 1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; 1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; +1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; +1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; +1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; +1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; +1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; +1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; 1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; 1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; 1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; @@ -24251,6 +25482,678 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; 1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; 1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; +1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; +1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; +1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; +1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; +1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; +1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; +1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; +1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; +1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; +1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; +1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; +1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; +1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; +1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; +1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; +1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; +1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; +1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; +1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; +1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; +1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; +1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; +1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; +1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; +1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; +1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; +1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; +1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; +1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; +1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; +1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; +1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; +1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; +1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; +1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; +1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; +1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; +1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; +1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; +1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; +1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; +1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; +1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; +1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; +1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; +1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; +1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; +1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; +1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; +1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; +1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; +1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; +1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; +1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; +1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; +1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; +1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; +1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; +1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; +1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; +1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; +1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; +1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; +1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; +1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; +1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; +1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; +1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; +1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; +1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; +1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; +1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; +1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; +1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; +1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; +1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; +1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; +1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; +1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; +1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; +1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; +1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; +1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; +1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; +1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; +1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; +1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; +1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; +1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; +1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; +1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; +1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; +1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; +1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; +1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; +1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; +1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; +1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; +1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; +1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; +1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; +1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; +1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; +1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; +1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; +1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; +1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; +1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; +1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; +1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; +1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; +1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; +1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; +1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; +1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; +1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; +1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; +1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; +1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; +1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; +1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; +1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; +1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; +1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; +1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; +1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; +1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; +1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; +1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; +1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; +1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; +1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; +1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; +1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; +1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; +1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; +1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; +1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; +1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; +1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; +1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; +1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; +1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; +1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; +1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; +1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; +1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; +1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; +1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; +1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; +1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; +1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; +1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; +1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; +1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; +1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; +1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; +1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; +1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; +1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; +1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; +1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; +1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; +1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; +1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; +1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; +1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; +1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; +1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; +1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; +1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; +1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; +1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; +1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; +1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; +1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; +1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; +1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; +1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; +1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; +1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; +1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; +1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; +1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; +1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; +1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; +1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; +1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; +1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; +1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; +1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; +1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; +1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; +1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; +1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; +1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; +1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; +1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; +1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; +1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; +1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; +1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; +1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; +1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; +1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; +1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; +1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; +1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; +1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; +1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; +1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; +1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; +1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; +1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; +1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; +1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; +1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; +1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; +1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; +1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; +1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; +1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; +1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; +1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; +1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; +1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; +1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; +1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; +1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; +1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; +1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; +1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; +1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; +1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; +1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; +1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; +1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; +1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; +1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; +1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; +1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; +1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; +1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; +1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; +1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; +1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; +1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; +1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; +1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; +1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; +1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; +1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; +1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; +1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; +1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; +1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; +1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; +1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; +1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; +1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; +1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; +1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; +1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; +1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; +1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; +1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; +1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; +1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; +1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; +1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; +1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; +1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; +1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; +1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; +1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; +1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; +1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; +1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; +1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; +1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; +1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; +1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; +1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; +1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; +1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; +1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; +1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; +1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; +1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; +1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; +1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; +1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; +1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; +1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; +1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; +1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; +1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; +1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; +1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; +1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; +1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; +1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; +1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; +1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; +1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; +1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; +1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; +1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; +1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; +1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; +1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; +1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; +1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; +1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; +1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; +1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; +1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; +1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; +1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; +1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; +1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; +1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; +1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; +1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; +1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; +1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; +1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; +1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; +1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; +1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; +1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; +1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; 1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; 1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; 1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; @@ -25108,6 +27011,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; 1F32B;FOG;So;0;ON;;;;;N;;;;; 1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F32D;HOT DOG;So;0;ON;;;;;N;;;;; +1F32E;TACO;So;0;ON;;;;;N;;;;; +1F32F;BURRITO;So;0;ON;;;;;N;;;;; 1F330;CHESTNUT;So;0;ON;;;;;N;;;;; 1F331;SEEDLING;So;0;ON;;;;;N;;;;; 1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; @@ -25186,6 +27092,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; 1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; 1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; +1F37F;POPCORN;So;0;ON;;;;;N;;;;; 1F380;RIBBON;So;0;ON;;;;;N;;;;; 1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; 1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; @@ -25265,6 +27173,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F3CC;GOLFER;So;0;ON;;;;;N;;;;; 1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; 1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; +1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; +1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; +1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; +1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; 1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; 1F3D5;CAMPING;So;0;ON;;;;;N;;;;; 1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; @@ -25301,6 +27214,14 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; 1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; 1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; +1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; +1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; +1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; +1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; +1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; +1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; +1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; 1F400;RAT;So;0;ON;;;;;N;;;;; 1F401;MOUSE;So;0;ON;;;;;N;;;;; 1F402;OX;So;0;ON;;;;;N;;;;; @@ -25556,6 +27477,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; 1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; 1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; 1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; 1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; 1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; @@ -25631,6 +27553,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; 1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; 1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F54B;KAABA;So;0;ON;;;;;N;;;;; +1F54C;MOSQUE;So;0;ON;;;;;N;;;;; +1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; +1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; +1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; 1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; 1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; 1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; @@ -25872,6 +27799,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; 1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; 1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; +1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; 1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; 1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; 1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; @@ -26011,6 +27940,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; 1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; 1F6CF;BED;So;0;ON;;;;;N;;;;; +1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; 1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; 1F6E1;SHIELD;So;0;ON;;;;;N;;;;; 1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; @@ -26377,12 +28307,29 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; 1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; +1F913;NERD FACE;So;0;ON;;;;;N;;;;; +1F914;THINKING FACE;So;0;ON;;;;;N;;;;; +1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; +1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; +1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; +1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; +1F980;CRAB;So;0;ON;;;;;N;;;;; +1F981;LION FACE;So;0;ON;;;;;N;;;;; +1F982;SCORPION;So;0;ON;;;;;N;;;;; +1F983;TURKEY;So;0;ON;;;;;N;;;;; +1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; +1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; 20000;;Lo;0;L;;;;;N;;;;; 2A6D6;;Lo;0;L;;;;;N;;;;; 2A700;;Lo;0;L;;;;;N;;;;; 2B734;;Lo;0;L;;;;;N;;;;; 2B740;;Lo;0;L;;;;;N;;;;; 2B81D;;Lo;0;L;;;;;N;;;;; +2B820;;Lo;0;L;;;;;N;;;;; +2CEA1;;Lo;0;L;;;;;N;;;;; 2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; 2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; 2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; diff --git a/unicode/how-to-update.txt b/unicode/how-to-update.txt new file mode 100644 index 0000000000..246e84891a --- /dev/null +++ b/unicode/how-to-update.txt @@ -0,0 +1,94 @@ +This document contains instructions for updating the Unicode data set used by +the WebEncoders project. + +1) Download the latest UnicodeData.txt and Blocks.txt from the Unicode + Consortium web site. These files are normally found under + http://www.unicode.org/Public/X.Y.Z/ucd/, where X.Y.Z is the version of the + Unicode specification of interest. Replace the UnicodeData.txt and + Blocks.txt files in this folder with the files you downloaded. + +2) Update unicode-copyright.txt in this folder with the following information: + - The exact URLs where you downloaded UnicodeData.txt and Blocks.txt. + - The date on which you downloaded these two files. + - The Unicode copyright and permission notice, if it has changed. The latest + copyright and permission notice can be found at the bottom of + http://www.unicode.org/copyright.html. + +3) Open the Generators solution and run the DefinedCharListGenerator project. + Running this will drop a file unicode-defined-chars.bin into the output + folder. Move this file into the following directory, overwriting the + existing file in that directory: + src\Microsoft.Framework.WebEncoders.Core\compiler\resources + +4) Open the Generators solution and run the UnicodeTablesGenerator project. + Running this will drop two files UnicodeRanges.generated.txt and + UnicodeRangesTests.generated.txt into the output folder. + +5) Open UnicodeRanges.generated.txt in your favorite text editor. You'll see + that the file contains all of the parsed Unicode block information in + ascending code point order. Manually REMOVE the following blocks from this + text file and re-save it. + - High Surrogates (U+D800..U+DB7F) + - High Private Use Surrogates (U+DB80..U+DBFF) + - Low Surrogates (U+DC00..U+DFFF) + - Private Use Area (U+E000..U+F8FF) + +6) Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.generated.cs in + your IDE. Delete everything within the partial class definition and replace + it with the contents of UnicodeRanges.generated.txt. (Remember to remove + the blocks mentioned in the previous step, otherwise unit tests will fail.) + + Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.cs in your IDE. + Update the doc comment at the top of the class to reflect the appropriate + version of the Unicode specification. + +7) Open UnicodeRangesTests.generated.txt in your favorite text editor. Just + like in the previous .txt file, you'll need to remove the [InlineData] + lines which map to the Unicode blocks which were manually removed. + See step (5) for the list of which blocks must be removed. Then re-save + this file. + +8) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeRangesTests.cs in + your IDE. Delete all of the [InlineData] attributes on the Range_Unicode + test, then paste the contents of UnicodeRangesTests.generated.txt in + to restore the new [InlineData] list. + + IMPORTANT: Don't delete the [Theory] attribute on this method! + +9) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeHelpersTests.cs in + your IDE. Scroll to the bottom of the ReadListOfDefinedCharacters method, + and you'll see a section where the test special-cases CJK Ideographs and + Hangul Syllables. As more characters are added to the Unicode specification + the list of valid CJK Ideographs and Hangul Syllables can grow, so make sure + these match up with the relevant lines in UnicodeData.txt. For instance, at + the time of this writing UnicodeData.txt lists the valid Hangul Syllable + character range as follows: + + AC00;;Lo;0;L;;;;;N;;;;; + D7A3;;Lo;0;L;;;;;N;;;;; + + If necessary, update the logic in the ReadListOfDefinedCharacters method to + account for any changes to these lines in UnicodeData.txt. + +That's it! Run the unit tests and everything should be good to go. If you find +any stray comments throughout the code base that reference a specific version +of the Unicode specification, go ahead and update them so that they correctly +reflect the version you just submitted. + +To recap, the files you should check in are: + +src\Microsoft.Framework.WebEncoders.Core\compiler\resources\ + unicode-defined-chars.bin + +src\Microsoft.Framework.WebEncoders.Core\ + UnicodeRanges.cs + UnicodeRanges.generated.cs + +test\Microsoft.Framework.WebEncoders.Tests\ + UnicodeHelpersTests.cs (if necessary, see step 9) + UnicodeRangesTests.cs + +unicode\ + Blocks.txt + unicode-copyright.txt + UnicodeData.txt diff --git a/unicode/unicode-copyright.txt b/unicode/unicode-copyright.txt index 1a7f162552..9a34a6b8b2 100644 --- a/unicode/unicode-copyright.txt +++ b/unicode/unicode-copyright.txt @@ -1,8 +1,8 @@ The files Blocks.txt and UnicodeData.txt in this directory were -retrieved from the following URLs on Saturday, February 7, 2015. +retrieved from the following URLs on Saturday, September 5, 2015. -http://www.unicode.org/Public/7.0.0/ucd/Blocks.txt -http://www.unicode.org/Public/7.0.0/ucd/UnicodeData.txt +http://www.unicode.org/Public/8.0.0/ucd/Blocks.txt +http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt The below copyright notice applies to these files. From 4e0f0c79ec62561650ef7f7cd341a136f803b7d3 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 8 Sep 2015 12:04:53 -0700 Subject: [PATCH 375/846] #366 Rewind the request buffer after parsing the form. --- src/Microsoft.AspNet.Http/Features/FormFeature.cs | 3 +++ test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index b50d58c415..48819224dd 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -152,6 +152,9 @@ namespace Microsoft.AspNet.Http.Features.Internal } } + // Rewind so later readers don't have to. + _request.Body.Seek(0, SeekOrigin.Begin); + Form = new FormCollection(formFields, files); return Form; } diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 6f3eb26111..4580ac9e97 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -32,6 +32,8 @@ namespace Microsoft.AspNet.Http.Features.Internal // Assert Assert.Equal("bar", formCollection["foo"]); Assert.Equal("2", formCollection["baz"]); + Assert.Equal(0, context.Request.Body.Position); + Assert.True(context.Request.Body.CanSeek); // Cached formFeature = context.Features.Get(); From 20e534a570723d0f03203ba7d3323c95022bc63d Mon Sep 17 00:00:00 2001 From: Justin Van Patten Date: Sun, 6 Sep 2015 21:07:14 -0700 Subject: [PATCH 376/846] Add more StringValues tests --- .../StringValuesTests.cs | 242 +++++++++++++++--- 1 file changed, 203 insertions(+), 39 deletions(-) diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs index 389d6f547d..bdf8e7bca3 100644 --- a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs +++ b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using Xunit; @@ -10,10 +11,76 @@ namespace Microsoft.Framework.Primitives { public class StringValuesTests { - [Fact] - public void IsReadOnly_True() + public static TheoryData DefaultOrNullStringValues + { + get + { + return new TheoryData + { + new StringValues(), + new StringValues((string)null), + new StringValues((string[])null), + (string)null, + (string[])null + }; + } + } + + public static TheoryData EmptyStringValues + { + get + { + return new TheoryData + { + StringValues.Empty, + new StringValues(new string[0]), + new string[0] + }; + } + } + + public static TheoryData FilledStringValues + { + get + { + return new TheoryData + { + new StringValues("abc"), + new StringValues(new[] { "abc" }), + new StringValues(new[] { "abc", "bcd" }), + new StringValues(new[] { "abc", "bcd", "foo" }), + "abc", + new[] { "abc" }, + new[] { "abc", "bcd" }, + new[] { "abc", "bcd", "foo" } + }; + } + } + + public static TheoryData FilledStringValuesWithExpected + { + get + { + return new TheoryData + { + { new StringValues("abc"), new[] { "abc" } }, + { new StringValues(new[] { "abc" }), new[] { "abc" } }, + { new StringValues(new[] { "abc", "bcd" }), new[] { "abc", "bcd" } }, + { new StringValues(new[] { "abc", "bcd", "foo" }), new[] { "abc", "bcd", "foo" } }, + { "abc", new[] { "abc" } }, + { new[] { "abc" }, new[] { "abc" } }, + { new[] { "abc", "bcd" }, new[] { "abc", "bcd" } }, + { new[] { "abc", "bcd", "foo" }, new[] { "abc", "bcd", "foo" } } + }; + } + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + [MemberData(nameof(FilledStringValues))] + public void IsReadOnly_True(StringValues stringValues) { - var stringValues = new StringValues(); Assert.True(((IList)stringValues).IsReadOnly); Assert.Throws(() => ((IList)stringValues)[0] = string.Empty); Assert.Throws(() => ((ICollection)stringValues).Add(string.Empty)); @@ -23,51 +90,34 @@ namespace Microsoft.Framework.Primitives Assert.Throws(() => ((ICollection)stringValues).Clear()); } - [Fact] - public void DefaultConstructor_ExpectedValues() + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + public void DefaultOrNull_ExpectedValues(StringValues stringValues) + { + Assert.Null((string[])stringValues); + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_ExpectedValues(StringValues stringValues) { - var stringValues = new StringValues(); Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); Assert.Equal((string)null, stringValues); + Assert.Equal(string.Empty, stringValues.ToString()); Assert.Equal(new string[0], stringValues.ToArray()); Assert.True(StringValues.IsNullOrEmpty(stringValues)); Assert.Throws(() => stringValues[0]); + Assert.Throws(() => ((IList)stringValues)[0]); Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Equal(-1, ((IList)stringValues).IndexOf(null)); Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void Constructor_NullStringValue_ExpectedValues() - { - var stringValues = new StringValues((string)null); - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Null((string[])stringValues); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void Constructor_NullStringArray_ExpectedValues() - { - var stringValues = new StringValues((string[])null); - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Null((string[])stringValues); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(-1, ((IList)stringValues).IndexOf("not there")); + Assert.False(((ICollection)stringValues).Contains(null)); + Assert.False(((ICollection)stringValues).Contains(string.Empty)); + Assert.False(((ICollection)stringValues).Contains("not there")); Assert.Equal(0, stringValues.Count()); } @@ -85,6 +135,7 @@ namespace Microsoft.Framework.Primitives Assert.Equal(1, stringValues.Count); Assert.Equal(aString, stringValues); Assert.Equal(aString, stringValues[0]); + Assert.Equal(aString, ((IList)stringValues)[0]); Assert.Equal(new string[] { aString }, stringValues); } @@ -103,6 +154,7 @@ namespace Microsoft.Framework.Primitives Assert.Equal(1, stringValues.Count); Assert.Equal(aString, stringValues); Assert.Equal(aString, stringValues[0]); + Assert.Equal(aString, ((IList)stringValues)[0]); Assert.Equal(aStringArray, stringValues); aString = "abc"; @@ -113,5 +165,117 @@ namespace Microsoft.Framework.Primitives Assert.Equal("abc,bcd", stringValues); Assert.Equal(aStringArray, stringValues); } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_Enumerator(StringValues stringValues) + { + var e1 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e1.Current); + Assert.False(e1.MoveNext()); + Assert.Null(e1.Current); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + + var e2 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e2.Current); + Assert.False(e2.MoveNext()); + Assert.Null(e2.Current); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Enumerator(StringValues stringValues, string[] expected) + { + var e1 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e1.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e1.MoveNext()); + Assert.Equal(expected[i], e1.Current); + } + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + + var e2 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e2.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e2.MoveNext()); + Assert.Equal(expected[i], e2.Current); + } + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void IndexOf(StringValues stringValues, string[] expected) + { + IList list = stringValues; + Assert.Equal(-1, list.IndexOf("not there")); + for (int i = 0; i < expected.Length; i++) + { + Assert.Equal(i, list.IndexOf(expected[i])); + } + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Contains(StringValues stringValues, string[] expected) + { + ICollection collection = stringValues; + Assert.False(collection.Contains("not there")); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(collection.Contains(expected[i])); + } + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void CopyTo(StringValues stringValues, string[] expected) + { + ICollection collection = stringValues; + string[] actual = new string[expected.Length]; + collection.CopyTo(actual, 0); + Assert.Equal(expected, actual); + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_Concat(StringValues stringValues) + { + string[] expected = new[] { "abc", "bcd", "foo" }; + Assert.Equal(expected, StringValues.Concat(stringValues, new StringValues(expected))); + Assert.Equal(expected, StringValues.Concat(new StringValues(expected), stringValues)); + + string[] empty = new string[0]; + Assert.Equal(empty, StringValues.Concat(stringValues, StringValues.Empty)); + Assert.Equal(empty, StringValues.Concat(StringValues.Empty, stringValues)); + Assert.Equal(empty, StringValues.Concat(stringValues, new StringValues())); + Assert.Equal(empty, StringValues.Concat(new StringValues(), stringValues)); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Concat(StringValues stringValues, string[] array) + { + string[] filled = new[] { "abc", "bcd", "foo" }; + + string[] expectedPrepended = array.Concat(filled).ToArray(); + Assert.Equal(expectedPrepended, StringValues.Concat(stringValues, new StringValues(filled))); + + string[] expectedAppended = filled.Concat(array).ToArray(); + Assert.Equal(expectedAppended, StringValues.Concat(new StringValues(filled), stringValues)); + } } } From df33a3cff8507abfce749ace47158243aca270ad Mon Sep 17 00:00:00 2001 From: Justin Van Patten Date: Sun, 6 Sep 2015 21:29:09 -0700 Subject: [PATCH 377/846] StringValues improvements - Add public struct enumerator (avoids enumerator allocations) - Implement IReadOnlyList - Rename indexer parameter name from "key" to "index" - Faster IndexOf (no more enumerator allocation & faster array enumeration) - Faster Contains (no more box allocation) - Faster CopyTo (no more enumerator allocation) - Faster Concat (no more enumerator allocations; use CopyTo) --- .../StringValues.cs | 155 +++++++++++++----- .../StringValuesTests.cs | 25 +++ 2 files changed, 142 insertions(+), 38 deletions(-) diff --git a/src/Microsoft.Framework.Primitives/StringValues.cs b/src/Microsoft.Framework.Primitives/StringValues.cs index a9904aac5c..79a8e6d006 100644 --- a/src/Microsoft.Framework.Primitives/StringValues.cs +++ b/src/Microsoft.Framework.Primitives/StringValues.cs @@ -10,7 +10,7 @@ namespace Microsoft.Framework.Primitives /// /// Represents zero/null, one, or many strings in an efficient way. /// - public struct StringValues : IList + public struct StringValues : IList, IReadOnlyList { private static readonly string[] EmptyArray = new string[0]; public static readonly StringValues Empty = new StringValues(EmptyArray); @@ -63,15 +63,15 @@ namespace Microsoft.Framework.Primitives set { throw new NotSupportedException(); } } - public string this[int key] + public string this[int index] { get { if (_values != null) { - return _values[key]; // may throw + return _values[index]; // may throw } - if (key == 0 && _value != null) + if (index == 0 && _value != null) { return _value; } @@ -114,28 +114,67 @@ namespace Microsoft.Framework.Primitives int IList.IndexOf(string item) { - var index = 0; - foreach (var value in this) + return IndexOf(item); + } + + private int IndexOf(string item) + { + if (_values != null) { - if (string.Equals(value, item, StringComparison.Ordinal)) + var values = _values; + for (int i = 0; i < values.Length; i++) { - return index; + if (string.Equals(values[i], item, StringComparison.Ordinal)) + { + return i; + } } - index += 1; + return -1; } + + if (_value != null) + { + return string.Equals(_value, item, StringComparison.Ordinal) ? 0 : -1; + } + return -1; } bool ICollection.Contains(string item) { - return ((IList)this).IndexOf(item) >= 0; + return IndexOf(item) >= 0; } void ICollection.CopyTo(string[] array, int arrayIndex) { - for(int i = 0; i < Count; i++) + CopyTo(array, arrayIndex); + } + + private void CopyTo(string[] array, int arrayIndex) + { + if (_values != null) { - array[arrayIndex + i] = this[i]; + Array.Copy(_values, 0, array, arrayIndex, _values.Length); + return; + } + + if (_value != null) + { + if (array == null) + { + throw new ArgumentNullException(nameof(array)); + } + if (arrayIndex < 0) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + } + if (array.Length - arrayIndex < 1) + { + throw new ArgumentException( + $"'{nameof(array)}' is not long enough to copy all the items in the collection. Check '{nameof(arrayIndex)}' and '{nameof(array)}' length."); + } + + array[arrayIndex] = _value; } } @@ -164,28 +203,19 @@ namespace Microsoft.Framework.Primitives throw new NotSupportedException(); } - IEnumerator IEnumerable.GetEnumerator() + public Enumerator GetEnumerator() { - return ((IEnumerable)this).GetEnumerator(); + return new Enumerator(this); } IEnumerator IEnumerable.GetEnumerator() { - if (Count == 0) - { - yield break; - } - if (_values == null) - { - yield return _value; - } - else - { - for (int i = 0; i < _values.Length; i++) - { - yield return _values[i]; - } - } + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); } public static bool IsNullOrEmpty(StringValues value) @@ -218,16 +248,65 @@ namespace Microsoft.Framework.Primitives } var combined = new string[count1 + count2]; - var index = 0; - foreach (var value in values1) - { - combined[index++] = value; - } - foreach (var value in values2) - { - combined[index++] = value; - } + values1.CopyTo(combined, 0); + values2.CopyTo(combined, count1); return new StringValues(combined); } + + public struct Enumerator : IEnumerator + { + private readonly StringValues _values; + private string _current; + private int _index; + + public Enumerator(StringValues values) + { + _values = values; + _current = null; + _index = 0; + } + + public bool MoveNext() + { + var values = _values._values; + if (values != null) + { + if (_index < values.Length) + { + _current = values[_index]; + _index++; + return true; + } + + _current = null; + return false; + } + + var value = _values._value; + if (value != null && _index == 0) + { + _current = value; + _index = -1; // sentinel value + return true; + } + + _current = null; + return false; + } + + public string Current => _current; + + object IEnumerator.Current => _current; + + void IEnumerator.Reset() + { + _current = null; + _index = 0; + } + + void IDisposable.Dispose() + { + } + } } } diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs index bdf8e7bca3..184fa3f7da 100644 --- a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs +++ b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs @@ -171,6 +171,14 @@ namespace Microsoft.Framework.Primitives [MemberData(nameof(EmptyStringValues))] public void DefaultNullOrEmpty_Enumerator(StringValues stringValues) { + var e = stringValues.GetEnumerator(); + Assert.Null(e.Current); + Assert.False(e.MoveNext()); + Assert.Null(e.Current); + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + var e1 = ((IEnumerable)stringValues).GetEnumerator(); Assert.Null(e1.Current); Assert.False(e1.MoveNext()); @@ -192,6 +200,17 @@ namespace Microsoft.Framework.Primitives [MemberData(nameof(FilledStringValuesWithExpected))] public void Enumerator(StringValues stringValues, string[] expected) { + var e = stringValues.GetEnumerator(); + Assert.Null(e.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e.MoveNext()); + Assert.Equal(expected[i], e.Current); + } + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + var e1 = ((IEnumerable)stringValues).GetEnumerator(); Assert.Null(e1.Current); for (int i = 0; i < expected.Length; i++) @@ -244,7 +263,13 @@ namespace Microsoft.Framework.Primitives public void CopyTo(StringValues stringValues, string[] expected) { ICollection collection = stringValues; + + string[] tooSmall = new string[0]; + Assert.Throws(() => collection.CopyTo(tooSmall, 0)); + string[] actual = new string[expected.Length]; + Assert.Throws(() => collection.CopyTo(actual, -1)); + Assert.Throws(() => collection.CopyTo(actual, actual.Length + 1)); collection.CopyTo(actual, 0); Assert.Equal(expected, actual); } From 00d5a056d9ed0ed863a9b2aee22eb152d1434e3c Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 10 Sep 2015 11:30:42 -0700 Subject: [PATCH 378/846] #360 Add Response.Clear() extension. --- .../ResponseExtensions.cs | 26 ++++++++ .../ResponseExtensionTests.cs | 64 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs new file mode 100644 index 0000000000..c818bcaa16 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http.Extensions +{ + public static class ResponseExtensions + { + public static void Clear(this HttpResponse response) + { + if (response.HasStarted) + { + throw new InvalidOperationException("The response cannot be cleared, it has already started sending."); + } + response.StatusCode = 200; + response.HttpContext.Features.Get().ReasonPhrase = null; + response.Headers.Clear(); + if (response.Body.CanSeek) + { + response.Body.SetLength(0); + } + } + } +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs new file mode 100644 index 0000000000..2565ef1f80 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -0,0 +1,64 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; +using Microsoft.Framework.Primitives; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions +{ + public class ResponseExtensionTests + { + [Fact] + public void Clear_ResetsResponse() + { + var context = new DefaultHttpContext(); + context.Response.StatusCode = 201; + context.Response.Headers["custom"] = "value"; + context.Response.Body.Write(new byte[100], 0, 100); + + context.Response.Clear(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Response.Headers["custom"].ToString()); + Assert.Equal(0, context.Response.Body.Length); + } + + [Fact] + public void Clear_AlreadyStarted_Throws() + { + var context = new DefaultHttpContext(); + context.Features.Set(new StartedResponseFeature()); + + Assert.Throws(() => context.Response.Clear()); + } + + private class StartedResponseFeature : IHttpResponseFeature + { + public Stream Body { get; set; } + + public bool HasStarted { get { return true; } } + + public IDictionary Headers { get; set; } + + public string ReasonPhrase { get; set; } + + public int StatusCode { get; set; } + + public void OnCompleted(Func callback, object state) + { + throw new NotImplementedException(); + } + + public void OnStarting(Func callback, object state) + { + throw new NotImplementedException(); + } + } + } +} From 327dabb243112510d403094b89b2ad597fdf02cc Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 10 Sep 2015 11:35:22 -0700 Subject: [PATCH 379/846] Fix namespace for Clear extension. --- src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs index c818bcaa16..ea00f14d5c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs @@ -4,7 +4,7 @@ using System; using Microsoft.AspNet.Http.Features; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Http { public static class ResponseExtensions { From b1a2db0a7cb31c3effafcabbf1871a872ff6ce50 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 10 Sep 2015 17:47:52 -0700 Subject: [PATCH 380/846] Adding NeutralResourcesLanguageAttribute --- .../Properties/AssemblyInfo.cs | 8 ++++++++ src/Microsoft.AspNet.Html.Abstractions/project.json | 6 +++++- .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 4 +++- src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs | 4 +++- src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 8 ++++++++ src/Microsoft.Framework.Primitives/project.json | 3 ++- .../Properties/AssemblyInfo.cs | 3 ++- src/Microsoft.Framework.WebEncoders.Core/project.json | 1 + .../Properties/AssemblyInfo.cs | 4 +++- src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 4 +++- 14 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b2437d9ad6 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index a2a7420401..6ecc82e292 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -11,6 +11,10 @@ "frameworks": { "net45" : { }, "dnx451": { }, - "dnxcore50": { } + "dnxcore50": { + "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index 2565f9261e..08ea154ce6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -2,7 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] \ No newline at end of file +[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b2437d9ad6 --- /dev/null +++ b/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json index 3b870f7173..c504f822d2 100644 --- a/src/Microsoft.Framework.Primitives/project.json +++ b/src/Microsoft.Framework.Primitives/project.json @@ -16,7 +16,8 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.11-beta-*" + "System.Collections": "4.0.11-beta-*", + "System.Resources.ResourceManager": "4.0.1-beta-" } } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs index c09b9bdbba..48510ed635 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -1,9 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] [assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index 7cee739e6e..b2ad614378 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -20,6 +20,7 @@ "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.Reflection": "4.0.10-*", + "System.Resources.ResourceManager": "4.0.1-beta-", "System.Runtime.Extensions": "4.0.11-beta-*", "System.Threading": "4.0.11-beta-*" } diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file From ed3ea339189902dfa5747f26c88e573bb1f56538 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 10 Sep 2015 18:41:17 -0700 Subject: [PATCH 381/846] Add IHtmlContentBuilder interface Common interface for things that allow appending content (TagBuilder, BufferedHtmlContent). We want to be able to expose this from APIs for users to add content. See discussion: https://github.com/aspnet/Mvc/issues/3087 --- .../IHtmlContentBuilder.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs new file mode 100644 index 0000000000..4b34f98bfb --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -0,0 +1,31 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// A builder for HTML content. + /// + public interface IHtmlContentBuilder : IHtmlContent + { + /// + /// Appends an instance. + /// + /// The to append. + /// The . + IHtmlContentBuilder Append(IHtmlContent content); + + /// + /// Appends a value. The value is treated as unencoded as-provided, and will be HTML + /// encoded before writing to output. + /// + /// The to append. + /// The . + IHtmlContentBuilder Append(string unencoded); + + /// + /// Clears the content. + /// + void Clear(); + } +} From 7a24045953df16e0ee69173a05078c51764ba720 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 13 Sep 2015 22:07:17 -0700 Subject: [PATCH 382/846] Split ParsingHelpers classes into their own files #397 --- .../Internal/HeaderSegment.cs | 62 ++++ .../HeaderSegmentCollection.cs} | 329 +----------------- .../Internal/ParsingHelpers.cs | 137 ++++++++ .../Internal/StringSegment.cs | 132 +++++++ 4 files changed, 332 insertions(+), 328 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs rename src/Microsoft.AspNet.Http.Extensions/{ParsingHelpers.cs => Internal/HeaderSegmentCollection.cs} (52%) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs new file mode 100644 index 0000000000..72e94d3ef5 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs @@ -0,0 +1,62 @@ +using System; + +namespace Microsoft.AspNet.Http.Internal +{ + internal struct HeaderSegment : IEquatable + { + private readonly StringSegment _formatting; + private readonly StringSegment _data; + + // + // Initializes a new instance of the class. + // + public HeaderSegment(StringSegment formatting, StringSegment data) + { + _formatting = formatting; + _data = data; + } + + public StringSegment Formatting + { + get { return _formatting; } + } + + public StringSegment Data + { + get { return _data; } + } + + public bool Equals(HeaderSegment other) + { + return _formatting.Equals(other._formatting) && _data.Equals(other._data); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegment && Equals((HeaderSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); + } + } + + public static bool operator ==(HeaderSegment left, HeaderSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegment left, HeaderSegment right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs similarity index 52% rename from src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index fcce4dd404..85e51f3782 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,78 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; +using System; using System.Collections; using System.Collections.Generic; -using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { - internal struct HeaderSegment : IEquatable - { - private readonly StringSegment _formatting; - private readonly StringSegment _data; - - // - // Initializes a new instance of the class. - // - public HeaderSegment(StringSegment formatting, StringSegment data) - { - _formatting = formatting; - _data = data; - } - - public StringSegment Formatting - { - get { return _formatting; } - } - - public StringSegment Data - { - get { return _data; } - } - - #region Equality members - - public bool Equals(HeaderSegment other) - { - return _formatting.Equals(other._formatting) && _data.Equals(other._data); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is HeaderSegment && Equals((HeaderSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); - } - } - - public static bool operator ==(HeaderSegment left, HeaderSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(HeaderSegment left, HeaderSegment right) - { - return !left.Equals(right); - } - - #endregion - } - - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] internal struct HeaderSegmentCollection : IEnumerable, IEquatable { private readonly StringValues _headers; @@ -82,8 +14,6 @@ namespace Microsoft.AspNet.Http.Internal _headers = headers; } - #region Equality members - public bool Equals(HeaderSegmentCollection other) { return Equals(_headers, other._headers); @@ -114,8 +44,6 @@ namespace Microsoft.AspNet.Http.Internal return !left.Equals(right); } - #endregion - public Enumerator GetEnumerator() { return new Enumerator(_headers); @@ -360,259 +288,4 @@ namespace Microsoft.AspNet.Http.Internal } } - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] - internal struct StringSegment : IEquatable - { - private readonly string _buffer; - private readonly int _offset; - private readonly int _count; - - // - // Initializes a new instance of the class. - // - public StringSegment(string buffer, int offset, int count) - { - _buffer = buffer; - _offset = offset; - _count = count; - } - - public string Buffer - { - get { return _buffer; } - } - - public int Offset - { - get { return _offset; } - } - - public int Count - { - get { return _count; } - } - - public string Value - { - get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } - } - - public bool HasValue - { - get { return _offset != -1 && _count != 0 && _buffer != null; } - } - - #region Equality members - - public bool Equals(StringSegment other) - { - return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is StringSegment && Equals((StringSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ _offset; - hashCode = (hashCode * 397) ^ _count; - return hashCode; - } - } - - public static bool operator ==(StringSegment left, StringSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(StringSegment left, StringSegment right) - { - return !left.Equals(right); - } - - #endregion - - public bool StartsWith([NotNull] string text, StringComparison comparisonType) - { - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public bool EndsWith([NotNull] string text, StringComparison comparisonType) - { - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; - } - - public bool Equals([NotNull] string text, StringComparison comparisonType) - { - int textLength = text.Length; - if (!HasValue || _count != textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public string Substring(int offset, int length) - { - return _buffer.Substring(_offset + offset, length); - } - - public StringSegment Subsegment(int offset, int length) - { - return new StringSegment(_buffer, _offset + offset, length); - } - - public override string ToString() - { - return Value ?? string.Empty; - } - } - - internal static class ParsingHelpers - { - public static StringValues GetHeader(IDictionary headers, string key) - { - StringValues value; - return headers.TryGetValue(key, out value) ? value : StringValues.Empty; - } - - public static StringValues GetHeaderSplit(IDictionary headers, string key) - { - var values = GetHeaderUnmodified(headers, key); - return new StringValues(GetHeaderSplitImplementation(values).ToArray()); - } - - private static IEnumerable GetHeaderSplitImplementation(StringValues values) - { - foreach (var segment in new HeaderSegmentCollection(values)) - { - if (segment.Data.HasValue) - { - yield return DeQuote(segment.Data.Value); - } - } - } - - public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) - { - StringValues values; - return headers.TryGetValue(key, out values) ? values : StringValues.Empty; - } - - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (StringValues.IsNullOrEmpty(value)) - { - headers.Remove(key); - } - else - { - headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); - } - } - - // Quote items that contain comas and are not already quoted. - private static string QuoteIfNeeded(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Contains(',')) - { - if (value[0] != '"' || value[value.Length - 1] != '"') - { - value = '"' + value + '"'; - } - } - - return value; - } - - private static string DeQuote(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') - { - value = value.Substring(1, value.Length - 2); - } - - return value; - } - - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) - { - headers.Remove(key); - } - else - { - headers[key] = values.Value; - } - } - - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) - { - if (values == null || values.Length == 0) - { - return; - } - - string existing = GetHeader(headers, key); - if (existing == null) - { - SetHeaderJoined(headers, key, values); - } - else - { - headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); - } - } - - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) - { - if (values.Count == 0) - { - return; - } - - var existing = GetHeaderUnmodified(headers, key); - SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); - } - } } diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs new file mode 100644 index 0000000000..0959adbca0 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -0,0 +1,137 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Http.Internal +{ + internal static class ParsingHelpers + { + public static StringValues GetHeader(IDictionary headers, string key) + { + StringValues value; + return headers.TryGetValue(key, out value) ? value : StringValues.Empty; + } + + public static StringValues GetHeaderSplit(IDictionary headers, string key) + { + var values = GetHeaderUnmodified(headers, key); + return new StringValues(GetHeaderSplitImplementation(values).ToArray()); + } + + private static IEnumerable GetHeaderSplitImplementation(StringValues values) + { + foreach (var segment in new HeaderSegmentCollection(values)) + { + if (segment.Data.HasValue) + { + yield return DeQuote(segment.Data.Value); + } + } + } + + public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + { + StringValues values; + return headers.TryGetValue(key, out values) ? values : StringValues.Empty; + } + + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (StringValues.IsNullOrEmpty(value)) + { + headers.Remove(key); + } + else + { + headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); + } + } + + // Quote items that contain comas and are not already quoted. + private static string QuoteIfNeeded(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Contains(',')) + { + if (value[0] != '"' || value[value.Length - 1] != '"') + { + value = '"' + value + '"'; + } + } + + return value; + } + + private static string DeQuote(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + { + value = value.Substring(1, value.Length - 2); + } + + return value; + } + + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) + { + headers.Remove(key); + } + else + { + headers[key] = values.Value; + } + } + + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeaderJoined(headers, key, values); + } + else + { + headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); + } + } + + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) + { + if (values.Count == 0) + { + return; + } + + var existing = GetHeaderUnmodified(headers, key); + SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs new file mode 100644 index 0000000000..2b7fa93020 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs @@ -0,0 +1,132 @@ +using System; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.Http.Internal +{ + internal struct StringSegment : IEquatable + { + private readonly string _buffer; + private readonly int _offset; + private readonly int _count; + + // + // Initializes a new instance of the class. + // + public StringSegment(string buffer, int offset, int count) + { + _buffer = buffer; + _offset = offset; + _count = count; + } + + public string Buffer + { + get { return _buffer; } + } + + public int Offset + { + get { return _offset; } + } + + public int Count + { + get { return _count; } + } + + public string Value + { + get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } + } + + public bool HasValue + { + get { return _offset != -1 && _count != 0 && _buffer != null; } + } + + public bool Equals(StringSegment other) + { + return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is StringSegment && Equals((StringSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ _offset; + hashCode = (hashCode * 397) ^ _count; + return hashCode; + } + } + + public static bool operator ==(StringSegment left, StringSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(StringSegment left, StringSegment right) + { + return !left.Equals(right); + } + + public bool StartsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public bool EndsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; + } + + public bool Equals([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count != textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public string Substring(int offset, int length) + { + return _buffer.Substring(_offset + offset, length); + } + + public StringSegment Subsegment(int offset, int length) + { + return new StringSegment(_buffer, _offset + offset, length); + } + + public override string ToString() + { + return Value ?? string.Empty; + } + } + +} From 52cfdf75f24059a54be5896e8c873741e5162026 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 14 Sep 2015 11:58:38 -0700 Subject: [PATCH 383/846] Add AppendEncoded to the builder This is needed because a builder may have an optimized path for an unencoded string. There's also no 'common' encoded string implementation so it's much more straightforward to put this on the interface. --- .../IHtmlContentBuilder.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index 4b34f98bfb..0d558f2006 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -23,6 +23,14 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . IHtmlContentBuilder Append(string unencoded); + /// + /// Appends an HTML encoded value. The value is treated as HTML encoded as-provided, and + /// no further encoding will be performed. + /// + /// The HTML encoded to append. + /// The . + IHtmlContentBuilder AppendEncoded(string encoded); + /// /// Clears the content. /// From 7ef2242805bfd3b8837dff0f068e77cde47071b3 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Tue, 15 Sep 2015 16:50:01 -0700 Subject: [PATCH 384/846] Extension methods for IHtmlContentBuilder Resolves a bunch of duplication between TagHelperContent and BufferedHtmlContent, plus adds a few more convenience overloads we don't have in one of the two places. --- .../HtmlContentBuilderExtensions.cs | 136 ++++++++++++++++++ .../IHtmlContentBuilder.cs | 4 +- 2 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs new file mode 100644 index 0000000000..bfd5e3ef03 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -0,0 +1,136 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using Microsoft.Framework.WebEncoders; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// Extension methods for . + /// + public static class HtmlContentBuilderExtensions + { + /// + /// Appends an . + /// + /// The . + /// The . + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder) + { + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Appends an after appending the value. + /// The value is treated as unencoded as-provided, and will be HTML encoded before writing to output. + /// + /// The . + /// The to append. + /// The . + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, string unencoded) + { + builder.Append(unencoded); + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Appends an after appending the value. + /// + /// The . + /// The to append. + /// The . + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent htmlContent) + { + builder.Append(htmlContent); + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Appends an after appending the value. + /// The value is treated as HTML encoded as-provided, and no further encoding will be performed. + /// + /// The . + /// The HTML encoded to append. + /// The . + public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) + { + builder.AppendEncoded(encoded); + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Sets the content to the value. The value is treated as unencoded as-provided, + /// and will be HTML encoded before writing to output. + /// + /// The . + /// The value that replaces the content. + /// The . + public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, string unencoded) + { + builder.Clear(); + builder.Append(unencoded); + return builder; + } + + /// + /// Sets the content to the value. + /// + /// The . + /// The value that replaces the content. + /// The . + public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, IHtmlContent content) + { + builder.Clear(); + builder.Append(content); + return builder; + } + + /// + /// Sets the content to the value. The value is treated as HTML encoded as-provided, and + /// no further encoding will be performed. + /// + /// The . + /// The HTML encoded that replaces the content. + /// The . + public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) + { + builder.Clear(); + builder.AppendEncoded(encoded); + return builder; + } + + [DebuggerDisplay("{DebuggerToString()}")] + private class HtmlEncodedString : IHtmlContent + { + public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); + + private readonly string _value; + + public HtmlEncodedString(string value) + { + _value = value; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + writer.Write(_value); + } + + private string DebuggerToString() + { + using (var writer = new StringWriter()) + { + WriteTo(writer, HtmlEncoder.Default); + return writer.ToString(); + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index 0d558f2006..aea0291e70 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// Appends a value. The value is treated as unencoded as-provided, and will be HTML /// encoded before writing to output. /// - /// The to append. + /// The to append. /// The . IHtmlContentBuilder Append(string unencoded); @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// Appends an HTML encoded value. The value is treated as HTML encoded as-provided, and /// no further encoding will be performed. /// - /// The HTML encoded to append. + /// The HTML encoded to append. /// The . IHtmlContentBuilder AppendEncoded(string encoded); From e56c3806b64f276b5c89c171d790095ca1bc0a09 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Tue, 15 Sep 2015 23:45:25 -0700 Subject: [PATCH 385/846] Add tests for HtmlContentBuilderExtensions --- HttpAbstractions.sln | 15 ++ .../HtmlContentBuilderExtensionsTest.cs | 216 ++++++++++++++++++ ...rosoft.AspNet.Html.Abstractions.Test.xproj | 21 ++ .../project.json | 15 ++ 4 files changed, 267 insertions(+) create mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs create mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj create mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 4a5ef774ab..39f29673eb 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -51,6 +51,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primiti EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives.Tests", "test\Microsoft.Framework.Primitives.Tests\Microsoft.Framework.Primitives.Tests.xproj", "{61F72E92-B3AE-4A10-B838-44F80AED40AE}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -289,6 +291,18 @@ Global {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.ActiveCfg = Release|Any CPU {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.Build.0 = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.Build.0 = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.Build.0 = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -315,5 +329,6 @@ Global {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {61F72E92-B3AE-4A10-B838-44F80AED40AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs new file mode 100644 index 0000000000..3aba376094 --- /dev/null +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -0,0 +1,216 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.Framework.WebEncoders; +using Microsoft.Framework.WebEncoders.Testing; +using Xunit; + +namespace Microsoft.AspNet.Html.Abstractions.Test +{ + public class HtmlContentBuilderExtensionsTest + { + [Fact] + public void Builder_AppendLine_Empty() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendLine(); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_AppendLine_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendLine("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value), + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_AppendLine_IHtmlContent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + var content = new OtherHtmlContent("Hi"); + + // Act + builder.AppendLine(content); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Same(content, entry), + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_AppendLineEncoded_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendLineEncoded("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value), + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_SetContent_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + builder.Append("Existing Content. Will be Cleared."); + + // Act + builder.SetContent("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); + } + + [Fact] + public void Builder_SetContent_IHtmlContent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + builder.Append("Existing Content. Will be Cleared."); + + var content = new OtherHtmlContent("Hi"); + + // Act + builder.SetContent(content); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Same(content, entry)); + } + + [Fact] + public void Builder_SetContentEncoded_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + builder.Append("Existing Content. Will be Cleared."); + + // Act + builder.SetContentEncoded("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); + } + + private static string HtmlContentToString(IHtmlContent content) + { + using (var writer = new StringWriter()) + { + content.WriteTo(writer, new CommonTestEncoder()); + return writer.ToString(); + } + } + + private class TestHtmlContentBuilder : IHtmlContentBuilder + { + public List Entries { get; } = new List(); + + public IHtmlContentBuilder Append(string unencoded) + { + Entries.Add(new UnencodedString(unencoded)); + return this; + } + + public IHtmlContentBuilder Append(IHtmlContent content) + { + Entries.Add(content); + return this; + } + + public IHtmlContentBuilder AppendEncoded(string encoded) + { + Entries.Add(new EncodedString(encoded)); + return this; + } + + public void Clear() + { + Entries.Clear(); + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + + private class EncodedString : IHtmlContent + { + public EncodedString(string value) + { + Value = value; + } + + public string Value { get; } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + + private class UnencodedString : IHtmlContent + { + public UnencodedString(string value) + { + Value = value; + } + + public string Value { get; } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + + private class OtherHtmlContent : IHtmlContent + { + public OtherHtmlContent(string value) + { + Value = value; + } + + public string Value { get; } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj b/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj new file mode 100644 index 0000000000..4a03567677 --- /dev/null +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj @@ -0,0 +1,21 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 2d187b88-94bd-4a39-ac97-f8f8b9363301 + Microsoft.AspNet.Html.Abstractions.Test + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json new file mode 100644 index 0000000000..9d82a3d934 --- /dev/null +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -0,0 +1,15 @@ +{ + "dependencies": { + "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} From f4a25b14084cc0952436575832eb201950b0eabd Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 17 Sep 2015 18:32:19 -0700 Subject: [PATCH 386/846] Update nuget.exe and corresponding feeds to v3. --- NuGet.Config => NuGet.config | 2 +- build.cmd | 11 ++++++----- build.sh | 12 +++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) rename NuGet.Config => NuGet.config (83%) diff --git a/NuGet.Config b/NuGet.config similarity index 83% rename from NuGet.Config rename to NuGet.config index 10cec18a32..1707938c61 100644 --- a/NuGet.Config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/build.cmd b/build.cmd index b54d91cf74..177997c42e 100644 --- a/build.cmd +++ b/build.cmd @@ -2,14 +2,15 @@ cd %~dp0 SETLOCAL -SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe +SET NUGET_VERSION=latest +SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe SET BUILDCMD_KOREBUILD_VERSION="" SET BUILDCMD_DNX_VERSION="" IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '%CACHED_NUGET%'" +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" :copynuget IF EXIST .nuget\nuget.exe goto restore @@ -19,11 +20,11 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run IF %BUILDCMD_KOREBUILD_VERSION%=="" ( - .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( - .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages +.nuget\nuget.exe install Sake -ExcludeVersion -Out packages IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( diff --git a/build.sh b/build.sh index 68c3e8cb52..0c66139817 100755 --- a/build.sh +++ b/build.sh @@ -10,21 +10,23 @@ else fi fi mkdir -p $cachedir +nugetVersion=latest +cachePath=$cachedir/nuget.$nugetVersion.exe -url=https://www.nuget.org/nuget.exe +url=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe -if test ! -f $cachedir/nuget.exe; then - wget -O $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null +if test ! -f $cachePath; then + wget -O $cachePath $url 2>/dev/null || curl -o $cachePath --location $url /dev/null fi if test ! -e .nuget; then mkdir .nuget - cp $cachedir/nuget.exe .nuget/nuget.exe + cp $cachePath .nuget/nuget.exe fi if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages + mono .nuget/nuget.exe install Sake -ExcludeVersion -Out packages fi if ! type dnvm > /dev/null 2>&1; then From 58974a9defd70388e5de007adb2fdf01fd939917 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Sep 2015 11:30:54 -0700 Subject: [PATCH 387/846] Replacing NotNullAttribute with thrown exceptions --- NuGet.config | 2 +- .../project.json | 3 + .../Authentication/AuthenticationManager.cs | 64 +++++++++++++--- .../HttpResponseWritingExtensions.cs | 30 +++++++- .../Extensions/MapExtensions.cs | 13 +++- .../Extensions/MapMiddleware.cs | 21 +++++- .../Extensions/MapWhenExtensions.cs | 20 ++++- .../Extensions/MapWhenMiddleware.cs | 21 +++++- .../Extensions/MapWhenOptions.cs | 20 +++-- .../Extensions/RunExtensions.cs | 15 +++- .../FragmentString.cs | 8 +- .../HostString.cs | 8 +- .../HttpResponse.cs | 11 ++- .../PathString.cs | 12 ++- .../QueryString.cs | 8 +- .../project.json | 4 +- .../FormFileExtensions.cs | 16 +++- .../HeaderDictionaryTypeExtensions.cs | 73 ++++++++++++++++--- .../Internal/HeaderSegmentCollection.cs | 2 +- .../Internal/ParsingHelpers.cs | 47 ++++++++++-- .../Internal/StringSegment.cs | 22 +++++- .../RequestHeaders.cs | 46 ++++++++++-- .../ResponseHeaders.cs | 46 ++++++++++-- .../SendFileResponseExtensions.cs | 32 +++++++- .../project.json | 6 +- .../Authentication/AuthenticateContext.cs | 9 ++- .../Authentication/ChallengeContext.cs | 11 ++- .../Authentication/SignInContext.cs | 13 +++- .../Authentication/SignOutContext.cs | 8 +- .../FeatureCollection.cs | 15 +++- .../IFeatureCollection.cs | 3 +- .../project.json | 7 +- .../DefaultAuthenticationManager.cs | 34 +++++++-- src/Microsoft.AspNet.Http/BufferingHelper.cs | 8 +- .../DefaultHttpResponse.cs | 10 +++ .../Features/FormFeature.cs | 15 +++- .../Features/QueryFeature.cs | 21 +++++- .../Features/RequestCookiesFeature.cs | 17 ++++- src/Microsoft.AspNet.Http/FormCollection.cs | 18 ++++- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 8 +- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 55 ++++++++++++-- .../ReadableStringCollection.cs | 9 ++- .../ReferenceReadStream.cs | 8 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 22 +++++- src/Microsoft.AspNet.Http/project.json | 4 +- src/Microsoft.AspNet.Owin/project.json | 6 +- .../BufferedReadStream.cs | 8 +- .../FileBufferingReadStream.cs | 27 ++++++- .../FormReader.cs | 22 +++++- .../MultipartReader.cs | 15 +++- .../MultipartReaderStream.cs | 13 +++- .../QueryHelpers.cs | 46 ++++++++++-- .../WebEncoders.cs | 29 ++++++-- .../project.json | 4 +- .../project.json | 7 +- .../CodePointFilter.cs | 43 +++++++++-- .../HtmlEncoder.cs | 27 ++++++- .../IHtmlEncoder.cs | 6 +- .../IJavaScriptStringEncoder.cs | 6 +- .../IUrlEncoder.cs | 6 +- .../JavaScriptStringEncoder.cs | 27 ++++++- .../UrlEncoder.cs | 27 ++++++- .../project.json | 6 +- .../EncoderServiceCollectionExtensions.cs | 15 +++- .../project.json | 4 +- .../CookieHeaderValue.cs | 33 +++++++-- .../GenericHeaderParser.cs | 9 ++- .../SetCookieHeaderValue.cs | 15 +++- .../StringWithQualityHeaderValueComparer.cs | 15 +++- src/Microsoft.Net.Http.Headers/project.json | 6 +- .../MapPathMiddlewareTests.cs | 6 +- .../MapPredicateMiddlewareTests.cs | 17 ++--- .../DefaultAuthenticationManagerTests.cs | 1 - 73 files changed, 1035 insertions(+), 256 deletions(-) diff --git a/NuGet.config b/NuGet.config index 1707938c61..03704957e8 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,4 +1,4 @@ - + diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index 6ecc82e292..eee0e0ab1b 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -5,6 +5,9 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index e10e081717..a18fe99c97 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -1,11 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { @@ -13,10 +13,15 @@ namespace Microsoft.AspNet.Http.Authentication { public abstract IEnumerable GetAuthenticationSchemes(); - public abstract Task AuthenticateAsync([NotNull] AuthenticateContext context); + public abstract Task AuthenticateAsync(AuthenticateContext context); - public virtual async Task AuthenticateAsync([NotNull] string authenticationScheme) + public virtual async Task AuthenticateAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + var context = new AuthenticateContext(authenticationScheme); await AuthenticateAsync(context); return context.Principal; @@ -32,42 +37,77 @@ namespace Microsoft.AspNet.Http.Authentication return ChallengeAsync(authenticationScheme: string.Empty, properties: properties); } - public virtual Task ChallengeAsync([NotNull] string authenticationScheme) + public virtual Task ChallengeAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ChallengeAsync(authenticationScheme: authenticationScheme, properties: null); } // Leave it up to authentication handler to do the right thing for the challenge - public virtual Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + public virtual Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Automatic); } - public virtual Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal) + public virtual Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + return SignInAsync(authenticationScheme, principal, properties: null); } - public virtual Task ForbidAsync([NotNull] string authenticationScheme) + public virtual Task ForbidAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ForbidAsync(authenticationScheme, properties: null); } // Deny access (typically a 403) - public virtual Task ForbidAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + public virtual Task ForbidAsync(string authenticationScheme, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Forbidden); } - public abstract Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); + public abstract Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); - public abstract Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties); + public abstract Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); - public virtual Task SignOutAsync([NotNull] string authenticationScheme) + public virtual Task SignOutAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return SignOutAsync(authenticationScheme, properties: null); } - public abstract Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties); + public abstract Task SignOutAsync(string authenticationScheme, AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs index 896a6a11b4..953cd7ce6e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs @@ -5,7 +5,6 @@ using System; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -21,8 +20,18 @@ namespace Microsoft.AspNet.Http /// /// /// - public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) + public static Task WriteAsync(this HttpResponse response, string text, CancellationToken cancellationToken = default(CancellationToken)) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + return response.WriteAsync(text, Encoding.UTF8, cancellationToken); } @@ -34,8 +43,23 @@ namespace Microsoft.AspNet.Http /// /// /// - public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) + public static Task WriteAsync(this HttpResponse response, string text, Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + byte[] data = encoding.GetBytes(text); return response.Body.WriteAsync(data, 0, data.Length, cancellationToken); } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 3af199d519..94985df589 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -4,7 +4,6 @@ using System; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { @@ -18,8 +17,18 @@ namespace Microsoft.AspNet.Builder /// The path to match /// The branch to take for positive path matches /// - public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, PathString pathMatch, [NotNull] Action configuration) + public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action configuration) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + if (configuration == null) + { + throw new ArgumentNullException(nameof(configuration)); + } + if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) { throw new ArgumentException("The path must not end with a '/'", nameof(pathMatch)); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index 569938516d..f35e0a5480 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -12,14 +12,29 @@ namespace Microsoft.AspNet.Builder.Extensions private readonly RequestDelegate _next; private readonly MapOptions _options; - public MapMiddleware([NotNull] RequestDelegate next, [NotNull] MapOptions options) + public MapMiddleware(RequestDelegate next, MapOptions options) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + _next = next; _options = options; } - public async Task Invoke([NotNull] HttpContext context) + public async Task Invoke(HttpContext context) { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + PathString path = context.Request.Path; PathString remainingPath; if (path.StartsWithSegments(_options.PathMatch, out remainingPath)) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs index e3ac00274f..cabe45094d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; -using Microsoft.Framework.Internal; + namespace Microsoft.AspNet.Builder { @@ -23,8 +22,23 @@ namespace Microsoft.AspNet.Builder /// Invoked with the request environment to determine if the branch should be taken /// Configures a branch to take /// - public static IApplicationBuilder MapWhen([NotNull] this IApplicationBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) + public static IApplicationBuilder MapWhen(this IApplicationBuilder app, Predicate predicate, Action configuration) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + if (predicate == null) + { + throw new ArgumentNullException(nameof(predicate)); + } + + if (configuration == null) + { + throw new ArgumentNullException(nameof(configuration)); + } + // create branch var branchBuilder = app.New(); configuration(branchBuilder); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs index 09024a11db..b1ac27f800 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -12,14 +12,29 @@ namespace Microsoft.AspNet.Builder.Extensions private readonly RequestDelegate _next; private readonly MapWhenOptions _options; - public MapWhenMiddleware([NotNull] RequestDelegate next, [NotNull] MapWhenOptions options) + public MapWhenMiddleware(RequestDelegate next, MapWhenOptions options) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + _next = next; _options = options; } - public async Task Invoke([NotNull] HttpContext context) + public async Task Invoke(HttpContext context) { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + if (_options.Predicate(context)) { await _options.Branch(context); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs index dead7f4de8..aa6263366e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -13,14 +11,26 @@ namespace Microsoft.AspNet.Builder.Extensions /// public class MapWhenOptions { + private Func _predicate; + /// /// The user callback that determines if the branch should be taken /// public Func Predicate { - get; - [param: NotNull] - set; + get + { + return _predicate; + } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + _predicate = value; + } } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index b87b2797e3..d79949c5c8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -2,16 +2,23 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { public static class RunExtensions { - public static void Run([NotNull] this IApplicationBuilder app, [NotNull] RequestDelegate handler) + public static void Run(this IApplicationBuilder app, RequestDelegate handler) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + if (handler == null) + { + throw new ArgumentNullException(nameof(handler)); + } + app.Use(_ => handler); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 794b800b63..87b22df243 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -91,8 +90,13 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting FragmentString - public static FragmentString FromUriComponent([NotNull] Uri uri) + public static FragmentString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index 15af914718..59fb4f233d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -4,7 +4,6 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -135,8 +134,13 @@ namespace Microsoft.AspNet.Http /// /// /// - public static HostString FromUriComponent([NotNull] Uri uri) + public static HostString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + return new HostString(uri.GetComponents( UriComponents.NormalizedHost | // Always convert punycode to Unicode. UriComponents.HostAndPort, UriFormat.Unescaped)); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 22c4daae06..195ef02330 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -33,15 +32,15 @@ namespace Microsoft.AspNet.Http public abstract bool HasStarted { get; } - public abstract void OnStarting([NotNull] Func callback, object state); + public abstract void OnStarting(Func callback, object state); - public virtual void OnStarting([NotNull] Func callback) => OnStarting(_callbackDelegate, callback); + public virtual void OnStarting(Func callback) => OnStarting(_callbackDelegate, callback); - public abstract void OnCompleted([NotNull] Func callback, object state); + public abstract void OnCompleted(Func callback, object state); - public virtual void RegisterForDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + public virtual void RegisterForDispose(IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); - public virtual void OnCompleted([NotNull] Func callback) => OnCompleted(_callbackDelegate, callback); + public virtual void OnCompleted(Func callback) => OnCompleted(_callbackDelegate, callback); public virtual void Redirect(string location) => Redirect(location, permanent: false); diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 62cfd74bd6..be6422063f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,7 +3,6 @@ using System; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http @@ -88,8 +87,13 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting PathString - public static PathString FromUriComponent([NotNull] Uri uri) + public static PathString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + // REVIEW: what is the exactly correct thing to do? return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); } @@ -128,8 +132,8 @@ namespace Microsoft.AspNet.Http /// The combined PathString value public PathString Add(PathString other) { - if (HasValue && - other.HasValue && + if (HasValue && + other.HasValue && Value[Value.Length - 1] == '/') { // If the path string has a trailing slash and the other string has a leading slash, we need diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 2844c90213..ed59879585 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; @@ -97,8 +96,13 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting QueryString - public static QueryString FromUriComponent([NotNull] Uri uri) + public static QueryString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + string queryValue = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(queryValue)) { diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index da09379110..3ae66b0aba 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -5,10 +5,12 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index e83402f101..7b13bc2ac3 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -21,8 +21,13 @@ namespace Microsoft.AspNet.Http /// /// The . /// The name of the file to create. - public static void SaveAs([NotNull] this IFormFile formFile, string filename) + public static void SaveAs(this IFormFile formFile, string filename) { + if (formFile == null) + { + throw new ArgumentNullException(nameof(formFile)); + } + using (var fileStream = new FileStream(filename, FileMode.Create)) { var inputStream = formFile.OpenReadStream(); @@ -35,10 +40,15 @@ namespace Microsoft.AspNet.Http /// /// The . /// The name of the file to create. - public async static Task SaveAsAsync([NotNull] this IFormFile formFile, + public async static Task SaveAsAsync(this IFormFile formFile, string filename, CancellationToken cancellationToken = default(CancellationToken)) { + if (formFile == null) + { + throw new ArgumentNullException(nameof(formFile)); + } + using (var fileStream = new FileStream(filename, FileMode.Create)) { var inputStream = formFile.OpenReadStream(); diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 803a0a5080..78bafd33bc 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -26,13 +25,33 @@ namespace Microsoft.AspNet.Http // These are all shared helpers used by both RequestHeaders and ResponseHeaders - internal static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) + internal static DateTimeOffset? GetDate(this IHeaderDictionary headers, string name) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + return headers.Get(name); } - internal static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) + internal static void Set(this IHeaderDictionary headers, string name, object value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value == null) { headers.Remove(name); @@ -43,8 +62,18 @@ namespace Microsoft.AspNet.Http } } - internal static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) + internal static void SetList(this IHeaderDictionary headers, string name, IList values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (values == null || values.Count == 0) { headers.Remove(name); @@ -55,8 +84,18 @@ namespace Microsoft.AspNet.Http } } - internal static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) + internal static void SetDate(this IHeaderDictionary headers, string name, DateTimeOffset? value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value.HasValue) { headers[name] = HeaderUtilities.FormatDate(value.Value); @@ -89,8 +128,13 @@ namespace Microsoft.AspNet.Http { typeof(SetCookieHeaderValue), new Func, IList>(value => { IList result; return SetCookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, }; - internal static T Get([NotNull] this IHeaderDictionary headers, string name) + internal static T Get(this IHeaderDictionary headers, string name) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + object temp; if (KnownParsers.TryGetValue(typeof(T), out temp)) { @@ -107,8 +151,13 @@ namespace Microsoft.AspNet.Http return GetViaReflection(value); } - internal static IList GetList([NotNull] this IHeaderDictionary headers, string name) + internal static IList GetList(this IHeaderDictionary headers, string name) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + object temp; if (KnownListParsers.TryGetValue(typeof(T), out temp)) { @@ -169,11 +218,11 @@ namespace Microsoft.AspNet.Http if (string.Equals("TryParseList", methodInfo.Name, StringComparison.Ordinal) && methodInfo.ReturnParameter.ParameterType.Equals(typeof(Boolean))) { - var methodParams = methodInfo.GetParameters(); - return methodParams.Length == 2 - && methodParams[0].ParameterType.Equals(typeof(IList)) - && methodParams[1].IsOut - && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); + var methodParams = methodInfo.GetParameters(); + return methodParams.Length == 2 + && methodParams[0].ParameterType.Equals(typeof(IList)) + && methodParams[1].IsOut + && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); } return false; }).FirstOrDefault(); diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index 85e51f3782..d3bfe5f4cf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Primitives; diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index 0959adbca0..93a5bfc631 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -2,10 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -35,14 +33,24 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IDictionary headers, string key) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + StringValues values; return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + public static void SetHeaderJoined(IDictionary headers, string key, StringValues value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); @@ -89,8 +97,13 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) + public static void SetHeaderUnmodified(IDictionary headers, string key, StringValues? values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); @@ -105,8 +118,18 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (values == null || values.Length == 0) { return; @@ -123,8 +146,18 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) + public static void AppendHeaderUnmodified(IDictionary headers, string key, StringValues values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (values.Count == 0) { return; diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs index 2b7fa93020..83c998421d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs @@ -1,5 +1,4 @@ using System; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Internal { @@ -80,8 +79,13 @@ namespace Microsoft.AspNet.Http.Internal return !left.Equals(right); } - public bool StartsWith([NotNull] string text, StringComparison comparisonType) + public bool StartsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -91,8 +95,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; } - public bool EndsWith([NotNull] string text, StringComparison comparisonType) + public bool EndsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -102,8 +111,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; } - public bool Equals([NotNull] string text, StringComparison comparisonType) + public bool Equals(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count != textLength) { diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index c718ada981..efaa73fc14 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -4,15 +4,19 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers { public class RequestHeaders { - public RequestHeaders([NotNull] IHeaderDictionary headers) + public RequestHeaders(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + Headers = headers; } @@ -268,23 +272,53 @@ namespace Microsoft.AspNet.Http.Headers return Headers.GetList(name); } - public void Set([NotNull] string name, object value) + public void Set(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.Set(name, value); } - public void SetList([NotNull] string name, IList values) + public void SetList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.SetList(name, values); } - public void Append([NotNull] string name, [NotNull] object value) + public void Append(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Headers.Append(name, value.ToString()); } - public void AppendList([NotNull] string name, [NotNull] IList values) + public void AppendList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (values == null) + { + throw new ArgumentNullException(nameof(values)); + } + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 7ee2bb79a5..de719d58ec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -5,15 +5,19 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Extensions; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers { public class ResponseHeaders { - public ResponseHeaders([NotNull] IHeaderDictionary headers) + public ResponseHeaders(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + Headers = headers; } @@ -165,23 +169,53 @@ namespace Microsoft.AspNet.Http.Headers return Headers.GetList(name); } - public void Set([NotNull] string name, object value) + public void Set(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.Set(name, value); } - public void SetList([NotNull] string name, IList values) + public void SetList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.SetList(name, values); } - public void Append([NotNull] string name, [NotNull] object value) + public void Append(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Headers.Append(name, value.ToString()); } - public void AppendList([NotNull] string name, [NotNull] IList values) + public void AppendList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (values == null) + { + throw new ArgumentNullException(nameof(values)); + } + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index b60f1acad9..680c77e62c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -6,7 +6,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Extensions; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -20,8 +19,13 @@ namespace Microsoft.AspNet.Http /// /// /// True if sendfile feature exists in the response. - public static bool SupportsSendFile([NotNull] this HttpResponse response) + public static bool SupportsSendFile(this HttpResponse response) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + return response.HttpContext.Features.Get() != null; } @@ -31,8 +35,18 @@ namespace Microsoft.AspNet.Http /// /// /// - public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName) + public static Task SendFileAsync(this HttpResponse response, string fileName) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (fileName == null) + { + throw new ArgumentNullException(nameof(fileName)); + } + return response.SendFileAsync(fileName, 0, null, CancellationToken.None); } @@ -45,8 +59,18 @@ namespace Microsoft.AspNet.Http /// The number of types to send, or null to send the remainder of the file. /// /// - public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken) + public static Task SendFileAsync(this HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (fileName == null) + { + throw new ArgumentNullException(nameof(fileName)); + } + var sendFile = response.HttpContext.Features.Get(); if (sendFile == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 767da562d9..4ef0842096 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,9 +5,11 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, - "dependencies": { + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index a259ce8489..c3ef43c071 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -1,16 +1,21 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class AuthenticateContext { - public AuthenticateContext([NotNull] string authenticationScheme) + public AuthenticateContext(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + AuthenticationScheme = authenticationScheme; } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index 5dfcd16914..d632a5722e 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -3,18 +3,23 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class ChallengeContext { - public ChallengeContext([NotNull] string authenticationScheme) : this(authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) + public ChallengeContext(string authenticationScheme) + : this(authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) { } - public ChallengeContext([NotNull] string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) + public ChallengeContext(string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); Behavior = behavior; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index 0eade92638..f4bdef8dcb 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -4,14 +4,23 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class SignInContext { - public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary properties) + public SignInContext(string authenticationScheme, ClaimsPrincipal principal, IDictionary properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + AuthenticationScheme = authenticationScheme; Principal = principal; Properties = properties ?? new Dictionary(StringComparer.Ordinal); diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index d260afea84..ba27794c3e 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -3,14 +3,18 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class SignOutContext { - public SignOutContext([NotNull] string authenticationScheme, IDictionary properties) + public SignOutContext(string authenticationScheme, IDictionary properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); } diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 16b4d6fb44..25c86d06a9 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -5,13 +5,12 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { public class FeatureCollection : IFeatureCollection { - private static KeyComparer FeatureKeyComparer = new FeatureCollection.KeyComparer(); + private static KeyComparer FeatureKeyComparer = new KeyComparer(); private readonly IFeatureCollection _defaults; private IDictionary _features; private volatile int _containerRevision; @@ -32,15 +31,25 @@ namespace Microsoft.AspNet.Http.Features public bool IsReadOnly { get { return false; } } - public object this[[NotNull] Type key] + public object this[Type key] { get { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + object result; return _features != null && _features.TryGetValue(key, out result) ? result : _defaults?[key]; } set { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (value == null) { if (_features != null && _features.Remove(key)) diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index ba612b10c6..59741d9394 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { @@ -24,6 +23,6 @@ namespace Microsoft.AspNet.Http.Features /// /// /// The requested feature, or null if it is not present. - object this[[NotNull] Type key] { get; set; } + object this[Type key] { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index b2b95c92a0..51e3cada2f 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -5,11 +5,10 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { - "type": "build", - "version": "1.0.0-*" - }, "Microsoft.Framework.Primitives": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 821a67395a..4dcb81916c 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -9,7 +9,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication.Internal { @@ -47,8 +46,13 @@ namespace Microsoft.AspNet.Http.Authentication.Internal return describeContext.Results.Select(description => new AuthenticationDescription(description)); } - public override async Task AuthenticateAsync([NotNull] AuthenticateContext context) + public override async Task AuthenticateAsync(AuthenticateContext context) { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + var handler = HttpAuthenticationFeature.Handler; if (handler != null) @@ -62,8 +66,13 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override async Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) + public override async Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + var handler = HttpAuthenticationFeature.Handler; var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items, behavior); @@ -78,8 +87,18 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override async Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + public override async Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(authenticationScheme, principal, properties?.Items); @@ -94,8 +113,13 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override async Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + public override async Task SignOutAsync(string authenticationScheme, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationScheme, properties?.Items); diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 47b08915c4..e56d73e5cf 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -4,7 +4,6 @@ using System; using System.IO; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Internal { @@ -39,8 +38,13 @@ namespace Microsoft.AspNet.Http.Internal } } - public static HttpRequest EnableRewind([NotNull] this HttpRequest request, int bufferThreshold = DefaultBufferThreshold) + public static HttpRequest EnableRewind(this HttpRequest request, int bufferThreshold = DefaultBufferThreshold) { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + var body = request.Body; if (!body.CanSeek) { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index b47279bfd8..e5f09f7ca2 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -95,11 +95,21 @@ namespace Microsoft.AspNet.Http.Internal public override void OnStarting(Func callback, object state) { + if (callback == null) + { + throw new ArgumentNullException(nameof(callback)); + } + HttpResponseFeature.OnStarting(callback, state); } public override void OnCompleted(Func callback, object state) { + if (callback == null) + { + throw new ArgumentNullException(nameof(callback)); + } + HttpResponseFeature.OnCompleted(callback, state); } diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index 48819224dd..6d6ff1d012 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -9,7 +9,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -19,13 +18,23 @@ namespace Microsoft.AspNet.Http.Features.Internal { private readonly HttpRequest _request; - public FormFeature([NotNull] IFormCollection form) + public FormFeature(IFormCollection form) { + if (form == null) + { + throw new ArgumentNullException(nameof(form)); + } + Form = form; } - public FormFeature([NotNull] HttpRequest request) + public FormFeature(HttpRequest request) { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + _request = request; } diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 39c842b83e..5dd7ca9163 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal @@ -18,18 +17,32 @@ namespace Microsoft.AspNet.Http.Features.Internal private string _original; private IReadableStringCollection _parsedValues; - public QueryFeature([NotNull] IDictionary query) + public QueryFeature(IDictionary query) : this(new ReadableStringCollection(query)) { + if (query == null) + { + throw new ArgumentNullException(nameof(query)); + } } - public QueryFeature([NotNull] IReadableStringCollection query) + public QueryFeature(IReadableStringCollection query) { + if (query == null) + { + throw new ArgumentNullException(nameof(query)); + } + _parsedValues = query; } - public QueryFeature([NotNull] IFeatureCollection features) + public QueryFeature(IFeatureCollection features) { + if (features == null) + { + throw new ArgumentNullException(nameof(features)); + } + _features = features; } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index cc0a9df3ed..0eb44ef102 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -19,18 +18,28 @@ namespace Microsoft.AspNet.Http.Features.Internal private StringValues _original; private IReadableStringCollection _parsedValues; - public RequestCookiesFeature([NotNull] IDictionary cookies) + public RequestCookiesFeature(IDictionary cookies) : this(new ReadableStringCollection(cookies)) { } - public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) + public RequestCookiesFeature(IReadableStringCollection cookies) { + if (cookies == null) + { + throw new ArgumentNullException(nameof(cookies)); + } + _parsedValues = cookies; } - public RequestCookiesFeature([NotNull] IFeatureCollection features) + public RequestCookiesFeature(IFeatureCollection features) { + if (features == null) + { + throw new ArgumentNullException(nameof(features)); + } + _features = features; } diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index 15de4dee62..550ad933eb 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -1,8 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -12,17 +12,27 @@ namespace Microsoft.AspNet.Http.Internal /// public class FormCollection : ReadableStringCollection, IFormCollection { - public FormCollection([NotNull] IDictionary store) + public FormCollection(IDictionary store) : this(store, new FormFileCollection()) { } - public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) + public FormCollection(IDictionary store, IFormFileCollection files) : base(store) { + if (store == null) + { + throw new ArgumentNullException(nameof(store)); + } + + if (files == null) + { + throw new ArgumentNullException(nameof(files)); + } + Files = files; } - public IFormFileCollection Files { get; private set; } + public IFormFileCollection Files { get; } } } diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 05d5d7fdf4..20b520b783 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -4,7 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -22,8 +21,13 @@ namespace Microsoft.AspNet.Http.Internal /// Initializes a new instance of the class. /// /// The underlying data store. - public HeaderDictionary([NotNull] IDictionary store) + public HeaderDictionary(IDictionary store) { + if (store == null) + { + throw new ArgumentNullException(nameof(store)); + } + Store = store; } diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 54455b90b3..6bf5a57ae6 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -6,7 +6,6 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -444,8 +443,13 @@ namespace Microsoft.AspNet.Http.Internal #endregion - public bool StartsWith([NotNull] string text, StringComparison comparisonType) + public bool StartsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -455,8 +459,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; } - public bool EndsWith([NotNull] string text, StringComparison comparisonType) + public bool EndsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -466,8 +475,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; } - public bool Equals([NotNull] string text, StringComparison comparisonType) + public bool Equals(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count != textLength) { @@ -518,14 +532,29 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IDictionary headers, string key) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + StringValues values; return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + public static void SetHeader(IDictionary headers, string key, StringValues value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); @@ -554,8 +583,13 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static long? GetContentLength([NotNull] IHeaderDictionary headers) + public static long? GetContentLength(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; var rawValue = headers[HeaderNames.ContentLength]; @@ -569,8 +603,13 @@ namespace Microsoft.AspNet.Http.Internal return null; } - public static void SetContentLength([NotNull] IHeaderDictionary headers, long? value) + public static void SetContentLength(IHeaderDictionary headers, long? value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + if (value.HasValue) { headers[HeaderNames.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs index 962804b723..c1ed5d910e 100644 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -19,8 +19,13 @@ namespace Microsoft.AspNet.Http.Internal /// Create a new wrapper /// /// - public ReadableStringCollection([NotNull] IDictionary store) + public ReadableStringCollection(IDictionary store) { + if (store == null) + { + throw new ArgumentNullException(nameof(store)); + } + Store = store; } diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 87f2959eef..509a6e44cd 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -5,7 +5,6 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Internal { @@ -21,8 +20,13 @@ namespace Microsoft.AspNet.Http.Internal private bool _disposed; - public ReferenceReadStream([NotNull] Stream inner, long offset, long length) + public ReferenceReadStream(Stream inner, long offset, long length) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + _inner = inner; _innerOffset = offset; _length = length; diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index 7ead5dcc91..c4db554c47 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -3,7 +3,6 @@ using System; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; @@ -19,8 +18,13 @@ namespace Microsoft.AspNet.Http.Internal /// Create a new wrapper /// /// - public ResponseCookies([NotNull] IHeaderDictionary headers) + public ResponseCookies(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + Headers = headers; } @@ -49,8 +53,13 @@ namespace Microsoft.AspNet.Http.Internal /// /// /// - public void Append(string key, string value, [NotNull] CookieOptions options) + public void Append(string key, string value, CookieOptions options) { + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + var setCookieHeaderValue = new SetCookieHeaderValue( UrlEncoder.Default.UrlEncode(key), UrlEncoder.Default.UrlEncode(value)) @@ -91,8 +100,13 @@ namespace Microsoft.AspNet.Http.Internal /// /// /// - public void Delete(string key, [NotNull] CookieOptions options) + public void Delete(string key, CookieOptions options) { + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 53e3ece572..27cb110745 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -5,10 +5,12 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 7a496619ae..a20dd5ccff 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -5,9 +5,11 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } + "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 94bb03efce..88e2782938 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -6,7 +6,6 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -21,8 +20,13 @@ namespace Microsoft.AspNet.WebUtilities private int _bufferCount = 0; private bool _disposed; - public BufferedReadStream([NotNull] Stream inner, int bufferSize) + public BufferedReadStream(Stream inner, int bufferSize) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + _inner = inner; _buffer = new byte[bufferSize]; } diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 9bed427578..3341b65857 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -30,18 +29,38 @@ namespace Microsoft.AspNet.WebUtilities // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? public FileBufferingReadStream( - [NotNull] Stream inner, + Stream inner, int memoryThreshold, - [NotNull] Func tempFileDirectoryAccessor) + Func tempFileDirectoryAccessor) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + + if (tempFileDirectoryAccessor == null) + { + throw new ArgumentNullException(nameof(tempFileDirectoryAccessor)); + } + _inner = inner; _memoryThreshold = memoryThreshold; _tempFileDirectoryAccessor = tempFileDirectoryAccessor; } // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? - public FileBufferingReadStream([NotNull] Stream inner, int memoryThreshold, [NotNull] string tempFileDirectory) + public FileBufferingReadStream(Stream inner, int memoryThreshold, string tempFileDirectory) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + + if (tempFileDirectory == null) + { + throw new ArgumentNullException(nameof(tempFileDirectory)); + } + _inner = inner; _memoryThreshold = memoryThreshold; _tempFileDirectory = tempFileDirectory; diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index e475522646..d4e36264de 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -7,7 +7,6 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities @@ -23,13 +22,28 @@ namespace Microsoft.AspNet.WebUtilities private int _bufferOffset; private int _bufferCount; - public FormReader([NotNull] string data) + public FormReader(string data) { + if (data == null) + { + throw new ArgumentNullException(nameof(data)); + } + _reader = new StringReader(data); } - public FormReader([NotNull] Stream stream, [NotNull] Encoding encoding) + public FormReader(Stream stream, Encoding encoding) { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + _reader = new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); } @@ -160,7 +174,7 @@ namespace Microsoft.AspNet.WebUtilities while (pair.HasValue) { accumulator.Append(pair.Value.Key, pair.Value.Value); - pair = reader.ReadNextPair(); + pair = reader.ReadNextPair(); } return accumulator.GetResults(); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 631908173b..8c87e5db52 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -7,7 +7,6 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities @@ -21,13 +20,23 @@ namespace Microsoft.AspNet.WebUtilities private readonly string _boundary; private MultipartReaderStream _currentStream; - public MultipartReader([NotNull] string boundary, [NotNull] Stream stream) + public MultipartReader(string boundary, Stream stream) : this(boundary, stream, DefaultBufferSize) { } - public MultipartReader([NotNull] string boundary, [NotNull] Stream stream, int bufferSize) + public MultipartReader(string boundary, Stream stream, int bufferSize) { + if (boundary == null) + { + throw new ArgumentNullException(nameof(boundary)); + } + + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + if (bufferSize < boundary.Length + 8) // Size of the boundary + leading and trailing CRLF + leading and trailing '--' markers. { throw new ArgumentOutOfRangeException(nameof(bufferSize), bufferSize, "Insufficient buffer space, the buffer must be larger than the boundary: " + boundary); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 5e3059280d..9350233c83 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -7,7 +7,6 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -26,8 +25,18 @@ namespace Microsoft.AspNet.WebUtilities /// /// /// - public MultipartReaderStream([NotNull] BufferedReadStream stream, [NotNull] string boundary, bool expectLeadingCrlf = true) + public MultipartReaderStream(BufferedReadStream stream, string boundary, bool expectLeadingCrlf = true) { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (boundary == null) + { + throw new ArgumentNullException(nameof(boundary)); + } + _innerStream = stream; _innerOffset = _innerStream.CanSeek ? _innerStream.Position : 0; if (expectLeadingCrlf) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 13cd1f4051..17022d0b2d 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; @@ -19,10 +18,25 @@ namespace Microsoft.AspNet.WebUtilities /// The name of the query key. /// The query value. /// The combined result. - public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) + public static string AddQueryString(string uri, string name, string value) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + return AddQueryString( - uri, new [] { new KeyValuePair(name, value) }); + uri, new[] { new KeyValuePair(name, value) }); } /// @@ -31,15 +45,35 @@ namespace Microsoft.AspNet.WebUtilities /// The base uri. /// A collection of name value query pairs to append. /// The combined result. - public static string AddQueryString([NotNull] string uri, [NotNull] IDictionary queryString) + public static string AddQueryString(string uri, IDictionary queryString) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + + if (queryString == null) + { + throw new ArgumentNullException(nameof(queryString)); + } + return AddQueryString(uri, (IEnumerable>)queryString); } private static string AddQueryString( - [NotNull] string uri, - [NotNull] IEnumerable> queryString) + string uri, + IEnumerable> queryString) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + + if (queryString == null) + { + throw new ArgumentNullException(nameof(queryString)); + } + var anchorIndex = uri.IndexOf('#'); var uriToBeAppended = uri; var anchorText = ""; diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index 132f106e07..751ad43c21 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -3,7 +3,6 @@ using System; using System.Diagnostics; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -21,8 +20,13 @@ namespace Microsoft.AspNet.WebUtilities /// The input must not contain any whitespace or padding characters. /// Throws FormatException if the input is malformed. /// - public static byte[] Base64UrlDecode([NotNull] string input) + public static byte[] Base64UrlDecode(string input) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + return Base64UrlDecode(input, 0, input.Length); } @@ -37,8 +41,13 @@ namespace Microsoft.AspNet.WebUtilities /// The input must not contain any whitespace or padding characters. /// Throws FormatException if the input is malformed. /// - public static byte[] Base64UrlDecode([NotNull] string input, int offset, int count) + public static byte[] Base64UrlDecode(string input, int offset, int count) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + ValidateParameters(input.Length, offset, count); // Special-case empty input @@ -83,8 +92,13 @@ namespace Microsoft.AspNet.WebUtilities /// /// The binary input to encode. /// The base64url-encoded form of the input. - public static string Base64UrlEncode([NotNull] byte[] input) + public static string Base64UrlEncode(byte[] input) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + return Base64UrlEncode(input, 0, input.Length); } @@ -95,8 +109,13 @@ namespace Microsoft.AspNet.WebUtilities /// The offset into at which to begin encoding. /// The number of bytes of to encode. /// The base64url-encoded form of the input. - public static string Base64UrlEncode([NotNull] byte[] input, int offset, int count) + public static string Base64UrlEncode(byte[] input, int offset, int count) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + ValidateParameters(input.Length, offset, count); // Special-case empty input diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 4aa7a07c04..621e8c5954 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -5,8 +5,10 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.Primitives": "1.0.0-*", "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json index c504f822d2..4957eeb224 100644 --- a/src/Microsoft.Framework.Primitives/project.json +++ b/src/Microsoft.Framework.Primitives/project.json @@ -5,11 +5,8 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { - "type": "build", - "version": "1.0.0-*" - } + "compilationOptions": { + "warningsAsErrors": true }, "frameworks": { "net451": { }, diff --git a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs index a5d5b21c3a..8858c2df17 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -25,8 +24,13 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates the filter by cloning the allow list of another . /// - public CodePointFilter([NotNull] ICodePointFilter other) + public CodePointFilter(ICodePointFilter other) { + if (other == null) + { + throw new ArgumentNullException(nameof(other)); + } + CodePointFilter otherAsCodePointFilter = other as CodePointFilter; if (otherAsCodePointFilter != null) { @@ -85,8 +89,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter AllowChars([NotNull] string chars) + public CodePointFilter AllowChars(string chars) { + if (chars == null) + { + throw new ArgumentNullException(nameof(chars)); + } + for (int i = 0; i < chars.Length; i++) { _allowedCharsBitmap.AllowCharacter(chars[i]); @@ -100,8 +109,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter AllowFilter([NotNull] ICodePointFilter filter) + public CodePointFilter AllowFilter(ICodePointFilter filter) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } + foreach (var allowedCodePoint in filter.GetAllowedCodePoints()) { // If the code point can't be represented as a BMP character, skip it. @@ -120,8 +134,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter AllowRange([NotNull] UnicodeRange range) + public CodePointFilter AllowRange(UnicodeRange range) { + if (range == null) + { + throw new ArgumentNullException(nameof(range)); + } + int firstCodePoint = range.FirstCodePoint; int rangeSize = range.RangeSize; for (int i = 0; i < rangeSize; i++) @@ -197,8 +216,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter ForbidChars([NotNull] string chars) + public CodePointFilter ForbidChars(string chars) { + if (chars == null) + { + throw new ArgumentNullException(nameof(chars)); + } + for (int i = 0; i < chars.Length; i++) { _allowedCharsBitmap.ForbidCharacter(chars[i]); @@ -212,8 +236,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter ForbidRange([NotNull] UnicodeRange range) + public CodePointFilter ForbidRange(UnicodeRange range) { + if (range == null) + { + throw new ArgumentNullException(nameof(range)); + } + int firstCodePoint = range.FirstCodePoint; int rangeSize = range.RangeSize; for (int i = 0; i < rangeSize; i++) diff --git a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs index 68b492f55a..5a0553e782 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -51,9 +50,13 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public HtmlEncoder([NotNull] ICodePointFilter filter) + public HtmlEncoder(ICodePointFilter filter) : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } } private HtmlEncoder(HtmlUnicodeEncoder innerEncoder) @@ -97,6 +100,16 @@ namespace Microsoft.Framework.WebEncoders /// public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } @@ -113,6 +126,16 @@ namespace Microsoft.Framework.WebEncoders /// public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } diff --git a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs index 16e4ff5f05..f7c6adb064 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -20,7 +18,7 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// - void HtmlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output); /// /// HTML-encodes a given input string. @@ -42,6 +40,6 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// - void HtmlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); + void HtmlEncode(string value, int startIndex, int charCount, TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs index e88aafce79..19b7d843e2 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -19,7 +17,7 @@ namespace Microsoft.Framework.WebEncoders /// /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. /// - void JavaScriptStringEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output); /// /// JavaScript-escapes a given input string. @@ -37,6 +35,6 @@ namespace Microsoft.Framework.WebEncoders /// /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. /// - void JavaScriptStringEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); + void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs index 9b38b6a65e..edcaaffea8 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -20,7 +18,7 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// - void UrlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output); /// /// URL-escapes a given input string. @@ -41,6 +39,6 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// - void UrlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); + void UrlEncode(string value, int startIndex, int charCount, TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs index 71e8a68246..6328bdebc1 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -51,9 +50,13 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public JavaScriptStringEncoder([NotNull] ICodePointFilter filter) + public JavaScriptStringEncoder(ICodePointFilter filter) : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } } private JavaScriptStringEncoder(JavaScriptStringUnicodeEncoder innerEncoder) @@ -97,6 +100,16 @@ namespace Microsoft.Framework.WebEncoders /// public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } @@ -113,6 +126,16 @@ namespace Microsoft.Framework.WebEncoders /// public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index 0e0de56c7a..e15096659f 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -51,9 +50,13 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public UrlEncoder([NotNull] ICodePointFilter filter) + public UrlEncoder(ICodePointFilter filter) : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } } private UrlEncoder(UrlUnicodeEncoder innerEncoder) @@ -97,6 +100,16 @@ namespace Microsoft.Framework.WebEncoders /// public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } @@ -113,6 +126,16 @@ namespace Microsoft.Framework.WebEncoders /// public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index b2ad614378..54dbd1c28e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -6,10 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "allowUnsafe": true - }, - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } + "allowUnsafe": true, + "warningsAsErrors": true }, "frameworks": { "net45": { }, diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 48e0e94c98..13505165d8 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -3,7 +3,6 @@ using System; using Microsoft.Framework.DependencyInjection.Extensions; -using Microsoft.Framework.Internal; using Microsoft.Framework.OptionsModel; using Microsoft.Framework.WebEncoders; @@ -11,13 +10,23 @@ namespace Microsoft.Framework.DependencyInjection { public static class EncoderServiceCollectionExtensions { - public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services) + public static IServiceCollection AddWebEncoders(this IServiceCollection services) { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + return AddWebEncoders(services, configureOptions: null); } - public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, Action configureOptions) + public static IServiceCollection AddWebEncoders(this IServiceCollection services, Action configureOptions) { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + services.AddOptions(); // Register the default encoders diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index d39cd992f4..d2a1c401fb 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,10 +5,12 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index 5006792814..e7e72d3ce5 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; -using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { @@ -23,13 +22,27 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public CookieHeaderValue([NotNull] string name) + public CookieHeaderValue(string name) : this(name, string.Empty) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } } - public CookieHeaderValue([NotNull] string name, [NotNull] string value) + public CookieHeaderValue(string name, string value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Name = name; Value = value; } @@ -219,16 +232,26 @@ namespace Microsoft.Net.Http.Headers return !(c == '"' || c == ',' || c == ';' || c == '\\'); } - internal static void CheckNameFormat([NotNull] string name, string parameterName) + internal static void CheckNameFormat(string name, string parameterName) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (HttpRuleParser.GetTokenLength(name, 0) != name.Length) { throw new ArgumentException("Invalid cookie name: " + name, parameterName); } } - internal static void CheckValueFormat([NotNull] string value, string parameterName) + internal static void CheckValueFormat(string value, string parameterName) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + string temp; if (GetCookieValueLength(value, 0, out temp) != value.Length) { diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs index 669ec464de..63f9b8aed0 100644 --- a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Internal; +using System; namespace Microsoft.Net.Http.Headers { @@ -11,9 +11,14 @@ namespace Microsoft.Net.Http.Headers private GetParsedValueLengthDelegate _getParsedValueLength; - internal GenericHeaderParser(bool supportsMultipleValues, [NotNull] GetParsedValueLengthDelegate getParsedValueLength) + internal GenericHeaderParser(bool supportsMultipleValues, GetParsedValueLengthDelegate getParsedValueLength) : base(supportsMultipleValues) { + if (getParsedValueLength == null) + { + throw new ArgumentNullException(nameof(getParsedValueLength)); + } + _getParsedValueLength = getParsedValueLength; } diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 52fdd46a36..92cf35a41f 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; -using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { @@ -33,13 +32,23 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public SetCookieHeaderValue([NotNull] string name) + public SetCookieHeaderValue(string name) : this(name, string.Empty) { } - public SetCookieHeaderValue([NotNull] string name, [NotNull] string value) + public SetCookieHeaderValue(string name, string value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Name = name; Value = value; } diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 37873c476c..2dfa0509ad 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { @@ -39,9 +38,19 @@ namespace Microsoft.Net.Http.Headers /// The first value to compare. /// The second value to compare /// The result of the comparison. - public int Compare([NotNull] StringWithQualityHeaderValue stringWithQuality1, - [NotNull] StringWithQualityHeaderValue stringWithQuality2) + public int Compare(StringWithQualityHeaderValue stringWithQuality1, + StringWithQualityHeaderValue stringWithQuality2) { + if (stringWithQuality1 == null) + { + throw new ArgumentNullException(nameof(stringWithQuality1)); + } + + if (stringWithQuality2 == null) + { + throw new ArgumentNullException(nameof(stringWithQuality2)); + } + var quality1 = stringWithQuality1.Quality ?? HeaderQuality.Match; var quality2 = stringWithQuality2.Quality ?? HeaderQuality.Match; var qualityDifference = quality1 - quality2; diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index ae39f93621..8bcba3ca6d 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,12 +1,12 @@ { "version": "1.0.0-*", - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } - }, "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "frameworks" : { "net45" : { }, "dnx451" : { }, diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index aaa4467fe9..03d885f7bc 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -43,10 +43,8 @@ namespace Microsoft.AspNet.Builder.Extensions var builder = new ApplicationBuilder(serviceProvider: null); var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapOptions(); - // TODO: [NotNull] Assert.Throws(() => builder.Map(null, ActionNotImplemented)); - // TODO: [NotNull] Assert.Throws(() => builder.Map("/foo", (Action)null)); - // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(null, noOptions)); - // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(noMiddleware, null)); + Assert.Throws(() => builder.Map("/foo", configuration: null)); + Assert.Throws(() => new MapMiddleware(noMiddleware, null)); } [Theory] diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 0fcc04c997..4ddf45220d 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -11,9 +11,7 @@ using Xunit; namespace Microsoft.AspNet.Builder.Extensions { - using AppFunc = Func, Task>; using Predicate = Func; - using PredicateAsync = Func>; public class MapPredicateMiddlewareTests { @@ -56,15 +54,12 @@ namespace Microsoft.AspNet.Builder.Extensions var builder = new ApplicationBuilder(serviceProvider: null); var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapWhenOptions(); - // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); - // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, (Action)null)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); - - // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(null, UseNotImplemented)); - // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(NotImplementedPredicateAsync, (Action)null)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); + Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, configuration: null)); + Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); } [Fact] diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index db7e1f7f36..a48e80ea03 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -24,7 +24,6 @@ namespace Microsoft.AspNet.Http.Authentication.Internal [Theory] [InlineData("")] - [InlineData(null)] [InlineData("Foo")] public async Task ChallengeWithNoAuthMiddlewareMayThrow(string scheme) { From ceded805f32e3aca0066182fd96bbf171bd40574 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 18 Sep 2015 15:17:41 -0700 Subject: [PATCH 388/846] Formatting fixes --- .../Authentication/AuthenticationDescription.cs | 2 +- .../Authentication/AuthenticationProperties.cs | 2 +- .../FormFileExtensions.cs | 7 ++++--- .../RequestHeaders.cs | 2 +- .../ResponseHeaders.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 6 ++++-- src/Microsoft.AspNet.Http/ItemsDictionary.cs | 2 +- .../CacheControlHeaderValue.cs | 7 +++++-- .../ContentRangeHeaderValue.cs | 12 ++++++++++-- src/Microsoft.Net.Http.Headers/HeaderUtilities.cs | 5 ++++- src/Microsoft.Net.Http.Headers/HttpRuleParser.cs | 14 ++++++++++---- .../MediaTypeHeaderValueComparer.cs | 5 +++-- .../NameValueHeaderValue.cs | 10 ++++++++-- .../RangeItemHeaderValue.cs | 6 ++++-- .../StringWithQualityHeaderValueComparer.cs | 5 +++-- .../ContentDispositionHeaderValueTest.cs | 6 +++--- 16 files changed, 63 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs index 0ee24024e5..d6f9bf08a7 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Http.Authentication /// /// Contains metadata about the authentication provider. /// - public IDictionary Items { get; private set; } + public IDictionary Items { get; } /// /// Gets or sets the name used to reference the authentication middleware instance. diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs index ab17713ab0..5c815ba37b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Http.Authentication /// /// State values about the authentication session. /// - public IDictionary Items { get; private set; } + public IDictionary Items { get; } /// /// Gets or sets whether the authentication session is persisted across multiple requests. diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index 7b13bc2ac3..fa68ae340a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -40,9 +40,10 @@ namespace Microsoft.AspNet.Http /// /// The . /// The name of the file to create. - public async static Task SaveAsAsync(this IFormFile formFile, - string filename, - CancellationToken cancellationToken = default(CancellationToken)) + public async static Task SaveAsAsync( + this IFormFile formFile, + string filename, + CancellationToken cancellationToken = default(CancellationToken)) { if (formFile == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index efaa73fc14..4b31e30615 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Http.Headers Headers = headers; } - public IHeaderDictionary Headers { get; private set; } + public IHeaderDictionary Headers { get; } public IList Accept { diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index de719d58ec..e7cb97ad3f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Http.Headers Headers = headers; } - public IHeaderDictionary Headers { get; private set; } + public IHeaderDictionary Headers { get; } public CacheControlHeaderValue CacheControl { diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 3e137acc2e..84143af242 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -18,7 +18,8 @@ namespace Microsoft.AspNet.Http.Extensions /// /// /// - public static string Encode(PathString pathBase = new PathString(), + public static string Encode( + PathString pathBase = new PathString(), PathString path = new PathString(), QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) @@ -38,7 +39,8 @@ namespace Microsoft.AspNet.Http.Extensions /// /// /// - public static string Encode(string scheme, + public static string Encode( + string scheme, HostString host, PathString pathBase = new PathString(), PathString path = new PathString(), diff --git a/src/Microsoft.AspNet.Http/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/ItemsDictionary.cs index e191516849..90e9cd3138 100644 --- a/src/Microsoft.AspNet.Http/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/ItemsDictionary.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Http.Internal Items = items; } - public IDictionary Items { get; private set; } + public IDictionary Items { get; } // Replace the indexer with one that returns null for missing values object IDictionary.this[object key] diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index c1940754ba..b8b6d2726c 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -390,7 +390,8 @@ namespace Microsoft.Net.Http.Headers return input.Length - startIndex; } - private static bool TrySetCacheControlValues(CacheControlHeaderValue cc, + private static bool TrySetCacheControlValues( + CacheControlHeaderValue cc, List nameValueList) { foreach (NameValueHeaderValue nameValue in nameValueList) @@ -477,7 +478,9 @@ namespace Microsoft.Net.Http.Headers return true; } - private static bool TrySetOptionalTokenList(NameValueHeaderValue nameValue, ref bool boolField, + private static bool TrySetOptionalTokenList( + NameValueHeaderValue nameValue, + ref bool boolField, ref ICollection destination) { Contract.Requires(nameValue != null); diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index 092bb83320..c24b42758a 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -340,8 +340,16 @@ namespace Microsoft.Net.Http.Headers return true; } - private static bool TryCreateContentRange(string input, string unit, int fromStartIndex, int fromLength, - int toStartIndex, int toLength, int lengthStartIndex, int lengthLength, out ContentRangeHeaderValue parsedValue) + private static bool TryCreateContentRange( + string input, + string unit, + int fromStartIndex, + int fromLength, + int toStartIndex, + int toLength, + int lengthStartIndex, + int lengthLength, + out ContentRangeHeaderValue parsedValue) { parsedValue = null; diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 630e02b93f..3885477aa1 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -163,7 +163,10 @@ namespace Microsoft.Net.Http.Headers return true; } - internal static int GetNextNonEmptyOrWhitespaceIndex(string input, int startIndex, bool skipEmptyValues, + internal static int GetNextNonEmptyOrWhitespaceIndex( + string input, + int startIndex, + bool skipEmptyValues, out bool separatorFound) { Contract.Requires(input != null); diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 188ffe1389..b1690e96fd 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -35,8 +35,8 @@ namespace Microsoft.Net.Http.Headers internal const char CR = '\r'; internal const char LF = '\n'; - internal const char SP = ' '; - internal const char Tab = '\t'; + internal const char SP = ' '; + internal const char Tab = '\t'; internal const int MaxInt64Digits = 19; internal const int MaxInt32Digits = 10; @@ -263,8 +263,14 @@ namespace Microsoft.Net.Http.Headers // "(((((comment)))))". If we wouldn't define a limit an attacker could send a comment with hundreds of nested // comments, resulting in a stack overflow exception. In addition having more than 1 nested comment (if any) // is unusual. - private static HttpParseResult GetExpressionLength(string input, int startIndex, char openChar, - char closeChar, bool supportsNesting, ref int nestedCount, out int length) + private static HttpParseResult GetExpressionLength( + string input, + int startIndex, + char openChar, + char closeChar, + bool supportsNesting, + ref int nestedCount, + out int length) { Contract.Requires(input != null); Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs index a64b12e6b0..21ab21f71e 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs @@ -79,8 +79,9 @@ namespace Microsoft.Net.Http.Headers return returnValue; } - private static int CompareBasedOnQualityFactor(MediaTypeHeaderValue mediaType1, - MediaTypeHeaderValue mediaType2) + private static int CompareBasedOnQualityFactor( + MediaTypeHeaderValue mediaType1, + MediaTypeHeaderValue mediaType2) { var mediaType1Quality = mediaType1.Quality ?? HeaderQuality.Match; var mediaType2Quality = mediaType2.Quality ?? HeaderQuality.Match; diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index f5b1c72435..3031d877c0 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -172,7 +172,10 @@ namespace Microsoft.Net.Http.Headers return _name; } - internal static void ToString(ICollection values, char separator, bool leadingSeparator, + internal static void ToString( + ICollection values, + char separator, + bool leadingSeparator, StringBuilder destination) { Contract.Assert(destination != null); @@ -275,7 +278,10 @@ namespace Microsoft.Net.Http.Headers // Returns the length of a name/value list, separated by 'delimiter'. E.g. "a=b, c=d, e=f" adds 3 // name/value pairs to 'nameValueCollection' if 'delimiter' equals ','. - internal static int GetNameValueListLength(string input, int startIndex, char delimiter, + internal static int GetNameValueListLength( + string input, + int startIndex, + char delimiter, ICollection nameValueCollection) { Contract.Requires(nameValueCollection != null); diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index 772a1c923a..ce62e99f2a 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -86,12 +86,14 @@ namespace Microsoft.Net.Http.Headers // Returns the length of a range list. E.g. "1-2, 3-4, 5-6" adds 3 ranges to 'rangeCollection'. Note that empty // list segments are allowed, e.g. ",1-2, , 3-4,,". - internal static int GetRangeItemListLength(string input, int startIndex, + internal static int GetRangeItemListLength( + string input, + int startIndex, ICollection rangeCollection) { Contract.Requires(rangeCollection != null); Contract.Requires(startIndex >= 0); - Contract.Ensures((Contract.Result() == 0) || (rangeCollection.Count > 0), + Contract.Ensures((Contract.Result() == 0) || (rangeCollection.Count > 0), "If we can parse the string, then we expect to have at least one range item."); if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 2dfa0509ad..6dc3d0758a 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -38,8 +38,9 @@ namespace Microsoft.Net.Http.Headers /// The first value to compare. /// The second value to compare /// The result of the comparison. - public int Compare(StringWithQualityHeaderValue stringWithQuality1, - StringWithQualityHeaderValue stringWithQuality2) + public int Compare( + StringWithQualityHeaderValue stringWithQuality1, + StringWithQualityHeaderValue stringWithQuality2) { if (stringWithQuality1 == null) { diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index 02e233a53d..89b1ab0f10 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -569,11 +569,11 @@ namespace Microsoft.Net.Http.Headers Valid = valid; } - public string Value { get; private set; } + public string Value { get; } - public string Description { get; private set; } + public string Description { get; } - public bool Valid { get; private set; } + public bool Valid { get; } } private void CheckValidParse(string input, ContentDispositionHeaderValue expectedResult) From 7816c0183e6ecedc5263cc7d06a815476de832d8 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 20 Sep 2015 10:20:58 -0700 Subject: [PATCH 389/846] Removing Microsoft.Framework.Primitives from HttpAbstractions --- HttpAbstractions.sln | 30 -- .../Microsoft.Framework.Primitives.xproj | 20 -- .../Properties/AssemblyInfo.cs | 8 - .../StringValues.cs | 312 ------------------ .../project.json | 21 -- ...Microsoft.Framework.Primitives.Tests.xproj | 21 -- .../StringValuesTests.cs | 306 ----------------- .../project.json | 13 - 8 files changed, 731 deletions(-) delete mode 100644 src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj delete mode 100644 src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Framework.Primitives/StringValues.cs delete mode 100644 src/Microsoft.Framework.Primitives/project.json delete mode 100644 test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj delete mode 100644 test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs delete mode 100644 test/Microsoft.Framework.Primitives.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 39f29673eb..bbb59df0db 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -47,10 +47,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives", "src\Microsoft.Framework.Primitives\Microsoft.Framework.Primitives.xproj", "{E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives.Tests", "test\Microsoft.Framework.Primitives.Tests\Microsoft.Framework.Primitives.Tests.xproj", "{61F72E92-B3AE-4A10-B838-44F80AED40AE}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject Global @@ -267,30 +263,6 @@ Global {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.ActiveCfg = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.Build.0 = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.Build.0 = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.ActiveCfg = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.Build.0 = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.Build.0 = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.Build.0 = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.ActiveCfg = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.Build.0 = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.Build.0 = Debug|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -327,8 +299,6 @@ Global {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {61F72E92-B3AE-4A10-B838-44F80AED40AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj b/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj deleted file mode 100644 index f7b40aaa14..0000000000 --- a/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - - e5faccd4-6327-43aa-80a9-ae6f4a3bfe6a - Microsoft.AspNet.Primitives - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - - 2.0 - - - diff --git a/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs deleted file mode 100644 index b2437d9ad6..0000000000 --- a/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.Primitives/StringValues.cs b/src/Microsoft.Framework.Primitives/StringValues.cs deleted file mode 100644 index 79a8e6d006..0000000000 --- a/src/Microsoft.Framework.Primitives/StringValues.cs +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Microsoft.Framework.Primitives -{ - /// - /// Represents zero/null, one, or many strings in an efficient way. - /// - public struct StringValues : IList, IReadOnlyList - { - private static readonly string[] EmptyArray = new string[0]; - public static readonly StringValues Empty = new StringValues(EmptyArray); - - private readonly string _value; - private readonly string[] _values; - - public StringValues(string value) - { - _value = value; - _values = null; - } - - public StringValues(string[] values) - { - _value = null; - _values = values; - } - - public static implicit operator StringValues(string value) - { - return new StringValues(value); - } - - public static implicit operator StringValues(string[] values) - { - return new StringValues(values); - } - - public static implicit operator string (StringValues values) - { - return values.GetStringValue(); - } - - public static implicit operator string[] (StringValues value) - { - return value.GetArrayValue(); - } - - public int Count => _values?.Length ?? (_value != null ? 1 : 0); - - bool ICollection.IsReadOnly - { - get { return true; } - } - - string IList.this[int index] - { - get { return this[index]; } - set { throw new NotSupportedException(); } - } - - public string this[int index] - { - get - { - if (_values != null) - { - return _values[index]; // may throw - } - if (index == 0 && _value != null) - { - return _value; - } - return EmptyArray[0]; // throws - } - } - - public override string ToString() - { - return GetStringValue() ?? string.Empty; - } - - private string GetStringValue() - { - if (_values == null) - { - return _value; - } - switch (_values.Length) - { - case 0: return null; - case 1: return _values[0]; - default: return string.Join(",", _values); - } - } - - public string[] ToArray() - { - return GetArrayValue() ?? EmptyArray; - } - - private string[] GetArrayValue() - { - if (_value != null) - { - return new[] { _value }; - } - return _values; - } - - int IList.IndexOf(string item) - { - return IndexOf(item); - } - - private int IndexOf(string item) - { - if (_values != null) - { - var values = _values; - for (int i = 0; i < values.Length; i++) - { - if (string.Equals(values[i], item, StringComparison.Ordinal)) - { - return i; - } - } - return -1; - } - - if (_value != null) - { - return string.Equals(_value, item, StringComparison.Ordinal) ? 0 : -1; - } - - return -1; - } - - bool ICollection.Contains(string item) - { - return IndexOf(item) >= 0; - } - - void ICollection.CopyTo(string[] array, int arrayIndex) - { - CopyTo(array, arrayIndex); - } - - private void CopyTo(string[] array, int arrayIndex) - { - if (_values != null) - { - Array.Copy(_values, 0, array, arrayIndex, _values.Length); - return; - } - - if (_value != null) - { - if (array == null) - { - throw new ArgumentNullException(nameof(array)); - } - if (arrayIndex < 0) - { - throw new ArgumentOutOfRangeException(nameof(arrayIndex)); - } - if (array.Length - arrayIndex < 1) - { - throw new ArgumentException( - $"'{nameof(array)}' is not long enough to copy all the items in the collection. Check '{nameof(arrayIndex)}' and '{nameof(array)}' length."); - } - - array[arrayIndex] = _value; - } - } - - void ICollection.Add(string item) - { - throw new NotSupportedException(); - } - - void IList.Insert(int index, string item) - { - throw new NotSupportedException(); - } - - bool ICollection.Remove(string item) - { - throw new NotSupportedException(); - } - - void IList.RemoveAt(int index) - { - throw new NotSupportedException(); - } - - void ICollection.Clear() - { - throw new NotSupportedException(); - } - - public Enumerator GetEnumerator() - { - return new Enumerator(this); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public static bool IsNullOrEmpty(StringValues value) - { - if (value._values == null) - { - return string.IsNullOrEmpty(value._value); - } - switch (value._values.Length) - { - case 0: return true; - case 1: return string.IsNullOrEmpty(value._values[0]); - default: return false; - } - } - - public static StringValues Concat(StringValues values1, StringValues values2) - { - var count1 = values1.Count; - var count2 = values2.Count; - - if (count1 == 0) - { - return values2; - } - - if (count2 == 0) - { - return values1; - } - - var combined = new string[count1 + count2]; - values1.CopyTo(combined, 0); - values2.CopyTo(combined, count1); - return new StringValues(combined); - } - - public struct Enumerator : IEnumerator - { - private readonly StringValues _values; - private string _current; - private int _index; - - public Enumerator(StringValues values) - { - _values = values; - _current = null; - _index = 0; - } - - public bool MoveNext() - { - var values = _values._values; - if (values != null) - { - if (_index < values.Length) - { - _current = values[_index]; - _index++; - return true; - } - - _current = null; - return false; - } - - var value = _values._value; - if (value != null && _index == 0) - { - _current = value; - _index = -1; // sentinel value - return true; - } - - _current = null; - return false; - } - - public string Current => _current; - - object IEnumerator.Current => _current; - - void IEnumerator.Reset() - { - _current = null; - _index = 0; - } - - void IDisposable.Dispose() - { - } - } - } -} diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json deleted file mode 100644 index 4957eeb224..0000000000 --- a/src/Microsoft.Framework.Primitives/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "Contains primitive types such as StringValues.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "frameworks": { - "net451": { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Resources.ResourceManager": "4.0.1-beta-" - } - } - } -} diff --git a/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj b/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj deleted file mode 100644 index f1a2ba4182..0000000000 --- a/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 61f72e92-b3ae-4a10-b838-44f80aed40ae - Microsoft.AspNet.Primitives.Tests - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs deleted file mode 100644 index 184fa3f7da..0000000000 --- a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using Xunit; - -namespace Microsoft.Framework.Primitives -{ - public class StringValuesTests - { - public static TheoryData DefaultOrNullStringValues - { - get - { - return new TheoryData - { - new StringValues(), - new StringValues((string)null), - new StringValues((string[])null), - (string)null, - (string[])null - }; - } - } - - public static TheoryData EmptyStringValues - { - get - { - return new TheoryData - { - StringValues.Empty, - new StringValues(new string[0]), - new string[0] - }; - } - } - - public static TheoryData FilledStringValues - { - get - { - return new TheoryData - { - new StringValues("abc"), - new StringValues(new[] { "abc" }), - new StringValues(new[] { "abc", "bcd" }), - new StringValues(new[] { "abc", "bcd", "foo" }), - "abc", - new[] { "abc" }, - new[] { "abc", "bcd" }, - new[] { "abc", "bcd", "foo" } - }; - } - } - - public static TheoryData FilledStringValuesWithExpected - { - get - { - return new TheoryData - { - { new StringValues("abc"), new[] { "abc" } }, - { new StringValues(new[] { "abc" }), new[] { "abc" } }, - { new StringValues(new[] { "abc", "bcd" }), new[] { "abc", "bcd" } }, - { new StringValues(new[] { "abc", "bcd", "foo" }), new[] { "abc", "bcd", "foo" } }, - { "abc", new[] { "abc" } }, - { new[] { "abc" }, new[] { "abc" } }, - { new[] { "abc", "bcd" }, new[] { "abc", "bcd" } }, - { new[] { "abc", "bcd", "foo" }, new[] { "abc", "bcd", "foo" } } - }; - } - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - [MemberData(nameof(FilledStringValues))] - public void IsReadOnly_True(StringValues stringValues) - { - Assert.True(((IList)stringValues).IsReadOnly); - Assert.Throws(() => ((IList)stringValues)[0] = string.Empty); - Assert.Throws(() => ((ICollection)stringValues).Add(string.Empty)); - Assert.Throws(() => ((IList)stringValues).Insert(0, string.Empty)); - Assert.Throws(() => ((ICollection)stringValues).Remove(string.Empty)); - Assert.Throws(() => ((IList)stringValues).RemoveAt(0)); - Assert.Throws(() => ((ICollection)stringValues).Clear()); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - public void DefaultOrNull_ExpectedValues(StringValues stringValues) - { - Assert.Null((string[])stringValues); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - public void DefaultNullOrEmpty_ExpectedValues(StringValues stringValues) - { - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal((string)null, stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Throws(() => ((IList)stringValues)[0]); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Equal(-1, ((IList)stringValues).IndexOf(null)); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(-1, ((IList)stringValues).IndexOf("not there")); - Assert.False(((ICollection)stringValues).Contains(null)); - Assert.False(((ICollection)stringValues).Contains(string.Empty)); - Assert.False(((ICollection)stringValues).Contains("not there")); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void ImplicitStringConverter_Works() - { - string nullString = null; - StringValues stringValues = nullString; - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Null((string[])stringValues); - - string aString = "abc"; - stringValues = aString; - Assert.Equal(1, stringValues.Count); - Assert.Equal(aString, stringValues); - Assert.Equal(aString, stringValues[0]); - Assert.Equal(aString, ((IList)stringValues)[0]); - Assert.Equal(new string[] { aString }, stringValues); - } - - [Fact] - public void ImplicitStringArrayConverter_Works() - { - string[] nullStringArray = null; - StringValues stringValues = nullStringArray; - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Null((string[])stringValues); - - string aString = "abc"; - string[] aStringArray = new[] { aString }; - stringValues = aStringArray; - Assert.Equal(1, stringValues.Count); - Assert.Equal(aString, stringValues); - Assert.Equal(aString, stringValues[0]); - Assert.Equal(aString, ((IList)stringValues)[0]); - Assert.Equal(aStringArray, stringValues); - - aString = "abc"; - string bString = "bcd"; - aStringArray = new[] { aString, bString }; - stringValues = aStringArray; - Assert.Equal(2, stringValues.Count); - Assert.Equal("abc,bcd", stringValues); - Assert.Equal(aStringArray, stringValues); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - public void DefaultNullOrEmpty_Enumerator(StringValues stringValues) - { - var e = stringValues.GetEnumerator(); - Assert.Null(e.Current); - Assert.False(e.MoveNext()); - Assert.Null(e.Current); - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - - var e1 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e1.Current); - Assert.False(e1.MoveNext()); - Assert.Null(e1.Current); - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - - var e2 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e2.Current); - Assert.False(e2.MoveNext()); - Assert.Null(e2.Current); - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void Enumerator(StringValues stringValues, string[] expected) - { - var e = stringValues.GetEnumerator(); - Assert.Null(e.Current); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(e.MoveNext()); - Assert.Equal(expected[i], e.Current); - } - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - - var e1 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e1.Current); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(e1.MoveNext()); - Assert.Equal(expected[i], e1.Current); - } - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - - var e2 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e2.Current); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(e2.MoveNext()); - Assert.Equal(expected[i], e2.Current); - } - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void IndexOf(StringValues stringValues, string[] expected) - { - IList list = stringValues; - Assert.Equal(-1, list.IndexOf("not there")); - for (int i = 0; i < expected.Length; i++) - { - Assert.Equal(i, list.IndexOf(expected[i])); - } - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void Contains(StringValues stringValues, string[] expected) - { - ICollection collection = stringValues; - Assert.False(collection.Contains("not there")); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(collection.Contains(expected[i])); - } - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void CopyTo(StringValues stringValues, string[] expected) - { - ICollection collection = stringValues; - - string[] tooSmall = new string[0]; - Assert.Throws(() => collection.CopyTo(tooSmall, 0)); - - string[] actual = new string[expected.Length]; - Assert.Throws(() => collection.CopyTo(actual, -1)); - Assert.Throws(() => collection.CopyTo(actual, actual.Length + 1)); - collection.CopyTo(actual, 0); - Assert.Equal(expected, actual); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - public void DefaultNullOrEmpty_Concat(StringValues stringValues) - { - string[] expected = new[] { "abc", "bcd", "foo" }; - Assert.Equal(expected, StringValues.Concat(stringValues, new StringValues(expected))); - Assert.Equal(expected, StringValues.Concat(new StringValues(expected), stringValues)); - - string[] empty = new string[0]; - Assert.Equal(empty, StringValues.Concat(stringValues, StringValues.Empty)); - Assert.Equal(empty, StringValues.Concat(StringValues.Empty, stringValues)); - Assert.Equal(empty, StringValues.Concat(stringValues, new StringValues())); - Assert.Equal(empty, StringValues.Concat(new StringValues(), stringValues)); - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void Concat(StringValues stringValues, string[] array) - { - string[] filled = new[] { "abc", "bcd", "foo" }; - - string[] expectedPrepended = array.Concat(filled).ToArray(); - Assert.Equal(expectedPrepended, StringValues.Concat(stringValues, new StringValues(filled))); - - string[] expectedAppended = filled.Concat(array).ToArray(); - Assert.Equal(expectedAppended, StringValues.Concat(new StringValues(filled), stringValues)); - } - } -} diff --git a/test/Microsoft.Framework.Primitives.Tests/project.json b/test/Microsoft.Framework.Primitives.Tests/project.json deleted file mode 100644 index 1a5837820c..0000000000 --- a/test/Microsoft.Framework.Primitives.Tests/project.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "dependencies": { - "Microsoft.Framework.Primitives": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - } -} From 38bd9f423237b64e64914949d9c7081ba5ab7582 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Wed, 23 Sep 2015 23:54:17 +0300 Subject: [PATCH 390/846] Add project.json description --- src/Microsoft.Net.Http.Headers/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 8bcba3ca6d..effac85e1f 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP header implementations.", "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" From 3a8ecc7d4a33fb41d4d4ce63ef9fed2c45ae592d Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 23 Sep 2015 14:46:52 -0700 Subject: [PATCH 391/846] Add Dictionary and List dependency to dnxcore50 --- src/Microsoft.AspNet.WebUtilities/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 621e8c5954..88b039b752 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -16,6 +16,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { + "System.Collections": "4.0.11-beta-*", "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.IO.FileSystem": "4.0.1-beta-*", From 551da3e5587d31f4de13bcda0bdf9a36662a2df6 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 23 Sep 2015 14:28:36 -0700 Subject: [PATCH 392/846] Caption => DisplayName --- .../Authentication/AuthenticationDescription.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs index d6f9bf08a7..d1f39811ea 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { @@ -13,7 +12,7 @@ namespace Microsoft.AspNet.Http.Authentication /// public class AuthenticationDescription { - private const string CaptionPropertyKey = "Caption"; + private const string DisplayNamePropertyKey = "DisplayName"; private const string AuthenticationSchemePropertyKey = "AuthenticationScheme"; /// @@ -50,10 +49,10 @@ namespace Microsoft.AspNet.Http.Authentication /// /// Gets or sets the display name for the authentication provider. /// - public string Caption + public string DisplayName { - get { return GetString(CaptionPropertyKey); } - set { Items[CaptionPropertyKey] = value; } + get { return GetString(DisplayNamePropertyKey); } + set { Items[DisplayNamePropertyKey] = value; } } private string GetString(string name) From d82bc7ca9dd6decdc222f1537c17d77d2c00dc86 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Wed, 23 Sep 2015 12:57:35 -0700 Subject: [PATCH 393/846] Enabling NuGetPackageVerifier --- NuGetPackageVerifier.json | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 NuGetPackageVerifier.json diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json new file mode 100644 index 0000000000..6d1698dfd4 --- /dev/null +++ b/NuGetPackageVerifier.json @@ -0,0 +1,34 @@ +{ + "adx": { // Packages written by the ADX team and that ship on NuGet.org + "rules": [ + "AssemblyHasDocumentFileRule", + "AssemblyHasVersionAttributesRule", + "AssemblyHasServicingAttributeRule", + "AssemblyHasNeutralResourcesLanguageAttributeRule", + "SatellitePackageRule", + "StrictSemanticVersionValidationRule" + ], + "packages": { + "Microsoft.AspNet.Html.Abstractions": { }, + "Microsoft.AspNet.Http": { }, + "Microsoft.AspNet.Http.Abstractions": { }, + "Microsoft.AspNet.Http.Extensions": { }, + "Microsoft.AspNet.Http.Features": { }, + "Microsoft.AspNet.Owin": { }, + "Microsoft.AspNet.WebUtilities": { }, + "Microsoft.Framework.WebEncoders": { }, + "Microsoft.Framework.WebEncoders.Core": { }, + "Microsoft.Net.Http.Headers": { } + } + }, + "Default": { // Rules to run for packages not listed in any other set. + "rules": [ + "AssemblyHasDocumentFileRule", + "AssemblyHasVersionAttributesRule", + "AssemblyHasServicingAttributeRule", + "AssemblyHasNeutralResourcesLanguageAttributeRule", + "SatellitePackageRule", + "StrictSemanticVersionValidationRule" + ] + } +} \ No newline at end of file From a602b47e262b1733611018f1d357784dd7e10c5c Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 24 Sep 2015 14:12:42 -0700 Subject: [PATCH 394/846] Add AppendFormat extension methods on IHtmlContent --- .../HtmlContentBuilderExtensions.cs | 214 +++++++++++++++++ .../project.json | 2 +- .../project.json | 2 +- .../HtmlContentBuilderExtensionsTest.cs | 225 +++++++++++++++++- 4 files changed, 438 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index bfd5e3ef03..0e15077764 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -3,7 +3,9 @@ using System; using System.Diagnostics; +using System.Globalization; using System.IO; +using System.Text; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions @@ -13,6 +15,82 @@ namespace Microsoft.AspNet.Html.Abstractions /// public static class HtmlContentBuilderExtensions { + /// + /// Appends the specified to the existing content after replacing each format + /// item with the HTML encoded representation of the corresponding item in the + /// array. + /// + /// + /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). + /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. + /// + /// + /// The object array to format. Each element in the array will be formatted and then HTML encoded. + /// + /// A reference to this instance after the append operation has completed. + public static IHtmlContentBuilder AppendFormat( + this IHtmlContentBuilder builder, + string format, + params object[] args) + { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + + if (format == null) + { + throw new ArgumentNullException(nameof(format)); + } + + if (args == null) + { + throw new ArgumentNullException(nameof(args)); + } + + builder.Append(new HtmlFormatString(format, args)); + return builder; + } + + /// + /// Appends the specified to the existing content with information from the + /// after replacing each format item with the HTML encoded + /// representation of the corresponding item in the array. + /// + /// An object that supplies culture-specific formatting information. + /// + /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). + /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. + /// + /// + /// The object array to format. Each element in the array will be formatted and then HTML encoded. + /// + /// A reference to this instance after the append operation has completed. + public static IHtmlContentBuilder AppendFormat( + this IHtmlContentBuilder builder, + IFormatProvider formatProvider, + string format, + params object[] args) + { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + + if (format == null) + { + throw new ArgumentNullException(nameof(format)); + } + + if (args == null) + { + throw new ArgumentNullException(nameof(args)); + } + + builder.Append(new HtmlFormatString(formatProvider, format, args)); + return builder; + } + /// /// Appends an . /// @@ -132,5 +210,141 @@ namespace Microsoft.AspNet.Html.Abstractions } } } + + [DebuggerDisplay("{DebuggerToString()}")] + private class HtmlFormatString : IHtmlContent + { + private readonly IFormatProvider _formatProvider; + private readonly string _format; + private readonly object[] _args; + + public HtmlFormatString(string format, object[] args) + : this(null, format, args) + { + } + + public HtmlFormatString(IFormatProvider formatProvider, string format, object[] args) + { + Debug.Assert(format != null); + Debug.Assert(args != null); + + _formatProvider = formatProvider ?? CultureInfo.CurrentCulture; + _format = format; + _args = args; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + if (writer == null) + { + throw new ArgumentNullException(nameof(writer)); + } + + if (encoder == null) + { + throw new ArgumentNullException(nameof(encoder)); + } + + var formatProvider = new EncodingFormatProvider(_formatProvider, encoder); + writer.Write(string.Format(formatProvider, _format, _args)); + } + + private string DebuggerToString() + { + using (var writer = new StringWriter()) + { + WriteTo(writer, HtmlEncoder.Default); + return writer.ToString(); + } + } + } + + // This class implements Html encoding via an ICustomFormatter. Passing an instance of this + // class into a string.Format method or anything similar will evaluate arguments implementing + // IHtmlContent without HTML encoding them, and will give other arguments the standard + // composite format string treatment, and then HTML encode the result. + // + // Plenty of examples of ICustomFormatter and the interactions with string.Format here: + // https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format6_Example + private class EncodingFormatProvider : IFormatProvider, ICustomFormatter + { + private readonly IHtmlEncoder _encoder; + private readonly IFormatProvider _formatProvider; + + public EncodingFormatProvider(IFormatProvider formatProvider, IHtmlEncoder encoder) + { + Debug.Assert(formatProvider != null); + Debug.Assert(encoder != null); + + _formatProvider = formatProvider; + _encoder = encoder; + } + + public string Format(string format, object arg, IFormatProvider formatProvider) + { + // This is the case we need to special case. We trust the IHtmlContent instance to do the + // right thing with encoding. + var htmlContent = arg as IHtmlContent; + if (htmlContent != null) + { + using (var writer = new StringWriter()) + { + htmlContent.WriteTo(writer, _encoder); + return writer.ToString(); + } + } + + // If we get here then 'arg' is not an IHtmlContent, and we want to handle it the way a normal + // string.Format would work, but then HTML encode the result. + // + // First check for an ICustomFormatter - if the IFormatProvider is a CultureInfo, then it's likely + // that ICustomFormatter will be null. + var customFormatter = (ICustomFormatter)_formatProvider.GetFormat(typeof(ICustomFormatter)); + if (customFormatter != null) + { + var result = customFormatter.Format(format, arg, _formatProvider); + if (result != null) + { + return _encoder.HtmlEncode(result); + } + } + + // Next check if 'arg' is an IFormattable (DateTime is an example). + // + // An IFormattable will likely call back into the IFormatterProvider and ask for more information + // about how to format itself. This is the typical case when IFormatterProvider is a CultureInfo. + var formattable = arg as IFormattable; + if (formattable != null) + { + var result = formattable.ToString(format, _formatProvider); + if (result != null) + { + return _encoder.HtmlEncode(result); + } + } + + // If we get here then there's nothing really smart left to try. + if (arg != null) + { + var result = arg.ToString(); + if (result != null) + { + return _encoder.HtmlEncode(result); + } + } + + return string.Empty; + } + + public object GetFormat(Type formatType) + { + if (formatType == typeof(ICustomFormatter)) + { + return this; + } + + return null; + } + } } } diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index eee0e0ab1b..e4f6452bf1 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -16,7 +16,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-" + "System.Resources.ResourceManager": "4.0.1-beta-*" } } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index 54dbd1c28e..0da3e70874 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -18,7 +18,7 @@ "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.Reflection": "4.0.10-*", - "System.Resources.ResourceManager": "4.0.1-beta-", + "System.Resources.ResourceManager": "4.0.1-beta-*", "System.Runtime.Extensions": "4.0.11-beta-*", "System.Threading": "4.0.11-beta-*" } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 3aba376094..7c340933ec 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; +using Microsoft.AspNet.Testing; using Microsoft.Framework.WebEncoders; using Microsoft.Framework.WebEncoders.Testing; using Xunit; @@ -126,6 +128,220 @@ namespace Microsoft.AspNet.Html.Abstractions.Test entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); } + [Fact] + public void Builder_AppendFormat() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth"); + + // Assert + Assert.Equal( + "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_HtmlContent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("{0}!", new EncodedString("First")); + + // Assert + Assert.Equal( + "First!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormatContent_With1Argument() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X} - hex equivalent for 50.", 50); + + // Assert + Assert.Equal( + "0xHtmlEncode[[32]] - hex equivalent for 50.", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormatContent_With2Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X} - hex equivalent for {1}.", 50, 50); + + // Assert + Assert.Equal( + "0xHtmlEncode[[32]] - hex equivalent for HtmlEncode[[50]].", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormatContent_With3Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50); + + // Assert + Assert.Equal( + "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithAlignmentComponent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("{0, -25} World!", "Hello"); + + // Assert + Assert.Equal( + "HtmlEncode[[Hello]] World!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithFormatStringComponent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X}", 50); + + // Assert + Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!", + 1.1, + 2.98, + 145.82, + 32.86); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + + "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture_1Argument() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0:N}!", + 1.1); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture_2Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0:N} {1}!", + 1.1, + 2.98); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture_3Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0:N} {1} {2}!", + 1.1, + 2.98, + 3.12); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] HtmlEncode[[3.12]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithDifferentCulture() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + var culture = new CultureInfo("fr-FR"); + + // Act + builder.AppendFormat(culture, "{0} in french!", 1.21); + + // Assert + Assert.Equal( + "HtmlEncode[[1,21]] in french!", + HtmlContentToString(builder)); + } + + [Fact] + [ReplaceCulture] + public void Builder_AppendFormat_WithDifferentCurrentCulture() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat(CultureInfo.CurrentCulture, "{0:D}", DateTime.Parse("01/02/2015")); + + // Assert + Assert.Equal( + "HtmlEncode[[01 February 2015]]", + HtmlContentToString(builder)); + } + private static string HtmlContentToString(IHtmlContent content) { using (var writer = new StringWriter()) @@ -164,7 +380,10 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public void WriteTo(TextWriter writer, IHtmlEncoder encoder) { - throw new NotImplementedException(); + foreach (var entry in Entries) + { + entry.WriteTo(writer, encoder); + } } } @@ -179,7 +398,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public void WriteTo(TextWriter writer, IHtmlEncoder encoder) { - throw new NotImplementedException(); + writer.Write(Value); } } @@ -194,7 +413,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public void WriteTo(TextWriter writer, IHtmlEncoder encoder) { - throw new NotImplementedException(); + encoder.HtmlEncode(Value, writer); } } From c62aa147f41e822a579e153d5b607b91dc157c7f Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 25 Sep 2015 17:17:28 -0700 Subject: [PATCH 395/846] Make .Clear() consistent with TagHelperOutput --- src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs | 3 ++- .../HtmlContentBuilderExtensionsTest.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index aea0291e70..ced5bd763e 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -34,6 +34,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// Clears the content. /// - void Clear(); + /// The . + IHtmlContentBuilder Clear(); } } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 7c340933ec..4493048940 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -373,9 +373,10 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public void Clear() + public IHtmlContentBuilder Clear() { Entries.Clear(); + return this; } public void WriteTo(TextWriter writer, IHtmlEncoder encoder) From 326dc222f0a13809b8e6ddec8b2b36f1c8d9430c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 28 Sep 2015 23:12:17 -0700 Subject: [PATCH 396/846] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From 894c8dbe2bac3210b95961ab40d4a131dc5e9a9f Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 30 Sep 2015 14:31:03 -0700 Subject: [PATCH 397/846] Hosting#359 Remove IDisposable from HttpContext and IFeatureCollection. --- src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs | 4 +--- src/Microsoft.AspNet.Http.Features/FeatureCollection.cs | 5 ----- src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 6 ------ 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 8029c68641..7a7a35e543 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -10,7 +10,7 @@ using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { - public abstract class HttpContext : IDisposable + public abstract class HttpContext { public abstract IFeatureCollection Features { get; } @@ -37,7 +37,5 @@ namespace Microsoft.AspNet.Http public abstract ISession Session { get; set; } public abstract void Abort(); - - public abstract void Dispose(); } } diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 25c86d06a9..eacad01a72 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -93,11 +93,6 @@ namespace Microsoft.AspNet.Http.Features } } - public virtual void Dispose() - { - _defaults?.Dispose(); - } - private class KeyComparer : IEqualityComparer> { public bool Equals(KeyValuePair x, KeyValuePair y) diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index 59741d9394..8da86ea5b9 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http.Features { - public interface IFeatureCollection : IEnumerable>, IDisposable + public interface IFeatureCollection : IEnumerable> { /// /// Indicates if the collection can be modified. diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index db0a4d27ad..29ad2e565c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -165,11 +165,5 @@ namespace Microsoft.AspNet.Http.Internal { LifetimeFeature.Abort(); } - - public override void Dispose() - { - // REVIEW: is this necessary? is the environment "owned" by the context? - _features.Dispose(); - } } } \ No newline at end of file From 8ef20c5c5677220dcf7d4e4b6ac14f764d89c92d Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 1 Oct 2015 11:57:25 -0700 Subject: [PATCH 398/846] Update 'build.cmd' alias parameter to use full name. --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 177997c42e..70d974a61f 100644 --- a/build.cmd +++ b/build.cmd @@ -30,7 +30,7 @@ IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 ) ELSE ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -a default + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -alias default ) CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 From 5f7a17b8e3097b3752a8970391c653b4e70774af Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 10:35:02 -0700 Subject: [PATCH 399/846] Move BufferedHtmlContent to HttpAbstractions --- HttpAbstractions.sln | 30 ++++ .../BufferedHtmlContent.cs | 125 +++++++++++++++ ...ramework.BufferedHtmlContent.Sources.xproj | 19 +++ .../project.json | 19 +++ .../BufferedHtmlContentTest.cs | 146 ++++++++++++++++++ ...t.Framework.BufferedHtmlContent.Test.xproj | 19 +++ .../project.json | 18 +++ 7 files changed, 376 insertions(+) create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json create mode 100644 test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs create mode 100644 test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj create mode 100644 test/Microsoft.Framework.BufferedHtmlContent.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index bbb59df0db..1e1b155ed3 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -49,6 +49,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\Sample EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Sources", "src\Microsoft.Framework.BufferedHtmlContent.Sources\Microsoft.Framework.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Test", "test\Microsoft.Framework.BufferedHtmlContent.Test\Microsoft.Framework.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -275,6 +279,30 @@ Global {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.Build.0 = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.Build.0 = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.ActiveCfg = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.Build.0 = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.Build.0 = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.Build.0 = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.ActiveCfg = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -300,5 +328,7 @@ Global {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {B1B2B906-24AE-4C57-AAC5-19B734014504} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs new file mode 100644 index 0000000000..0b9ddc770f --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -0,0 +1,125 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using Microsoft.AspNet.Html.Abstractions; +using Microsoft.Framework.WebEncoders; + +namespace Microsoft.Framework.Internal +{ + /// + /// Enumerable object collection which knows how to write itself. + /// + [DebuggerDisplay("{DebuggerToString()}")] + internal class BufferedHtmlContent : IHtmlContentBuilder + { + // This is not List because that would lead to wrapping all strings to IHtmlContent + // which is not space performant. + // internal for testing. + internal List Entries { get; } = new List(); + + /// + /// Appends the to the collection. + /// + /// The string to be appended. + /// A reference to this instance after the Append operation has completed. + public IHtmlContentBuilder Append(string value) + { + Entries.Add(value); + return this; + } + + /// + /// Appends a to the collection. + /// + /// The to be appended. + /// A reference to this instance after the Append operation has completed. + public IHtmlContentBuilder Append(IHtmlContent htmlContent) + { + Entries.Add(htmlContent); + return this; + } + + /// + /// Appends the HTML encoded to the collection. + /// + /// The HTML encoded string to be appended. + /// A reference to this instance after the Append operation has completed. + public IHtmlContentBuilder AppendEncoded(string value) + { + Entries.Add(new HtmlEncodedString(value)); + return this; + } + /// + /// Removes all the entries from the collection. + /// + /// A reference to this instance after the Clear operation has completed. + public IHtmlContentBuilder Clear() + { + Entries.Clear(); + return this; + } + + /// + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + if (writer == null) + { + throw new ArgumentNullException(nameof(writer)); + } + + if (encoder == null) + { + throw new ArgumentNullException(nameof(encoder)); + } + + foreach (var entry in Entries) + { + if (entry == null) + { + continue; + } + + var entryAsString = entry as string; + if (entryAsString != null) + { + encoder.HtmlEncode(entryAsString, writer); + } + else + { + // Only string, IHtmlContent values can be added to the buffer. + ((IHtmlContent)entry).WriteTo(writer, encoder); + } + } + } + + private string DebuggerToString() + { + using (var writer = new StringWriter()) + { + WriteTo(writer, HtmlEncoder.Default); + return writer.ToString(); + } + } + + private class HtmlEncodedString : IHtmlContent + { + public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); + + private readonly string _value; + + public HtmlEncodedString(string value) + { + _value = value; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + writer.Write(_value); + } + } + } +} diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj new file mode 100644 index 0000000000..9185ec07d6 --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj @@ -0,0 +1,19 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + b1b2b906-24ae-4c57-aac5-19b734014504 + Microsoft.Framework.BufferedHtmlContent.Sources + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + \ No newline at end of file diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json new file mode 100644 index 0000000000..6041a826dd --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json @@ -0,0 +1,19 @@ +{ + "version": "1.0.0-*", + "shared": "*.cs", + "dependencies": { }, + "frameworks" : { + "net45": { }, + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Runtime": "4.0.21-beta-*" + } + }, + "dotnet": { + "dependencies": { + "System.Runtime": "4.0.21-beta-*" + } + } + } +} diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs new file mode 100644 index 0000000000..aa0d20b2d3 --- /dev/null +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -0,0 +1,146 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Microsoft.AspNet.Html.Abstractions; +using Microsoft.Framework.WebEncoders; +using Microsoft.Framework.WebEncoders.Testing; +using Xunit; + +namespace Microsoft.Framework.Internal +{ + public class BufferedHtmlContentTest + { + [Fact] + public void AppendString_AppendsAString() + { + // Arrange + var content = new BufferedHtmlContent(); + + // Act + content.Append("Hello"); + + // Assert + var result = Assert.Single(content.Entries); + Assert.IsType(result); + } + + [Fact] + public void AppendString_WrittenAsEncoded() + { + // Arrange + var content = new BufferedHtmlContent(); + content.Append("Hello"); + + var writer = new StringWriter(); + + // Act + content.WriteTo(writer, new CommonTestEncoder()); + + // Assert + Assert.Equal("HtmlEncode[[Hello]]", writer.ToString()); + } + + [Fact] + public void AppendEncoded_DoesNotGetWrittenAsEncoded() + { + // Arrange + var content = new BufferedHtmlContent(); + content.AppendEncoded("Hello"); + + var writer = new StringWriter(); + + // Act + content.WriteTo(writer, new CommonTestEncoder()); + + // Assert + Assert.Equal("Hello", writer.ToString()); + } + + [Fact] + public void AppendIHtmlContent_AppendsAsIs() + { + // Arrange + var content = new BufferedHtmlContent(); + var writer = new StringWriter(); + + // Act + content.Append(new TestHtmlContent("Hello")); + + // Assert + var result = Assert.Single(content.Entries); + var testHtmlContent = Assert.IsType(result); + testHtmlContent.WriteTo(writer, new CommonTestEncoder()); + Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString()); + } + + [Fact] + public void CanAppendMultipleItems() + { + // Arrange + var content = new BufferedHtmlContent(); + + // Act + content.Append(new TestHtmlContent("hello")); + content.Append("Test"); + + // Assert + Assert.Equal(2, content.Entries.Count); + Assert.Equal("Written from TestHtmlContent: hello", content.Entries[0].ToString()); + Assert.Equal("Test", content.Entries[1]); + } + + [Fact] + public void Clear_DeletesAllItems() + { + // Arrange + var content = new BufferedHtmlContent(); + content.Append(new TestHtmlContent("hello")); + content.Append("Test"); + + // Act + content.Clear(); + + // Assert + Assert.Equal(0, content.Entries.Count); + } + + [Fact] + public void WriteTo_WritesAllItems() + { + // Arrange + var content = new BufferedHtmlContent(); + var writer = new StringWriter(); + content.Append(new TestHtmlContent("Hello")); + content.Append("Test"); + + // Act + content.WriteTo(writer, new CommonTestEncoder()); + + // Assert + Assert.Equal(2, content.Entries.Count); + Assert.Equal("Written from TestHtmlContent: HelloHtmlEncode[[Test]]", writer.ToString()); + } + + private class TestHtmlContent : IHtmlContent + { + private string _content; + + public TestHtmlContent(string content) + { + _content = content; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + writer.Write(ToString()); + } + + public override string ToString() + { + return "Written from TestHtmlContent: " + _content; + } + } + } +} diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj b/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj new file mode 100644 index 0000000000..a112b34876 --- /dev/null +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj @@ -0,0 +1,19 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 3e5311e2-a73e-40cc-a58c-5a62cead43ae + Microsoft.Framework.BufferedHtmlContent.Test + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json new file mode 100644 index 0000000000..0e2b957585 --- /dev/null +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json @@ -0,0 +1,18 @@ +{ + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", + "Microsoft.Framework.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} From 079e4909f7b3a93b4217325690e026725d9a92dc Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:03:14 -0700 Subject: [PATCH 400/846] Adding BufferedHtmlContent to NuGetPackageVerifier --- NuGetPackageVerifier.json | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 6d1698dfd4..3a6a9f4229 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -16,6 +16,7 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, + "Microsoft.Framework.BufferedHtmlContent.Sources": { }, "Microsoft.Framework.WebEncoders": { }, "Microsoft.Framework.WebEncoders.Core": { }, "Microsoft.Net.Http.Headers": { } From 886849d890c544616d7e447d17edc68d858ec9e1 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:07:52 -0700 Subject: [PATCH 401/846] Adding AssemblyInfo.cs --- .../Properties/AssemblyInfo.cs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b2437d9ad6 --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file From 78a8748248e8a5cb6be4acb9f74ee57a18a3ddf7 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:12:41 -0700 Subject: [PATCH 402/846] Fixing build break --- .../project.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json index 6041a826dd..812b75a205 100644 --- a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json @@ -7,11 +7,13 @@ "dnx451": { }, "dnxcore50": { "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*", "System.Runtime": "4.0.21-beta-*" } }, "dotnet": { "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*", "System.Runtime": "4.0.21-beta-*" } } From 3cb50b9cf5c92cd660b5d35c3064435d898ceeeb Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:12:41 -0700 Subject: [PATCH 403/846] Remove Microsoft.Framework.WebEncoders.Testing dependency --- .../HtmlContentBuilderExtensionsTest.cs | 5 +- .../project.json | 2 +- .../BufferedHtmlContentTest.cs | 2 - .../project.json | 2 +- .../CommonTestEncoder.cs | 103 ++++++++++++++++++ ...EncoderServiceCollectionExtensionsTests.cs | 4 +- .../project.json | 1 - 7 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 4493048940..a32724ca8f 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -7,7 +7,6 @@ using System.Globalization; using System.IO; using Microsoft.AspNet.Testing; using Microsoft.Framework.WebEncoders; -using Microsoft.Framework.WebEncoders.Testing; using Xunit; namespace Microsoft.AspNet.Html.Abstractions.Test @@ -230,7 +229,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test // Assert Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder)); } - + [Fact] public void Builder_AppendFormat_WithCulture() { @@ -248,7 +247,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test // Assert Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!", HtmlContentToString(builder)); } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 9d82a3d934..4536c6b8d2 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -2,9 +2,9 @@ "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, + "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index aa0d20b2d3..234da8af9c 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -1,11 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; using Microsoft.AspNet.Html.Abstractions; using Microsoft.Framework.WebEncoders; -using Microsoft.Framework.WebEncoders.Testing; using Xunit; namespace Microsoft.Framework.Internal diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json index 0e2b957585..8064ceed44 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json @@ -5,9 +5,9 @@ "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.Framework.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, + "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs new file mode 100644 index 0000000000..9f24eae292 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs @@ -0,0 +1,103 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Runtime.CompilerServices; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Encoder used for unit testing. + /// + internal sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder + { + /// + /// Returns "HtmlEncode[[value]]". + /// + public string HtmlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "JavaScriptStringEncode[[value]]". + /// + public string JavaScriptStringEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "UrlEncode[[value]]". + /// + public string UrlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) + { + return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); + } + + private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); + } + + private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index f45951277e..ff6acd3772 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,10 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Xunit; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.WebEncoders.Testing; +using Xunit; namespace Microsoft.Framework.WebEncoders { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 0968582e6b..c5c1f52c94 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -2,7 +2,6 @@ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "Newtonsoft.Json": "6.0.6", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 61466af7a38497ae25d538e5eb0f4cbcb6f303a0 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 15:44:37 -0700 Subject: [PATCH 404/846] Renaming Microsoft.Framework.* -> Microsoft.Extensions.* --- HttpAbstractions.sln | 12 ++++++------ NuGetPackageVerifier.json | 6 +++--- samples/SampleApp/Program.cs | 4 ++-- .../HtmlContentBuilderExtensions.cs | 4 ++-- .../IHtmlContent.cs | 2 +- .../project.json | 4 ++-- .../Extensions/UseMiddlewareExtensions.cs | 2 +- .../IHeaderDictionary.cs | 2 +- .../IReadableStringCollection.cs | 2 +- .../PathString.cs | 2 +- .../QueryString.cs | 4 ++-- .../project.json | 4 ++-- .../HeaderDictionaryExtensions.cs | 4 ++-- .../HeaderDictionaryTypeExtensions.cs | 2 +- .../Internal/HeaderSegmentCollection.cs | 2 +- .../Internal/ParsingHelpers.cs | 2 +- .../QueryBuilder.cs | 2 +- .../project.json | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/project.json | 2 +- .../Features/FormFeature.cs | 2 +- .../Features/HttpRequestFeature.cs | 2 +- .../Features/HttpResponseFeature.cs | 2 +- .../Features/QueryFeature.cs | 2 +- .../Features/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/FormCollection.cs | 2 +- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 2 +- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 2 +- .../ReadableStringCollection.cs | 2 +- .../RequestCookiesCollection.cs | 2 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 4 ++-- .../DictionaryStringArrayWrapper.cs | 4 ++-- .../DictionaryStringValuesWrapper.cs | 4 ++-- .../OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.Owin/Utilities.cs | 2 +- src/Microsoft.AspNet.WebUtilities/FormReader.cs | 2 +- .../KeyValueAccumulator.cs | 2 +- .../MultipartReader.cs | 2 +- .../MultipartSection.cs | 2 +- .../QueryHelpers.cs | 4 ++-- src/Microsoft.AspNet.WebUtilities/project.json | 4 ++-- .../BufferedHtmlContent.cs | 4 ++-- ...xtensions.BufferedHtmlContent.Sources.xproj} | 4 ++-- .../Properties/AssemblyInfo.cs | 0 .../project.json | 0 .../AllowedCharsBitmap.cs | 2 +- .../CodePointFilter.cs | 2 +- .../EncoderCommon.cs | 2 +- .../EncoderExtensions.cs | 2 +- .../EncoderServiceProviderExtensions.cs | 2 +- .../HexUtil.cs | 2 +- .../HtmlEncoder.cs | 2 +- .../ICodePointFilter.cs | 2 +- .../IHtmlEncoder.cs | 2 +- .../IJavaScriptStringEncoder.cs | 2 +- .../IUrlEncoder.cs | 2 +- .../JavaScriptStringEncoder.cs | 2 +- ...Microsoft.Extensions.WebEncoders.Core.xproj} | 0 .../Properties/AssemblyInfo.cs | 2 +- .../UnicodeEncoderBase.cs | 2 +- .../UnicodeHelpers.cs | 2 +- .../UnicodeRange.cs | 2 +- .../UnicodeRanges.cs | 2 +- .../UnicodeRanges.generated.cs | 2 +- .../UrlEncoder.cs | 2 +- .../WebEncoderOptions.cs | 2 +- .../resources/unicode-defined-chars.bin | Bin .../project.json | 0 .../EncoderServiceCollectionExtensions.cs | 8 ++++---- .../Microsoft.Extensions.WebEncoders.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../project.json | 6 +++--- .../HtmlContentBuilderExtensionsTest.cs | 4 ++-- .../project.json | 2 +- .../ResponseExtensionTests.cs | 4 ++-- .../project.json | 2 +- .../DefaultHttpRequestTests.cs | 2 +- .../HeaderDictionaryTests.cs | 2 +- .../BufferedHtmlContentTest.cs | 6 +++--- ...t.Extensions.BufferedHtmlContent.Test.xproj} | 4 ++-- .../project.json | 4 ++-- .../AllowedCharsBitmapTests.cs | 2 +- .../CodePointFilterTests.cs | 2 +- .../CommonTestEncoder.cs | 2 +- .../EncoderCommonTests.cs | 2 +- .../EncoderExtensionsTests.cs | 2 +- .../EncoderServiceCollectionExtensionsTests.cs | 4 ++-- .../EncoderServiceProviderExtensionsTests.cs | 2 +- .../Entities.cs | 2 +- .../Extensions.cs | 2 +- .../HtmlEncoderTests.cs | 2 +- .../JavaScriptStringEncoderTests.cs | 2 +- ...icrosoft.Extensions.WebEncoders.Tests.xproj} | 0 .../ParsedEntity.cs | 2 +- .../UnicodeEncoderBaseTests.cs | 2 +- .../UnicodeHelpersTests.cs | 2 +- .../UnicodeRangeTests.cs | 2 +- .../UnicodeRangesTests.cs | 2 +- .../UrlEncoderTests.cs | 2 +- .../project.json | 4 ++-- unicode/how-to-update.txt | 16 ++++++++-------- 102 files changed, 134 insertions(+), 134 deletions(-) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources => Microsoft.Extensions.BufferedHtmlContent.Sources}/BufferedHtmlContent.cs (98%) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj => Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj} (88%) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources => Microsoft.Extensions.BufferedHtmlContent.Sources}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources => Microsoft.Extensions.BufferedHtmlContent.Sources}/project.json (100%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/AllowedCharsBitmap.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/CodePointFilter.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/EncoderCommon.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/EncoderExtensions.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/EncoderServiceProviderExtensions.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/HexUtil.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/HtmlEncoder.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/ICodePointFilter.cs (92%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/IHtmlEncoder.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/IJavaScriptStringEncoder.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/IUrlEncoder.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/JavaScriptStringEncoder.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj => Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj} (100%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/Properties/AssemblyInfo.cs (72%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeEncoderBase.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeHelpers.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeRange.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeRanges.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeRanges.generated.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UrlEncoder.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/WebEncoderOptions.cs (94%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/compiler/resources/unicode-defined-chars.bin (100%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/project.json (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Extensions.WebEncoders}/EncoderServiceCollectionExtensions.cs (92%) rename src/{Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj => Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj} (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Extensions.WebEncoders}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Extensions.WebEncoders}/project.json (69%) rename test/{Microsoft.Framework.BufferedHtmlContent.Test => Microsoft.Extensions.BufferedHtmlContent.Test}/BufferedHtmlContentTest.cs (96%) rename test/{Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj => Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj} (88%) rename test/{Microsoft.Framework.BufferedHtmlContent.Test => Microsoft.Extensions.BufferedHtmlContent.Test}/project.json (64%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/AllowedCharsBitmapTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/CodePointFilterTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/CommonTestEncoder.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderCommonTests.cs (95%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderExtensionsTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderServiceCollectionExtensionsTests.cs (97%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderServiceProviderExtensionsTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/Entities.cs (96%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/Extensions.cs (94%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/HtmlEncoderTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/JavaScriptStringEncoderTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj => Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj} (100%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/ParsedEntity.cs (90%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeEncoderBaseTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeHelpersTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeRangeTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeRangesTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UrlEncoderTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/project.json (79%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 1e1b155ed3..28574eee21 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.23107.0 @@ -35,11 +35,11 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.xproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders", "src\Microsoft.Extensions.WebEncoders\Microsoft.Extensions.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Core", "src\Microsoft.Framework.WebEncoders.Core\Microsoft.Framework.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Core", "src\Microsoft.Extensions.WebEncoders.Core\Microsoft.Extensions.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" EndProject @@ -49,9 +49,9 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\Sample EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Sources", "src\Microsoft.Framework.BufferedHtmlContent.Sources\Microsoft.Framework.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Sources", "src\Microsoft.Extensions.BufferedHtmlContent.Sources\Microsoft.Extensions.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Test", "test\Microsoft.Framework.BufferedHtmlContent.Test\Microsoft.Framework.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Test", "test\Microsoft.Extensions.BufferedHtmlContent.Test\Microsoft.Extensions.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 3a6a9f4229..d465e3b553 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -16,9 +16,9 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, - "Microsoft.Framework.BufferedHtmlContent.Sources": { }, - "Microsoft.Framework.WebEncoders": { }, - "Microsoft.Framework.WebEncoders.Core": { }, + "Microsoft.Extensions.BufferedHtmlContent.Sources": { }, + "Microsoft.Extensions.WebEncoders": { }, + "Microsoft.Extensions.WebEncoders.Core": { }, "Microsoft.Net.Http.Headers": { } } }, diff --git a/samples/SampleApp/Program.cs b/samples/SampleApp/Program.cs index c434e6c0a6..0bfe4fbd10 100644 --- a/samples/SampleApp/Program.cs +++ b/samples/SampleApp/Program.cs @@ -1,6 +1,6 @@ -using System; +using System; using System.Diagnostics; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace SampleApp { diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 0e15077764..5f8515bb03 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -6,7 +6,7 @@ using System.Diagnostics; using System.Globalization; using System.IO; using System.Text; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions { diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs index fc77f9edf4..05f09cb7b4 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions { diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index e4f6452bf1..fd368e97e6 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTML content interface.", "repository": { @@ -9,7 +9,7 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "net45" : { }, diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 04430164df..cac2100ce3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -7,7 +7,7 @@ using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Abstractions; -using Microsoft.Framework.Internal; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index 36137ed45c..b6483c15a8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs index d85e960d9b..81c8408753 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index be6422063f..4f1499650d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,7 +3,7 @@ using System; using System.Linq; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index ed59879585..25ba1f2699 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Primitives; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.Primitives; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 3ae66b0aba..1d944cde2a 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -10,8 +10,8 @@ }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs index c986a530c0..6a8d909dba 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -1,8 +1,8 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 78bafd33bc..5b1f70f471 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index d3bfe5f4cf..6806dbaab0 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index 93a5bfc631..f829eec939 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index fa23ebeced..060c04efc7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http.Extensions { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 4ef0842096..1d330ebe5d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -10,7 +10,7 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index 7e61bb915a..d67143e096 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index b46b4ae4b6..2a8b10ab15 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 51e3cada2f..73e5663933 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -9,7 +9,7 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.Primitives": "1.0.0-*" + "Microsoft.Extensions.Primitives": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index 6d6ff1d012..b5e71b8cab 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index 73bf244cbf..900976e647 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 010a13c86c..50a204efcf 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 5dd7ca9163..b0ceafb3f1 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 0eb44ef102..3806a65f06 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index 550ad933eb..a0e7428567 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 20b520b783..2955cddec0 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -4,7 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 6bf5a57ae6..ef8c526945 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs index c1ed5d910e..8239699e1b 100644 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs index 8fb23def3d..d0001c1a5d 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index c4db554c47..e67251f61a 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -3,8 +3,8 @@ using System; using System.Linq; -using Microsoft.Framework.Primitives; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.Primitives; +using Microsoft.Extensions.WebEncoders; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs index fb1e812cca..4aec5c9d27 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs index e94ecbcb30..51cd330dd8 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index de01c47052..72a7b19f4f 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index 98fc30ea26..a7aa9a752c 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using System.Security.Principal; using Microsoft.AspNet.Http; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index d4e36264de..e361bac1c4 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -7,7 +7,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index eb8f311c50..c0ecc8c45c 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 8c87e5db52..ef6f03a92f 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -7,7 +7,7 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index c420073eef..29dfc49574 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 17022d0b2d..465ce48a83 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Primitives; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.Primitives; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 88b039b752..5a64ca96b6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -9,8 +9,8 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.Primitives": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.Primitives": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs similarity index 98% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 0b9ddc770f..3b79916d9c 100644 --- a/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; -namespace Microsoft.Framework.Internal +namespace Microsoft.Extensions.Internal { /// /// Enumerable object collection which knows how to write itself. diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj similarity index 88% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj index 9185ec07d6..6d93971523 100644 --- a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -7,7 +7,7 @@ b1b2b906-24ae-4c57-aac5-19b734014504 - Microsoft.Framework.BufferedHtmlContent.Sources + Microsoft.Extensions.BufferedHtmlContent.Sources ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json similarity index 100% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json diff --git a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs b/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs rename to src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs index 5d396a473a..aae7b3c8b8 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs @@ -4,7 +4,7 @@ using System; using System.Diagnostics; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal struct AllowedCharsBitmap { diff --git a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs rename to src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs index 8858c2df17..dda6499604 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Represents a filter which allows only certain Unicode code points through. diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs rename to src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs index 3ec108fff2..940a8590ae 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal static class EncoderCommon { diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs rename to src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs index df01877f6d..d6428f866e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs @@ -4,7 +4,7 @@ using System; using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Helpful extension methods for the encoder classes. diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs rename to src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs index 7d2b81a8fe..f08f37db52 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains extension methods for fetching encoders from an . diff --git a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs b/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs rename to src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs index a2a350b9a9..3262a1665d 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains helpers for dealing with byte-hex char conversions. diff --git a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs index 5a0553e782..d1347c0338 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// A class which can perform HTML encoding given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs similarity index 92% rename from src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs rename to src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs index f39c3580f8..446bc354a5 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Represents a filter which allows only certain Unicode code points through. diff --git a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs index f7c6adb064..e6bbb35a5c 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Provides services for HTML-encoding input. diff --git a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs index 19b7d843e2..29d07a46cc 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Provides services for JavaScript-escaping strings. diff --git a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs index edcaaffea8..c3e92568ab 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Provides services for URL-escaping strings. diff --git a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs index 6328bdebc1..008c6bcc51 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// A class which can perform JavaScript string escaping given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj b/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj similarity index 100% rename from src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj rename to src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs similarity index 72% rename from src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs rename to src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs index 48510ed635..b781d6ca97 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -5,6 +5,6 @@ using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] +[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs index 1588ec0e19..1a6baaf665 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Text; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal unsafe abstract class UnicodeEncoderBase { diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs index fac3a2e4e1..53e52ef573 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs @@ -7,7 +7,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains helpers for dealing with Unicode code points. diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs index 78a3c41a2f..8320350e16 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Represents a contiguous range of Unicode code points. diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs index f78837bc6e..73d155e141 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains predefined instances which correspond to blocks diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs index 64d522f248..ae2079a309 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs @@ -4,7 +4,7 @@ using System; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public static partial class UnicodeRanges { diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs index e15096659f..f5d6ea1c99 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// A class which can perform URL string escaping given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs b/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs similarity index 94% rename from src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs rename to src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs index 0e06693f3c..b68b05ee50 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). diff --git a/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin b/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin similarity index 100% rename from src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin rename to src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json similarity index 100% rename from src/Microsoft.Framework.WebEncoders.Core/project.json rename to src/Microsoft.Extensions.WebEncoders.Core/project.json diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs similarity index 92% rename from src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs rename to src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs index 13505165d8..0cb40d8a62 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.DependencyInjection.Extensions; -using Microsoft.Framework.OptionsModel; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.WebEncoders; -namespace Microsoft.Framework.DependencyInjection +namespace Microsoft.Extensions.DependencyInjection { public static class EncoderServiceCollectionExtensions { diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj b/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj rename to src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs rename to src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json similarity index 69% rename from src/Microsoft.Framework.WebEncoders/project.json rename to src/Microsoft.Extensions.WebEncoders/project.json index d2a1c401fb..7cd8aac9ad 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -9,9 +9,9 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", + "Microsoft.Extensions.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "net45": { }, diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index a32724ca8f..660b1a4dc6 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using Microsoft.AspNet.Testing; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; using Xunit; namespace Microsoft.AspNet.Html.Abstractions.Test diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 4536c6b8d2..789d27a38d 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Testing": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], + "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs index 2565ef1f80..383f75315e 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -7,7 +7,7 @@ using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index bac140231f..2b7a5ed450 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 4a767821ff..33f6a3ac9c 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index c353d54d68..d69dd0a129 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs similarity index 96% rename from test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs rename to test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index 234da8af9c..e883f84960 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -1,12 +1,12 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; using Xunit; -namespace Microsoft.Framework.Internal +namespace Microsoft.Extensions.Internal { public class BufferedHtmlContentTest { diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj similarity index 88% rename from test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj rename to test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj index a112b34876..a091460b76 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -7,7 +7,7 @@ 3e5311e2-a73e-40cc-a58c-5a62cead43ae - Microsoft.Framework.BufferedHtmlContent.Test + Microsoft.Extensions.BufferedHtmlContent.Test ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json similarity index 64% rename from test/Microsoft.Framework.BufferedHtmlContent.Test/project.json rename to test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json index 8064ceed44..0f4d9b84b3 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json @@ -4,10 +4,10 @@ }, "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.Framework.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], + "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs index faf6d4c982..24cdb75568 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class AllowedCharsBitmapTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs index 64e517a6f0..39624b1fb1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class CodePointFilterTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs index 9f24eae292..b78d91e8c2 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.IO; using System.Runtime.CompilerServices; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Encoder used for unit testing. diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs similarity index 95% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs index debec372ac..ac9fc8bb28 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderCommonTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs index 5b7797340f..abdc1d9cc2 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -5,7 +5,7 @@ using System; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderExtensionsTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs similarity index 97% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index ff6acd3772..790210be39 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderServiceCollectionExtensionsTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index 07b23933e1..b62068a941 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderServiceProviderExtensionsTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs similarity index 96% rename from test/Microsoft.Framework.WebEncoders.Tests/Entities.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs index e10ff951b0..c872b7bf9d 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs @@ -7,7 +7,7 @@ using System.IO; using System.Linq; using Newtonsoft.Json; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal static class Entities { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs similarity index 94% rename from test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs index 14d0f21e9d..97b157b7d5 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public static class Extensions { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs index 471ea4f385..8fe2ddde62 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class HtmlEncoderTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs index 4acee36980..b4d4f250de 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class JavaScriptStringEncoderTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj b/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj similarity index 100% rename from test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj rename to test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj diff --git a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs similarity index 90% rename from test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs index e7bf1f49a6..b52ee7f04f 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs @@ -4,7 +4,7 @@ using System; using Newtonsoft.Json; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal sealed class ParsedEntity { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index 6ee48c5954..1c088e8b16 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -7,7 +7,7 @@ using System.Globalization; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UnicodeEncoderBaseTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs index cf170bf3f8..57ba091465 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -10,7 +10,7 @@ using System.Reflection; using System.Text; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public unsafe class UnicodeHelpersTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs index fd64048673..dd9302f2a1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UnicodeRangeTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs index 208eb34c6b..ddb4b1c646 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs @@ -5,7 +5,7 @@ using System; using System.Reflection; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UnicodeRangesTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs index 54ad81839e..2f31e0e16f 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Text; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UrlEncoderTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json similarity index 79% rename from test/Microsoft.Framework.WebEncoders.Tests/project.json rename to test/Microsoft.Extensions.WebEncoders.Tests/project.json index c5c1f52c94..87d9e98e9c 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { - "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.Extensions.WebEncoders": "1.0.0-*", "Newtonsoft.Json": "6.0.6", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, diff --git a/unicode/how-to-update.txt b/unicode/how-to-update.txt index 246e84891a..5014ea151b 100644 --- a/unicode/how-to-update.txt +++ b/unicode/how-to-update.txt @@ -18,7 +18,7 @@ the WebEncoders project. Running this will drop a file unicode-defined-chars.bin into the output folder. Move this file into the following directory, overwriting the existing file in that directory: - src\Microsoft.Framework.WebEncoders.Core\compiler\resources + src\Microsoft.Extensions.WebEncoders.Core\compiler\resources 4) Open the Generators solution and run the UnicodeTablesGenerator project. Running this will drop two files UnicodeRanges.generated.txt and @@ -33,12 +33,12 @@ the WebEncoders project. - Low Surrogates (U+DC00..U+DFFF) - Private Use Area (U+E000..U+F8FF) -6) Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.generated.cs in +6) Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.generated.cs in your IDE. Delete everything within the partial class definition and replace it with the contents of UnicodeRanges.generated.txt. (Remember to remove the blocks mentioned in the previous step, otherwise unit tests will fail.) - Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.cs in your IDE. + Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.cs in your IDE. Update the doc comment at the top of the class to reflect the appropriate version of the Unicode specification. @@ -48,14 +48,14 @@ the WebEncoders project. See step (5) for the list of which blocks must be removed. Then re-save this file. -8) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeRangesTests.cs in +8) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeRangesTests.cs in your IDE. Delete all of the [InlineData] attributes on the Range_Unicode test, then paste the contents of UnicodeRangesTests.generated.txt in to restore the new [InlineData] list. IMPORTANT: Don't delete the [Theory] attribute on this method! -9) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeHelpersTests.cs in +9) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeHelpersTests.cs in your IDE. Scroll to the bottom of the ReadListOfDefinedCharacters method, and you'll see a section where the test special-cases CJK Ideographs and Hangul Syllables. As more characters are added to the Unicode specification @@ -77,14 +77,14 @@ reflect the version you just submitted. To recap, the files you should check in are: -src\Microsoft.Framework.WebEncoders.Core\compiler\resources\ +src\Microsoft.Extensions.WebEncoders.Core\compiler\resources\ unicode-defined-chars.bin -src\Microsoft.Framework.WebEncoders.Core\ +src\Microsoft.Extensions.WebEncoders.Core\ UnicodeRanges.cs UnicodeRanges.generated.cs -test\Microsoft.Framework.WebEncoders.Tests\ +test\Microsoft.Extensions.WebEncoders.Tests\ UnicodeHelpersTests.cs (if necessary, see step 9) UnicodeRangesTests.cs From 8ecb14733258afa8a8086ac8e53dc2cd0bfdf545 Mon Sep 17 00:00:00 2001 From: damianedwards Date: Fri, 2 Oct 2015 15:38:22 -0700 Subject: [PATCH 405/846] Added overload to PathString.StartsWithSegments to allow specifying StringComparison: - This allows us to have a fast-path (or just be more explicit) for the comparison by doing case-sensitive checks (which are cheaper) --- .../PathString.cs | 56 +++++++++++--- .../PathStringTests.cs | 77 +++++++++++++++++++ 2 files changed, 124 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 4f1499650d..f9538e7444 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Http /// The unescaped path to be assigned to the Value property. public PathString(string value) { - if (!String.IsNullOrEmpty(value) && value[0] != '/') + if (!string.IsNullOrEmpty(value) && value[0] != '/') { throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, nameof(value)); } @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Http /// public bool HasValue { - get { return !String.IsNullOrEmpty(_value); } + get { return !string.IsNullOrEmpty(_value); } } /// @@ -98,23 +98,61 @@ namespace Microsoft.AspNet.Http return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); } + /// + /// Determines whether the beginning of this instance matches the specified . + /// + /// The to compare. + /// true if value matches the beginning of this string; otherwise, false. public bool StartsWithSegments(PathString other) { - string value1 = Value ?? String.Empty; - string value2 = other.Value ?? String.Empty; - if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + return StartsWithSegments(other, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Determines whether the beginning of this instance matches the specified when compared + /// using the specified comparison option. + /// + /// The to compare. + /// One of the enumeration values that determines how this and value are compared. + /// true if value matches the beginning of this string; otherwise, false. + public bool StartsWithSegments(PathString other, StringComparison comparisonType) + { + var value1 = Value ?? string.Empty; + var value2 = other.Value ?? string.Empty; + if (value1.StartsWith(value2, comparisonType)) { return value1.Length == value2.Length || value1[value2.Length] == '/'; } return false; } + /// + /// Determines whether the beginning of this PathString instance matches the specified when compared + /// using the specified comparison option and returns the remaining segments. + /// + /// The to compare. + /// The remaining segments after the match. + /// true if value matches the beginning of this string; otherwise, false. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] public bool StartsWithSegments(PathString other, out PathString remaining) { - string value1 = Value ?? String.Empty; - string value2 = other.Value ?? String.Empty; - if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + return StartsWithSegments(other, StringComparison.OrdinalIgnoreCase, out remaining); + } + + /// + /// Determines whether the beginning of this instance matches the specified and returns + /// the remaining segments. + /// + /// The to compare. + /// One of the enumeration values that determines how this and value are compared. + /// The remaining segments after the match. + /// true if value matches the beginning of this string; otherwise, false. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] + public bool StartsWithSegments(PathString other, StringComparison comparisonType, out PathString remaining) + { + var value1 = Value ?? string.Empty; + var value2 = other.Value ?? string.Empty; + if (value1.StartsWith(value2, comparisonType)) { if (value1.Length == value2.Length || value1[value2.Length] == '/') { @@ -278,7 +316,7 @@ namespace Microsoft.AspNet.Http /// Implicitly calls ToString(). /// /// - public static implicit operator string(PathString path) + public static implicit operator string (PathString path) { return path.ToString(); } diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs index 245ce693e2..48d403a9ee 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNet.Testing; using Xunit; @@ -70,5 +71,81 @@ namespace Microsoft.AspNet.Http result = path + "text"; Assert.Equal("/pathtext", result); } + + [Theory] + [InlineData("/test/path", "/TEST", true)] + [InlineData("/test/path", "/TEST/pa", false)] + [InlineData("/TEST/PATH", "/test", true)] + [InlineData("/TEST/path", "/test/pa", false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", true)] + public void StartsWithSegments_DoesACaseInsensitiveMatch(string sourcePath, string testPath, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + var result = source.StartsWithSegments(test); + + Assert.Equal(expectedResult, result); + } + + [Theory] + [InlineData("/test/path", "/TEST", true)] + [InlineData("/test/path", "/TEST/pa", false)] + [InlineData("/TEST/PATH", "/test", true)] + [InlineData("/TEST/path", "/test/pa", false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", true)] + public void StartsWithSegmentsWithRemainder_DoesACaseInsensitiveMatch(string sourcePath, string testPath, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + PathString remaining; + var result = source.StartsWithSegments(test, out remaining); + + Assert.Equal(expectedResult, result); + } + + [Theory] + [InlineData("/test/path", "/TEST", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/path", "/TEST", StringComparison.Ordinal, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.Ordinal, false)] + [InlineData("/TEST/PATH", "/test", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/TEST/PATH", "/test", StringComparison.Ordinal, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.Ordinal, false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.Ordinal, false)] + public void StartsWithSegments_DoesMatchUsingSpecifiedComparison(string sourcePath, string testPath, StringComparison comparison, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + var result = source.StartsWithSegments(test, comparison); + + Assert.Equal(expectedResult, result); + } + + [Theory] + [InlineData("/test/path", "/TEST", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/path", "/TEST", StringComparison.Ordinal, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.Ordinal, false)] + [InlineData("/TEST/PATH", "/test", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/TEST/PATH", "/test", StringComparison.Ordinal, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.Ordinal, false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.Ordinal, false)] + public void StartsWithSegmentsWithRemainder_DoesMatchUsingSpecifiedComparison(string sourcePath, string testPath, StringComparison comparison, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + PathString remaining; + var result = source.StartsWithSegments(test, comparison, out remaining); + + Assert.Equal(expectedResult, result); + } } } From 3741d3869156ec03db45120ce181ee50e892a800 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 8 Oct 2015 08:36:27 -0700 Subject: [PATCH 406/846] #426 Move IHeaderDictionary to Features to reduce wrapping. --- .../IHeaderDictionary.cs | 34 ------------------- .../IHeaderDictionary.cs | 21 ++++++++++++ .../IHttpRequestFeature.cs | 4 +-- .../IHttpResponseFeature.cs | 4 +-- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 2 +- .../Features/HttpRequestFeature.cs | 8 ++--- .../Features/HttpResponseFeature.cs | 7 ++-- .../DictionaryStringArrayWrapper.cs | 7 ++-- .../DictionaryStringValuesWrapper.cs | 13 ++++++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +-- .../OwinFeatureCollection.cs | 8 ++--- src/Microsoft.AspNet.Owin/Utilities.cs | 4 +-- .../ResponseExtensionTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 10 +++--- 15 files changed, 61 insertions(+), 69 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs create mode 100644 src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs deleted file mode 100644 index b6483c15a8..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; - -namespace Microsoft.AspNet.Http -{ - /// - /// Represents request and response headers - /// - public interface IHeaderDictionary : IReadableStringCollection, IDictionary - { - // This property is duplicated to resolve an ambiguity between IReadableStringCollection and IDictionary - /// - /// - /// - /// - /// The stored value, or StringValues.Empty if the key is not present. - new StringValues this[string key] { get; set; } - - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count - /// - /// Gets the number of elements contained in the collection. - /// - new int Count { get; } - - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys - /// - /// Gets a collection containing the keys. - /// - new ICollection Keys { get; } - } -} diff --git a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs new file mode 100644 index 0000000000..0c03c29d90 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNet.Http +{ + /// + /// Represents request and response headers + /// + public interface IHeaderDictionary : IDictionary + { + /// + /// IHeaderDictionary has a different indexer contract than IDictionary, where it will return StringValues.Empty for missing entries. + /// + /// + /// The stored value, or StringValues.Empty if the key is not present. + new StringValues this[string key] { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index d67143e096..988f2b6194 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; using System.IO; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -15,7 +13,7 @@ namespace Microsoft.AspNet.Http.Features string PathBase { get; set; } string Path { get; set; } string QueryString { get; set; } - IDictionary Headers { get; set; } + IHeaderDictionary Headers { get; set; } Stream Body { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index 2a8b10ab15..67cfa28333 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -2,10 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -13,7 +11,7 @@ namespace Microsoft.AspNet.Http.Features { int StatusCode { get; set; } string ReasonPhrase { get; set; } - IDictionary Headers { get; set; } + IHeaderDictionary Headers { get; set; } Stream Body { get; set; } bool HasStarted { get; } void OnStarting(Func callback, object state); diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 479ead6ebf..b06bc6f410 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.Http.Internal public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpRequestFeature.Headers); } + get { return HttpRequestFeature.Headers; } } public override IReadableStringCollection Cookies diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index e5f09f7ca2..81c5539a81 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -43,7 +43,7 @@ namespace Microsoft.AspNet.Http.Internal public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpResponseFeature.Headers); } + get { return HttpResponseFeature.Headers; } } public override Stream Body diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index 900976e647..de48b71b8a 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -1,10 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections.Generic; using System.IO; -using Microsoft.Extensions.Primitives; +using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { @@ -12,7 +10,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { public HttpRequestFeature() { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new HeaderDictionary(); Body = Stream.Null; Protocol = string.Empty; Scheme = string.Empty; @@ -28,7 +26,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string PathBase { get; set; } public string Path { get; set; } public string QueryString { get; set; } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public Stream Body { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 50a204efcf..adb411ee3a 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.Primitives; +using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { @@ -14,7 +13,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public HttpResponseFeature() { StatusCode = 200; - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new HeaderDictionary(); Body = Stream.Null; } @@ -22,7 +21,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs index 4aec5c9d27..5fe22814d4 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs @@ -4,18 +4,19 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Http; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { internal class DictionaryStringArrayWrapper : IDictionary { - public DictionaryStringArrayWrapper(IDictionary inner) + public DictionaryStringArrayWrapper(IHeaderDictionary inner) { Inner = inner; } - public readonly IDictionary Inner; + public readonly IHeaderDictionary Inner; private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); @@ -27,7 +28,7 @@ namespace Microsoft.AspNet.Owin string[] IDictionary.this[string key] { - get { return Inner[key]; } + get { return ((IDictionary)Inner)[key]; } set { Inner[key] = value; } } diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs index 51cd330dd8..aec1a0d921 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs @@ -4,11 +4,12 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Http; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { - internal class DictionaryStringValuesWrapper : IDictionary + internal class DictionaryStringValuesWrapper : IHeaderDictionary { public DictionaryStringValuesWrapper(IDictionary inner) { @@ -25,6 +26,16 @@ namespace Microsoft.AspNet.Owin private string[] Convert(StringValues item) => item; + StringValues IHeaderDictionary.this[string key] + { + get + { + string[] values; + return Inner.TryGetValue(key, out values) ? values : null; + } + set { Inner[key] = value; } + } + StringValues IDictionary.this[string key] { get { return Inner[key]; } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index c6cdd63926..5e4db89d1a 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -56,13 +56,13 @@ namespace Microsoft.AspNet.Owin { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, () => string.Empty, (feature, value) => feature.Path = Convert.ToString(value)) }, { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), () => string.Empty, (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, - { OwinConstants.RequestHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeHeaderDictionary((IDictionary)value)) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.RequestUser, new FeatureMap(feature => feature.User, () => null, (feature, value) => feature.User = (ClaimsPrincipal)value) }, { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, - { OwinConstants.ResponseHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeHeaderDictionary((IDictionary)value)) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap( feature => new Action, object>((cb, state) => { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 72a7b19f4f..6d955194fa 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -106,9 +106,9 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.RequestQueryString, Utilities.RemoveQuestionMark(value)); } } - IDictionary IHttpRequestFeature.Headers + IHeaderDictionary IHttpRequestFeature.Headers { - get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.RequestHeaders)); } + get { return Utilities.MakeHeaderDictionary(Prop>(OwinConstants.RequestHeaders)); } set { Prop(OwinConstants.RequestHeaders, Utilities.MakeDictionaryStringArray(value)); } } @@ -136,9 +136,9 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseReasonPhrase, value); } } - IDictionary IHttpResponseFeature.Headers + IHeaderDictionary IHttpResponseFeature.Headers { - get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.ResponseHeaders)); } + get { return Utilities.MakeHeaderDictionary(Prop>(OwinConstants.ResponseHeaders)); } set { Prop(OwinConstants.ResponseHeaders, Utilities.MakeDictionaryStringArray(value)); } } diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index a7aa9a752c..00789a86c2 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Owin return new ClaimsPrincipal(principal); } - internal static IDictionary MakeDictionaryStringValues(IDictionary dictionary) + internal static IHeaderDictionary MakeHeaderDictionary(IDictionary dictionary) { var wrapper = dictionary as DictionaryStringArrayWrapper; if (wrapper != null) @@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Owin return new DictionaryStringValuesWrapper(dictionary); } - internal static IDictionary MakeDictionaryStringArray(IDictionary dictionary) + internal static IDictionary MakeDictionaryStringArray(IHeaderDictionary dictionary) { var wrapper = dictionary as DictionaryStringValuesWrapper; if (wrapper != null) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs index 383f75315e..efa5f370ee 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Extensions public bool HasStarted { get { return true; } } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public string ReasonPhrase { get; set; } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 33f6a3ac9c..e020da61fa 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -65,7 +65,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "localhost:9001"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new HeaderDictionary() { { "Host", expected }, }; @@ -85,7 +85,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "löcalhöst"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new HeaderDictionary() { { "Host", "xn--lcalhst-90ae" }, }; @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "xn--lcalhst-90ae"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new HeaderDictionary(); var request = CreateRequest(headers); @@ -188,7 +188,7 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal(new[] { "name2=value2" }, cookieHeaders); } - private static HttpRequest CreateRequest(IDictionary headers) + private static HttpRequest CreateRequest(IHeaderDictionary headers) { var context = new DefaultHttpContext(); context.Features.Get().Headers = headers; @@ -217,7 +217,7 @@ namespace Microsoft.AspNet.Http.Internal private static HttpRequest GetRequestWithHeader(string headerName, string headerValue) { - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new HeaderDictionary(); if (headerValue != null) { headers.Add(headerName, headerValue); From 2303220cf658187754c2dacae77dd863af7fd8a4 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Thu, 8 Oct 2015 19:00:48 -0700 Subject: [PATCH 407/846] React to aspnet/Universe#290 fix --- build.cmd | 25 +++++++++++++------------ build.sh | 12 +++++++----- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/build.cmd b/build.cmd index 70d974a61f..84dc87e480 100644 --- a/build.cmd +++ b/build.cmd @@ -18,22 +18,23 @@ md .nuget copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore -IF EXIST packages\KoreBuild goto run +IF EXIST packages\Sake goto getdnx IF %BUILDCMD_KOREBUILD_VERSION%=="" ( - .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( - .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\nuget.exe install Sake -ExcludeVersion -Out packages +.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages -IF "%SKIP_DNX_INSTALL%"=="1" goto run -IF %BUILDCMD_DNX_VERSION%=="" ( - CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +:getdnx +IF "%SKIP_DNX_INSTALL%"=="" ( + IF "%BUILDCMD_DNX_VERSION%"=="" ( + BUILDCMD_DNX_VERSION=latest + ) + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default + CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default ) ELSE ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -alias default + CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 ) -CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 -:run -CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* \ No newline at end of file +packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index 0c66139817..da4e3fcd1c 100755 --- a/build.sh +++ b/build.sh @@ -24,18 +24,20 @@ if test ! -e .nuget; then cp $cachePath .nuget/nuget.exe fi -if test ! -d packages/KoreBuild; then +if test ! -d packages/Sake; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Out packages + mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages fi if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi -if ! type dnx > /dev/null 2>&1; then - dnvm upgrade +if ! type dnx > /dev/null 2>&1 || [ -z "$SKIP_DNX_INSTALL" ]; then + dnvm install latest -runtime coreclr -alias default + dnvm install default -runtime mono -alias default +else + dnvm use default -runtime mono fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" - From a0b29e3f2bd487ead00b3f878a084b67350dd545 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 12 Oct 2015 12:55:41 -0700 Subject: [PATCH 408/846] Fix local build break --- build.cmd | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cmd b/build.cmd index 84dc87e480..553e3929a0 100644 --- a/build.cmd +++ b/build.cmd @@ -4,8 +4,8 @@ cd %~dp0 SETLOCAL SET NUGET_VERSION=latest SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe -SET BUILDCMD_KOREBUILD_VERSION="" -SET BUILDCMD_DNX_VERSION="" +SET BUILDCMD_KOREBUILD_VERSION= +SET BUILDCMD_DNX_VERSION= IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... @@ -19,7 +19,7 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\Sake goto getdnx -IF %BUILDCMD_KOREBUILD_VERSION%=="" ( +IF "%BUILDCMD_KOREBUILD_VERSION%"=="" ( .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre @@ -27,10 +27,10 @@ IF %BUILDCMD_KOREBUILD_VERSION%=="" ( .nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages :getdnx +IF "%BUILDCMD_DNX_VERSION%"=="" ( + SET BUILDCMD_DNX_VERSION=latest +) IF "%SKIP_DNX_INSTALL%"=="" ( - IF "%BUILDCMD_DNX_VERSION%"=="" ( - BUILDCMD_DNX_VERSION=latest - ) CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default ) ELSE ( From 0581bcf0086159c55fae06d082595efdc723dfc0 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 14 Oct 2015 12:07:07 -0700 Subject: [PATCH 409/846] Update `MediaTypeHeaderValue.IsSubsetOf()` to perform consistent checks - aspnet/Mvc#3138 part 1/2 - check parameters with same polarity as type and subtype - ignore quality factors - bug was obscured because MVC has no formatters supporting wildcard media types nits: - add doc comments - spelling - correct typo in a `project.json` file --- .../MediaTypeHeaderValue.cs | 53 +++++++++++++------ ....Extensions.BufferedHtmlContent.Test.xproj | 6 ++- .../MediaTypeHeaderValueTest.cs | 33 ++++++++---- 3 files changed, 66 insertions(+), 26 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index aebf80e00b..23ed8b0cec 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -219,6 +219,21 @@ namespace Microsoft.Net.Http.Headers get { return _isReadOnly; } } + /// + /// Gets a value indicating whether this is a subset of + /// . A "subset" is defined as the same or a more specific media type + /// according to the precedence described in https://www.ietf.org/rfc/rfc2068.txt section 14.1, Accept. + /// + /// The to compare. + /// + /// A value indicating whether this is a subset of + /// . + /// + /// + /// For example "multipart/mixed; boundary=1234" is a subset of "multipart/mixed; boundary=1234", + /// "multipart/mixed", "multipart/*", and "*/*" but not "multipart/mixed; boundary=2345" or + /// "multipart/message; boundary=1234". + /// public bool IsSubsetOf(MediaTypeHeaderValue otherMediaType) { if (otherMediaType == null) @@ -226,6 +241,7 @@ namespace Microsoft.Net.Http.Headers return false; } + // "text/plain" is a subset of "text/plain", "text/*" and "*/*". "*/*" is a subset only of "*/*". if (!Type.Equals(otherMediaType.Type, StringComparison.OrdinalIgnoreCase)) { if (!otherMediaType.MatchesAllTypes) @@ -241,22 +257,29 @@ namespace Microsoft.Net.Http.Headers } } - if (Parameters != null) + // "text/plain; charset=utf-8; level=1" is a subset of "text/plain; charset=utf-8". In turn + // "text/plain; charset=utf-8" is a subset of "text/plain". + if (otherMediaType._parameters != null && otherMediaType._parameters.Count != 0) { - if (Parameters.Count != 0 && (otherMediaType.Parameters == null || otherMediaType.Parameters.Count == 0)) + // Make sure all parameters in the potential superset are included locally. Fine to have additional + // parameters locally; they make this one more specific. + foreach (var parameter in otherMediaType._parameters) { - return false; - } - - // Make sure all parameters listed locally are listed in the other one. The other one may have additional parameters. - foreach (var param in _parameters) - { - var otherParam = NameValueHeaderValue.Find(otherMediaType._parameters, param.Name); - if (otherParam == null) + if (string.Equals(parameter.Name, "q", StringComparison.OrdinalIgnoreCase)) { + // "q" and later parameters are not involved in media type matching. Quoting the RFC: The first + // "q" parameter (if any) separates the media-range parameter(s) from the accept-params. + break; + } + + var localParameter = NameValueHeaderValue.Find(_parameters, parameter.Name); + if (localParameter == null) + { + // Not found. return false; } - if (!string.Equals(param.Value, otherParam.Value, StringComparison.OrdinalIgnoreCase)) + + if (!string.Equals(parameter.Value, localParameter.Value, StringComparison.OrdinalIgnoreCase)) { return false; } @@ -364,7 +387,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - // Caller must remove leading whitespaces. If not, we'll return 0. + // Caller must remove leading whitespace. If not, we'll return 0. string mediaType = null; var mediaTypeLength = MediaTypeHeaderValue.GetMediaTypeExpressionLength(input, startIndex, out mediaType); @@ -432,7 +455,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - // If there are no whitespaces between and in / get the media type using + // If there is no whitespace between and in / get the media type using // one Substring call. Otherwise get substrings for and and combine them. var mediatTypeLength = current + subtypeLength - startIndex; if (typeLength + subtypeLength + 1 == mediatTypeLength) @@ -454,8 +477,8 @@ namespace Microsoft.Net.Http.Headers throw new ArgumentException("An empty string is not allowed.", parameterName); } - // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. - // Also no LWS between type and subtype are allowed. + // When adding values using strongly typed objects, no leading/trailing LWS (whitespace) is allowed. + // Also no LWS between type and subtype is allowed. string tempMediaType; var mediaTypeLength = GetMediaTypeExpressionLength(mediaType, 0, out tempMediaType); if ((mediaTypeLength == 0) || (tempMediaType.Length != mediaType.Length)) diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj index a091460b76..f0c4c7f35a 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -11,9 +11,11 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ - 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 9ca74a3632..48a4bfab12 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -542,13 +542,16 @@ namespace Microsoft.Net.Http.Headers [Theory] [InlineData("*/*;", "*/*")] - [InlineData("text/*;", "text/*")] + [InlineData("text/*", "text/*")] + [InlineData("text/*;", "*/*")] [InlineData("text/plain;", "text/plain")] - [InlineData("*/*;", "*/*;charset=utf-8;")] - [InlineData("text/*;", "*/*;charset=utf-8;")] - [InlineData("text/plain;", "*/*;charset=utf-8;")] - [InlineData("text/plain;", "text/*;charset=utf-8;")] - [InlineData("text/plain;", "text/plain;charset=utf-8;")] + [InlineData("text/plain", "text/*")] + [InlineData("text/plain;", "*/*")] + [InlineData("*/*;missingparam=4", "*/*")] + [InlineData("text/*;missingparam=4;", "*/*;")] + [InlineData("text/plain;missingparam=4", "*/*;")] + [InlineData("text/plain;missingparam=4", "text/*")] + [InlineData("text/plain;charset=utf-8", "text/plain;charset=utf-8")] [InlineData("text/plain;version=v1", "Text/plain;Version=v1")] [InlineData("text/plain;version=v1", "tExT/plain;version=V1")] [InlineData("text/plain;version=v1", "TEXT/PLAIN;VERSION=V1")] @@ -558,26 +561,38 @@ namespace Microsoft.Net.Http.Headers [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "*/*;charset=utf-8;foo=bar;q=0.0")] public void IsSubsetOf_PositiveCases(string mediaType1, string mediaType2) { + // Arrange var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + // Act var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + + // Assert Assert.True(isSubset); } [Theory] + [InlineData("application/html", "text/*")] + [InlineData("application/json", "application/html")] [InlineData("text/plain;version=v1", "text/plain;version=")] [InlineData("*/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] [InlineData("text/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] - [InlineData("text/plain;missingparam=4;", "text/plain;charset=utf-8;foo=bar;q=0.0")] - [InlineData("text/plain;missingparam=4;", "text/*;charset=utf-8;foo=bar;q=0.0")] - [InlineData("text/plain;missingparam=4;", "*/*;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/*;charset=utf-8;foo=bar;q=0.0", "text/plain;missingparam=4;")] + [InlineData("*/*;charset=utf-8;foo=bar;q=0.0", "text/plain;missingparam=4;")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/plain;missingparam=4;")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/*;missingparam=4;")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "*/*;missingparam=4;")] public void IsSubsetOf_NegativeCases(string mediaType1, string mediaType2) { + // Arrange var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + // Act var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + + // Assert Assert.False(isSubset); } From d28c6e1dbbd6156a6168e331ec8137044cd05ee9 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 14 Oct 2015 14:44:50 -0700 Subject: [PATCH 410/846] Changes for error handling in Authentication --- .../Authentication/AuthenticationManager.cs | 19 ++++++++++------- .../Authentication/AuthenticateContext.cs | 12 +++++++++-- .../Authentication/ChallengeContext.cs | 4 ++-- .../Authentication/SignInContext.cs | 4 ++-- .../Authentication/SignOutContext.cs | 4 ++-- .../DefaultAuthenticationManager.cs | 21 +++++++++---------- .../DefaultAuthenticationManagerTests.cs | 4 ++-- 7 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index a18fe99c97..497ad3e25d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -11,6 +11,11 @@ namespace Microsoft.AspNet.Http.Authentication { public abstract class AuthenticationManager { + /// + /// Constant used to represent the automatic scheme + /// + public const string AutomaticScheme = "Automatic"; + public abstract IEnumerable GetAuthenticationSchemes(); public abstract Task AuthenticateAsync(AuthenticateContext context); @@ -34,14 +39,14 @@ namespace Microsoft.AspNet.Http.Authentication public virtual Task ChallengeAsync(AuthenticationProperties properties) { - return ChallengeAsync(authenticationScheme: string.Empty, properties: properties); + return ChallengeAsync(authenticationScheme: AutomaticScheme, properties: properties); } public virtual Task ChallengeAsync(string authenticationScheme) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } return ChallengeAsync(authenticationScheme: authenticationScheme, properties: null); @@ -50,9 +55,9 @@ namespace Microsoft.AspNet.Http.Authentication // Leave it up to authentication handler to do the right thing for the challenge public virtual Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Automatic); @@ -60,9 +65,9 @@ namespace Microsoft.AspNet.Http.Authentication public virtual Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } if (principal == null) diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index c3ef43c071..187c372fad 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -11,9 +11,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication { public AuthenticateContext(string authenticationScheme) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } AuthenticationScheme = authenticationScheme; @@ -29,6 +29,8 @@ namespace Microsoft.AspNet.Http.Features.Authentication public IDictionary Description { get; private set; } + public Exception Error { get; private set; } + public virtual void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) { Accepted = true; @@ -41,5 +43,11 @@ namespace Microsoft.AspNet.Http.Features.Authentication { Accepted = true; } + + public virtual void Failed(Exception error) + { + Error = error; + Accepted = true; + } } } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index d632a5722e..5989ab4245 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -15,9 +15,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication public ChallengeContext(string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } AuthenticationScheme = authenticationScheme; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index f4bdef8dcb..08591ffa82 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -11,9 +11,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication { public SignInContext(string authenticationScheme, ClaimsPrincipal principal, IDictionary properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } if (principal == null) diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index ba27794c3e..ea89cf9f31 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -10,9 +10,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication { public SignOutContext(string authenticationScheme, IDictionary properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } AuthenticationScheme = authenticationScheme; diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 4dcb81916c..f7de7fcd49 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -54,7 +54,6 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } var handler = HttpAuthenticationFeature.Handler; - if (handler != null) { await handler.AuthenticateAsync(context); @@ -62,15 +61,15 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!context.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {context.AuthenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to authenticate for the scheme: {context.AuthenticationScheme}"); } } public override async Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } var handler = HttpAuthenticationFeature.Handler; @@ -83,15 +82,15 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!challengeContext.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {authenticationScheme}"); } } public override async Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } if (principal == null) @@ -109,15 +108,15 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!signInContext.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {authenticationScheme}"); } } public override async Task SignOutAsync(string authenticationScheme, AuthenticationProperties properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } var handler = HttpAuthenticationFeature.Handler; @@ -130,7 +129,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!signOutContext.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {authenticationScheme}"); } } } diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index a48e80ea03..2b3f666740 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -12,7 +12,7 @@ using Xunit; namespace Microsoft.AspNet.Http.Authentication.Internal { - public class AuthenticationManagerTests + public class DefaultAuthenticationManagerTests { [Fact] @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } [Theory] - [InlineData("")] + [InlineData("Automatic")] [InlineData("Foo")] public async Task ChallengeWithNoAuthMiddlewareMayThrow(string scheme) { From 1f4ca557994d6952294aa4b103dcffd607c7e2f9 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sun, 27 Sep 2015 11:03:26 +0100 Subject: [PATCH 411/846] Features performance Use FeatureCacheHelpers static methods rather than struct FeatureReference by default for lower allocation --- .../DefaultAuthenticationManager.cs | 29 +++++- .../DefaultConnectionInfo.cs | 35 ++++++- .../DefaultHttpContext.cs | 76 +++++++++++---- .../DefaultHttpRequest.cs | 53 +++++++++-- .../DefaultHttpResponse.cs | 29 +++++- .../DefaultWebSocketManager.cs | 22 ++++- .../Features/FeatureHelpers.cs | 93 +++++++++++++++++++ .../Features/IFeatureCache.cs | 10 ++ .../Features/QueryFeature.cs | 26 +++++- .../Features/RequestCookiesFeature.cs | 26 +++++- .../Features/ResponseCookiesFeature.cs | 23 ++++- 11 files changed, 362 insertions(+), 60 deletions(-) create mode 100644 src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs create mode 100644 src/Microsoft.AspNet.Http/Features/IFeatureCache.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 4dcb81916c..e138f98f7d 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -12,25 +12,44 @@ using Microsoft.AspNet.Http.Features.Authentication.Internal; namespace Microsoft.AspNet.Http.Authentication.Internal { - public class DefaultAuthenticationManager : AuthenticationManager + public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache { private readonly IFeatureCollection _features; - private FeatureReference _authentication = FeatureReference.Default; - private FeatureReference _response = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpAuthenticationFeature _authentication; + private IHttpResponseFeature _response; public DefaultAuthenticationManager(IFeatureCollection features) { _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _authentication = null; + _response = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpAuthenticationFeature(), + ref _authentication); + } } private IHttpResponseFeature HttpResponseFeature { - get { return _response.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } } public override IEnumerable GetAuthenticationSchemes() diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 30a7ace398..c0fd423478 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -10,26 +10,51 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultConnectionInfo : ConnectionInfo + public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache { private readonly IFeatureCollection _features; + private int _cachedFeaturesRevision = -1; - private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _tlsConnection = FeatureReference.Default; + private IHttpConnectionFeature _connection; + private ITlsConnectionFeature _tlsConnection; public DefaultConnectionInfo(IFeatureCollection features) { _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _connection = null; + _tlsConnection = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpConnectionFeature HttpConnectionFeature { - get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpConnectionFeature(), + ref _connection); + } } private ITlsConnectionFeature TlsConnectionFeature { - get { return _tlsConnection.Fetch(_features) ?? _tlsConnection.Update(_features, new TlsConnectionFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new TlsConnectionFeature(), + ref _tlsConnection); + } } public override IPAddress RemoteIpAddress diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index db0a4d27ad..089511e231 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -14,20 +14,22 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpContext : HttpContext + public class DefaultHttpContext : HttpContext, IFeatureCache { private readonly HttpRequest _request; private readonly HttpResponse _response; private readonly ConnectionInfo _connection; private readonly AuthenticationManager _authenticationManager; - private FeatureReference _items; - private FeatureReference _serviceProviders; - private FeatureReference _authentication; - private FeatureReference _lifetime; - private FeatureReference _session; + private IItemsFeature _items; + private IServiceProvidersFeature _serviceProviders; + private IHttpAuthenticationFeature _authentication; + private IHttpRequestLifetimeFeature _lifetime; + private ISessionFeature _session; private WebSocketManager _websockets; + private IFeatureCollection _features; + private int _cachedFeaturesRevision = -1; public DefaultHttpContext() : this(new FeatureCollection()) @@ -43,37 +45,77 @@ namespace Microsoft.AspNet.Http.Internal _response = new DefaultHttpResponse(this, features); _connection = new DefaultConnectionInfo(features); _authenticationManager = new DefaultAuthenticationManager(features); + } - _items = FeatureReference.Default; - _serviceProviders = FeatureReference.Default; - _authentication = FeatureReference.Default; - _lifetime = FeatureReference.Default; - _session = FeatureReference.Default; + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision !=_features.Revision) + { + _items = null; + _serviceProviders = null; + _authentication = null; + _lifetime = null; + _session = null; + _cachedFeaturesRevision = _features.Revision; + } } IItemsFeature ItemsFeature { - get { return _items.Fetch(_features) ?? _items.Update(_features, new ItemsFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new ItemsFeature(), + ref _items); + } } IServiceProvidersFeature ServiceProvidersFeature { - get { return _serviceProviders.Fetch(_features) ?? _serviceProviders.Update(_features, new ServiceProvidersFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new ServiceProvidersFeature(), + ref _serviceProviders); + } } private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpAuthenticationFeature(), + ref _authentication); + } } private IHttpRequestLifetimeFeature LifetimeFeature { - get { return _lifetime.Fetch(_features) ?? _lifetime.Update(_features, new HttpRequestLifetimeFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpRequestLifetimeFeature(), + ref _lifetime); + } } private ISessionFeature SessionFeature { - get { return _session.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _session); } + set + { + _features.Set(value); + _session = value; + } } public override IFeatureCollection Features { get { return _features; } } @@ -143,7 +185,7 @@ namespace Microsoft.AspNet.Http.Internal if (feature == null) { feature = new DefaultSessionFeature(); - _session.Update(_features, feature); + SessionFeature = feature; } feature.Session = value; } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 479ead6ebf..2bd87ba81c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -11,15 +11,16 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpRequest : HttpRequest + public class DefaultHttpRequest : HttpRequest, IFeatureCache { private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; + private int _cachedFeaturesRevision = -1; - private FeatureReference _request = FeatureReference.Default; - private FeatureReference _query = FeatureReference.Default; - private FeatureReference _form = FeatureReference.Default; - private FeatureReference _cookies = FeatureReference.Default; + private IHttpRequestFeature _request; + private IQueryFeature _query; + private IFormFeature _form; + private IRequestCookiesFeature _cookies; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) { @@ -27,24 +28,58 @@ namespace Microsoft.AspNet.Http.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _query = null; + _form = null; + _cookies = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpRequestFeature HttpRequestFeature { - get { return _request.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } private IQueryFeature QueryFeature { - get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + (f) => new QueryFeature(f), + ref _query); + } } private IFormFeature FormFeature { - get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(this)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + this, + (r) => new FormFeature(r), + ref _form); + } } private IRequestCookiesFeature RequestCookiesFeature { - get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new RequestCookiesFeature(_features)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + (f) => new RequestCookiesFeature(f), + ref _cookies); + } } public override HttpContext HttpContext { get { return _context; } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index e5f09f7ca2..0d728fd30c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -10,12 +10,14 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpResponse : HttpResponse + public class DefaultHttpResponse : HttpResponse, IFeatureCache { private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _response = FeatureReference.Default; - private FeatureReference _cookies = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpResponseFeature _response; + private IResponseCookiesFeature _cookies; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -23,14 +25,31 @@ namespace Microsoft.AspNet.Http.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _response = null; + _cookies = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpResponseFeature HttpResponseFeature { - get { return _response.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } } private IResponseCookiesFeature ResponseCookiesFeature { - get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + (f) => new ResponseCookiesFeature(f), + ref _cookies); + } } public override HttpContext HttpContext { get { return _context; } } diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 9493859f7c..454b0fa61f 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -10,25 +10,37 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultWebSocketManager : WebSocketManager + public class DefaultWebSocketManager : WebSocketManager, IFeatureCache { private IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; - private FeatureReference _webSockets = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpRequestFeature _request; + private IHttpWebSocketFeature _webSockets; public DefaultWebSocketManager(IFeatureCollection features) { _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _webSockets = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpRequestFeature HttpRequestFeature { - get { return _request.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } private IHttpWebSocketFeature WebSocketFeature { - get { return _webSockets.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _webSockets); } } public override bool IsWebSocketRequest diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs new file mode 100644 index 0000000000..142e0e2aa5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -0,0 +1,93 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http.Features +{ + internal sealed class FeatureHelpers + { + public static T GetAndCache( + IFeatureCache cache, + IFeatureCollection features, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + cachedObject = obj; + } + return obj; + } + + public static T GetOrCreateAndCache( + IFeatureCache cache, + IFeatureCollection features, + Func factory, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + if (obj == null) + { + obj = factory(); + cachedObject = obj; + features.Set(obj); + } + } + return obj; + } + + public static T GetOrCreateAndCache( + IFeatureCache cache, + IFeatureCollection features, + Func factory, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + if (obj == null) + { + obj = factory(features); + cachedObject = obj; + features.Set(obj); + } + } + return obj; + } + + public static T GetOrCreateAndCache( + IFeatureCache cache, + IFeatureCollection features, + HttpRequest request, + Func factory, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + if (obj == null) + { + obj = factory(request); + cachedObject = obj; + features.Set(obj); + } + } + return obj; + } + } +} diff --git a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs new file mode 100644 index 0000000000..80db1ee3c8 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features +{ + internal interface IFeatureCache + { + void CheckFeaturesRevision(); + } +} diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 5dd7ca9163..4a275ec6c3 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -9,10 +9,12 @@ using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { - public class QueryFeature : IQueryFeature + public class QueryFeature : IQueryFeature, IFeatureCache { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpRequestFeature _request; private string _original; private IReadableStringCollection _parsedValues; @@ -46,6 +48,20 @@ namespace Microsoft.AspNet.Http.Features.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _cachedFeaturesRevision = _features.Revision; + } + } + + private IHttpRequestFeature HttpRequestFeature + { + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } + } + public IReadableStringCollection Query { get @@ -55,7 +71,7 @@ namespace Microsoft.AspNet.Http.Features.Internal return _parsedValues ?? ReadableStringCollection.Empty; } - var current = _request.Fetch(_features).QueryString; + var current = HttpRequestFeature.QueryString; if (_parsedValues == null || !string.Equals(_original, current, StringComparison.Ordinal)) { _original = current; @@ -71,12 +87,12 @@ namespace Microsoft.AspNet.Http.Features.Internal if (value == null) { _original = string.Empty; - _request.Fetch(_features).QueryString = string.Empty; + HttpRequestFeature.QueryString = string.Empty; } else { _original = QueryString.Create(_parsedValues).ToString(); - _request.Fetch(_features).QueryString = _original; + HttpRequestFeature.QueryString = _original; } } } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 0eb44ef102..2a10f15a16 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -10,10 +10,12 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal { - public class RequestCookiesFeature : IRequestCookiesFeature + public class RequestCookiesFeature : IRequestCookiesFeature, IFeatureCache { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpRequestFeature _request; private StringValues _original; private IReadableStringCollection _parsedValues; @@ -43,6 +45,20 @@ namespace Microsoft.AspNet.Http.Features.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _cachedFeaturesRevision = _features.Revision; + } + } + + private IHttpRequestFeature HttpRequestFeature + { + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } + } + public IReadableStringCollection Cookies { get @@ -52,7 +68,7 @@ namespace Microsoft.AspNet.Http.Features.Internal return _parsedValues ?? ReadableStringCollection.Empty; } - var headers = _request.Fetch(_features).Headers; + var headers = HttpRequestFeature.Headers; StringValues current; if (!headers.TryGetValue(HeaderNames.Cookie, out current)) { @@ -81,7 +97,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { if (_parsedValues == null || _parsedValues.Count == 0) { - _request.Fetch(_features).Headers.Remove(HeaderNames.Cookie); + HttpRequestFeature.Headers.Remove(HeaderNames.Cookie); } else { @@ -94,7 +110,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } } _original = headers.ToArray(); - _request.Fetch(_features).Headers[HeaderNames.Cookie] = _original; + HttpRequestFeature.Headers[HeaderNames.Cookie] = _original; } } } diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index 96504f1ff7..d56ba114ef 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -5,10 +5,12 @@ using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { - public class ResponseCookiesFeature : IResponseCookiesFeature + public class ResponseCookiesFeature : IResponseCookiesFeature, IFeatureCache { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpResponseFeature _response; private IResponseCookies _cookiesCollection; public ResponseCookiesFeature(IFeatureCollection features) @@ -16,16 +18,29 @@ namespace Microsoft.AspNet.Http.Features.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _response = null; + _cachedFeaturesRevision = _features.Revision; + } + } + + private IHttpResponseFeature HttpResponseFeature + { + get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } + } + public IResponseCookies Cookies { get { if (_cookiesCollection == null) { - var headers = _request.Fetch(_features).Headers; + var headers = HttpResponseFeature.Headers; _cookiesCollection = new ResponseCookies(new HeaderDictionary(headers)); } - return _cookiesCollection; } } From e01a05d21439815370a6b82682839390b7c57a24 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 15 Oct 2015 19:56:41 +0100 Subject: [PATCH 412/846] Move RequestIdentifierFeature to HttpContext Rebased #435 Allow lazier instantiation Expose TraceIdentifier on Httpcontext Also resolves #412 Add tests --- .../HttpContext.cs | 2 + .../DefaultHttpContext.cs | 15 +++++ .../Features/FeatureHelpers.cs | 15 +++++ .../Features/HttpRequestIdentifierFeature.cs | 56 ++++++++++++++++++- src/Microsoft.AspNet.Http/project.json | 3 +- .../DefaultHttpContextTests.cs | 14 +++++ .../HttpRequestIdentifierFeatureTests.cs | 44 +++++++++++++++ 7 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 7a7a35e543..191d0a5d42 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -34,6 +34,8 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken RequestAborted { get; set; } + public abstract string TraceIdentifier { get; set; } + public abstract ISession Session { get; set; } public abstract void Abort(); diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index b3e92ee208..ffc6acc670 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -118,6 +118,15 @@ namespace Microsoft.AspNet.Http.Internal } } + private IHttpRequestIdentifierFeature RequestIdentifierFeature + { + get { + return FeatureHelpers.GetOrCreate( + _features, + () => new HttpRequestIdentifierFeature()); + } + } + public override IFeatureCollection Features { get { return _features; } } public override HttpRequest Request { get { return _request; } } @@ -167,6 +176,12 @@ namespace Microsoft.AspNet.Http.Internal set { LifetimeFeature.RequestAborted = value; } } + public override string TraceIdentifier + { + get { return RequestIdentifierFeature.TraceIdentifier; } + set { RequestIdentifierFeature.TraceIdentifier = value; } + } + public override ISession Session { get diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs index 142e0e2aa5..fc59b00e6e 100644 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -23,6 +23,21 @@ namespace Microsoft.AspNet.Http.Features return obj; } + public static T GetOrCreate( + IFeatureCollection features, + Func factory) + { + T obj = features.Get(); + if (obj == null) + { + obj = factory(); + features.Set(obj); + } + + return obj; + } + + public static T GetOrCreateAndCache( IFeatureCache cache, IFeatureCollection features, diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs index 01dd9d0ee5..71f78614e9 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs @@ -1,10 +1,64 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Threading; + namespace Microsoft.AspNet.Http.Features.Internal { public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { - public string TraceIdentifier { get; set; } + // Base64 encoding - but in ascii sort order for easy text based sorting + private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; + // Seed the _requestId for this application instance with + // the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001 + // for a roughly increasing _requestId over restarts + private static long _requestId = DateTime.UtcNow.Ticks; + + private string _id = null; + + public string TraceIdentifier + { + get + { + // Don't incur the cost of generating the request ID until it's asked for + if (_id == null) + { + _id = GenerateRequestId(Interlocked.Increment(ref _requestId)); + } + return _id; + } + set + { + _id = value; + } + } + + private static unsafe string GenerateRequestId(long id) + { + // The following routine is ~310% faster than calling long.ToString() on x64 + // and ~600% faster than calling long.ToString() on x86 in tight loops of 1 million+ iterations + // See: https://github.com/aspnet/Hosting/pull/385 + + // stackalloc to allocate array on stack rather than heap + char* charBuffer = stackalloc char[13]; + + charBuffer[0] = _encode32Chars[(int)(id >> 60) & 31]; + charBuffer[1] = _encode32Chars[(int)(id >> 55) & 31]; + charBuffer[2] = _encode32Chars[(int)(id >> 50) & 31]; + charBuffer[3] = _encode32Chars[(int)(id >> 45) & 31]; + charBuffer[4] = _encode32Chars[(int)(id >> 40) & 31]; + charBuffer[5] = _encode32Chars[(int)(id >> 35) & 31]; + charBuffer[6] = _encode32Chars[(int)(id >> 30) & 31]; + charBuffer[7] = _encode32Chars[(int)(id >> 25) & 31]; + charBuffer[8] = _encode32Chars[(int)(id >> 20) & 31]; + charBuffer[9] = _encode32Chars[(int)(id >> 15) & 31]; + charBuffer[10] = _encode32Chars[(int)(id >> 10) & 31]; + charBuffer[11] = _encode32Chars[(int)(id >> 5) & 31]; + charBuffer[12] = _encode32Chars[(int)id & 31]; + + // string ctor overload that takes char* + return new string(charBuffer, 0, 13); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 27cb110745..6ea620d194 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "allowUnsafe": true }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index b8c9691e35..3d7305b89d 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -119,6 +119,20 @@ namespace Microsoft.AspNet.Http.Internal Assert.Same(item, context.Items["foo"]); } + [Fact] + public void GetItems_DefaultRequestIdentifierAvailable() + { + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.Null(context.Features.Get()); + var traceIdentifier = context.TraceIdentifier; + Assert.NotNull(context.Features.Get()); + Assert.NotNull(traceIdentifier); + Assert.Same(traceIdentifier, context.TraceIdentifier); + + context.TraceIdentifier = "Hello"; + Assert.Same("Hello", context.TraceIdentifier); + } + [Fact] public void SetItems_NewCollectionUsed() { diff --git a/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs new file mode 100644 index 0000000000..c117a48d66 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs @@ -0,0 +1,44 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features.Internal; +using Xunit; + +namespace Microsoft.AspNet.Http.Tests +{ + public class HttpRequestIdentifierFeatureTests + { + [Fact] + public void TraceIdentifier_ReturnsId() + { + var feature = new HttpRequestIdentifierFeature(); + + var id = feature.TraceIdentifier; + + Assert.NotNull(id); + } + + [Fact] + public void TraceIdentifier_ReturnsStableId() + { + var feature = new HttpRequestIdentifierFeature(); + + var id1 = feature.TraceIdentifier; + var id2 = feature.TraceIdentifier; + + Assert.Equal(id1, id2); + } + + [Fact] + public void TraceIdentifier_ReturnsUniqueIdForDifferentInstances() + { + var feature1 = new HttpRequestIdentifierFeature(); + var feature2 = new HttpRequestIdentifierFeature(); + + var id1 = feature1.TraceIdentifier; + var id2 = feature2.TraceIdentifier; + + Assert.NotEqual(id1, id2); + } + } +} \ No newline at end of file From 327611587735e688314a2ac8aff606aadc63cb2d Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 16 Oct 2015 00:40:37 +0100 Subject: [PATCH 413/846] Comment sp --- .../Features/HttpRequestIdentifierFeature.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs index 71f78614e9..ba7cac52d9 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { - // Base64 encoding - but in ascii sort order for easy text based sorting + // Base32 encoding - in ascii sort order for easy text based sorting private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; // Seed the _requestId for this application instance with // the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001 @@ -61,4 +61,4 @@ namespace Microsoft.AspNet.Http.Features.Internal return new string(charBuffer, 0, 13); } } -} \ No newline at end of file +} From 221df714258668603319e75828e9546eaa13926d Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 8 Oct 2015 16:01:20 -0700 Subject: [PATCH 414/846] Incorporate StringSegment from primitives --- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 146 -------------------- 1 file changed, 146 deletions(-) diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index ef8c526945..9f6feb3d75 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -361,152 +361,6 @@ namespace Microsoft.AspNet.Http.Internal } } - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] - internal struct StringSegment : IEquatable - { - private readonly string _buffer; - private readonly int _offset; - private readonly int _count; - - // - // Initializes a new instance of the class. - // - public StringSegment(string buffer, int offset, int count) - { - _buffer = buffer; - _offset = offset; - _count = count; - } - - public string Buffer - { - get { return _buffer; } - } - - public int Offset - { - get { return _offset; } - } - - public int Count - { - get { return _count; } - } - - public string Value - { - get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } - } - - public bool HasValue - { - get { return _offset != -1 && _count != 0 && _buffer != null; } - } - - #region Equality members - - public bool Equals(StringSegment other) - { - return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is StringSegment && Equals((StringSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ _offset; - hashCode = (hashCode * 397) ^ _count; - return hashCode; - } - } - - public static bool operator ==(StringSegment left, StringSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(StringSegment left, StringSegment right) - { - return !left.Equals(right); - } - - #endregion - - public bool StartsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public bool EndsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; - } - - public bool Equals(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count != textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public string Substring(int offset, int length) - { - return _buffer.Substring(_offset + offset, length); - } - - public StringSegment Subsegment(int offset, int length) - { - return new StringSegment(_buffer, _offset + offset, length); - } - - public override string ToString() - { - return Value ?? string.Empty; - } - } - internal static class ParsingHelpers { public static StringValues GetHeader(IDictionary headers, string key) From f00c7c6d060e6d318efe9d1ed320db49716ee0a0 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 19 Oct 2015 14:18:13 -0700 Subject: [PATCH 415/846] Fix CoreCLR test pass on Linux (fixes #442). --- .../HtmlContentBuilderExtensionsTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 660b1a4dc6..b1a8fab41f 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -326,7 +326,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - [ReplaceCulture] + [ReplaceCulture("de-DE", "de-DE")] public void Builder_AppendFormat_WithDifferentCurrentCulture() { // Arrange @@ -337,7 +337,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test // Assert Assert.Equal( - "HtmlEncode[[01 February 2015]]", + "HtmlEncode[[Sonntag, 1. Februar 2015]]", HtmlContentToString(builder)); } From 7ed6a6cb578ca9a18c44751acca2257d752c0699 Mon Sep 17 00:00:00 2001 From: DamianEdwards Date: Mon, 19 Oct 2015 14:16:50 -0700 Subject: [PATCH 416/846] Add doc-comments for main APIs - Coherence-Signed#75 --- .../HttpResponseWritingExtensions.cs | 18 +++--- .../Extensions/MapExtensions.cs | 17 +++--- .../Extensions/MapMiddleware.cs | 13 +++++ .../Extensions/MapOptions.cs | 6 +- .../Extensions/MapWhenExtensions.cs | 2 +- .../Extensions/MapWhenMiddleware.cs | 13 +++++ .../Extensions/MapWhenOptions.cs | 6 +- .../Extensions/RunExtensions.cs | 8 +++ .../Extensions/UseExtensions.cs | 9 ++- .../Extensions/UseMiddlewareExtensions.cs | 30 ++++++++-- .../HttpContext.cs | 46 +++++++++++++++ .../HttpRequest.cs | 6 ++ .../HttpResponse.cs | 58 +++++++++++++++++++ .../IApplicationBuilder.cs | 26 +++++++++ .../RequestDelegate.cs | 5 ++ .../WebSocketManager.cs | 18 ++++++ .../IFeatureCollection.cs | 5 +- 17 files changed, 253 insertions(+), 33 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs index 953cd7ce6e..fd0553b3c0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs @@ -16,10 +16,10 @@ namespace Microsoft.AspNet.Http /// /// Writes the given text to the response body. UTF-8 encoding will be used. /// - /// - /// - /// - /// + /// The . + /// The text to write to the response. + /// Notifies when request operations should be cancelled. + /// A task that represents the completion of the write operation. public static Task WriteAsync(this HttpResponse response, string text, CancellationToken cancellationToken = default(CancellationToken)) { if (response == null) @@ -38,11 +38,11 @@ namespace Microsoft.AspNet.Http /// /// Writes the given text to the response body using the given encoding. /// - /// - /// - /// - /// - /// + /// The . + /// The text to write to the response. + /// The encoding to use. + /// Notifies when request operations should be cancelled. + /// A task that represents the completion of the write operation. public static Task WriteAsync(this HttpResponse response, string text, Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) { if (response == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 94985df589..c06c37563a 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -7,16 +7,19 @@ using Microsoft.AspNet.Builder.Extensions; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for the . + /// public static class MapExtensions { /// - /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of - /// continuing to the next component in the pipeline. + /// Branches the request pipeline based on matches of the given request path. If the request path starts with + /// the given path, the branch is executed. /// - /// - /// The path to match - /// The branch to take for positive path matches - /// + /// The instance. + /// The request path to match. + /// The branch to take for positive path matches. + /// The instance. public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action configuration) { if (app == null) @@ -39,7 +42,7 @@ namespace Microsoft.AspNet.Builder configuration(branchBuilder); var branch = branchBuilder.Build(); - var options = new MapOptions() + var options = new MapOptions { Branch = branch, PathMatch = pathMatch, diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index f35e0a5480..2b2c80b06f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -7,11 +7,19 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { + /// + /// Respresents a middleware that maps a request path to a sub-request pipeline. + /// public class MapMiddleware { private readonly RequestDelegate _next; private readonly MapOptions _options; + /// + /// Creates a new instace of . + /// + /// The delegate representing the next middleware in the request pipeline. + /// The middleware options. public MapMiddleware(RequestDelegate next, MapOptions options) { if (next == null) @@ -28,6 +36,11 @@ namespace Microsoft.AspNet.Builder.Extensions _options = options; } + /// + /// Executes the middleware. + /// + /// The for the current request. + /// A task that represents the execution of this middleware. public async Task Invoke(HttpContext context) { if (context == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs index d0453902f4..dc16d15482 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs @@ -6,17 +6,17 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { /// - /// Options for the Map middleware + /// Options for the . /// public class MapOptions { /// - /// The path to match + /// The path to match. /// public PathString PathMatch { get; set; } /// - /// The branch taken for a positive match + /// The branch taken for a positive match. /// public RequestDelegate Branch { get; set; } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs index cabe45094d..7bd658460e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Builder using Predicate = Func; /// - /// Extension methods for the MapWhenMiddleware + /// Extension methods for the . /// public static class MapWhenExtensions { diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs index b1ac27f800..26ba9f0d81 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -7,11 +7,19 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { + /// + /// Respresents a middleware that runs a sub-request pipeline when a given predicate is matched. + /// public class MapWhenMiddleware { private readonly RequestDelegate _next; private readonly MapWhenOptions _options; + /// + /// Creates a new instance of . + /// + /// The delegate representing the next middleware in the request pipeline. + /// The middleware options. public MapWhenMiddleware(RequestDelegate next, MapWhenOptions options) { if (next == null) @@ -28,6 +36,11 @@ namespace Microsoft.AspNet.Builder.Extensions _options = options; } + /// + /// Executes the middleware. + /// + /// The for the current request. + /// A task that represents the execution of this middleware. public async Task Invoke(HttpContext context) { if (context == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs index aa6263366e..9b430b2d4d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -7,14 +7,14 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { /// - /// Options for the MapWhen middleware + /// Options for the . /// public class MapWhenOptions { private Func _predicate; /// - /// The user callback that determines if the branch should be taken + /// The user callback that determines if the branch should be taken. /// public Func Predicate { @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Builder.Extensions } /// - /// The branch taken for a positive match + /// The branch taken for a positive match. /// public RequestDelegate Branch { get; set; } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index d79949c5c8..8280b285ce 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -5,8 +5,16 @@ using System; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for adding terminal middleware. + /// public static class RunExtensions { + /// + /// Adds a terminal middleware delagate to the application's request pipeline. + /// + /// The instance. + /// A delegate that handles the request. public static void Run(this IApplicationBuilder app, RequestDelegate handler) { if (app == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs index 1a14048128..163dcfd19f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs @@ -7,14 +7,17 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for adding middleware. + /// public static class UseExtensions { /// - /// Use middleware defined in-line. + /// Adds a middleware delagate defined in-line to the application's request pipeline. /// - /// + /// The instance. /// A function that handles the request or calls the given next function. - /// + /// The instance. public static IApplicationBuilder Use(this IApplicationBuilder app, Func, Task> middleware) { return app.Use(next => diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index cac2100ce3..fe13dab8c8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -11,18 +11,36 @@ using Microsoft.Extensions.Internal; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for adding typed middlware. + /// public static class UseMiddlewareExtensions { const string InvokeMethodName = "Invoke"; - public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) + + /// + /// Adds a middleware type to the application's request pipeline. + /// + /// The middleware type. + /// The instance. + /// The arguments to pass to the middleware type instance's constructor. + /// The instance. + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder app, params object[] args) { - return builder.UseMiddleware(typeof(T), args); + return app.UseMiddleware(typeof(TMiddleware), args); } - public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) + /// + /// Adds a middleware type to the application's request pipeline. + /// + /// The instance. + /// The middleware type. + /// The arguments to pass to the middleware type instance's constructor. + /// The instance. + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder app, Type middleware, params object[] args) { - var applicationServices = builder.ApplicationServices; - return builder.Use(next => + var applicationServices = app.ApplicationServices; + return app.Use(next => { var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public); var invokeMethods = methods.Where(m => string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal)).ToArray(); @@ -48,7 +66,7 @@ namespace Microsoft.AspNet.Builder throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName,nameof(HttpContext))); } - var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var instance = ActivatorUtilities.CreateInstance(app.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); if (parameters.Length == 1) { return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 191d0a5d42..162f3c582d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -10,34 +10,80 @@ using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { + /// + /// Encapsulates all HTTP-specific information about an individual HTTP request. + /// public abstract class HttpContext { + /// + /// Gets the collection of HTTP features provided by the server and middleware available on this request. + /// public abstract IFeatureCollection Features { get; } + /// + /// Gets the object for this request. + /// public abstract HttpRequest Request { get; } + /// + /// Gets the object for this request. + /// public abstract HttpResponse Response { get; } + /// + /// Gets information about the underlying connection for this request. + /// public abstract ConnectionInfo Connection { get; } + /// + /// Gets an object that manages the establishment of WebSocket connections for this request. + /// public abstract WebSocketManager WebSockets { get; } + /// + /// Gets an object that facilitates authentication for this request. + /// public abstract AuthenticationManager Authentication { get; } + /// + /// Gets or sets the the user for this request. + /// public abstract ClaimsPrincipal User { get; set; } + /// + /// Gets or sets a key/value collection that can be used to share data within the scope of this request. + /// public abstract IDictionary Items { get; set; } + /// + /// Gets or sets the that provides access to the application's service container. + /// public abstract IServiceProvider ApplicationServices { get; set; } + /// + /// Gets or sets the that provides access to the request's service container. + /// public abstract IServiceProvider RequestServices { get; set; } + /// + /// Notifies when the connection underlying this request is aborted and thus request operations should be + /// cancelled. + /// public abstract CancellationToken RequestAborted { get; set; } + /// + /// Gets or sets a unique identifier to represent this request in trace logs. + /// public abstract string TraceIdentifier { get; set; } + /// + /// Gets or sets the object used to manage user session data for this request. + /// public abstract ISession Session { get; set; } + /// + /// Aborts the connection underlying this request. + /// public abstract void Abort(); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 4cbbf62a6f..283eddf4b8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -7,8 +7,14 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { + /// + /// Represents the incoming side of an individual HTTP request. + /// public abstract class HttpRequest { + /// + /// Gets the this request; + /// public abstract HttpContext HttpContext { get; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 195ef02330..1e3344459c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -7,6 +7,9 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { + /// + /// Represents the outgoing side of an individual HTTP request. + /// public abstract class HttpResponse { private static readonly Func _callbackDelegate = callback => ((Func)callback)(); @@ -16,34 +19,89 @@ namespace Microsoft.AspNet.Http return Task.FromResult(0); }; + /// + /// Gets the for this request. + /// public abstract HttpContext HttpContext { get; } + /// + /// Gets or sets the HTTP response code. + /// public abstract int StatusCode { get; set; } + /// + /// Gets the response headers. + /// public abstract IHeaderDictionary Headers { get; } + /// + /// Gets the response body . + /// public abstract Stream Body { get; set; } + /// + /// Gets or sets the value for the Content-Length response header. + /// public abstract long? ContentLength { get; set; } + /// + /// Gets or sets the value for the Content-Type response header. + /// public abstract string ContentType { get; set; } + /// + /// Gets an object that can be used to manage cookies for this response. + /// public abstract IResponseCookies Cookies { get; } + /// + /// Gets a value indicating whether response headers have been sent to the client. + /// public abstract bool HasStarted { get; } + /// + /// Adds a delegate to be invoked just before response headers will be sent to the client. + /// + /// The delegate to execute. + /// A state object to capture and pass back to the delegate. public abstract void OnStarting(Func callback, object state); + /// + /// Adds a delegate to be invoked just before response headers will be sent to the client. + /// + /// The delegate to execute. public virtual void OnStarting(Func callback) => OnStarting(_callbackDelegate, callback); + /// + /// Adds a delegate to be invoked after the response has finished being sent to the client. + /// + /// The delegate to invoke. + /// A state object to capture and pass back to the delegate. public abstract void OnCompleted(Func callback, object state); + /// + /// Registers an object for disposal by the host once the request has finished processing. + /// + /// The object to be disposed. public virtual void RegisterForDispose(IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + /// + /// Adds a delegate to be invoked after the response has finished being sent to the client. + /// + /// The delegate to invoke. public virtual void OnCompleted(Func callback) => OnCompleted(_callbackDelegate, callback); + /// + /// Returns a temporary redirect response (HTTP 302) to the client. + /// + /// The URL to redirect the client to. public virtual void Redirect(string location) => Redirect(location, permanent: false); + /// + /// Returns a redirect response (HTTP 301 or HTTP 302) to the client. + /// + /// The URL to redirect the client to. + /// True if the redirect is permanent (301), otherwise false (302). public abstract void Redirect(string location, bool permanent); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index e74bdec015..342b7b4f30 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -7,18 +7,44 @@ using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Builder { + /// + /// Defines a class that provides the mechanisms to configure an application's request pipeline. + /// public interface IApplicationBuilder { + /// + /// Gets or sets the that provides access to the application's service container. + /// IServiceProvider ApplicationServices { get; set; } + /// + /// Gets the set of HTTP features the application's server provides. + /// IFeatureCollection ServerFeatures { get; } + /// + /// Gets a key/value collection that can be used to share data between middleware. + /// IDictionary Properties { get; } + /// + /// Adds a middleware delegate to the application's request pipeline. + /// + /// The middleware delgate. + /// The . IApplicationBuilder Use(Func middleware); + /// + /// Creates a new that shares the of this + /// . + /// + /// The new . IApplicationBuilder New(); + /// + /// Builds the delegate used by this application to process HTTP requests. + /// + /// The request handling delegate. RequestDelegate Build(); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs index c4c2f8d94e..87d215ad6f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs @@ -6,5 +6,10 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { + /// + /// A function that can process an HTTP request. + /// + /// The for the request. + /// A task that represents the completion of request processing. public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs index b1dd679ef0..e569e549b9 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs @@ -7,17 +7,35 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { + /// + /// Manages the establishment of WebSocket connections for a specific HTTP request. + /// public abstract class WebSocketManager { + /// + /// Gets a value indicating whether the request is a WebSocket establishment request. + /// public abstract bool IsWebSocketRequest { get; } + /// + /// Gets the list of requested WebSocket sub-protocols. + /// public abstract IList WebSocketRequestedProtocols { get; } + /// + /// Transitions the request to a WebSocket connection. + /// + /// A task representing the completion of the transition. public virtual Task AcceptWebSocketAsync() { return AcceptWebSocketAsync(subProtocol: null); } + /// + /// Transitions the request to a WebSocket connection using the specified sub-protocol. + /// + /// The sub-protocol to use. + /// A task representing the completion of the transition. public abstract Task AcceptWebSocketAsync(string subProtocol); } } diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index 8da86ea5b9..c7ad165c66 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -6,6 +6,9 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http.Features { + /// + /// Represents a collection of HTTP features. + /// public interface IFeatureCollection : IEnumerable> { /// @@ -14,7 +17,7 @@ namespace Microsoft.AspNet.Http.Features bool IsReadOnly { get; } /// - /// Incremented for each modification and can be used verify cached results. + /// Incremented for each modification and can be used to verify cached results. /// int Revision { get; } From 14c96f695a91207e2d5d048b38fce958fe69bbca Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 21 Oct 2015 15:43:42 -0700 Subject: [PATCH 417/846] Rename `AppendEncoded()` to `AppendHtml()` - aspnet/Mvc#3225, 1 of 3 --- .../HtmlContentBuilderExtensions.cs | 6 +++--- .../IHtmlContentBuilder.cs | 2 +- .../BufferedHtmlContent.cs | 2 +- .../HtmlContentBuilderExtensionsTest.cs | 6 +++--- .../BufferedHtmlContentTest.cs | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 5f8515bb03..b3b9fc23e7 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -136,9 +136,9 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . /// The HTML encoded to append. /// The . - public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) { - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -180,7 +180,7 @@ namespace Microsoft.AspNet.Html.Abstractions public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) { builder.Clear(); - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); return builder; } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index ced5bd763e..e55cec3530 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// The HTML encoded to append. /// The . - IHtmlContentBuilder AppendEncoded(string encoded); + IHtmlContentBuilder AppendHtml(string encoded); /// /// Clears the content. diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 3b79916d9c..ba32edf99c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -48,7 +48,7 @@ namespace Microsoft.Extensions.Internal /// /// The HTML encoded string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder AppendEncoded(string value) + public IHtmlContentBuilder AppendHtml(string value) { Entries.Add(new HtmlEncodedString(value)); return this; diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index b1a8fab41f..1f2d9975ed 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -62,13 +62,13 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_AppendLineEncoded_String() + public void Builder_AppendHtmlLine_String() { // Arrange var builder = new TestHtmlContentBuilder(); // Act - builder.AppendLineEncoded("Hi"); + builder.AppendHtmlLine("Hi"); // Assert Assert.Collection( @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public IHtmlContentBuilder AppendEncoded(string encoded) + public IHtmlContentBuilder AppendHtml(string encoded) { Entries.Add(new EncodedString(encoded)); return this; diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index e883f84960..2eebd6041e 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -41,11 +41,11 @@ namespace Microsoft.Extensions.Internal } [Fact] - public void AppendEncoded_DoesNotGetWrittenAsEncoded() + public void AppendHtml_DoesNotGetWrittenAsEncoded() { // Arrange var content = new BufferedHtmlContent(); - content.AppendEncoded("Hello"); + content.AppendHtml("Hello"); var writer = new StringWriter(); From 9d7300c52bad4c249d953366156025edc9757b9d Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 21 Oct 2015 15:45:55 -0700 Subject: [PATCH 418/846] Revert "Rename `AppendEncoded()` to `AppendHtml()`" This reverts commit 14c96f695a91207e2d5d048b38fce958fe69bbca. --- .../HtmlContentBuilderExtensions.cs | 6 +++--- .../IHtmlContentBuilder.cs | 2 +- .../BufferedHtmlContent.cs | 2 +- .../HtmlContentBuilderExtensionsTest.cs | 6 +++--- .../BufferedHtmlContentTest.cs | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index b3b9fc23e7..5f8515bb03 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -136,9 +136,9 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . /// The HTML encoded to append. /// The . - public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) { - builder.AppendHtml(encoded); + builder.AppendEncoded(encoded); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -180,7 +180,7 @@ namespace Microsoft.AspNet.Html.Abstractions public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) { builder.Clear(); - builder.AppendHtml(encoded); + builder.AppendEncoded(encoded); return builder; } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index e55cec3530..ced5bd763e 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// The HTML encoded to append. /// The . - IHtmlContentBuilder AppendHtml(string encoded); + IHtmlContentBuilder AppendEncoded(string encoded); /// /// Clears the content. diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index ba32edf99c..3b79916d9c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -48,7 +48,7 @@ namespace Microsoft.Extensions.Internal /// /// The HTML encoded string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder AppendHtml(string value) + public IHtmlContentBuilder AppendEncoded(string value) { Entries.Add(new HtmlEncodedString(value)); return this; diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 1f2d9975ed..b1a8fab41f 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -62,13 +62,13 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_AppendHtmlLine_String() + public void Builder_AppendLineEncoded_String() { // Arrange var builder = new TestHtmlContentBuilder(); // Act - builder.AppendHtmlLine("Hi"); + builder.AppendLineEncoded("Hi"); // Assert Assert.Collection( @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public IHtmlContentBuilder AppendHtml(string encoded) + public IHtmlContentBuilder AppendEncoded(string encoded) { Entries.Add(new EncodedString(encoded)); return this; diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index 2eebd6041e..e883f84960 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -41,11 +41,11 @@ namespace Microsoft.Extensions.Internal } [Fact] - public void AppendHtml_DoesNotGetWrittenAsEncoded() + public void AppendEncoded_DoesNotGetWrittenAsEncoded() { // Arrange var content = new BufferedHtmlContent(); - content.AppendHtml("Hello"); + content.AppendEncoded("Hello"); var writer = new StringWriter(); From 0219aabc171d41aad412819a286add4e4f7ad2e5 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 21 Oct 2015 21:10:18 -0700 Subject: [PATCH 419/846] Switching to using generations TFM --- .../project.json | 39 ++++++----- .../project.json | 11 ++-- .../project.json | 14 ++-- .../project.json | 54 +++++++-------- .../HttpContextAccessor.cs | 8 +-- .../ReferenceReadStream.cs | 4 +- src/Microsoft.AspNet.Http/project.json | 48 +++++++------- src/Microsoft.AspNet.Owin/project.json | 66 +++++++++---------- .../BufferedReadStream.cs | 4 +- .../FileBufferingReadStream.cs | 4 +- .../MultipartReaderStream.cs | 4 +- .../project.json | 52 +++++++-------- .../project.json | 31 ++++----- .../project.json | 49 +++++++------- .../project.json | 39 ++++++----- src/Microsoft.Net.Http.Headers/project.json | 47 +++++++------ 16 files changed, 233 insertions(+), 241 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index fd368e97e6..9fe9c36612 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -1,23 +1,22 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTML content interface.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "net45" : { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTML content interface.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*" + } } + } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 1d944cde2a..8c0d539da3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -10,12 +10,15 @@ }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.ActivatorUtilities.Sources": { + "type": "build", + "version": "1.0.0-*" + }, "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { + "net451": {}, + "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-beta-*", "System.Diagnostics.Tools": "4.0.1-beta-*", @@ -35,4 +38,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1d330ebe5d..5cc71ea727 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,17 +5,17 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { + "net451": {}, + "dotnet5.4": { "dependencies": { "System.IO.FileSystem": "4.0.1-beta-*", "System.Runtime": "4.0.21-beta-*", @@ -23,4 +23,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 73e5663933..0a3df94ed9 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -1,29 +1,29 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature interface definitions.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Net.WebSockets": "4.0.0-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature interface definitions.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.Primitives": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Net.WebSockets": "4.0.0-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Security.Claims": "4.0.1-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.1-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs index 384bb961ca..83b558161d 100644 --- a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -#if DNX451 +#if NET451 using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting; -#elif DNXCORE50 +#elif DOTNET5_4 using System.Threading; #endif @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Internal { public class HttpContextAccessor : IHttpContextAccessor { -#if DNX451 +#if NET451 private const string LogicalDataKey = "__HttpContext_Current__"; public HttpContext HttpContext @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Http.Internal } } -#elif DNXCORE50 +#elif DOTNET5_4 private AsyncLocal _httpContextCurrent = new AsyncLocal(); public HttpContext HttpContext { diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 509a6e44cd..1a413d4271 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -115,7 +115,7 @@ namespace Microsoft.AspNet.Http.Internal _position += read; return read; } -#if DNX451 +#if NET451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -164,7 +164,7 @@ namespace Microsoft.AspNet.Http.Internal { throw new NotSupportedException(); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 6ea620d194..cc8ecdc60c 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,26 +1,26 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature implementations.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true, - "allowUnsafe": true - }, - "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.Text.Encoding": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature implementations.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true, + "allowUnsafe": true + }, + "dependencies": { + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.Text.Encoding": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index a20dd5ccff..545a5bcb92 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,35 +1,35 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 component for running OWIN middleware.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Tools": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Runtime.InteropServices": "4.0.21-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*", - "System.Threading.Tasks": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 component for running OWIN middleware.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Tools": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Runtime.InteropServices": "4.0.21-beta-*", + "System.Security.Claims": "4.0.1-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.1-beta-*", + "System.Threading.Tasks": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 88e2782938..d78d3b34ce 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -149,7 +149,7 @@ namespace Microsoft.AspNet.WebUtilities { _inner.Write(buffer, offset, count); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { return _inner.BeginWrite(buffer, offset, count, callback, state); @@ -198,7 +198,7 @@ namespace Microsoft.AspNet.WebUtilities return await _inner.ReadAsync(buffer, offset, count, cancellationToken); } -#if DNX451 +#if NET451 // We only anticipate using ReadAsync public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 3341b65857..f67eed3d93 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -163,7 +163,7 @@ namespace Microsoft.AspNet.WebUtilities return read; } -#if DNX451 +#if NET451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -239,7 +239,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 9350233c83..d87fae944f 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -157,7 +157,7 @@ namespace Microsoft.AspNet.WebUtilities } return read; } -#if DNX451 +#if NET451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { var tcs = new TaskCompletionSource(state); diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 5a64ca96b6..93b5d00c98 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,28 +1,28 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 common helper methods.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 common helper methods.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.Primitives": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.IO.FileSystem": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json index 812b75a205..a60d35fe5c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json @@ -1,21 +1,14 @@ { - "version": "1.0.0-*", - "shared": "*.cs", - "dependencies": { }, - "frameworks" : { - "net45": { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*" - } - }, - "dotnet": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*" - } - } + "version": "1.0.0-*", + "shared": "*.cs", + "dependencies": {}, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json index 0da3e70874..990b9a373b 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/project.json +++ b/src/Microsoft.Extensions.WebEncoders.Core/project.json @@ -1,27 +1,26 @@ { - "version": "1.0.0-*", - "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "allowUnsafe": true, - "warningsAsErrors": true - }, - "frameworks": { - "net45": { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Reflection": "4.0.10-*", - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "allowUnsafe": true, + "warningsAsErrors": true + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.Reflection": "4.0.10-*", + "System.Resources.ResourceManager": "4.0.1-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index 7cd8aac9ad..ecc7c0a3d1 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -1,21 +1,20 @@ { - "version": "1.0.0-*", - "description": "Contains registration and configuration APIs for the core framework encoders.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Extensions.OptionsModel": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "net45": { }, - "dnx451": { }, - "dnxcore50": { } - } -} + "version": "1.0.0-*", + "description": "Contains registration and configuration APIs for the core framework encoders.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", + "Microsoft.Extensions.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": {} + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index effac85e1f..853c52324c 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,26 +1,25 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP header implementations.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "frameworks" : { - "net45" : { }, - "dnx451" : { }, - "dnxcore50" : { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Contracts": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.Globalization.Extensions": "4.0.1-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Text.Encoding": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP header implementations.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Contracts": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.Globalization.Extensions": "4.0.1-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Text.Encoding": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*" + } } -} + } +} \ No newline at end of file From bcb56bdd1a771a514b005ee112140922b6dc852c Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 21 Oct 2015 15:43:42 -0700 Subject: [PATCH 420/846] Rename `AppendEncoded()` to `AppendHtml()` and `SetContentEncoded()` to `SetHtmlContent()` - aspnet/Mvc#3225, 1 of 3 Also correct parameter names and doc comments - add `xml-docs-test` to ensure this doc comments remain valid in the future --- makefile.shade | 3 +++ .../HtmlContentBuilderExtensions.cs | 27 ++++++++++--------- .../IHtmlContentBuilder.cs | 2 +- .../BufferedHtmlContent.cs | 14 +++++----- .../HtmlContentBuilderExtensionsTest.cs | 10 +++---- .../BufferedHtmlContentTest.cs | 4 +-- 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/makefile.shade b/makefile.shade index 562494d144..d5e473d558 100644 --- a/makefile.shade +++ b/makefile.shade @@ -5,3 +5,6 @@ var AUTHORS='Microsoft Open Technologies, Inc.' use-standard-lifecycle k-standard-goals + +#xml-docs-test .clean .build-compile description='Check generated XML documentation files for errors' target='package' + k-xml-docs-test diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 5f8515bb03..ef7f932226 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -5,7 +5,6 @@ using System; using System.Diagnostics; using System.Globalization; using System.IO; -using System.Text; using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions @@ -20,6 +19,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// item with the HTML encoded representation of the corresponding item in the /// array. /// + /// The . /// /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. @@ -54,9 +54,10 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// Appends the specified to the existing content with information from the - /// after replacing each format item with the HTML encoded - /// representation of the corresponding item in the array. + /// after replacing each format item with the HTML encoded + /// representation of the corresponding item in the array. /// + /// The . /// An object that supplies culture-specific formatting information. /// /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). @@ -122,9 +123,9 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . /// The to append. /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent htmlContent) + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent content) { - builder.Append(htmlContent); + builder.Append(content); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -134,11 +135,11 @@ namespace Microsoft.AspNet.Html.Abstractions /// The value is treated as HTML encoded as-provided, and no further encoding will be performed. /// /// The . - /// The HTML encoded to append. + /// The HTML encoded to append. /// The . - public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) { - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -148,7 +149,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// and will be HTML encoded before writing to output. /// /// The . - /// The value that replaces the content. + /// The value that replaces the content. /// The . public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, string unencoded) { @@ -161,7 +162,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// Sets the content to the value. /// /// The . - /// The value that replaces the content. + /// The value that replaces the content. /// The . public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, IHtmlContent content) { @@ -175,12 +176,12 @@ namespace Microsoft.AspNet.Html.Abstractions /// no further encoding will be performed. /// /// The . - /// The HTML encoded that replaces the content. + /// The HTML encoded that replaces the content. /// The . - public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder SetHtmlContent(this IHtmlContentBuilder builder, string encoded) { builder.Clear(); - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); return builder; } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index ced5bd763e..e55cec3530 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// The HTML encoded to append. /// The . - IHtmlContentBuilder AppendEncoded(string encoded); + IHtmlContentBuilder AppendHtml(string encoded); /// /// Clears the content. diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 3b79916d9c..9d098518b8 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -24,11 +24,11 @@ namespace Microsoft.Extensions.Internal /// /// Appends the to the collection. /// - /// The string to be appended. + /// The string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder Append(string value) + public IHtmlContentBuilder Append(string unencoded) { - Entries.Add(value); + Entries.Add(unencoded); return this; } @@ -46,11 +46,11 @@ namespace Microsoft.Extensions.Internal /// /// Appends the HTML encoded to the collection. /// - /// The HTML encoded string to be appended. + /// The HTML encoded string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder AppendEncoded(string value) + public IHtmlContentBuilder AppendHtml(string encoded) { - Entries.Add(new HtmlEncodedString(value)); + Entries.Add(new HtmlEncodedString(encoded)); return this; } /// @@ -95,7 +95,7 @@ namespace Microsoft.Extensions.Internal } } } - + private string DebuggerToString() { using (var writer = new StringWriter()) diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index b1a8fab41f..8221fa524c 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -62,13 +62,13 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_AppendLineEncoded_String() + public void Builder_AppendHtmlLine_String() { // Arrange var builder = new TestHtmlContentBuilder(); // Act - builder.AppendLineEncoded("Hi"); + builder.AppendHtmlLine("Hi"); // Assert Assert.Collection( @@ -112,14 +112,14 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_SetContentEncoded_String() + public void Builder_SetHtmlContent_String() { // Arrange var builder = new TestHtmlContentBuilder(); builder.Append("Existing Content. Will be Cleared."); // Act - builder.SetContentEncoded("Hi"); + builder.SetHtmlContent("Hi"); // Assert Assert.Collection( @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public IHtmlContentBuilder AppendEncoded(string encoded) + public IHtmlContentBuilder AppendHtml(string encoded) { Entries.Add(new EncodedString(encoded)); return this; diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index e883f84960..2eebd6041e 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -41,11 +41,11 @@ namespace Microsoft.Extensions.Internal } [Fact] - public void AppendEncoded_DoesNotGetWrittenAsEncoded() + public void AppendHtml_DoesNotGetWrittenAsEncoded() { // Arrange var content = new BufferedHtmlContent(); - content.AppendEncoded("Hello"); + content.AppendHtml("Hello"); var writer = new StringWriter(); From f931cb7c6d11786ffdc7c8eab35e2ed4a942b0db Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 23 Oct 2015 18:49:25 -0700 Subject: [PATCH 421/846] Moving httpcontextfactory to AspNet.Http.Abstractions --- .../IHttpContextFactory.cs | 13 +++++++++ .../HttpContextFactory.cs | 29 +++++++++++++++++++ .../HttpContextFactoryTests.cs | 25 ++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs create mode 100644 src/Microsoft.AspNet.Http/HttpContextFactory.cs create mode 100644 test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs new file mode 100644 index 0000000000..f0e28db8a7 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs @@ -0,0 +1,13 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http +{ + public interface IHttpContextFactory + { + HttpContext CreateHttpContext(IFeatureCollection featureCollection); + void Dispose(HttpContext httpContext); + } +} diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNet.Http/HttpContextFactory.cs new file mode 100644 index 0000000000..4557cd13fb --- /dev/null +++ b/src/Microsoft.AspNet.Http/HttpContextFactory.cs @@ -0,0 +1,29 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http.Internal +{ + public class HttpContextFactory : IHttpContextFactory + { + private IHttpContextAccessor _httpContextAccessor; + + public HttpContextFactory(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public HttpContext CreateHttpContext(IFeatureCollection featureCollection) + { + var httpContext = new DefaultHttpContext(featureCollection); + _httpContextAccessor.HttpContext = httpContext; + return httpContext; + } + + public void Dispose(HttpContext httpContext) + { + _httpContextAccessor.HttpContext = null; + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs new file mode 100644 index 0000000000..8cb2cc6e9b --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs @@ -0,0 +1,25 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features; +using Xunit; + +namespace Microsoft.AspNet.Http.Internal +{ + public class HttpContextFactoryTests + { + [Fact] + public void CreateHttpContextSetsHttpContextAccessor() + { + // Arrange + var accessor = new HttpContextAccessor(); + var contextFactory = new HttpContextFactory(accessor); + + // Act + var context = contextFactory.CreateHttpContext(new FeatureCollection()); + + // Assert + Assert.True(ReferenceEquals(context, accessor.HttpContext)); + } + } +} \ No newline at end of file From 018f3d1815853060c9b03cdef304106e36c7ef39 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 23 Oct 2015 21:58:22 -0700 Subject: [PATCH 422/846] Renaming HttpContextFactory Create method --- src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs | 2 +- src/Microsoft.AspNet.Http/HttpContextFactory.cs | 2 +- test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs index f0e28db8a7..cdeb2ce223 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Http { public interface IHttpContextFactory { - HttpContext CreateHttpContext(IFeatureCollection featureCollection); + HttpContext Create(IFeatureCollection featureCollection); void Dispose(HttpContext httpContext); } } diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNet.Http/HttpContextFactory.cs index 4557cd13fb..9c98fd1594 100644 --- a/src/Microsoft.AspNet.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Http/HttpContextFactory.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal _httpContextAccessor = httpContextAccessor; } - public HttpContext CreateHttpContext(IFeatureCollection featureCollection) + public HttpContext Create(IFeatureCollection featureCollection) { var httpContext = new DefaultHttpContext(featureCollection); _httpContextAccessor.HttpContext = httpContext; diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs index 8cb2cc6e9b..1fcdcab423 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Http.Internal var contextFactory = new HttpContextFactory(accessor); // Act - var context = contextFactory.CreateHttpContext(new FeatureCollection()); + var context = contextFactory.Create(new FeatureCollection()); // Assert Assert.True(ReferenceEquals(context, accessor.HttpContext)); From 7ad859b5c06006d2581c14926a66091c3118cbb9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 28 Oct 2015 12:43:05 -0700 Subject: [PATCH 423/846] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From f177f0c760cd84cbd23553bc84196bd3b8eb0170 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 29 Oct 2015 10:03:07 -0700 Subject: [PATCH 424/846] Add ForbidAsync overload for automatic authentication scheme. --- .../Authentication/AuthenticationManager.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index 497ad3e25d..687e1c7474 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -78,6 +78,13 @@ namespace Microsoft.AspNet.Http.Authentication return SignInAsync(authenticationScheme, principal, properties: null); } + /// + /// Creates a challenge for the authentication manager with . + /// + /// A that represents the asynchronous challenge operation. + public virtual Task ForbidAsync() + => ForbidAsync(AutomaticScheme, properties: null); + public virtual Task ForbidAsync(string authenticationScheme) { if (authenticationScheme == null) @@ -99,6 +106,14 @@ namespace Microsoft.AspNet.Http.Authentication return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Forbidden); } + /// + /// Creates a challenge for the authentication manager with . + /// + /// Additional arbitrary values which may be used by particular authentication types. + /// A that represents the asynchronous challenge operation. + public virtual Task ForbidAsync(AuthenticationProperties properties) + => ForbidAsync(AutomaticScheme, properties); + public abstract Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); public abstract Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); From be4fb46281ffaebb60788ae7f47574410d0af767 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 30 Oct 2015 10:13:02 -0700 Subject: [PATCH 425/846] #391 Migrate to System.Text.Encoding.Web --- HttpAbstractions.sln | 16 - .../HtmlContentBuilderExtensions.cs | 16 +- .../IHtmlContent.cs | 6 +- .../project.json | 9 +- .../PathString.cs | 4 +- .../QueryString.cs | 34 +- .../project.json | 12 +- .../QueryBuilder.cs | 6 +- .../project.json | 3 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 14 +- src/Microsoft.AspNet.Http/project.json | 3 +- .../QueryHelpers.cs | 6 +- .../project.json | 8 +- .../BufferedHtmlContent.cs | 7 +- .../AllowedCharsBitmap.cs | 77 - .../CodePointFilter.cs | 312 - .../EncoderCommon.cs | 37 - .../EncoderExtensions.cs | 70 - .../HexUtil.cs | 48 - .../HtmlEncoder.cs | 208 - .../ICodePointFilter.cs | 19 - .../IHtmlEncoder.cs | 45 - .../IJavaScriptStringEncoder.cs | 40 - .../IUrlEncoder.cs | 44 - .../JavaScriptStringEncoder.cs | 231 - ...icrosoft.Extensions.WebEncoders.Core.xproj | 17 - .../Properties/AssemblyInfo.cs | 10 - .../UnicodeEncoderBase.cs | 301 - .../UnicodeHelpers.cs | 231 - .../UnicodeRange.cs | 64 - .../UnicodeRanges.cs | 51 - .../UnicodeRanges.generated.cs | 1415 - .../UrlEncoder.cs | 245 - .../resources/unicode-defined-chars.bin | Bin 8192 -> 0 bytes .../project.json | 26 - .../EncoderServiceCollectionExtensions.cs | 21 +- .../EncoderServiceProviderExtensions.cs | 19 +- .../Testing/HtmlTestEncoder.cs | 54 + .../Testing/JavaScriptTestEncoder.cs | 54 + .../Testing/UrlTestEncoder.cs | 54 + .../WebEncoderOptions.cs | 6 +- .../project.json | 12 +- .../HtmlContentBuilderExtensionsTest.cs | 15 +- .../project.json | 2 +- .../QueryStringTests.cs | 2 - .../BufferedHtmlContentTest.cs | 13 +- .../project.json | 7 +- .../AllowedCharsBitmapTests.cs | 125 - .../CodePointFilterTests.cs | 365 - .../CommonTestEncoder.cs | 103 - .../EncoderCommonTests.cs | 21 - .../EncoderExtensionsTests.cs | 72 - ...EncoderServiceCollectionExtensionsTests.cs | 50 +- .../EncoderServiceProviderExtensionsTests.cs | 17 +- .../Entities.cs | 38 - .../Extensions.cs | 27 - .../HtmlEncoderTests.cs | 269 - .../JavaScriptStringEncoderTests.cs | 331 - .../ParsedEntity.cs | 17 - .../UnicodeEncoderBaseTests.cs | 406 - .../UnicodeHelpersTests.cs | 222 - .../UnicodeRangeTests.cs | 69 - .../UnicodeRangesTests.cs | 211 - .../UrlEncoderTests.cs | 301 - .../project.json | 3 +- unicode/Blocks.txt | 298 - .../DefinedCharListGenerator/App.config | 6 - .../DefinedCharListGenerator.csproj | 61 - .../DefinedCharListGenerator/Program.cs | 180 - .../Properties/AssemblyInfo.cs | 36 - unicode/Generators/Generators.sln | 28 - .../UnicodeTablesGenerator/App.config | 6 - .../UnicodeTablesGenerator/Program.cs | 103 - .../Properties/AssemblyInfo.cs | 36 - .../UnicodeTablesGenerator.csproj | 61 - unicode/UnicodeData.txt | 29215 ---------------- unicode/how-to-update.txt | 94 - unicode/unicode-copyright.txt | 47 - 78 files changed, 334 insertions(+), 36378 deletions(-) delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/project.json rename src/{Microsoft.Extensions.WebEncoders.Core => Microsoft.Extensions.WebEncoders}/EncoderServiceProviderExtensions.cs (59%) create mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs create mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs create mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs rename src/{Microsoft.Extensions.WebEncoders.Core => Microsoft.Extensions.WebEncoders}/WebEncoderOptions.cs (82%) delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs delete mode 100644 unicode/Blocks.txt delete mode 100644 unicode/Generators/DefinedCharListGenerator/App.config delete mode 100644 unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj delete mode 100644 unicode/Generators/DefinedCharListGenerator/Program.cs delete mode 100644 unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs delete mode 100644 unicode/Generators/Generators.sln delete mode 100644 unicode/Generators/UnicodeTablesGenerator/App.config delete mode 100644 unicode/Generators/UnicodeTablesGenerator/Program.cs delete mode 100644 unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs delete mode 100644 unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj delete mode 100644 unicode/UnicodeData.txt delete mode 100644 unicode/how-to-update.txt delete mode 100644 unicode/unicode-copyright.txt diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 28574eee21..289cdf8dcb 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,4 +1,3 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.23107.0 @@ -39,8 +38,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEnc EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Core", "src\Microsoft.Extensions.WebEncoders.Core\Microsoft.Extensions.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" @@ -231,18 +228,6 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.ActiveCfg = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.Build.0 = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.Build.0 = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.ActiveCfg = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.Build.0 = Release|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -324,7 +309,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index ef7f932226..5b1164b438 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.Globalization; using System.IO; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Html.Abstractions { @@ -197,7 +197,7 @@ namespace Microsoft.AspNet.Html.Abstractions _value = value; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(_value); } @@ -234,7 +234,7 @@ namespace Microsoft.AspNet.Html.Abstractions _args = args; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { if (writer == null) { @@ -269,10 +269,10 @@ namespace Microsoft.AspNet.Html.Abstractions // https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format6_Example private class EncodingFormatProvider : IFormatProvider, ICustomFormatter { - private readonly IHtmlEncoder _encoder; + private readonly HtmlEncoder _encoder; private readonly IFormatProvider _formatProvider; - public EncodingFormatProvider(IFormatProvider formatProvider, IHtmlEncoder encoder) + public EncodingFormatProvider(IFormatProvider formatProvider, HtmlEncoder encoder) { Debug.Assert(formatProvider != null); Debug.Assert(encoder != null); @@ -306,7 +306,7 @@ namespace Microsoft.AspNet.Html.Abstractions var result = customFormatter.Format(format, arg, _formatProvider); if (result != null) { - return _encoder.HtmlEncode(result); + return _encoder.Encode(result); } } @@ -320,7 +320,7 @@ namespace Microsoft.AspNet.Html.Abstractions var result = formattable.ToString(format, _formatProvider); if (result != null) { - return _encoder.HtmlEncode(result); + return _encoder.Encode(result); } } @@ -330,7 +330,7 @@ namespace Microsoft.AspNet.Html.Abstractions var result = arg.ToString(); if (result != null) { - return _encoder.HtmlEncode(result); + return _encoder.Encode(result); } } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs index 05f09cb7b4..d9b7099710 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Html.Abstractions { @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// to the specified . /// /// The to which the content is written. - /// The which encodes the content to be written. - void WriteTo(TextWriter writer, IHtmlEncoder encoder); + /// The which encodes the content to be written. + void WriteTo(TextWriter writer, HtmlEncoder encoder); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index 9fe9c36612..86a35720b2 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -9,10 +9,15 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.IO": "", + "System.Runtime": "" + } + }, "dotnet5.4": { "dependencies": { "System.Resources.ResourceManager": "4.0.1-beta-*" diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index f9538e7444..ebcc9b107e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,7 +3,7 @@ using System; using System.Linq; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Http { @@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Http public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. - return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.UrlEncode)) : string.Empty; + return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.Encode)) : string.Empty; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 25ba1f2699..af2feeedb5 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; +using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http { @@ -119,7 +119,16 @@ namespace Microsoft.AspNet.Http /// The resulting QueryString public static QueryString Create(string name, string value) { - return new QueryString("?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value)); + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + return new QueryString("?" + UrlEncoder.Default.Encode(name) + '=' + UrlEncoder.Default.Encode(value)); } /// @@ -135,9 +144,9 @@ namespace Microsoft.AspNet.Http { builder.Append(first ? "?" : "&"); first = false; - builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append(UrlEncoder.Default.Encode(pair.Key)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); + builder.Append(UrlEncoder.Default.Encode(pair.Value)); } return new QueryString(builder.ToString()); @@ -158,9 +167,9 @@ namespace Microsoft.AspNet.Http { builder.Append(first ? "?" : "&"); first = false; - builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append(UrlEncoder.Default.Encode(pair.Key)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(value)); + builder.Append(UrlEncoder.Default.Encode(value)); } } @@ -184,6 +193,15 @@ namespace Microsoft.AspNet.Http public QueryString Add(string name, string value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) { return Create(name, value); @@ -191,9 +209,9 @@ namespace Microsoft.AspNet.Http var builder = new StringBuilder(Value); builder.Append("&"); - builder.Append(UrlEncoder.Default.UrlEncode(name)); + builder.Append(UrlEncoder.Default.Encode(name)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(value)); + builder.Append(UrlEncoder.Default.Encode(value)); return new QueryString(builder.ToString()); } diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 8c0d539da3..8810641078 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -14,13 +14,19 @@ "type": "build", "version": "1.0.0-*" }, - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.IO": "", + "System.Runtime": "" + } + }, "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-beta-*", + "System.ComponentModel": "4.0.1-beta-*", "System.Diagnostics.Tools": "4.0.1-beta-*", "System.Globalization": "4.0.11-beta-*", "System.Globalization.Extensions": "4.0.1-beta-*", @@ -38,4 +44,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index 060c04efc7..ec4ae68fec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.Text; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Http.Extensions { @@ -45,9 +45,9 @@ namespace Microsoft.AspNet.Http.Extensions var pair = _params[i]; builder.Append(first ? "?" : "&"); first = false; - builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append(UrlEncoder.Default.Encode(pair.Key)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); + builder.Append(UrlEncoder.Default.Encode(pair.Value)); } return builder.ToString(); diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 5cc71ea727..c0adfdc59e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -10,7 +10,6 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { @@ -23,4 +22,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index e67251f61a..5075efb004 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -3,8 +3,8 @@ using System; using System.Linq; +using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.WebEncoders; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal @@ -38,8 +38,8 @@ namespace Microsoft.AspNet.Http.Internal public void Append(string key, string value) { var setCookieHeaderValue = new SetCookieHeaderValue( - UrlEncoder.Default.UrlEncode(key), - UrlEncoder.Default.UrlEncode(value)) + UrlEncoder.Default.Encode(key), + UrlEncoder.Default.Encode(value)) { Path = "/" }; @@ -61,8 +61,8 @@ namespace Microsoft.AspNet.Http.Internal } var setCookieHeaderValue = new SetCookieHeaderValue( - UrlEncoder.Default.UrlEncode(key), - UrlEncoder.Default.UrlEncode(value)) + UrlEncoder.Default.Encode(key), + UrlEncoder.Default.Encode(value)) { Domain = options.Domain, Path = options.Path, @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); StringValues deleteCookies = encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT"; @@ -107,7 +107,7 @@ namespace Microsoft.AspNet.Http.Internal throw new ArgumentNullException(nameof(options)); } - var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index cc8ecdc60c..e60dfd06d6 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -19,7 +19,8 @@ "dotnet5.4": { "dependencies": { "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.Text.Encoding": "4.0.11-beta-*" + "System.Text.Encoding": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 465ce48a83..57ee90bc75 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; +using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.WebUtilities { @@ -92,9 +92,9 @@ namespace Microsoft.AspNet.WebUtilities foreach (var parameter in queryString) { sb.Append(hasQuery ? '&' : '?'); - sb.Append(UrlEncoder.Default.UrlEncode(parameter.Key)); + sb.Append(UrlEncoder.Default.Encode(parameter.Key)); sb.Append('='); - sb.Append(UrlEncoder.Default.UrlEncode(parameter.Value)); + sb.Append(UrlEncoder.Default.Encode(parameter.Value)); hasQuery = true; } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 93b5d00c98..e7878e15a7 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -10,10 +10,14 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.Runtime": "" + } + }, "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-beta-*", diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 9d098518b8..302692338b 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Text.Encodings.Web; using Microsoft.AspNet.Html.Abstractions; using Microsoft.Extensions.WebEncoders; @@ -64,7 +65,7 @@ namespace Microsoft.Extensions.Internal } /// - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { if (writer == null) { @@ -86,7 +87,7 @@ namespace Microsoft.Extensions.Internal var entryAsString = entry as string; if (entryAsString != null) { - encoder.HtmlEncode(entryAsString, writer); + encoder.Encode(writer, entryAsString); } else { @@ -116,7 +117,7 @@ namespace Microsoft.Extensions.Internal _value = value; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(_value); } diff --git a/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs b/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs deleted file mode 100644 index aae7b3c8b8..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; - -namespace Microsoft.Extensions.WebEncoders -{ - internal struct AllowedCharsBitmap - { - private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); - private readonly uint[] _allowedCharsBitmap; - - private AllowedCharsBitmap(uint[] allowedCharsBitmap) - { - Debug.Assert(allowedCharsBitmap != null); - _allowedCharsBitmap = allowedCharsBitmap; - } - - // Marks a character as allowed (can be returned unencoded) - public void AllowCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] |= 0x1U << offset; - } - - // Marks all characters as forbidden (must be returned encoded) - public void Clear() - { - Array.Clear(_allowedCharsBitmap, 0, _allowedCharsBitmap.Length); - } - - // Creates a deep copy of this bitmap - public AllowedCharsBitmap Clone() - { - return new AllowedCharsBitmap((uint[])_allowedCharsBitmap.Clone()); - } - - // should be called in place of the ctor - public static AllowedCharsBitmap CreateNew() - { - return new AllowedCharsBitmap(new uint[ALLOWED_CHARS_BITMAP_LENGTH]); - } - - // Marks a character as forbidden (must be returned encoded) - public void ForbidCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] &= ~(0x1U << offset); - } - - public void ForbidUndefinedCharacters() - { - // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) - uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); - Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); - for (int i = 0; i < _allowedCharsBitmap.Length; i++) - { - _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; - } - } - - // Determines whether the given character can be returned unencoded. - public bool IsCharacterAllowed(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs deleted file mode 100644 index dda6499604..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Represents a filter which allows only certain Unicode code points through. - /// - public sealed class CodePointFilter : ICodePointFilter - { - private AllowedCharsBitmap _allowedCharsBitmap; - - /// - /// Instantiates an empty filter (allows no code points through by default). - /// - public CodePointFilter() - { - _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); - } - - /// - /// Instantiates the filter by cloning the allow list of another . - /// - public CodePointFilter(ICodePointFilter other) - { - if (other == null) - { - throw new ArgumentNullException(nameof(other)); - } - - CodePointFilter otherAsCodePointFilter = other as CodePointFilter; - if (otherAsCodePointFilter != null) - { - _allowedCharsBitmap = otherAsCodePointFilter.GetAllowedCharsBitmap(); - } - else - { - _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); - AllowFilter(other); - } - } - - /// - /// Instantiates the filter where only the character ranges specified by - /// are allowed by the filter. - /// - public CodePointFilter(params UnicodeRange[] allowedRanges) - { - _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); - AllowRanges(allowedRanges); - } - - /// - /// Allows the character specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowChar(char c) - { - _allowedCharsBitmap.AllowCharacter(c); - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowChars(params char[] chars) - { - if (chars != null) - { - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.AllowCharacter(chars[i]); - } - } - return this; - } - - /// - /// Allows all characters in the string through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowChars(string chars) - { - if (chars == null) - { - throw new ArgumentNullException(nameof(chars)); - } - - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.AllowCharacter(chars[i]); - } - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowFilter(ICodePointFilter filter) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - - foreach (var allowedCodePoint in filter.GetAllowedCodePoints()) - { - // If the code point can't be represented as a BMP character, skip it. - char codePointAsChar = (char)allowedCodePoint; - if (allowedCodePoint == codePointAsChar) - { - _allowedCharsBitmap.AllowCharacter(codePointAsChar); - } - } - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowRange(UnicodeRange range) - { - if (range == null) - { - throw new ArgumentNullException(nameof(range)); - } - - int firstCodePoint = range.FirstCodePoint; - int rangeSize = range.RangeSize; - for (int i = 0; i < rangeSize; i++) - { - _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowRanges(params UnicodeRange[] ranges) - { - if (ranges != null) - { - for (int i = 0; i < ranges.Length; i++) - { - AllowRange(ranges[i]); - } - } - return this; - } - - /// - /// Resets this filter by disallowing all characters. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter Clear() - { - _allowedCharsBitmap.Clear(); - return this; - } - - /// - /// Disallows the character through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidChar(char c) - { - _allowedCharsBitmap.ForbidCharacter(c); - return this; - } - - /// - /// Disallows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidChars(params char[] chars) - { - if (chars != null) - { - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.ForbidCharacter(chars[i]); - } - } - return this; - } - - /// - /// Disallows all characters in the string through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidChars(string chars) - { - if (chars == null) - { - throw new ArgumentNullException(nameof(chars)); - } - - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.ForbidCharacter(chars[i]); - } - return this; - } - - /// - /// Disallows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidRange(UnicodeRange range) - { - if (range == null) - { - throw new ArgumentNullException(nameof(range)); - } - - int firstCodePoint = range.FirstCodePoint; - int rangeSize = range.RangeSize; - for (int i = 0; i < rangeSize; i++) - { - _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Disallows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidRanges(params UnicodeRange[] ranges) - { - if (ranges != null) - { - for (int i = 0; i < ranges.Length; i++) - { - ForbidRange(ranges[i]); - } - } - return this; - } - - /// - /// Retrieves the bitmap of allowed characters from this filter. - /// The returned bitmap is a clone of the original bitmap to avoid unintentional modification. - /// - internal AllowedCharsBitmap GetAllowedCharsBitmap() - { - return _allowedCharsBitmap.Clone(); - } - - /// - /// Gets an enumeration of all allowed code points. - /// - public IEnumerable GetAllowedCodePoints() - { - for (int i = 0; i < 0x10000; i++) - { - if (_allowedCharsBitmap.IsCharacterAllowed((char)i)) - { - yield return i; - } - } - } - - /// - /// Returns a value stating whether the character is allowed through the filter. - /// - public bool IsCharacterAllowed(char c) - { - return _allowedCharsBitmap.IsCharacterAllowed(c); - } - - /// - /// Wraps the provided filter as a CodePointFilter, avoiding the clone if possible. - /// - internal static CodePointFilter Wrap(ICodePointFilter filter) - { - return (filter as CodePointFilter) ?? new CodePointFilter(filter); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs deleted file mode 100644 index 940a8590ae..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Extensions.WebEncoders -{ - internal static class EncoderCommon - { - // Gets the optimal capacity of the StringBuilder that will be used to build the output - // given a specified number of input characters and the worst-case growth. - public static int GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar) - { - // We treat 32KB byte size (16k chars) as a soft upper boundary for the length of any StringBuilder - // that we allocate. We'll try to avoid going above this boundary if we can avoid it so that we - // don't allocate objects on the LOH. - const int upperBound = 16 * 1024; - - // Once we have chosen an initial value for the StringBuilder size, the StringBuilder type will - // efficiently allocate additionally blocks if necessary. - - if (numCharsToEncode >= upperBound) - { - // We know that the output will contain at least as many characters as the input, so if the - // input length exceeds the soft upper boundary just preallocate the entire builder and hope for - // a best-case outcome. - return numCharsToEncode; - } - else - { - // Allocate the worst-case if we can, but don't exceed the soft upper boundary. - long worstCaseTotalChars = (long)numCharsToEncode * worstCaseOutputCharsPerInputChar; - return (int)Math.Min(upperBound, worstCaseTotalChars); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs deleted file mode 100644 index d6428f866e..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Helpful extension methods for the encoder classes. - /// - public static class EncoderExtensions - { - /// - /// HTML-encodes a string and writes the result to the supplied output. - /// - /// - /// The encoded value is also safe for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - public static void HtmlEncode(this IHtmlEncoder htmlEncoder, string value, TextWriter output) - { - if (htmlEncoder == null) - { - throw new ArgumentNullException(nameof(htmlEncoder)); - } - - if (!String.IsNullOrEmpty(value)) - { - htmlEncoder.HtmlEncode(value, 0, value.Length, output); - } - } - - /// - /// JavaScript-escapes a string and writes the result to the supplied output. - /// - public static void JavaScriptStringEncode(this IJavaScriptStringEncoder javaScriptStringEncoder, string value, TextWriter output) - { - if (javaScriptStringEncoder == null) - { - throw new ArgumentNullException(nameof(javaScriptStringEncoder)); - } - - if (!String.IsNullOrEmpty(value)) - { - javaScriptStringEncoder.JavaScriptStringEncode(value, 0, value.Length, output); - } - } - - /// - /// URL-encodes a string and writes the result to the supplied output. - /// - /// - /// The encoded value is safe for use in the segment, query, or - /// fragment portion of a URI. - /// - public static void UrlEncode(this IUrlEncoder urlEncoder, string value, TextWriter output) - { - if (urlEncoder == null) - { - throw new ArgumentNullException(nameof(urlEncoder)); - } - - if (!String.IsNullOrEmpty(value)) - { - urlEncoder.UrlEncode(value, 0, value.Length, output); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs b/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs deleted file mode 100644 index 3262a1665d..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains helpers for dealing with byte-hex char conversions. - /// - internal static class HexUtil - { - /// - /// Converts a number 0 - 15 to its associated hex character '0' - 'F'. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static char IntToChar(uint i) - { - Debug.Assert(i < 16); - return (i < 10) ? (char)('0' + i) : (char)('A' + (i - 10)); - } - - /// - /// Returns the integral form of this hexadecimal character. - /// - /// 0 - 15 if the character is valid, -1 if the character is invalid. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static int ParseHexCharacter(char c) - { - if ('0' <= c && c <= '9') { return c - '0'; } - else if ('A' <= c && c <= 'F') { return c - 'A' + 10; } - else if ('a' <= c && c <= 'f') { return c - 'a' + 10; } - else { return -1; } - } - - /// - /// Gets the uppercase hex-encoded form of a byte. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void WriteHexEncodedByte(byte b, out char firstHexChar, out char secondHexChar) - { - firstHexChar = IntToChar((uint)b >> 4); - secondHexChar = IntToChar((uint)b & 0xFU); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs deleted file mode 100644 index d1347c0338..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// A class which can perform HTML encoding given an allow list of characters which - /// can be represented unencoded. - /// - /// - /// Instances of this type will always encode a certain set of characters (such as < - /// and >), even if the filter provided in the constructor allows such characters. - /// Once constructed, instances of this class are thread-safe for multiple callers. - /// - public unsafe sealed class HtmlEncoder : IHtmlEncoder - { - // The default HtmlEncoder (Basic Latin), instantiated on demand - private static HtmlEncoder _defaultEncoder; - - // The inner encoder, responsible for the actual encoding routines - private readonly HtmlUnicodeEncoder _innerUnicodeEncoder; - - /// - /// Instantiates an encoder using as its allow list. - /// Any character not in the range will be escaped. - /// - public HtmlEncoder() - : this(HtmlUnicodeEncoder.BasicLatin) - { - } - - /// - /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. Any character not in the set of ranges specified - /// by will be escaped. - /// - public HtmlEncoder(params UnicodeRange[] allowedRanges) - : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedRanges))) - { - } - - /// - /// Instantiates an encoder using a custom code point filter. Any character not in the - /// set returned by 's - /// method will be escaped. - /// - public HtmlEncoder(ICodePointFilter filter) - : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - } - - private HtmlEncoder(HtmlUnicodeEncoder innerEncoder) - { - Debug.Assert(innerEncoder != null); - _innerUnicodeEncoder = innerEncoder; - } - - /// - /// A default instance of . - /// - /// - /// This normally corresponds to . However, this property is - /// settable so that a developer can change the default implementation application-wide. - /// - public static HtmlEncoder Default - { - get - { - return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - Volatile.Write(ref _defaultEncoder, value); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us - private static HtmlEncoder CreateDefaultEncoderSlow() - { - var onDemandEncoder = new HtmlEncoder(); - return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; - } - - /// - /// Everybody's favorite HtmlEncode routine. - /// - public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - /// - /// Everybody's favorite HtmlEncode routine. - /// - public string HtmlEncode(string value) - { - return _innerUnicodeEncoder.Encode(value); - } - - /// - /// Everybody's favorite HtmlEncode routine. - /// - public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - private sealed class HtmlUnicodeEncoder : UnicodeEncoderBase - { - // A singleton instance of the basic latin encoder. - private static HtmlUnicodeEncoder _basicLatinSingleton; - - // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" - // We don't need to worry about astral code points since they consume *two* input chars to - // generate at most 10 output chars ("􏿿"), which equates to 5 output chars per input char. - private const int MaxOutputCharsPerInputChar = 8; - - internal HtmlUnicodeEncoder(CodePointFilter filter) - : base(filter, MaxOutputCharsPerInputChar) - { - } - - internal static HtmlUnicodeEncoder BasicLatin - { - get - { - HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); - if (encoder == null) - { - encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); - Volatile.Write(ref _basicLatinSingleton, encoder); - } - return encoder; - } - } - - // Writes a scalar value as an HTML-encoded entity. - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - if (value == (uint)'\"') { writer.Write("""); } - else if (value == (uint)'&') { writer.Write("&"); } - else if (value == (uint)'<') { writer.Write("<"); } - else if (value == (uint)'>') { writer.Write(">"); } - else { WriteEncodedScalarAsNumericEntity(ref writer, value); } - } - - // Writes a scalar value as an HTML-encoded numeric entity. - private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) - { - // We're building the characters up in reverse - char* chars = stackalloc char[8 /* "FFFFFFFF" */]; - int numCharsWritten = 0; - do - { - Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); - // Pop off the last nibble - chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); - value >>= 4; - } while (value != 0); - - // Finally, write out the HTML-encoded scalar value. - writer.Write('&'); - writer.Write('#'); - writer.Write('x'); - Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); - do - { - writer.Write(chars[--numCharsWritten]); - } while (numCharsWritten != 0); - writer.Write(';'); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs deleted file mode 100644 index 446bc354a5..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Represents a filter which allows only certain Unicode code points through. - /// - public interface ICodePointFilter - { - /// - /// Gets an enumeration of all allowed code points. - /// - IEnumerable GetAllowedCodePoints(); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs deleted file mode 100644 index e6bbb35a5c..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Provides services for HTML-encoding input. - /// - public interface IHtmlEncoder - { - /// - /// HTML-encodes a character array and writes the result to the supplied - /// output. - /// - /// - /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output); - - /// - /// HTML-encodes a given input string. - /// - /// - /// The HTML-encoded value, or null if the input string was null. - /// - /// - /// The return value is also appropriately encoded for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - string HtmlEncode(string value); - - /// - /// HTML-encodes a given input string and writes the result to the - /// supplied output. - /// - /// - /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - void HtmlEncode(string value, int startIndex, int charCount, TextWriter output); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs deleted file mode 100644 index 29d07a46cc..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Provides services for JavaScript-escaping strings. - /// - public interface IJavaScriptStringEncoder - { - /// - /// JavaScript-escapes a character array and writes the result to the - /// supplied output. - /// - /// - /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. - /// - void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output); - - /// - /// JavaScript-escapes a given input string. - /// - /// - /// The JavaScript-escaped value, or null if the input string was null. - /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. - /// - string JavaScriptStringEncode(string value); - - /// - /// JavaScript-escapes a given input string and writes the - /// result to the supplied output. - /// - /// - /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. - /// - void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs deleted file mode 100644 index c3e92568ab..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Provides services for URL-escaping strings. - /// - public interface IUrlEncoder - { - /// - /// URL-escapes a character array and writes the result to the supplied - /// output. - /// - /// - /// The encoded value is appropriately encoded for inclusion in the segment, query, or - /// fragment portion of a URI. - /// - void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output); - - /// - /// URL-escapes a given input string. - /// - /// - /// The URL-escaped value, or null if the input string was null. - /// - /// - /// The return value is appropriately encoded for inclusion in the segment, query, or - /// fragment portion of a URI. - /// - string UrlEncode(string value); - - /// - /// URL-escapes a string and writes the result to the supplied output. - /// - /// - /// The encoded value is appropriately encoded for inclusion in the segment, query, or - /// fragment portion of a URI. - /// - void UrlEncode(string value, int startIndex, int charCount, TextWriter output); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs deleted file mode 100644 index 008c6bcc51..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// A class which can perform JavaScript string escaping given an allow list of characters which - /// can be represented unescaped. - /// - /// - /// Instances of this type will always encode a certain set of characters (such as ' - /// and "), even if the filter provided in the constructor allows such characters. - /// Once constructed, instances of this class are thread-safe for multiple callers. - /// - public sealed class JavaScriptStringEncoder : IJavaScriptStringEncoder - { - // The default JavaScript string encoder (Basic Latin), instantiated on demand - private static JavaScriptStringEncoder _defaultEncoder; - - // The inner encoder, responsible for the actual encoding routines - private readonly JavaScriptStringUnicodeEncoder _innerUnicodeEncoder; - - /// - /// Instantiates an encoder using as its allow list. - /// Any character not in the range will be escaped. - /// - public JavaScriptStringEncoder() - : this(JavaScriptStringUnicodeEncoder.BasicLatin) - { - } - - /// - /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. Any character not in the set of ranges specified - /// by will be escaped. - /// - public JavaScriptStringEncoder(params UnicodeRange[] allowedRanges) - : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedRanges))) - { - } - - /// - /// Instantiates an encoder using a custom code point filter. Any character not in the - /// set returned by 's - /// method will be escaped. - /// - public JavaScriptStringEncoder(ICodePointFilter filter) - : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - } - - private JavaScriptStringEncoder(JavaScriptStringUnicodeEncoder innerEncoder) - { - Debug.Assert(innerEncoder != null); - _innerUnicodeEncoder = innerEncoder; - } - - /// - /// A default instance of . - /// - /// - /// This normally corresponds to . However, this property is - /// settable so that a developer can change the default implementation application-wide. - /// - public static JavaScriptStringEncoder Default - { - get - { - return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - Volatile.Write(ref _defaultEncoder, value); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us - private static JavaScriptStringEncoder CreateDefaultEncoderSlow() - { - var onDemandEncoder = new JavaScriptStringEncoder(); - return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; - } - - /// - /// Everybody's favorite JavaScriptStringEncode routine. - /// - public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - /// - /// Everybody's favorite JavaScriptStringEncode routine. - /// - public string JavaScriptStringEncode(string value) - { - return _innerUnicodeEncoder.Encode(value); - } - - /// - /// Everybody's favorite JavaScriptStringEncode routine. - /// - public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - private sealed class JavaScriptStringUnicodeEncoder : UnicodeEncoderBase - { - // A singleton instance of the basic latin encoder. - private static JavaScriptStringUnicodeEncoder _basicLatinSingleton; - - // The worst case encoding is 6 output chars per input char: [input] U+FFFF -> [output] "\uFFFF" - // We don't need to worry about astral code points since they're represented as encoded - // surrogate pairs in the output. - private const int MaxOutputCharsPerInputChar = 6; - - internal JavaScriptStringUnicodeEncoder(CodePointFilter filter) - : base(filter, MaxOutputCharsPerInputChar) - { - // The only interesting characters above and beyond what the base encoder - // already covers are the solidus and reverse solidus. - ForbidCharacter('\\'); - ForbidCharacter('/'); - } - - internal static JavaScriptStringUnicodeEncoder BasicLatin - { - get - { - JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); - if (encoder == null) - { - encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); - Volatile.Write(ref _basicLatinSingleton, encoder); - } - return encoder; - } - } - - // Writes a scalar value as a JavaScript-escaped character (or sequence of characters). - // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 - // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 - // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. - // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". - // (In ECMA-262 this character is a NonEscape character.) - // HTML-specific characters (including apostrophe and quotes) will - // be written out as numeric entities for defense-in-depth. - // See UnicodeEncoderBase ctor comments for more info. - - if (value == (uint)'\b') { writer.Write(@"\b"); } - else if (value == (uint)'\t') { writer.Write(@"\t"); } - else if (value == (uint)'\n') { writer.Write(@"\n"); } - else if (value == (uint)'\f') { writer.Write(@"\f"); } - else if (value == (uint)'\r') { writer.Write(@"\r"); } - else if (value == (uint)'/') { writer.Write(@"\/"); } - else if (value == (uint)'\\') { writer.Write(@"\\"); } - else { WriteEncodedScalarAsNumericEntity(ref writer, value); } - } - - // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). - private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) - { - if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) - { - // Convert this back to UTF-16 and write out both characters. - char leadingSurrogate, trailingSurrogate; - UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); - WriteEncodedSingleCharacter(ref writer, leadingSurrogate); - WriteEncodedSingleCharacter(ref writer, trailingSurrogate); - } - else - { - // This is only a single character. - WriteEncodedSingleCharacter(ref writer, value); - } - } - - // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. - private static void WriteEncodedSingleCharacter(ref Writer writer, uint value) - { - Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); - - // Encode this as 6 chars "\uFFFF". - writer.Write('\\'); - writer.Write('u'); - writer.Write(HexUtil.IntToChar(value >> 12)); - writer.Write(HexUtil.IntToChar((value >> 8) & 0xFU)); - writer.Write(HexUtil.IntToChar((value >> 4) & 0xFU)); - writer.Write(HexUtil.IntToChar(value & 0xFU)); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj b/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj deleted file mode 100644 index 559ec64868..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - be9112cb-d87d-4080-9cc3-24492d49cbe6 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs deleted file mode 100644 index b781d6ca97..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests")] -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs deleted file mode 100644 index 1a6baaf665..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Text; - -namespace Microsoft.Extensions.WebEncoders -{ - internal unsafe abstract class UnicodeEncoderBase - { - // A bitmap of characters which are allowed to be returned unescaped. - private AllowedCharsBitmap _allowedCharsBitmap; - - // The worst-case number of output chars generated for any input char. - private readonly int _maxOutputCharsPerInputChar; - - /// - /// Instantiates an encoder using a custom allow list of characters. - /// - protected UnicodeEncoderBase(CodePointFilter filter, int maxOutputCharsPerInputChar) - { - _maxOutputCharsPerInputChar = maxOutputCharsPerInputChar; - _allowedCharsBitmap = filter.GetAllowedCharsBitmap(); - - // Forbid characters that are special in HTML. - // Even though this is a common encoder used by everybody (including URL - // and JavaScript strings), it's unfortunately common for developers to - // forget to HTML-encode a string once it has been URL-encoded or - // JavaScript string-escaped, so this offers extra protection. - ForbidCharacter('<'); - ForbidCharacter('>'); - ForbidCharacter('&'); - ForbidCharacter('\''); // can be used to escape attributes - ForbidCharacter('\"'); // can be used to escape attributes - ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks - - // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) - _allowedCharsBitmap.ForbidUndefinedCharacters(); - } - - // Marks a character as forbidden (must be returned encoded) - protected void ForbidCharacter(char c) - { - _allowedCharsBitmap.ForbidCharacter(c); - } - - /// - /// Entry point to the encoder. - /// - public void Encode(char[] value, int startIndex, int charCount, TextWriter output) - { - // Input checking - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - ValidateInputs(startIndex, charCount, actualInputLength: value.Length); - - if (charCount != 0) - { - fixed (char* pChars = value) - { - int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(&pChars[startIndex], charCount); - if (indexOfFirstCharWhichRequiresEncoding < 0) - { - // All chars are valid - just copy the buffer as-is. - output.Write(value, startIndex, charCount); - } - else - { - // Flush all chars which are known to be valid, then encode the remainder individually - if (indexOfFirstCharWhichRequiresEncoding > 0) - { - output.Write(value, startIndex, indexOfFirstCharWhichRequiresEncoding); - } - EncodeCore(&pChars[startIndex + indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); - } - } - } - } - - /// - /// Entry point to the encoder. - /// - public string Encode(string value) - { - if (String.IsNullOrEmpty(value)) - { - return value; - } - - // Quick check: does the string need to be encoded at all? - // If not, just return the input string as-is. - for (int i = 0; i < value.Length; i++) - { - if (!IsCharacterAllowed(value[i])) - { - return EncodeCore(value, idxOfFirstCharWhichRequiresEncoding: i); - } - } - return value; - } - - /// - /// Entry point to the encoder. - /// - public void Encode(string value, int startIndex, int charCount, TextWriter output) - { - // Input checking - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - ValidateInputs(startIndex, charCount, actualInputLength: value.Length); - - if (charCount != 0) - { - fixed (char* pChars = value) - { - if (charCount == value.Length) - { - // Optimize for the common case: we're being asked to encode the entire input string - // (not just a subset). If all characters are safe, we can just spit it out as-is. - int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(pChars, charCount); - if (indexOfFirstCharWhichRequiresEncoding < 0) - { - output.Write(value); - } - else - { - // Flush all chars which are known to be valid, then encode the remainder individually - for (int i = 0; i < indexOfFirstCharWhichRequiresEncoding; i++) - { - output.Write(pChars[i]); - } - EncodeCore(&pChars[indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); - } - } - else - { - // We're being asked to encode a subset, so we need to go through the slow path of appending - // each character individually. - EncodeCore(&pChars[startIndex], (uint)charCount, output); - } - } - } - } - - private string EncodeCore(string input, int idxOfFirstCharWhichRequiresEncoding) - { - Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); - Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); - - int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; - int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, _maxOutputCharsPerInputChar)); - Debug.Assert(sbCapacity >= input.Length); - - // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, - // then begin encoding from the last (potentially requiring encoding) part of the input string. - StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); - Writer writer = new Writer(builder); - fixed (char* pInput = input) - { - EncodeCore(ref writer, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); - } - return builder.ToString(); - } - - private void EncodeCore(char* input, uint charsRemaining, TextWriter output) - { - Writer writer = new Writer(output); - EncodeCore(ref writer, input, charsRemaining); - } - - private void EncodeCore(ref Writer writer, char* input, uint charsRemaining) - { - while (charsRemaining != 0) - { - int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); - if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) - { - // Supplementary characters should always be encoded numerically. - WriteEncodedScalar(ref writer, (uint)nextScalar); - - // We consume two UTF-16 characters for a single supplementary character. - input += 2; - charsRemaining -= 2; - } - else - { - // Otherwise, this was a BMP character. - input++; - charsRemaining--; - char c = (char)nextScalar; - if (IsCharacterAllowed(c)) - { - writer.Write(c); - } - else - { - WriteEncodedScalar(ref writer, (uint)nextScalar); - } - } - } - } - - private int GetIndexOfFirstCharWhichRequiresEncoding(char* input, int inputLength) - { - for (int i = 0; i < inputLength; i++) - { - if (!IsCharacterAllowed(input[i])) - { - return i; - } - } - return -1; // no characters require encoding - } - - // Determines whether the given character can be returned unencoded. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private bool IsCharacterAllowed(char c) - { - return _allowedCharsBitmap.IsCharacterAllowed(c); - } - - private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) - { - if (startIndex < 0 || startIndex > actualInputLength) - { - throw new ArgumentOutOfRangeException(nameof(startIndex)); - } - if (charCount < 0 || charCount > (actualInputLength - startIndex)) - { - throw new ArgumentOutOfRangeException(nameof(charCount)); - } - } - - protected abstract void WriteEncodedScalar(ref Writer writer, uint value); - - /// - /// Provides an abstraction over both StringBuilder and TextWriter. - /// Declared as a struct so we can allocate on the stack and pass by - /// reference. Eliminates chatty virtual dispatches on hot paths. - /// - protected struct Writer - { - private readonly StringBuilder _innerBuilder; - private readonly TextWriter _innerWriter; - - public Writer(StringBuilder innerBuilder) - { - _innerBuilder = innerBuilder; - _innerWriter = null; - } - - public Writer(TextWriter innerWriter) - { - _innerBuilder = null; - _innerWriter = innerWriter; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Write(char value) - { - if (_innerBuilder != null) - { - _innerBuilder.Append(value); - } - else - { - _innerWriter.Write(value); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Write(string value) - { - if (_innerBuilder != null) - { - _innerBuilder.Append(value); - } - else - { - _innerWriter.Write(value); - } - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs deleted file mode 100644 index 53e52ef573..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains helpers for dealing with Unicode code points. - /// - internal unsafe static class UnicodeHelpers - { - /// - /// Used for invalid Unicode sequences or other unrepresentable values. - /// - private const char UNICODE_REPLACEMENT_CHAR = '\uFFFD'; - - /// - /// The last code point defined by the Unicode specification. - /// - internal const int UNICODE_LAST_CODEPOINT = 0x10FFFF; - - private static uint[] _definedCharacterBitmap; - - /// - /// Helper method which creates a bitmap of all characters which are - /// defined per version 8.0 of the Unicode specification. - /// - [MethodImpl(MethodImplOptions.NoInlining)] - private static uint[] CreateDefinedCharacterBitmap() - { - // The stream should be exactly 8KB in size. - var assembly = typeof(UnicodeHelpers).GetTypeInfo().Assembly; - var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-defined-chars.bin"; - - var stream = assembly.GetManifestResourceStream(resourceName); - if (stream.Length != 8 * 1024) - { - Environment.FailFast("Corrupt data detected."); - } - - // Read everything in as raw bytes. - byte[] rawData = new byte[8 * 1024]; - for (int numBytesReadTotal = 0; numBytesReadTotal < rawData.Length;) - { - int numBytesReadThisIteration = stream.Read(rawData, numBytesReadTotal, rawData.Length - numBytesReadTotal); - if (numBytesReadThisIteration == 0) - { - Environment.FailFast("Corrupt data detected."); - } - numBytesReadTotal += numBytesReadThisIteration; - } - - // Finally, convert the byte[] to a uint[]. - // The incoming bytes are little-endian. - uint[] retVal = new uint[2 * 1024]; - for (int i = 0; i < retVal.Length; i++) - { - retVal[i] = (((uint)rawData[4 * i + 3]) << 24) - | (((uint)rawData[4 * i + 2]) << 16) - | (((uint)rawData[4 * i + 1]) << 8) - | (uint)rawData[4 * i]; - } - - // And we're done! - Volatile.Write(ref _definedCharacterBitmap, retVal); - return retVal; - } - - /// - /// Returns a bitmap of all characters which are defined per version 8.0 - /// of the Unicode specification. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static uint[] GetDefinedCharacterBitmap() - { - return Volatile.Read(ref _definedCharacterBitmap) ?? CreateDefinedCharacterBitmap(); - } - - /// - /// Given a UTF-16 character stream, reads the next scalar value from the stream. - /// Set 'endOfString' to true if 'pChar' points to the last character in the stream. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static int GetScalarValueFromUtf16(char* pChar, bool endOfString) - { - // This method is marked as AggressiveInlining to handle the common case of a non-surrogate - // character. The surrogate case is handled in the slower fallback code path. - char thisChar = *pChar; - return (Char.IsSurrogate(thisChar)) ? GetScalarValueFromUtf16Slow(pChar, endOfString) : thisChar; - } - - private static int GetScalarValueFromUtf16Slow(char* pChar, bool endOfString) - { - char firstChar = pChar[0]; - - if (!Char.IsSurrogate(firstChar)) - { - Debug.Fail("This case should've been handled by the fast path."); - return firstChar; - } - else if (Char.IsHighSurrogate(firstChar)) - { - if (endOfString) - { - // unmatched surrogate - substitute - return UNICODE_REPLACEMENT_CHAR; - } - else - { - char secondChar = pChar[1]; - if (Char.IsLowSurrogate(secondChar)) - { - // valid surrogate pair - extract codepoint - return GetScalarValueFromUtf16SurrogatePair(firstChar, secondChar); - } - else - { - // unmatched surrogate - substitute - return UNICODE_REPLACEMENT_CHAR; - } - } - } - else - { - // unmatched surrogate - substitute - Debug.Assert(Char.IsLowSurrogate(firstChar)); - return UNICODE_REPLACEMENT_CHAR; - } - } - - private static int GetScalarValueFromUtf16SurrogatePair(char highSurrogate, char lowSurrogate) - { - Debug.Assert(Char.IsHighSurrogate(highSurrogate)); - Debug.Assert(Char.IsLowSurrogate(lowSurrogate)); - - // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the - // details of this conversion. We don't use Char.ConvertToUtf32 because its exception - // handling shows up on the hot path, and our caller has already sanitized the inputs. - return (lowSurrogate & 0x3ff) | (((highSurrogate & 0x3ff) + (1 << 6)) << 10); - } - - internal static void GetUtf16SurrogatePairFromAstralScalarValue(int scalar, out char highSurrogate, out char lowSurrogate) - { - Debug.Assert(0x10000 <= scalar && scalar <= UNICODE_LAST_CODEPOINT); - - // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the - // details of this conversion. We don't use Char.ConvertFromUtf32 because its exception - // handling shows up on the hot path, it allocates temporary strings (which we don't want), - // and our caller has already sanitized the inputs. - - int x = scalar & 0xFFFF; - int u = scalar >> 16; - int w = u - 1; - highSurrogate = (char)(0xD800 | (w << 6) | (x >> 10)); - lowSurrogate = (char)(0xDC00 | (x & 0x3FF)); - } - - /// - /// Given a Unicode scalar value, returns the UTF-8 representation of the value. - /// The return value's bytes should be popped from the LSB. - /// - internal static int GetUtf8RepresentationForScalarValue(uint scalar) - { - Debug.Assert(scalar <= UNICODE_LAST_CODEPOINT); - - // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.6 for the - // details of this conversion. We don't use UTF8Encoding since we're encoding - // a scalar code point, not a UTF16 character sequence. - if (scalar <= 0x7f) - { - // one byte used: scalar 00000000 0xxxxxxx -> byte sequence 0xxxxxxx - byte firstByte = (byte)scalar; - return firstByte; - } - else if (scalar <= 0x7ff) - { - // two bytes used: scalar 00000yyy yyxxxxxx -> byte sequence 110yyyyy 10xxxxxx - byte firstByte = (byte)(0xc0 | (scalar >> 6)); - byte secondByteByte = (byte)(0x80 | (scalar & 0x3f)); - return ((secondByteByte << 8) | firstByte); - } - else if (scalar <= 0xffff) - { - // three bytes used: scalar zzzzyyyy yyxxxxxx -> byte sequence 1110zzzz 10yyyyyy 10xxxxxx - byte firstByte = (byte)(0xe0 | (scalar >> 12)); - byte secondByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); - byte thirdByte = (byte)(0x80 | (scalar & 0x3f)); - return ((((thirdByte << 8) | secondByte) << 8) | firstByte); - } - else - { - // four bytes used: scalar 000uuuuu zzzzyyyy yyxxxxxx -> byte sequence 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx - byte firstByte = (byte)(0xf0 | (scalar >> 18)); - byte secondByte = (byte)(0x80 | ((scalar >> 12) & 0x3f)); - byte thirdByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); - byte fourthByte = (byte)(0x80 | (scalar & 0x3f)); - return ((((((fourthByte << 8) | thirdByte) << 8) | secondByte) << 8) | firstByte); - } - } - - /// - /// Returns a value stating whether a character is defined per version 8.0 - /// of the Unicode specification. Certain classes of characters (control chars, - /// private use, surrogates, some whitespace) are considered "undefined" for - /// our purposes. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static bool IsCharacterDefined(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((GetDefinedCharacterBitmap()[index] >> offset) & 0x1U) != 0; - } - - /// - /// Determines whether the given scalar value is in the supplementary plane and thus - /// requires 2 characters to be represented in UTF-16 (as a surrogate pair). - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static bool IsSupplementaryCodePoint(int scalar) - { - return ((scalar & ~((int)Char.MaxValue)) != 0); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs deleted file mode 100644 index 8320350e16..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Represents a contiguous range of Unicode code points. - /// - /// - /// Currently only the Basic Multilingual Plane is supported. - /// - public sealed class UnicodeRange - { - /// - /// Creates a new . - /// - /// The first code point in the range. - /// The number of code points in the range. - public UnicodeRange(int firstCodePoint, int rangeSize) - { - // Parameter checking: the first code point and last code point must - // lie within the BMP. See http://unicode.org/faq/blocks_ranges.html for more info. - if (firstCodePoint < 0 || firstCodePoint > 0xFFFF) - { - throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); - } - if (rangeSize < 0 || ((long)firstCodePoint + (long)rangeSize > 0x10000)) - { - throw new ArgumentOutOfRangeException(nameof(rangeSize)); - } - - FirstCodePoint = firstCodePoint; - RangeSize = rangeSize; - } - - /// - /// The first code point in this range. - /// - public int FirstCodePoint { get; } - - /// - /// The number of code points in this range. - /// - public int RangeSize { get; } - - /// - /// Creates a new from a span of characters. - /// - /// The first character in the range. - /// The last character in the range. - /// The representing this span. - public static UnicodeRange FromSpan(char firstChar, char lastChar) - { - if (lastChar < firstChar) - { - throw new ArgumentOutOfRangeException(nameof(lastChar)); - } - - return new UnicodeRange(firstChar, 1 + (int)(lastChar - firstChar)); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs deleted file mode 100644 index 73d155e141..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains predefined instances which correspond to blocks - /// from the Unicode 8.0 specification. - /// - public static partial class UnicodeRanges - { - /// - /// An empty . This range contains no code points. - /// - public static UnicodeRange None => Volatile.Read(ref _none) ?? CreateEmptyRange(ref _none); - private static UnicodeRange _none; - - /// - /// A which contains all characters in the Unicode Basic - /// Multilingual Plane (U+0000..U+FFFF). - /// - public static UnicodeRange All => Volatile.Read(ref _all) ?? CreateRange(ref _all, '\u0000', '\uFFFF'); - private static UnicodeRange _all; - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeRange CreateEmptyRange(ref UnicodeRange range) - { - // If the range hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'range' value. - var newRange = new UnicodeRange(0, 0); - Volatile.Write(ref range, newRange); - return newRange; - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeRange CreateRange(ref UnicodeRange range, char first, char last) - { - // If the range hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'range' value. - Debug.Assert(last > first, "Code points were specified out of order."); - var newRange = UnicodeRange.FromSpan(first, last); - Volatile.Write(ref range, newRange); - return newRange; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs deleted file mode 100644 index ae2079a309..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs +++ /dev/null @@ -1,1415 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - public static partial class UnicodeRanges - { - /// - /// A corresponding to the 'Basic Latin' Unicode block (U+0000..U+007F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. - /// - public static UnicodeRange BasicLatin => Volatile.Read(ref _basicLatin) ?? CreateRange(ref _basicLatin, first: '\u0000', last: '\u007F'); - private static UnicodeRange _basicLatin; - - /// - /// A corresponding to the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. - /// - public static UnicodeRange Latin1Supplement => Volatile.Read(ref _latin1Supplement) ?? CreateRange(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); - private static UnicodeRange _latin1Supplement; - - /// - /// A corresponding to the 'Latin Extended-A' Unicode block (U+0100..U+017F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedA => Volatile.Read(ref _latinExtendedA) ?? CreateRange(ref _latinExtendedA, first: '\u0100', last: '\u017F'); - private static UnicodeRange _latinExtendedA; - - /// - /// A corresponding to the 'Latin Extended-B' Unicode block (U+0180..U+024F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedB => Volatile.Read(ref _latinExtendedB) ?? CreateRange(ref _latinExtendedB, first: '\u0180', last: '\u024F'); - private static UnicodeRange _latinExtendedB; - - /// - /// A corresponding to the 'IPA Extensions' Unicode block (U+0250..U+02AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. - /// - public static UnicodeRange IPAExtensions => Volatile.Read(ref _ipaExtensions) ?? CreateRange(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); - private static UnicodeRange _ipaExtensions; - - /// - /// A corresponding to the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. - /// - public static UnicodeRange SpacingModifierLetters => Volatile.Read(ref _spacingModifierLetters) ?? CreateRange(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); - private static UnicodeRange _spacingModifierLetters; - - /// - /// A corresponding to the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarks => Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateRange(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); - private static UnicodeRange _combiningDiacriticalMarks; - - /// - /// A corresponding to the 'Greek and Coptic' Unicode block (U+0370..U+03FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. - /// - public static UnicodeRange GreekandCoptic => Volatile.Read(ref _greekandCoptic) ?? CreateRange(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); - private static UnicodeRange _greekandCoptic; - - /// - /// A corresponding to the 'Cyrillic' Unicode block (U+0400..U+04FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. - /// - public static UnicodeRange Cyrillic => Volatile.Read(ref _cyrillic) ?? CreateRange(ref _cyrillic, first: '\u0400', last: '\u04FF'); - private static UnicodeRange _cyrillic; - - /// - /// A corresponding to the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. - /// - public static UnicodeRange CyrillicSupplement => Volatile.Read(ref _cyrillicSupplement) ?? CreateRange(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); - private static UnicodeRange _cyrillicSupplement; - - /// - /// A corresponding to the 'Armenian' Unicode block (U+0530..U+058F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. - /// - public static UnicodeRange Armenian => Volatile.Read(ref _armenian) ?? CreateRange(ref _armenian, first: '\u0530', last: '\u058F'); - private static UnicodeRange _armenian; - - /// - /// A corresponding to the 'Hebrew' Unicode block (U+0590..U+05FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. - /// - public static UnicodeRange Hebrew => Volatile.Read(ref _hebrew) ?? CreateRange(ref _hebrew, first: '\u0590', last: '\u05FF'); - private static UnicodeRange _hebrew; - - /// - /// A corresponding to the 'Arabic' Unicode block (U+0600..U+06FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. - /// - public static UnicodeRange Arabic => Volatile.Read(ref _arabic) ?? CreateRange(ref _arabic, first: '\u0600', last: '\u06FF'); - private static UnicodeRange _arabic; - - /// - /// A corresponding to the 'Syriac' Unicode block (U+0700..U+074F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. - /// - public static UnicodeRange Syriac => Volatile.Read(ref _syriac) ?? CreateRange(ref _syriac, first: '\u0700', last: '\u074F'); - private static UnicodeRange _syriac; - - /// - /// A corresponding to the 'Arabic Supplement' Unicode block (U+0750..U+077F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicSupplement => Volatile.Read(ref _arabicSupplement) ?? CreateRange(ref _arabicSupplement, first: '\u0750', last: '\u077F'); - private static UnicodeRange _arabicSupplement; - - /// - /// A corresponding to the 'Thaana' Unicode block (U+0780..U+07BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. - /// - public static UnicodeRange Thaana => Volatile.Read(ref _thaana) ?? CreateRange(ref _thaana, first: '\u0780', last: '\u07BF'); - private static UnicodeRange _thaana; - - /// - /// A corresponding to the 'NKo' Unicode block (U+07C0..U+07FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. - /// - public static UnicodeRange NKo => Volatile.Read(ref _nKo) ?? CreateRange(ref _nKo, first: '\u07C0', last: '\u07FF'); - private static UnicodeRange _nKo; - - /// - /// A corresponding to the 'Samaritan' Unicode block (U+0800..U+083F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. - /// - public static UnicodeRange Samaritan => Volatile.Read(ref _samaritan) ?? CreateRange(ref _samaritan, first: '\u0800', last: '\u083F'); - private static UnicodeRange _samaritan; - - /// - /// A corresponding to the 'Mandaic' Unicode block (U+0840..U+085F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. - /// - public static UnicodeRange Mandaic => Volatile.Read(ref _mandaic) ?? CreateRange(ref _mandaic, first: '\u0840', last: '\u085F'); - private static UnicodeRange _mandaic; - - /// - /// A corresponding to the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicExtendedA => Volatile.Read(ref _arabicExtendedA) ?? CreateRange(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); - private static UnicodeRange _arabicExtendedA; - - /// - /// A corresponding to the 'Devanagari' Unicode block (U+0900..U+097F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. - /// - public static UnicodeRange Devanagari => Volatile.Read(ref _devanagari) ?? CreateRange(ref _devanagari, first: '\u0900', last: '\u097F'); - private static UnicodeRange _devanagari; - - /// - /// A corresponding to the 'Bengali' Unicode block (U+0980..U+09FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. - /// - public static UnicodeRange Bengali => Volatile.Read(ref _bengali) ?? CreateRange(ref _bengali, first: '\u0980', last: '\u09FF'); - private static UnicodeRange _bengali; - - /// - /// A corresponding to the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Gurmukhi => Volatile.Read(ref _gurmukhi) ?? CreateRange(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); - private static UnicodeRange _gurmukhi; - - /// - /// A corresponding to the 'Gujarati' Unicode block (U+0A80..U+0AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Gujarati => Volatile.Read(ref _gujarati) ?? CreateRange(ref _gujarati, first: '\u0A80', last: '\u0AFF'); - private static UnicodeRange _gujarati; - - /// - /// A corresponding to the 'Oriya' Unicode block (U+0B00..U+0B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Oriya => Volatile.Read(ref _oriya) ?? CreateRange(ref _oriya, first: '\u0B00', last: '\u0B7F'); - private static UnicodeRange _oriya; - - /// - /// A corresponding to the 'Tamil' Unicode block (U+0B80..U+0BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tamil => Volatile.Read(ref _tamil) ?? CreateRange(ref _tamil, first: '\u0B80', last: '\u0BFF'); - private static UnicodeRange _tamil; - - /// - /// A corresponding to the 'Telugu' Unicode block (U+0C00..U+0C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Telugu => Volatile.Read(ref _telugu) ?? CreateRange(ref _telugu, first: '\u0C00', last: '\u0C7F'); - private static UnicodeRange _telugu; - - /// - /// A corresponding to the 'Kannada' Unicode block (U+0C80..U+0CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Kannada => Volatile.Read(ref _kannada) ?? CreateRange(ref _kannada, first: '\u0C80', last: '\u0CFF'); - private static UnicodeRange _kannada; - - /// - /// A corresponding to the 'Malayalam' Unicode block (U+0D00..U+0D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Malayalam => Volatile.Read(ref _malayalam) ?? CreateRange(ref _malayalam, first: '\u0D00', last: '\u0D7F'); - private static UnicodeRange _malayalam; - - /// - /// A corresponding to the 'Sinhala' Unicode block (U+0D80..U+0DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Sinhala => Volatile.Read(ref _sinhala) ?? CreateRange(ref _sinhala, first: '\u0D80', last: '\u0DFF'); - private static UnicodeRange _sinhala; - - /// - /// A corresponding to the 'Thai' Unicode block (U+0E00..U+0E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Thai => Volatile.Read(ref _thai) ?? CreateRange(ref _thai, first: '\u0E00', last: '\u0E7F'); - private static UnicodeRange _thai; - - /// - /// A corresponding to the 'Lao' Unicode block (U+0E80..U+0EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Lao => Volatile.Read(ref _lao) ?? CreateRange(ref _lao, first: '\u0E80', last: '\u0EFF'); - private static UnicodeRange _lao; - - /// - /// A corresponding to the 'Tibetan' Unicode block (U+0F00..U+0FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tibetan => Volatile.Read(ref _tibetan) ?? CreateRange(ref _tibetan, first: '\u0F00', last: '\u0FFF'); - private static UnicodeRange _tibetan; - - /// - /// A corresponding to the 'Myanmar' Unicode block (U+1000..U+109F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. - /// - public static UnicodeRange Myanmar => Volatile.Read(ref _myanmar) ?? CreateRange(ref _myanmar, first: '\u1000', last: '\u109F'); - private static UnicodeRange _myanmar; - - /// - /// A corresponding to the 'Georgian' Unicode block (U+10A0..U+10FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Georgian => Volatile.Read(ref _georgian) ?? CreateRange(ref _georgian, first: '\u10A0', last: '\u10FF'); - private static UnicodeRange _georgian; - - /// - /// A corresponding to the 'Hangul Jamo' Unicode block (U+1100..U+11FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulJamo => Volatile.Read(ref _hangulJamo) ?? CreateRange(ref _hangulJamo, first: '\u1100', last: '\u11FF'); - private static UnicodeRange _hangulJamo; - - /// - /// A corresponding to the 'Ethiopic' Unicode block (U+1200..U+137F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. - /// - public static UnicodeRange Ethiopic => Volatile.Read(ref _ethiopic) ?? CreateRange(ref _ethiopic, first: '\u1200', last: '\u137F'); - private static UnicodeRange _ethiopic; - - /// - /// A corresponding to the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. - /// - public static UnicodeRange EthiopicSupplement => Volatile.Read(ref _ethiopicSupplement) ?? CreateRange(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); - private static UnicodeRange _ethiopicSupplement; - - /// - /// A corresponding to the 'Cherokee' Unicode block (U+13A0..U+13FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Cherokee => Volatile.Read(ref _cherokee) ?? CreateRange(ref _cherokee, first: '\u13A0', last: '\u13FF'); - private static UnicodeRange _cherokee; - - /// - /// A corresponding to the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. - /// - public static UnicodeRange UnifiedCanadianAboriginalSyllabics => Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); - private static UnicodeRange _unifiedCanadianAboriginalSyllabics; - - /// - /// A corresponding to the 'Ogham' Unicode block (U+1680..U+169F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. - /// - public static UnicodeRange Ogham => Volatile.Read(ref _ogham) ?? CreateRange(ref _ogham, first: '\u1680', last: '\u169F'); - private static UnicodeRange _ogham; - - /// - /// A corresponding to the 'Runic' Unicode block (U+16A0..U+16FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Runic => Volatile.Read(ref _runic) ?? CreateRange(ref _runic, first: '\u16A0', last: '\u16FF'); - private static UnicodeRange _runic; - - /// - /// A corresponding to the 'Tagalog' Unicode block (U+1700..U+171F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tagalog => Volatile.Read(ref _tagalog) ?? CreateRange(ref _tagalog, first: '\u1700', last: '\u171F'); - private static UnicodeRange _tagalog; - - /// - /// A corresponding to the 'Hanunoo' Unicode block (U+1720..U+173F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. - /// - public static UnicodeRange Hanunoo => Volatile.Read(ref _hanunoo) ?? CreateRange(ref _hanunoo, first: '\u1720', last: '\u173F'); - private static UnicodeRange _hanunoo; - - /// - /// A corresponding to the 'Buhid' Unicode block (U+1740..U+175F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. - /// - public static UnicodeRange Buhid => Volatile.Read(ref _buhid) ?? CreateRange(ref _buhid, first: '\u1740', last: '\u175F'); - private static UnicodeRange _buhid; - - /// - /// A corresponding to the 'Tagbanwa' Unicode block (U+1760..U+177F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tagbanwa => Volatile.Read(ref _tagbanwa) ?? CreateRange(ref _tagbanwa, first: '\u1760', last: '\u177F'); - private static UnicodeRange _tagbanwa; - - /// - /// A corresponding to the 'Khmer' Unicode block (U+1780..U+17FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. - /// - public static UnicodeRange Khmer => Volatile.Read(ref _khmer) ?? CreateRange(ref _khmer, first: '\u1780', last: '\u17FF'); - private static UnicodeRange _khmer; - - /// - /// A corresponding to the 'Mongolian' Unicode block (U+1800..U+18AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. - /// - public static UnicodeRange Mongolian => Volatile.Read(ref _mongolian) ?? CreateRange(ref _mongolian, first: '\u1800', last: '\u18AF'); - private static UnicodeRange _mongolian; - - /// - /// A corresponding to the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. - /// - public static UnicodeRange UnifiedCanadianAboriginalSyllabicsExtended => Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); - private static UnicodeRange _unifiedCanadianAboriginalSyllabicsExtended; - - /// - /// A corresponding to the 'Limbu' Unicode block (U+1900..U+194F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. - /// - public static UnicodeRange Limbu => Volatile.Read(ref _limbu) ?? CreateRange(ref _limbu, first: '\u1900', last: '\u194F'); - private static UnicodeRange _limbu; - - /// - /// A corresponding to the 'Tai Le' Unicode block (U+1950..U+197F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. - /// - public static UnicodeRange TaiLe => Volatile.Read(ref _taiLe) ?? CreateRange(ref _taiLe, first: '\u1950', last: '\u197F'); - private static UnicodeRange _taiLe; - - /// - /// A corresponding to the 'New Tai Lue' Unicode block (U+1980..U+19DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. - /// - public static UnicodeRange NewTaiLue => Volatile.Read(ref _newTaiLue) ?? CreateRange(ref _newTaiLue, first: '\u1980', last: '\u19DF'); - private static UnicodeRange _newTaiLue; - - /// - /// A corresponding to the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. - /// - public static UnicodeRange KhmerSymbols => Volatile.Read(ref _khmerSymbols) ?? CreateRange(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); - private static UnicodeRange _khmerSymbols; - - /// - /// A corresponding to the 'Buginese' Unicode block (U+1A00..U+1A1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Buginese => Volatile.Read(ref _buginese) ?? CreateRange(ref _buginese, first: '\u1A00', last: '\u1A1F'); - private static UnicodeRange _buginese; - - /// - /// A corresponding to the 'Tai Tham' Unicode block (U+1A20..U+1AAF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. - /// - public static UnicodeRange TaiTham => Volatile.Read(ref _taiTham) ?? CreateRange(ref _taiTham, first: '\u1A20', last: '\u1AAF'); - private static UnicodeRange _taiTham; - - /// - /// A corresponding to the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarksExtended => Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateRange(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); - private static UnicodeRange _combiningDiacriticalMarksExtended; - - /// - /// A corresponding to the 'Balinese' Unicode block (U+1B00..U+1B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Balinese => Volatile.Read(ref _balinese) ?? CreateRange(ref _balinese, first: '\u1B00', last: '\u1B7F'); - private static UnicodeRange _balinese; - - /// - /// A corresponding to the 'Sundanese' Unicode block (U+1B80..U+1BBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Sundanese => Volatile.Read(ref _sundanese) ?? CreateRange(ref _sundanese, first: '\u1B80', last: '\u1BBF'); - private static UnicodeRange _sundanese; - - /// - /// A corresponding to the 'Batak' Unicode block (U+1BC0..U+1BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Batak => Volatile.Read(ref _batak) ?? CreateRange(ref _batak, first: '\u1BC0', last: '\u1BFF'); - private static UnicodeRange _batak; - - /// - /// A corresponding to the 'Lepcha' Unicode block (U+1C00..U+1C4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Lepcha => Volatile.Read(ref _lepcha) ?? CreateRange(ref _lepcha, first: '\u1C00', last: '\u1C4F'); - private static UnicodeRange _lepcha; - - /// - /// A corresponding to the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. - /// - public static UnicodeRange OlChiki => Volatile.Read(ref _olChiki) ?? CreateRange(ref _olChiki, first: '\u1C50', last: '\u1C7F'); - private static UnicodeRange _olChiki; - - /// - /// A corresponding to the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange SundaneseSupplement => Volatile.Read(ref _sundaneseSupplement) ?? CreateRange(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); - private static UnicodeRange _sundaneseSupplement; - - /// - /// A corresponding to the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. - /// - public static UnicodeRange VedicExtensions => Volatile.Read(ref _vedicExtensions) ?? CreateRange(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); - private static UnicodeRange _vedicExtensions; - - /// - /// A corresponding to the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. - /// - public static UnicodeRange PhoneticExtensions => Volatile.Read(ref _phoneticExtensions) ?? CreateRange(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); - private static UnicodeRange _phoneticExtensions; - - /// - /// A corresponding to the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. - /// - public static UnicodeRange PhoneticExtensionsSupplement => Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateRange(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); - private static UnicodeRange _phoneticExtensionsSupplement; - - /// - /// A corresponding to the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarksSupplement => Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateRange(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); - private static UnicodeRange _combiningDiacriticalMarksSupplement; - - /// - /// A corresponding to the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedAdditional => Volatile.Read(ref _latinExtendedAdditional) ?? CreateRange(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); - private static UnicodeRange _latinExtendedAdditional; - - /// - /// A corresponding to the 'Greek Extended' Unicode block (U+1F00..U+1FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. - /// - public static UnicodeRange GreekExtended => Volatile.Read(ref _greekExtended) ?? CreateRange(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); - private static UnicodeRange _greekExtended; - - /// - /// A corresponding to the 'General Punctuation' Unicode block (U+2000..U+206F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. - /// - public static UnicodeRange GeneralPunctuation => Volatile.Read(ref _generalPunctuation) ?? CreateRange(ref _generalPunctuation, first: '\u2000', last: '\u206F'); - private static UnicodeRange _generalPunctuation; - - /// - /// A corresponding to the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. - /// - public static UnicodeRange SuperscriptsandSubscripts => Volatile.Read(ref _superscriptsandSubscripts) ?? CreateRange(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); - private static UnicodeRange _superscriptsandSubscripts; - - /// - /// A corresponding to the 'Currency Symbols' Unicode block (U+20A0..U+20CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CurrencySymbols => Volatile.Read(ref _currencySymbols) ?? CreateRange(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); - private static UnicodeRange _currencySymbols; - - /// - /// A corresponding to the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarksforSymbols => Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateRange(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); - private static UnicodeRange _combiningDiacriticalMarksforSymbols; - - /// - /// A corresponding to the 'Letterlike Symbols' Unicode block (U+2100..U+214F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. - /// - public static UnicodeRange LetterlikeSymbols => Volatile.Read(ref _letterlikeSymbols) ?? CreateRange(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); - private static UnicodeRange _letterlikeSymbols; - - /// - /// A corresponding to the 'Number Forms' Unicode block (U+2150..U+218F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. - /// - public static UnicodeRange NumberForms => Volatile.Read(ref _numberForms) ?? CreateRange(ref _numberForms, first: '\u2150', last: '\u218F'); - private static UnicodeRange _numberForms; - - /// - /// A corresponding to the 'Arrows' Unicode block (U+2190..U+21FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. - /// - public static UnicodeRange Arrows => Volatile.Read(ref _arrows) ?? CreateRange(ref _arrows, first: '\u2190', last: '\u21FF'); - private static UnicodeRange _arrows; - - /// - /// A corresponding to the 'Mathematical Operators' Unicode block (U+2200..U+22FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. - /// - public static UnicodeRange MathematicalOperators => Volatile.Read(ref _mathematicalOperators) ?? CreateRange(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); - private static UnicodeRange _mathematicalOperators; - - /// - /// A corresponding to the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousTechnical => Volatile.Read(ref _miscellaneousTechnical) ?? CreateRange(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); - private static UnicodeRange _miscellaneousTechnical; - - /// - /// A corresponding to the 'Control Pictures' Unicode block (U+2400..U+243F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. - /// - public static UnicodeRange ControlPictures => Volatile.Read(ref _controlPictures) ?? CreateRange(ref _controlPictures, first: '\u2400', last: '\u243F'); - private static UnicodeRange _controlPictures; - - /// - /// A corresponding to the 'Optical Character Recognition' Unicode block (U+2440..U+245F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. - /// - public static UnicodeRange OpticalCharacterRecognition => Volatile.Read(ref _opticalCharacterRecognition) ?? CreateRange(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); - private static UnicodeRange _opticalCharacterRecognition; - - /// - /// A corresponding to the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. - /// - public static UnicodeRange EnclosedAlphanumerics => Volatile.Read(ref _enclosedAlphanumerics) ?? CreateRange(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); - private static UnicodeRange _enclosedAlphanumerics; - - /// - /// A corresponding to the 'Box Drawing' Unicode block (U+2500..U+257F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. - /// - public static UnicodeRange BoxDrawing => Volatile.Read(ref _boxDrawing) ?? CreateRange(ref _boxDrawing, first: '\u2500', last: '\u257F'); - private static UnicodeRange _boxDrawing; - - /// - /// A corresponding to the 'Block Elements' Unicode block (U+2580..U+259F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. - /// - public static UnicodeRange BlockElements => Volatile.Read(ref _blockElements) ?? CreateRange(ref _blockElements, first: '\u2580', last: '\u259F'); - private static UnicodeRange _blockElements; - - /// - /// A corresponding to the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange GeometricShapes => Volatile.Read(ref _geometricShapes) ?? CreateRange(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); - private static UnicodeRange _geometricShapes; - - /// - /// A corresponding to the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousSymbols => Volatile.Read(ref _miscellaneousSymbols) ?? CreateRange(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); - private static UnicodeRange _miscellaneousSymbols; - - /// - /// A corresponding to the 'Dingbats' Unicode block (U+2700..U+27BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. - /// - public static UnicodeRange Dingbats => Volatile.Read(ref _dingbats) ?? CreateRange(ref _dingbats, first: '\u2700', last: '\u27BF'); - private static UnicodeRange _dingbats; - - /// - /// A corresponding to the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousMathematicalSymbolsA => Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateRange(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); - private static UnicodeRange _miscellaneousMathematicalSymbolsA; - - /// - /// A corresponding to the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalArrowsA => Volatile.Read(ref _supplementalArrowsA) ?? CreateRange(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); - private static UnicodeRange _supplementalArrowsA; - - /// - /// A corresponding to the 'Braille Patterns' Unicode block (U+2800..U+28FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. - /// - public static UnicodeRange BraillePatterns => Volatile.Read(ref _braillePatterns) ?? CreateRange(ref _braillePatterns, first: '\u2800', last: '\u28FF'); - private static UnicodeRange _braillePatterns; - - /// - /// A corresponding to the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalArrowsB => Volatile.Read(ref _supplementalArrowsB) ?? CreateRange(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); - private static UnicodeRange _supplementalArrowsB; - - /// - /// A corresponding to the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousMathematicalSymbolsB => Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateRange(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); - private static UnicodeRange _miscellaneousMathematicalSymbolsB; - - /// - /// A corresponding to the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalMathematicalOperators => Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateRange(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); - private static UnicodeRange _supplementalMathematicalOperators; - - /// - /// A corresponding to the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousSymbolsandArrows => Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateRange(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); - private static UnicodeRange _miscellaneousSymbolsandArrows; - - /// - /// A corresponding to the 'Glagolitic' Unicode block (U+2C00..U+2C5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Glagolitic => Volatile.Read(ref _glagolitic) ?? CreateRange(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); - private static UnicodeRange _glagolitic; - - /// - /// A corresponding to the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedC => Volatile.Read(ref _latinExtendedC) ?? CreateRange(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); - private static UnicodeRange _latinExtendedC; - - /// - /// A corresponding to the 'Coptic' Unicode block (U+2C80..U+2CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Coptic => Volatile.Read(ref _coptic) ?? CreateRange(ref _coptic, first: '\u2C80', last: '\u2CFF'); - private static UnicodeRange _coptic; - - /// - /// A corresponding to the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. - /// - public static UnicodeRange GeorgianSupplement => Volatile.Read(ref _georgianSupplement) ?? CreateRange(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); - private static UnicodeRange _georgianSupplement; - - /// - /// A corresponding to the 'Tifinagh' Unicode block (U+2D30..U+2D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tifinagh => Volatile.Read(ref _tifinagh) ?? CreateRange(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); - private static UnicodeRange _tifinagh; - - /// - /// A corresponding to the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. - /// - public static UnicodeRange EthiopicExtended => Volatile.Read(ref _ethiopicExtended) ?? CreateRange(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); - private static UnicodeRange _ethiopicExtended; - - /// - /// A corresponding to the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CyrillicExtendedA => Volatile.Read(ref _cyrillicExtendedA) ?? CreateRange(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); - private static UnicodeRange _cyrillicExtendedA; - - /// - /// A corresponding to the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalPunctuation => Volatile.Read(ref _supplementalPunctuation) ?? CreateRange(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); - private static UnicodeRange _supplementalPunctuation; - - /// - /// A corresponding to the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKRadicalsSupplement => Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateRange(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); - private static UnicodeRange _cjkRadicalsSupplement; - - /// - /// A corresponding to the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. - /// - public static UnicodeRange KangxiRadicals => Volatile.Read(ref _kangxiRadicals) ?? CreateRange(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); - private static UnicodeRange _kangxiRadicals; - - /// - /// A corresponding to the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. - /// - public static UnicodeRange IdeographicDescriptionCharacters => Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateRange(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); - private static UnicodeRange _ideographicDescriptionCharacters; - - /// - /// A corresponding to the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKSymbolsandPunctuation => Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateRange(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); - private static UnicodeRange _cjkSymbolsandPunctuation; - - /// - /// A corresponding to the 'Hiragana' Unicode block (U+3040..U+309F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. - /// - public static UnicodeRange Hiragana => Volatile.Read(ref _hiragana) ?? CreateRange(ref _hiragana, first: '\u3040', last: '\u309F'); - private static UnicodeRange _hiragana; - - /// - /// A corresponding to the 'Katakana' Unicode block (U+30A0..U+30FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Katakana => Volatile.Read(ref _katakana) ?? CreateRange(ref _katakana, first: '\u30A0', last: '\u30FF'); - private static UnicodeRange _katakana; - - /// - /// A corresponding to the 'Bopomofo' Unicode block (U+3100..U+312F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. - /// - public static UnicodeRange Bopomofo => Volatile.Read(ref _bopomofo) ?? CreateRange(ref _bopomofo, first: '\u3100', last: '\u312F'); - private static UnicodeRange _bopomofo; - - /// - /// A corresponding to the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulCompatibilityJamo => Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateRange(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); - private static UnicodeRange _hangulCompatibilityJamo; - - /// - /// A corresponding to the 'Kanbun' Unicode block (U+3190..U+319F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. - /// - public static UnicodeRange Kanbun => Volatile.Read(ref _kanbun) ?? CreateRange(ref _kanbun, first: '\u3190', last: '\u319F'); - private static UnicodeRange _kanbun; - - /// - /// A corresponding to the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange BopomofoExtended => Volatile.Read(ref _bopomofoExtended) ?? CreateRange(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); - private static UnicodeRange _bopomofoExtended; - - /// - /// A corresponding to the 'CJK Strokes' Unicode block (U+31C0..U+31EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKStrokes => Volatile.Read(ref _cjkStrokes) ?? CreateRange(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); - private static UnicodeRange _cjkStrokes; - - /// - /// A corresponding to the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. - /// - public static UnicodeRange KatakanaPhoneticExtensions => Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateRange(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); - private static UnicodeRange _katakanaPhoneticExtensions; - - /// - /// A corresponding to the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. - /// - public static UnicodeRange EnclosedCJKLettersandMonths => Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateRange(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); - private static UnicodeRange _enclosedCJKLettersandMonths; - - /// - /// A corresponding to the 'CJK Compatibility' Unicode block (U+3300..U+33FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKCompatibility => Volatile.Read(ref _cjkCompatibility) ?? CreateRange(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); - private static UnicodeRange _cjkCompatibility; - - /// - /// A corresponding to the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKUnifiedIdeographsExtensionA => Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateRange(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); - private static UnicodeRange _cjkUnifiedIdeographsExtensionA; - - /// - /// A corresponding to the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange YijingHexagramSymbols => Volatile.Read(ref _yijingHexagramSymbols) ?? CreateRange(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); - private static UnicodeRange _yijingHexagramSymbols; - - /// - /// A corresponding to the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKUnifiedIdeographs => Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateRange(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); - private static UnicodeRange _cjkUnifiedIdeographs; - - /// - /// A corresponding to the 'Yi Syllables' Unicode block (U+A000..U+A48F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. - /// - public static UnicodeRange YiSyllables => Volatile.Read(ref _yiSyllables) ?? CreateRange(ref _yiSyllables, first: '\uA000', last: '\uA48F'); - private static UnicodeRange _yiSyllables; - - /// - /// A corresponding to the 'Yi Radicals' Unicode block (U+A490..U+A4CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. - /// - public static UnicodeRange YiRadicals => Volatile.Read(ref _yiRadicals) ?? CreateRange(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); - private static UnicodeRange _yiRadicals; - - /// - /// A corresponding to the 'Lisu' Unicode block (U+A4D0..U+A4FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Lisu => Volatile.Read(ref _lisu) ?? CreateRange(ref _lisu, first: '\uA4D0', last: '\uA4FF'); - private static UnicodeRange _lisu; - - /// - /// A corresponding to the 'Vai' Unicode block (U+A500..U+A63F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. - /// - public static UnicodeRange Vai => Volatile.Read(ref _vai) ?? CreateRange(ref _vai, first: '\uA500', last: '\uA63F'); - private static UnicodeRange _vai; - - /// - /// A corresponding to the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. - /// - public static UnicodeRange CyrillicExtendedB => Volatile.Read(ref _cyrillicExtendedB) ?? CreateRange(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); - private static UnicodeRange _cyrillicExtendedB; - - /// - /// A corresponding to the 'Bamum' Unicode block (U+A6A0..U+A6FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Bamum => Volatile.Read(ref _bamum) ?? CreateRange(ref _bamum, first: '\uA6A0', last: '\uA6FF'); - private static UnicodeRange _bamum; - - /// - /// A corresponding to the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. - /// - public static UnicodeRange ModifierToneLetters => Volatile.Read(ref _modifierToneLetters) ?? CreateRange(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); - private static UnicodeRange _modifierToneLetters; - - /// - /// A corresponding to the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedD => Volatile.Read(ref _latinExtendedD) ?? CreateRange(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); - private static UnicodeRange _latinExtendedD; - - /// - /// A corresponding to the 'Syloti Nagri' Unicode block (U+A800..U+A82F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. - /// - public static UnicodeRange SylotiNagri => Volatile.Read(ref _sylotiNagri) ?? CreateRange(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); - private static UnicodeRange _sylotiNagri; - - /// - /// A corresponding to the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. - /// - public static UnicodeRange CommonIndicNumberForms => Volatile.Read(ref _commonIndicNumberForms) ?? CreateRange(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); - private static UnicodeRange _commonIndicNumberForms; - - /// - /// A corresponding to the 'Phags-pa' Unicode block (U+A840..U+A87F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. - /// - public static UnicodeRange Phagspa => Volatile.Read(ref _phagspa) ?? CreateRange(ref _phagspa, first: '\uA840', last: '\uA87F'); - private static UnicodeRange _phagspa; - - /// - /// A corresponding to the 'Saurashtra' Unicode block (U+A880..U+A8DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. - /// - public static UnicodeRange Saurashtra => Volatile.Read(ref _saurashtra) ?? CreateRange(ref _saurashtra, first: '\uA880', last: '\uA8DF'); - private static UnicodeRange _saurashtra; - - /// - /// A corresponding to the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. - /// - public static UnicodeRange DevanagariExtended => Volatile.Read(ref _devanagariExtended) ?? CreateRange(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); - private static UnicodeRange _devanagariExtended; - - /// - /// A corresponding to the 'Kayah Li' Unicode block (U+A900..U+A92F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. - /// - public static UnicodeRange KayahLi => Volatile.Read(ref _kayahLi) ?? CreateRange(ref _kayahLi, first: '\uA900', last: '\uA92F'); - private static UnicodeRange _kayahLi; - - /// - /// A corresponding to the 'Rejang' Unicode block (U+A930..U+A95F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. - /// - public static UnicodeRange Rejang => Volatile.Read(ref _rejang) ?? CreateRange(ref _rejang, first: '\uA930', last: '\uA95F'); - private static UnicodeRange _rejang; - - /// - /// A corresponding to the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulJamoExtendedA => Volatile.Read(ref _hangulJamoExtendedA) ?? CreateRange(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); - private static UnicodeRange _hangulJamoExtendedA; - - /// - /// A corresponding to the 'Javanese' Unicode block (U+A980..U+A9DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. - /// - public static UnicodeRange Javanese => Volatile.Read(ref _javanese) ?? CreateRange(ref _javanese, first: '\uA980', last: '\uA9DF'); - private static UnicodeRange _javanese; - - /// - /// A corresponding to the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MyanmarExtendedB => Volatile.Read(ref _myanmarExtendedB) ?? CreateRange(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); - private static UnicodeRange _myanmarExtendedB; - - /// - /// A corresponding to the 'Cham' Unicode block (U+AA00..U+AA5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Cham => Volatile.Read(ref _cham) ?? CreateRange(ref _cham, first: '\uAA00', last: '\uAA5F'); - private static UnicodeRange _cham; - - /// - /// A corresponding to the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. - /// - public static UnicodeRange MyanmarExtendedA => Volatile.Read(ref _myanmarExtendedA) ?? CreateRange(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); - private static UnicodeRange _myanmarExtendedA; - - /// - /// A corresponding to the 'Tai Viet' Unicode block (U+AA80..U+AADF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. - /// - public static UnicodeRange TaiViet => Volatile.Read(ref _taiViet) ?? CreateRange(ref _taiViet, first: '\uAA80', last: '\uAADF'); - private static UnicodeRange _taiViet; - - /// - /// A corresponding to the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MeeteiMayekExtensions => Volatile.Read(ref _meeteiMayekExtensions) ?? CreateRange(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); - private static UnicodeRange _meeteiMayekExtensions; - - /// - /// A corresponding to the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. - /// - public static UnicodeRange EthiopicExtendedA => Volatile.Read(ref _ethiopicExtendedA) ?? CreateRange(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); - private static UnicodeRange _ethiopicExtendedA; - - /// - /// A corresponding to the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedE => Volatile.Read(ref _latinExtendedE) ?? CreateRange(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); - private static UnicodeRange _latinExtendedE; - - /// - /// A corresponding to the 'Cherokee Supplement' Unicode block (U+AB70..U+ABBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB70.pdf for the full set of characters in this block. - /// - public static UnicodeRange CherokeeSupplement => Volatile.Read(ref _cherokeeSupplement) ?? CreateRange(ref _cherokeeSupplement, first: '\uAB70', last: '\uABBF'); - private static UnicodeRange _cherokeeSupplement; - - /// - /// A corresponding to the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MeeteiMayek => Volatile.Read(ref _meeteiMayek) ?? CreateRange(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); - private static UnicodeRange _meeteiMayek; - - /// - /// A corresponding to the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulSyllables => Volatile.Read(ref _hangulSyllables) ?? CreateRange(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); - private static UnicodeRange _hangulSyllables; - - /// - /// A corresponding to the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulJamoExtendedB => Volatile.Read(ref _hangulJamoExtendedB) ?? CreateRange(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); - private static UnicodeRange _hangulJamoExtendedB; - - /// - /// A corresponding to the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKCompatibilityIdeographs => Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateRange(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); - private static UnicodeRange _cjkCompatibilityIdeographs; - - /// - /// A corresponding to the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. - /// - public static UnicodeRange AlphabeticPresentationForms => Volatile.Read(ref _alphabeticPresentationForms) ?? CreateRange(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); - private static UnicodeRange _alphabeticPresentationForms; - - /// - /// A corresponding to the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicPresentationFormsA => Volatile.Read(ref _arabicPresentationFormsA) ?? CreateRange(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); - private static UnicodeRange _arabicPresentationFormsA; - - /// - /// A corresponding to the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. - /// - public static UnicodeRange VariationSelectors => Volatile.Read(ref _variationSelectors) ?? CreateRange(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); - private static UnicodeRange _variationSelectors; - - /// - /// A corresponding to the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. - /// - public static UnicodeRange VerticalForms => Volatile.Read(ref _verticalForms) ?? CreateRange(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); - private static UnicodeRange _verticalForms; - - /// - /// A corresponding to the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningHalfMarks => Volatile.Read(ref _combiningHalfMarks) ?? CreateRange(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); - private static UnicodeRange _combiningHalfMarks; - - /// - /// A corresponding to the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKCompatibilityForms => Volatile.Read(ref _cjkCompatibilityForms) ?? CreateRange(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); - private static UnicodeRange _cjkCompatibilityForms; - - /// - /// A corresponding to the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. - /// - public static UnicodeRange SmallFormVariants => Volatile.Read(ref _smallFormVariants) ?? CreateRange(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); - private static UnicodeRange _smallFormVariants; - - /// - /// A corresponding to the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicPresentationFormsB => Volatile.Read(ref _arabicPresentationFormsB) ?? CreateRange(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); - private static UnicodeRange _arabicPresentationFormsB; - - /// - /// A corresponding to the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. - /// - public static UnicodeRange HalfwidthandFullwidthForms => Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateRange(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); - private static UnicodeRange _halfwidthandFullwidthForms; - - /// - /// A corresponding to the 'Specials' Unicode block (U+FFF0..U+FFFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Specials => Volatile.Read(ref _specials) ?? CreateRange(ref _specials, first: '\uFFF0', last: '\uFFFF'); - private static UnicodeRange _specials; - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs deleted file mode 100644 index f5d6ea1c99..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// A class which can perform URL string escaping given an allow list of characters which - /// can be represented unescaped. - /// - /// - /// Instances of this type will always encode a certain set of characters (such as + - /// and ?), even if the filter provided in the constructor allows such characters. - /// Once constructed, instances of this class are thread-safe for multiple callers. - /// - public sealed class UrlEncoder : IUrlEncoder - { - // The default URL string encoder (Basic Latin), instantiated on demand - private static UrlEncoder _defaultEncoder; - - // The inner encoder, responsible for the actual encoding routines - private readonly UrlUnicodeEncoder _innerUnicodeEncoder; - - /// - /// Instantiates an encoder using as its allow list. - /// Any character not in the range will be escaped. - /// - public UrlEncoder() - : this(UrlUnicodeEncoder.BasicLatin) - { - } - - /// - /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. Any character not in the set of ranges specified - /// by will be escaped. - /// - public UrlEncoder(params UnicodeRange[] allowedRanges) - : this(new UrlUnicodeEncoder(new CodePointFilter(allowedRanges))) - { - } - - /// - /// Instantiates an encoder using a custom code point filter. Any character not in the - /// set returned by 's - /// method will be escaped. - /// - public UrlEncoder(ICodePointFilter filter) - : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - } - - private UrlEncoder(UrlUnicodeEncoder innerEncoder) - { - Debug.Assert(innerEncoder != null); - _innerUnicodeEncoder = innerEncoder; - } - - /// - /// A default instance of . - /// - /// - /// This normally corresponds to . However, this property is - /// settable so that a developer can change the default implementation application-wide. - /// - public static UrlEncoder Default - { - get - { - return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - Volatile.Write(ref _defaultEncoder, value); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us - private static UrlEncoder CreateDefaultEncoderSlow() - { - var onDemandEncoder = new UrlEncoder(); - return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; - } - - /// - /// Everybody's favorite UrlEncode routine. - /// - public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - /// - /// Everybody's favorite UrlEncode routine. - /// - public string UrlEncode(string value) - { - return _innerUnicodeEncoder.Encode(value); - } - - /// - /// Everybody's favorite UrlEncode routine. - /// - public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - private sealed class UrlUnicodeEncoder : UnicodeEncoderBase - { - // A singleton instance of the basic latin encoder. - private static UrlUnicodeEncoder _basicLatinSingleton; - - // We perform UTF8 conversion of input, which means that the worst case is - // 9 output chars per input char: [input] U+FFFF -> [output] "%XX%YY%ZZ". - // We don't need to worry about astral code points since they consume 2 input - // chars to produce 12 output chars "%XX%YY%ZZ%WW", which is 6 output chars per input char. - private const int MaxOutputCharsPerInputChar = 9; - - internal UrlUnicodeEncoder(CodePointFilter filter) - : base(filter, MaxOutputCharsPerInputChar) - { - // Per RFC 3987, Sec. 2.2, we want encodings that are safe for - // four particular components: 'isegment', 'ipath-noscheme', - // 'iquery', and 'ifragment'. The relevant definitions are below. - // - // ipath-noscheme = isegment-nz-nc *( "/" isegment ) - // - // isegment = *ipchar - // - // isegment-nz-nc = 1*( iunreserved / pct-encoded / sub-delims - // / "@" ) - // ; non-zero-length segment without any colon ":" - // - // ipchar = iunreserved / pct-encoded / sub-delims / ":" - // / "@" - // - // iquery = *( ipchar / iprivate / "/" / "?" ) - // - // ifragment = *( ipchar / "/" / "?" ) - // - // iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar - // - // ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF - // / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD - // / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD - // / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD - // / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD - // / %xD0000-DFFFD / %xE1000-EFFFD - // - // pct-encoded = "%" HEXDIG HEXDIG - // - // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - // / "*" / "+" / "," / ";" / "=" - // - // The only common characters between these four components are the - // intersection of 'isegment-nz-nc' and 'ipchar', which is really - // just 'isegment-nz-nc' (colons forbidden). - // - // From this list, the base encoder already forbids "&", "'", "+", - // and we'll additionally forbid "=" since it has special meaning - // in x-www-form-urlencoded representations. - // - // This means that the full list of allowed characters from the - // Basic Latin set is: - // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / "@" - - const string forbiddenChars = @" #%/:=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder - foreach (char c in forbiddenChars) - { - ForbidCharacter(c); - } - - // Specials (U+FFF0 .. U+FFFF) are forbidden by the definition of 'ucschar' above - for (int i = 0; i < 16; i++) - { - ForbidCharacter((char)(0xFFF0 | i)); - } - - // Supplementary characters are forbidden anyway by the base encoder - } - - internal static UrlUnicodeEncoder BasicLatin - { - get - { - UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); - if (encoder == null) - { - encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); - Volatile.Write(ref _basicLatinSingleton, encoder); - } - return encoder; - } - } - - // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); - do - { - char highNibble, lowNibble; - HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); - writer.Write('%'); - writer.Write(highNibble); - writer.Write(lowNibble); - } while ((asUtf8 >>= 8) != 0); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin b/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin deleted file mode 100644 index 48fa163f088cc88591c84b3e962c82fbfac136db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeHMv2GJV5MAdaT%l_zA{`AibrhN95BLMj5AXp<;4u=C|A5v#1>z5EDMBu!cbIt;gI{)H0!dCSw<2PP9I&Hu3tbf6l!8ocCXK zKc&p^v?unw;I>6|br}^NpVN#CvrW${m_YZ~=ZziMG*9Rj$8nxb1Nd9ik_-Byjk zC6&G!oXHv?T(RNoe#r;3MJ5r_tmK0U5OJ#liWQqU=J=Q3R{Da(xFQ~@&WveQA(VaX z6YEL16>%<<(q=O^0q2S`pYhmft`*v8ORDDPL#vftx37X*y5kt-2RN*A%Jio*<{xBa zk-t`yGR|eR2`uC0sUXPN??cy32x}H zUw59`Q@iXy1qloU1_A?tf&a#U>|2uTdt*1-{}F^LFc26B4AdC7){m0ih{gerF*sm5 z#;;BL`-Th0hkEd~1@17*CtMu=ifE>KnB<=!e>26Ix++D#a&l9FafrNF>=T(Me*n(= Bra=Gz diff --git a/src/Microsoft.Extensions.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json deleted file mode 100644 index 990b9a373b..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/project.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "allowUnsafe": true, - "warningsAsErrors": true - }, - "frameworks": { - "net451": {}, - "dotnet5.4": { - "dependencies": { - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Reflection": "4.0.10-*", - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*" - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs index 0cb40d8a62..c2327d330d 100644 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text.Encodings.Web; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.WebEncoders; @@ -31,12 +32,12 @@ namespace Microsoft.Extensions.DependencyInjection // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => HtmlEncoder.Default, settings => HtmlEncoder.Create(settings)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => JavaScriptEncoder.Default, settings => JavaScriptEncoder.Create(settings)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => UrlEncoder.Default, settings => UrlEncoder.Create(settings)))); if (configureOptions != null) { @@ -48,14 +49,14 @@ namespace Microsoft.Extensions.DependencyInjection private static Func CreateFactory( Func defaultFactory, - Func customFilterFactory) + Func customSettingsFactory) { return serviceProvider => { - var codePointFilter = serviceProvider?.GetService>()? + var settings = serviceProvider?.GetService>()? .Value? - .CodePointFilter; - return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); + .TextEncoderSettings; + return (settings != null) ? customSettingsFactory(settings) : defaultFactory(); }; } } diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs similarity index 59% rename from src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs rename to src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs index f08f37db52..8d9d2da4e8 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text.Encodings.Web; namespace Microsoft.Extensions.WebEncoders { @@ -11,39 +12,39 @@ namespace Microsoft.Extensions.WebEncoders public static class EncoderServiceProviderExtensions { /// - /// Retrieves an from an . + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. /// It will return a default encoder instance if does not contain one or is null. /// - public static IHtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) + public static HtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) { - return (IHtmlEncoder)serviceProvider?.GetService(typeof(IHtmlEncoder)) ?? HtmlEncoder.Default; + return (HtmlEncoder)serviceProvider?.GetService(typeof(HtmlEncoder)) ?? HtmlEncoder.Default; } /// - /// Retrieves an from an . + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. /// It will return a default encoder instance if does not contain one or is null. /// - public static IJavaScriptStringEncoder GetJavaScriptStringEncoder(this IServiceProvider serviceProvider) + public static JavaScriptEncoder GetJavaScriptEncoder(this IServiceProvider serviceProvider) { - return (IJavaScriptStringEncoder)serviceProvider?.GetService(typeof(IJavaScriptStringEncoder)) ?? JavaScriptStringEncoder.Default; + return (JavaScriptEncoder)serviceProvider?.GetService(typeof(JavaScriptEncoder)) ?? JavaScriptEncoder.Default; } /// - /// Retrieves an from an . + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. /// It will return a default encoder instance if does not contain one or is null. /// - public static IUrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) + public static UrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) { - return (IUrlEncoder)serviceProvider?.GetService(typeof(IUrlEncoder)) ?? UrlEncoder.Default; + return (UrlEncoder)serviceProvider?.GetService(typeof(UrlEncoder)) ?? UrlEncoder.Default; } } } diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs new file mode 100644 index 0000000000..7768d65bfa --- /dev/null +++ b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + /// + /// Encoder used for unit testing. + /// + public sealed class HtmlTestEncoder : HtmlEncoder + { + public override int MaxOutputCharactersPerInputCharacter + { + get { return 1; } + } + + public override string Encode(string value) + { + return $"HtmlEncode[[{value}]]"; + } + + public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) + { + output.Write("HtmlEncode[["); + output.Write(value, startIndex, characterCount); + output.Write("]]"); + } + + public override void Encode(TextWriter output, string value, int startIndex, int characterCount) + { + output.Write("HtmlEncode[["); + output.Write(value.Substring(startIndex, characterCount)); + output.Write("]]"); + } + + public override bool WillEncode(int unicodeScalar) + { + return false; + } + + public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) + { + return -1; + } + + public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + { + numberOfCharactersWritten = 0; + return false; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs new file mode 100644 index 0000000000..4207e8a43f --- /dev/null +++ b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + /// + /// Encoder used for unit testing. + /// + public class JavaScriptTestEncoder : JavaScriptEncoder + { + public override int MaxOutputCharactersPerInputCharacter + { + get { return 1; } + } + + public override string Encode(string value) + { + return $"JavaScriptEncode[[{value}]]"; + } + + public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) + { + output.Write("JavaScriptEncode[["); + output.Write(value, startIndex, characterCount); + output.Write("]]"); + } + + public override void Encode(TextWriter output, string value, int startIndex, int characterCount) + { + output.Write("JavaScriptEncode[["); + output.Write(value.Substring(startIndex, characterCount)); + output.Write("]]"); + } + + public override bool WillEncode(int unicodeScalar) + { + return false; + } + + public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) + { + return -1; + } + + public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + { + numberOfCharactersWritten = 0; + return false; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs new file mode 100644 index 0000000000..d10ee75594 --- /dev/null +++ b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + /// + /// Encoder used for unit testing. + /// + public class UrlTestEncoder : UrlEncoder + { + public override int MaxOutputCharactersPerInputCharacter + { + get { return 1; } + } + + public override string Encode(string value) + { + return $"UrlEncode[[{value}]]"; + } + + public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) + { + output.Write("UrlEncode[["); + output.Write(value, startIndex, characterCount); + output.Write("]]"); + } + + public override void Encode(TextWriter output, string value, int startIndex, int characterCount) + { + output.Write("UrlEncode[["); + output.Write(value.Substring(startIndex, characterCount)); + output.Write("]]"); + } + + public override bool WillEncode(int unicodeScalar) + { + return false; + } + + public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) + { + return -1; + } + + public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + { + numberOfCharactersWritten = 0; + return false; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs similarity index 82% rename from src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs rename to src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs index b68b05ee50..2f5e770a0c 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs +++ b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs @@ -1,12 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Text.Encodings.Web; namespace Microsoft.Extensions.WebEncoders { /// - /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). + /// Specifies options common to all three encoders (HtmlEncode, JavaScriptEncode, UrlEncode). /// public sealed class WebEncoderOptions { @@ -16,6 +16,6 @@ namespace Microsoft.Extensions.WebEncoders /// /// If this property is null, then the encoders will use their default allow lists. /// - public ICodePointFilter CodePointFilter { get; set; } + public TextEncoderSettings TextEncoderSettings { get; set; } } } diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index ecc7c0a3d1..c92247832b 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -6,15 +6,21 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "allowUnsafe": true }, "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Extensions.OptionsModel": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.IO": "", + "System.Runtime": "" + } + }, "dotnet5.4": {} } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 8221fa524c..1641f92caf 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -5,8 +5,9 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Text.Encodings.Web; using Microsoft.AspNet.Testing; -using Microsoft.Extensions.WebEncoders; +using Microsoft.Extensions.WebEncoders.Testing; using Xunit; namespace Microsoft.AspNet.Html.Abstractions.Test @@ -345,7 +346,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test { using (var writer = new StringWriter()) { - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); return writer.ToString(); } } @@ -378,7 +379,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { foreach (var entry in Entries) { @@ -396,7 +397,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public string Value { get; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(Value); } @@ -411,9 +412,9 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public string Value { get; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { - encoder.HtmlEncode(Value, writer); + encoder.Encode(writer, Value); } } @@ -426,7 +427,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public string Value { get; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 789d27a38d..06a8d06a2c 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -2,9 +2,9 @@ "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Extensions.WebEncoders": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs index f36b8eeefc..3084aec482 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs @@ -56,7 +56,6 @@ namespace Microsoft.AspNet.Http.Abstractions [InlineData("name", "", "?name=")] [InlineData("", "value", "?=value")] [InlineData("", "", "?=")] - [InlineData(null, null, "?=")] public void CreateNameValue_Success(string name, string value, string exepcted) { var query = QueryString.Create(name, value); @@ -94,7 +93,6 @@ namespace Microsoft.AspNet.Http.Abstractions } [Theory] - [InlineData(null, null, null, "?=")] [InlineData("", "", "", "?=")] [InlineData("?", "", "", "?=")] [InlineData("?", "name2", "value2", "?name2=value2")] diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index 2eebd6041e..f65cb4eaaf 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Text.Encodings.Web; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Extensions.WebEncoders; +using Microsoft.Extensions.WebEncoders.Testing; using Xunit; namespace Microsoft.Extensions.Internal @@ -34,7 +35,7 @@ namespace Microsoft.Extensions.Internal var writer = new StringWriter(); // Act - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); // Assert Assert.Equal("HtmlEncode[[Hello]]", writer.ToString()); @@ -50,7 +51,7 @@ namespace Microsoft.Extensions.Internal var writer = new StringWriter(); // Act - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); // Assert Assert.Equal("Hello", writer.ToString()); @@ -69,7 +70,7 @@ namespace Microsoft.Extensions.Internal // Assert var result = Assert.Single(content.Entries); var testHtmlContent = Assert.IsType(result); - testHtmlContent.WriteTo(writer, new CommonTestEncoder()); + testHtmlContent.WriteTo(writer, new HtmlTestEncoder()); Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString()); } @@ -114,7 +115,7 @@ namespace Microsoft.Extensions.Internal content.Append("Test"); // Act - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); // Assert Assert.Equal(2, content.Entries.Count); @@ -130,7 +131,7 @@ namespace Microsoft.Extensions.Internal _content = content; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(ToString()); } diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json index 0f4d9b84b3..8ed950043b 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json @@ -4,10 +4,13 @@ }, "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.Extensions.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.BufferedHtmlContent.Sources": { + "type": "build", + "version": "1.0.0-*" + }, + "Microsoft.Extensions.WebEncoders.Tests" : "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs deleted file mode 100644 index 24cdb75568..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class AllowedCharsBitmapTests - { - [Fact] - public void Ctor_EmptyByDefault() - { - // Act - var bitmap = AllowedCharsBitmap.CreateNew(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(bitmap.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Allow_Forbid_ZigZag() - { - // Arrange - var bitmap = AllowedCharsBitmap.CreateNew(); - - // Act - // The only chars which are allowed are those whose code points are multiples of 3 or 7 - // who aren't also multiples of 5. Exception: multiples of 35 are allowed. - for (int i = 0; i <= Char.MaxValue; i += 3) - { - bitmap.AllowCharacter((char)i); - } - for (int i = 0; i <= Char.MaxValue; i += 5) - { - bitmap.ForbidCharacter((char)i); - } - for (int i = 0; i <= Char.MaxValue; i += 7) - { - bitmap.AllowCharacter((char)i); - } - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - bool isAllowed = false; - if (i % 3 == 0) { isAllowed = true; } - if (i % 5 == 0) { isAllowed = false; } - if (i % 7 == 0) { isAllowed = true; } - Assert.Equal(isAllowed, bitmap.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Clear_ForbidsEverything() - { - // Arrange - var bitmap = AllowedCharsBitmap.CreateNew(); - for (int i = 1; i <= Char.MaxValue; i++) - { - bitmap.AllowCharacter((char)i); - } - - // Act - bitmap.Clear(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(bitmap.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Clone_MakesDeepCopy() - { - // Arrange - var originalBitmap = AllowedCharsBitmap.CreateNew(); - originalBitmap.AllowCharacter('x'); - - // Act - var clonedBitmap = originalBitmap.Clone(); - clonedBitmap.AllowCharacter('y'); - - // Assert - Assert.True(originalBitmap.IsCharacterAllowed('x')); - Assert.False(originalBitmap.IsCharacterAllowed('y')); - Assert.True(clonedBitmap.IsCharacterAllowed('x')); - Assert.True(clonedBitmap.IsCharacterAllowed('y')); - } - - [Fact] - public void ForbidUndefinedCharacters_RemovesUndefinedChars() - { - // Arrange - // We only allow odd-numbered characters in this test so that - // we can validate that we properly merged the two bitmaps together - // rather than simply overwriting the target. - var bitmap = AllowedCharsBitmap.CreateNew(); - for (int i = 1; i <= Char.MaxValue; i += 2) - { - bitmap.AllowCharacter((char)i); - } - - // Act - bitmap.ForbidUndefinedCharacters(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (i % 2 == 0) - { - Assert.False(bitmap.IsCharacterAllowed((char)i)); // these chars were never allowed in the original description - } - else - { - Assert.Equal(UnicodeHelpers.IsCharacterDefined((char)i), bitmap.IsCharacterAllowed((char)i)); - } - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs deleted file mode 100644 index 39624b1fb1..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class CodePointFilterTests - { - [Fact] - public void Ctor_Parameterless_CreatesEmptyFilter() - { - // Act - var filter = new CodePointFilter(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Ctor_OtherCodePointFilterAsInterface() - { - // Arrange - var originalFilter = new OddCodePointFilter(); - - // Act - var newFilter = new CodePointFilter(originalFilter); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.Equal((i % 2) == 1, newFilter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Ctor_OtherCodePointFilterAsConcreteType_Clones() - { - // Arrange - var originalFilter = new CodePointFilter().AllowChar('x'); - - // Act - var newFilter = new CodePointFilter(originalFilter).AllowChar('y'); - - // Assert - Assert.True(originalFilter.IsCharacterAllowed('x')); - Assert.False(originalFilter.IsCharacterAllowed('y')); - Assert.True(newFilter.IsCharacterAllowed('x')); - Assert.True(newFilter.IsCharacterAllowed('y')); - } - - [Fact] - public void Ctor_UnicodeRanges() - { - // Act - var filter = new CodePointFilter(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); - - // Assert - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i < 0x2C60; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C60; i <= 0x2C7F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C80; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowChar() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowChar('\u0100'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('\u0100')); - Assert.False(filter.IsCharacterAllowed('\u0101')); - } - - [Fact] - public void AllowChars_Array() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowChars('\u0100', '\u0102'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('\u0100')); - Assert.False(filter.IsCharacterAllowed('\u0101')); - Assert.True(filter.IsCharacterAllowed('\u0102')); - Assert.False(filter.IsCharacterAllowed('\u0103')); - } - - [Fact] - public void AllowChars_String() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowChars("\u0100\u0102"); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('\u0100')); - Assert.False(filter.IsCharacterAllowed('\u0101')); - Assert.True(filter.IsCharacterAllowed('\u0102')); - Assert.False(filter.IsCharacterAllowed('\u0103')); - } - - [Fact] - public void AllowFilter() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.AllowFilter(new OddCodePointFilter()); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= 0x007F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0080; i <= Char.MaxValue; i++) - { - Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowRange() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowRange(UnicodeRanges.LatinExtendedA); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowRanges() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowRanges(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i < 0x2C60; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C60; i <= 0x2C7F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C80; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Clear() - { - // Arrange - var filter = new CodePointFilter(); - for (int i = 1; i <= Char.MaxValue; i++) - { - filter.AllowChar((char)i); - } - - // Act - var retVal = filter.Clear(); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void ForbidChar() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.ForbidChar('x'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.True(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_Array() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.ForbidChars('x', 'z'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_String() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.ForbidChars("xz"); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidRange() - { - // Arrange - var filter = new CodePointFilter(new OddCodePointFilter()); - - // Act - var retVal = filter.ForbidRange(UnicodeRanges.Specials); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= 0xFFEF; i++) - { - Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); - } - for (int i = 0xFFF0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void ForbidRanges() - { - // Arrange - var filter = new CodePointFilter(new OddCodePointFilter()); - - // Act - var retVal = filter.ForbidRanges(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= 0x007F; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0080; i <= 0xFFEF; i++) - { - Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); - } - for (int i = 0xFFF0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void GetAllowedCodePoints() - { - // Arrange - var expected = Enumerable.Range(UnicodeRanges.BasicLatin.FirstCodePoint, UnicodeRanges.BasicLatin.RangeSize) - .Concat(Enumerable.Range(UnicodeRanges.Specials.FirstCodePoint, UnicodeRanges.Specials.RangeSize)) - .Except(new int[] { 'x' }) - .OrderBy(i => i) - .ToArray(); - - var filter = new CodePointFilter(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); - filter.ForbidChar('x'); - - // Act - var retVal = filter.GetAllowedCodePoints().OrderBy(i => i).ToArray(); - - // Assert - Assert.Equal(expected, retVal); - } - - // a code point filter which allows only odd code points through - private sealed class OddCodePointFilter : ICodePointFilter - { - public IEnumerable GetAllowedCodePoints() - { - for (int i = 1; i <= Char.MaxValue; i += 2) - { - yield return i; - } - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs deleted file mode 100644 index b78d91e8c2..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Runtime.CompilerServices; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Encoder used for unit testing. - /// - internal sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder - { - /// - /// Returns "HtmlEncode[[value]]". - /// - public string HtmlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "JavaScriptStringEncode[[value]]". - /// - public string JavaScriptStringEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "UrlEncode[[value]]". - /// - public string UrlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) - { - return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); - } - - private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); - } - - private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); - } - } -} \ No newline at end of file diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs deleted file mode 100644 index ac9fc8bb28..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderCommonTests - { - [Theory] - [InlineData(10000, 3, 16 * 1024)] // we cap at 16k chars - [InlineData(5000, 3, 15000)] // haven't exceeded the 16k cap - [InlineData(40000, 3, 40000)] // if we spill over the LOH, we still allocate an output buffer equivalent in length to the input buffer - [InlineData(512, Int32.MaxValue, 16 * 1024)] // make sure we can handle numeric overflow - public void GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar, int expectedResult) - { - Assert.Equal(expectedResult, EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsToEncode, worstCaseOutputCharsPerInputChar)); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs deleted file mode 100644 index abdc1d9cc2..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderExtensionsTests - { - [Fact] - public void HtmlEncode_ParameterChecks() - { - Assert.Throws(() => EncoderExtensions.HtmlEncode(null, "Hello!", new StringWriter())); - } - - [Fact] - public void HtmlEncode_PositiveTestCase() - { - // Arrange - IHtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); - StringWriter writer = new StringWriter(); - - // Act - encoder.HtmlEncode("Hello+there!", writer); - - // Assert - Assert.Equal("Hello+there!", writer.ToString()); - } - - [Fact] - public void JavaScriptStringEncode_ParameterChecks() - { - Assert.Throws(() => EncoderExtensions.JavaScriptStringEncode(null, "Hello!", new StringWriter())); - } - - [Fact] - public void JavaScriptStringEncode_PositiveTestCase() - { - // Arrange - IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - StringWriter writer = new StringWriter(); - - // Act - encoder.JavaScriptStringEncode("Hello+there!", writer); - - // Assert - Assert.Equal(@"Hello\u002Bthere!", writer.ToString()); - } - - [Fact] - public void UrlEncode_ParameterChecks() - { - Assert.Throws(() => EncoderExtensions.UrlEncode(null, "Hello!", new StringWriter())); - } - - [Fact] - public void UrlEncode_PositiveTestCase() - { - // Arrange - IUrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); - StringWriter writer = new StringWriter(); - - // Act - encoder.UrlEncode("Hello+there!", writer); - - // Assert - Assert.Equal("Hello%2Bthere!", writer.ToString()); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index 790210be39..8e060102bb 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,7 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Text.Encodings.Web; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.WebEncoders.Testing; using Xunit; namespace Microsoft.Extensions.WebEncoders @@ -19,12 +21,12 @@ namespace Microsoft.Extensions.WebEncoders // Assert var serviceProvider = serviceCollection.BuildServiceProvider(); - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance } [Fact] @@ -36,23 +38,24 @@ namespace Microsoft.Extensions.WebEncoders // Act serviceCollection.AddWebEncoders(options => { - options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + options.TextEncoderSettings = new TextEncoderSettings(); + options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed }); // Assert var serviceProvider = serviceCollection.BuildServiceProvider(); - var htmlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("abcde", htmlEncoder.HtmlEncode("abcde")); - Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + var htmlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("abcde", htmlEncoder.Encode("abcde")); + Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance - var javaScriptStringEncoder = serviceProvider.GetRequiredService(); - Assert.Equal(@"a\u0062c\u0064e", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); - Assert.Same(javaScriptStringEncoder, serviceProvider.GetRequiredService()); // as singleton instance + var javaScriptEncoder = serviceProvider.GetRequiredService(); + Assert.Equal(@"a\u0062c\u0064e", javaScriptEncoder.Encode("abcde")); + Assert.Same(javaScriptEncoder, serviceProvider.GetRequiredService()); // as singleton instance - var urlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); - Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + var urlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); + Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance } [Fact] @@ -62,25 +65,26 @@ namespace Microsoft.Extensions.WebEncoders var serviceCollection = new ServiceCollection(); // Act - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); // we don't register an existing URL encoder serviceCollection.AddWebEncoders(options => { - options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + options.TextEncoderSettings = new TextEncoderSettings(); + options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed }); // Assert var serviceProvider = serviceCollection.BuildServiceProvider(); var htmlEncoder = serviceProvider.GetHtmlEncoder(); - Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.HtmlEncode("abcde")); + Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.Encode("abcde")); - var javaScriptStringEncoder = serviceProvider.GetJavaScriptStringEncoder(); - Assert.Equal("JavaScriptStringEncode[[abcde]]", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); + var javaScriptEncoder = serviceProvider.GetJavaScriptEncoder(); + Assert.Equal("JavaScriptEncode[[abcde]]", javaScriptEncoder.Encode("abcde")); var urlEncoder = serviceProvider.GetUrlEncoder(); - Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); + Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); } } } diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index b62068a941..01492e759e 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text.Encodings.Web; using Xunit; namespace Microsoft.Extensions.WebEncoders @@ -25,7 +26,7 @@ namespace Microsoft.Extensions.WebEncoders public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new HtmlEncoder(); + var expectedEncoder = HtmlEncoder.Default; var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act @@ -36,27 +37,27 @@ namespace Microsoft.Extensions.WebEncoders } [Fact] - public void GetJavaScriptStringEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + public void GetJavaScriptEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange var serviceProvider = new TestServiceProvider(); // Act - var retVal = serviceProvider.GetJavaScriptStringEncoder(); + var retVal = serviceProvider.GetJavaScriptEncoder(); // Assert - Assert.Same(JavaScriptStringEncoder.Default, retVal); + Assert.Same(JavaScriptEncoder.Default, retVal); } [Fact] - public void GetJavaScriptStringEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + public void GetJavaScriptEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new JavaScriptStringEncoder(); + var expectedEncoder = JavaScriptEncoder.Default; var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = serviceProvider.GetJavaScriptStringEncoder(); + var retVal = serviceProvider.GetJavaScriptEncoder(); // Assert Assert.Same(expectedEncoder, retVal); @@ -79,7 +80,7 @@ namespace Microsoft.Extensions.WebEncoders public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new UrlEncoder(); + var expectedEncoder = UrlEncoder.Default; var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs deleted file mode 100644 index c872b7bf9d..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Newtonsoft.Json; - -namespace Microsoft.Extensions.WebEncoders -{ - internal static class Entities - { - public static readonly IDictionary ParsedEntities = GetParsedEntities(); - - private static IDictionary GetParsedEntities() - { - // read all entries - string allEntitiesText = ReadEntitiesJsonFile(); - var deserializedRawData = new JsonSerializer().Deserialize>(new JsonTextReader(new StringReader(allEntitiesText))); - - // strip out all entries which aren't of the form "&entity;" - foreach (var key in deserializedRawData.Keys.ToArray() /* dupe since we're mutating original structure */) - { - if (!key.StartsWith("&", StringComparison.Ordinal) || !key.EndsWith(";", StringComparison.Ordinal)) - { - deserializedRawData.Remove(key); - } - } - return deserializedRawData; - } - - private static string ReadEntitiesJsonFile() - { - return File.ReadAllText("entities.json"); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs deleted file mode 100644 index 97b157b7d5..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Microsoft.Extensions.WebEncoders -{ - public static class Extensions - { - public static string[] ReadAllLines(this TextReader reader) - { - return ReadAllLinesImpl(reader).ToArray(); - } - - private static IEnumerable ReadAllLinesImpl(TextReader reader) - { - string line; - while ((line = reader.ReadLine()) != null) - { - yield return line; - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs deleted file mode 100644 index 8fe2ddde62..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class HtmlEncoderTests - { - [Fact] - public void Ctor_WithCodePointFilter() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - HtmlEncoder encoder = new HtmlEncoder(filter); - - // Act & assert - Assert.Equal("a", encoder.HtmlEncode("a")); - Assert.Equal("b", encoder.HtmlEncode("b")); - Assert.Equal("c", encoder.HtmlEncode("c")); - Assert.Equal("d", encoder.HtmlEncode("d")); - Assert.Equal("�", encoder.HtmlEncode("\0")); // we still always encode control chars - Assert.Equal("&", encoder.HtmlEncode("&")); // we still always encode HTML-special chars - Assert.Equal("￿", encoder.HtmlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); - - // Act & assert - Assert.Equal("a", encoder.HtmlEncode("a")); - Assert.Equal("\u00E9", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.HtmlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Ctor_WithNoParameters_DefaultsToBasicLatin() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - - // Act & assert - Assert.Equal("a", encoder.HtmlEncode("a")); - Assert.Equal("é", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("☁", encoder.HtmlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Default_EquivalentToBasicLatin() - { - // Arrange - HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeRanges.BasicLatin); - HtmlEncoder testEncoder = HtmlEncoder.Default; - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (!IsSurrogateCodePoint(i)) - { - string input = new String((char)i, 1); - Assert.Equal(controlEncoder.HtmlEncode(input), testEncoder.HtmlEncode(input)); - } - } - } - - [Fact] - public void Default_ReturnsSingletonInstance() - { - // Act - HtmlEncoder encoder1 = HtmlEncoder.Default; - HtmlEncoder encoder2 = HtmlEncoder.Default; - - // Assert - Assert.Same(encoder1, encoder2); - } - - [Theory] - [InlineData("<", "<")] - [InlineData(">", ">")] - [InlineData("&", "&")] - [InlineData("'", "'")] - [InlineData("\"", """)] - [InlineData("+", "+")] - public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); - - // Act - string retVal = encoder.HtmlEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char - } - else - { - if (input == "<") { expected = "<"; } - else if (input == ">") { expected = ">"; } - else if (input == "&") { expected = "&"; } - else if (input == "\"") { expected = """; } - else - { - bool mustEncode = false; - if (i == '\'' || i == '+') - { - mustEncode = true; // apostrophe, plus - } - else if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) - { - mustEncode = true; // control char - } - else if (!UnicodeHelpers.IsCharacterDefined((char)i)) - { - mustEncode = true; // undefined (or otherwise disallowed) char - } - - if (mustEncode) - { - expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); - } - else - { - expected = input; // no encoding - } - } - } - - string retVal = encoder.HtmlEncode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); - string retVal = encoder.HtmlEncode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void HtmlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD𐏿e\uFFFD"; - - // Act - string retVal = encoder.HtmlEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void HtmlEncode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - - // Act & assert - Assert.Equal("", encoder.HtmlEncode("")); - } - - [Fact] - public void HtmlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - string input = "Hello, there!"; - - // Act & assert - Assert.Same(input, encoder.HtmlEncode(input)); - } - - [Fact] - public void HtmlEncode_NullInput_ReturnsNull() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - - // Act & assert - Assert.Null(encoder.HtmlEncode(null)); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal("&Hello, there!", new HtmlEncoder().HtmlEncode("&Hello, there!")); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal("Hello, there!&", new HtmlEncoder().HtmlEncode("Hello, there!&")); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal("Hello, &there!", new HtmlEncoder().HtmlEncode("Hello, &there!")); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal("Hello, <there>!", new HtmlEncoder().HtmlEncode("Hello, !")); - } - - [Fact] - public void HtmlEncode_CharArray() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - var output = new StringWriter(); - - // Act - encoder.HtmlEncode("Hello+world!".ToCharArray(), 3, 5, output); - - // Assert - Assert.Equal("lo+wo", output.ToString()); - } - - [Fact] - public void HtmlEncode_StringSubstring() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - var output = new StringWriter(); - - // Act - encoder.HtmlEncode("Hello+world!", 3, 5, output); - - // Assert - Assert.Equal("lo+wo", output.ToString()); - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs deleted file mode 100644 index b4d4f250de..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class JavaScriptStringEncoderTests - { - [Fact] - public void Ctor_WithCodePointFilter() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(filter); - - // Act & assert - Assert.Equal("a", encoder.JavaScriptStringEncode("a")); - Assert.Equal("b", encoder.JavaScriptStringEncode("b")); - Assert.Equal(@"\u0063", encoder.JavaScriptStringEncode("c")); - Assert.Equal("d", encoder.JavaScriptStringEncode("d")); - Assert.Equal(@"\u0000", encoder.JavaScriptStringEncode("\0")); // we still always encode control chars - Assert.Equal(@"\u0026", encoder.JavaScriptStringEncode("&")); // we still always encode HTML-special chars - Assert.Equal(@"\uFFFF", encoder.JavaScriptStringEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); - - // Act & assert - Assert.Equal(@"\u0061", encoder.JavaScriptStringEncode("a")); - Assert.Equal("\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Ctor_WithNoParameters_DefaultsToBasicLatin() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - - // Act & assert - Assert.Equal("a", encoder.JavaScriptStringEncode("a")); - Assert.Equal(@"\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal(@"\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Default_EquivalentToBasicLatin() - { - // Arrange - JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeRanges.BasicLatin); - JavaScriptStringEncoder testEncoder = JavaScriptStringEncoder.Default; - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (!IsSurrogateCodePoint(i)) - { - string input = new String((char)i, 1); - Assert.Equal(controlEncoder.JavaScriptStringEncode(input), testEncoder.JavaScriptStringEncode(input)); - } - } - } - - [Fact] - public void Default_ReturnsSingletonInstance() - { - // Act - JavaScriptStringEncoder encoder1 = JavaScriptStringEncoder.Default; - JavaScriptStringEncoder encoder2 = JavaScriptStringEncoder.Default; - - // Assert - Assert.Same(encoder1, encoder2); - } - - [Theory] - [InlineData("<", @"\u003C")] - [InlineData(">", @"\u003E")] - [InlineData("&", @"\u0026")] - [InlineData("'", @"\u0027")] - [InlineData("\"", @"\u0022")] - [InlineData("+", @"\u002B")] - [InlineData("\\", @"\\")] - [InlineData("/", @"\/")] - [InlineData("\b", @"\b")] - [InlineData("\f", @"\f")] - [InlineData("\n", @"\n")] - [InlineData("\t", @"\t")] - [InlineData("\r", @"\r")] - public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - - // Act - string retVal = encoder.JavaScriptStringEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char - } - else - { - if (input == "\b") { expected = @"\b"; } - else if (input == "\t") { expected = @"\t"; } - else if (input == "\n") { expected = @"\n"; } - else if (input == "\f") { expected = @"\f"; } - else if (input == "\r") { expected = @"\r"; } - else if (input == "\\") { expected = @"\\"; } - else if (input == "/") { expected = @"\/"; } - else - { - bool mustEncode = false; - switch (i) - { - case '<': - case '>': - case '&': - case '\"': - case '\'': - case '+': - mustEncode = true; - break; - } - - if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) - { - mustEncode = true; // control char - } - else if (!UnicodeHelpers.IsCharacterDefined((char)i)) - { - mustEncode = true; // undefined (or otherwise disallowed) char - } - - if (mustEncode) - { - expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}", i); - } - else - { - expected = input; // no encoding - } - } - } - - string retVal = encoder.JavaScriptStringEncode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}\u{1:X4}", (uint)input[0], (uint)input[1]); - string retVal = encoder.JavaScriptStringEncode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void JavaScriptStringEncode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD\\uD800\\uDFFFe\uFFFD"; // 'D800' 'DFFF' was preserved since it's valid - - // Act - string retVal = encoder.JavaScriptStringEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void JavaScriptStringEncode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - - // Act & assert - Assert.Equal("", encoder.JavaScriptStringEncode("")); - } - - [Fact] - public void JavaScriptStringEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - string input = "Hello, there!"; - - // Act & assert - Assert.Same(input, encoder.JavaScriptStringEncode(input)); - } - - [Fact] - public void JavaScriptStringEncode_NullInput_ReturnsNull() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - - // Act & assert - Assert.Null(encoder.JavaScriptStringEncode(null)); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal(@"\u0026Hello, there!", new JavaScriptStringEncoder().JavaScriptStringEncode("&Hello, there!")); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal(@"Hello, there!\u0026", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, there!&")); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal(@"Hello, \u0026there!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, &there!")); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal(@"Hello, \u003Cthere\u003E!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, !")); - } - - [Fact] - public void JavaScriptStringEncode_CharArray() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - var output = new StringWriter(); - - // Act - encoder.JavaScriptStringEncode("Hello+world!".ToCharArray(), 3, 5, output); - - // Assert - Assert.Equal(@"lo\u002Bwo", output.ToString()); - } - - [Fact] - public void JavaScriptStringEncode_StringSubstring() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - var output = new StringWriter(); - - // Act - encoder.JavaScriptStringEncode("Hello+world!", 3, 5, output); - - // Assert - Assert.Equal(@"lo\u002Bwo", output.ToString()); - } - - [Theory] - [InlineData("\"", @"\u0022")] - [InlineData("'", @"\u0027")] - public void JavaScriptStringEncode_Quotes(string input, string expected) - { - // Per the design document, we provide additional defense-in-depth - // against breaking out of HTML attributes by having the encoders - // never emit the ' or " characters. This means that we want to - // \u-escape these characters instead of using \' and \". - - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - - // Act - string retVal = encoder.JavaScriptStringEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void JavaScriptStringEncode_DoesNotOutputHtmlSensitiveCharacters() - { - // Per the design document, we provide additional defense-in-depth - // by never emitting HTML-sensitive characters unescaped. - - // Arrange - JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeRanges.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); - - // Act & assert - for (int i = 0; i <= 0x10FFFF; i++) - { - if (IsSurrogateCodePoint(i)) - { - continue; // surrogates don't matter here - } - - string javaScriptStringEncoded = javaScriptStringEncoder.JavaScriptStringEncode(Char.ConvertFromUtf32(i)); - string thenHtmlEncoded = htmlEncoder.HtmlEncode(javaScriptStringEncoded); - Assert.Equal(javaScriptStringEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters - } - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs deleted file mode 100644 index b52ee7f04f..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Newtonsoft.Json; - -namespace Microsoft.Extensions.WebEncoders -{ - internal sealed class ParsedEntity - { - [JsonProperty("codepoints")] - public int[] Codepoints { get; set; } - - [JsonProperty("characters")] - public string DecodedString { get; set; } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs deleted file mode 100644 index 1c088e8b16..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UnicodeEncoderBaseTests - { - [Fact] - public void Ctor_WithCustomFilters() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(filter); - - // Act & assert - Assert.Equal("a", encoder.Encode("a")); - Assert.Equal("b", encoder.Encode("b")); - Assert.Equal("[U+0063]", encoder.Encode("c")); - Assert.Equal("d", encoder.Encode("d")); - Assert.Equal("[U+0000]", encoder.Encode("\0")); // we still always encode control chars - Assert.Equal("[U+0026]", encoder.Encode("&")); // we still always encode HTML-special chars - Assert.Equal("[U+FFFF]", encoder.Encode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols)); - - // Act & assert - Assert.Equal("[U+0061]", encoder.Encode("a")); - Assert.Equal("\u00E9", encoder.Encode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.Encode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Simple() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - const string input = "Hello <>&\'\"+ there!"; - const string expected = "Hello [U+003C][U+003E][U+0026][U+0027][U+0022][U+002B] there!"; - - // Act & assert - Assert.Equal(expected, encoder.Encode(input)); - } - - [Fact] - public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char - } - else - { - bool mustEncode = false; - switch (i) - { - case '<': - case '>': - case '&': - case '\"': - case '\'': - case '+': - mustEncode = true; - break; - } - - if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) - { - mustEncode = true; // control char - } - else if (!UnicodeHelpers.IsCharacterDefined((char)i)) - { - mustEncode = true; // undefined (or otherwise disallowed) char - } - - if (mustEncode) - { - expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", i); - } - else - { - expected = input; // no encoding - } - } - - string retVal = encoder.Encode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X}]", i); - string retVal = encoder.Encode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void Encode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD[U+103FF]e\uFFFD"; - - // Act - string retVal = encoder.Encode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void Encode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - - // Act & assert - Assert.Equal("", encoder.Encode("")); - } - - [Fact] - public void Encode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - string input = "Hello, there!"; - - // Act & assert - Assert.Same(input, encoder.Encode(input)); - } - - [Fact] - public void Encode_NullInput_ReturnsNull() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - - // Act & assert - Assert.Null(encoder.Encode(null)); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("&Hello, there!")); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, there!&")); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, &there!")); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, !")); - } - - [Fact] - public void Encode_CharArray_ParameterChecking_NegativeTestCases() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - - // Act & assert - Assert.Throws(() => encoder.Encode((char[])null, 0, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 0, 3, null)); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), -1, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 4, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, -1, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 1, 3, new StringWriter())); - } - - [Fact] - public void Encode_CharArray_ZeroCount_DoesNotCallIntoTextWriter() - { - // Arrange - var encoder = new CustomUnicodeEncoderBase(); - var output = new StringWriter(); - output.Dispose(); // Throws ODE if written to. - - // Act - encoder.Encode("abc".ToCharArray(), 2, 0, output); - - // Assert - // If we got this far (without TextWriter throwing), success! - } - - [Fact] - public void Encode_CharArray_AllCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); - - // Assert - Assert.Equal("xy", output.ToString()); - } - - [Fact] - public void Encode_CharArray_AllCharsInvalid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); - - // Assert - Assert.Equal("[U+0078][U+0079]", output.ToString()); - } - - [Fact] - public void Encode_CharArray_SomeCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz".ToCharArray(), 2, 3, output); - - // Assert - Assert.Equal("c[U+0026]x", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_ParameterChecking_NegativeTestCases() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - - // Act & assert - Assert.Throws(() => encoder.Encode((string)null, 0, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 0, 3, null)); - Assert.Throws(() => encoder.Encode("abc", -1, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 2, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 4, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 2, -1, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 1, 3, new StringWriter())); - } - - [Fact] - public void Encode_StringSubstring_ZeroCount_DoesNotCallIntoTextWriter() - { - // Arrange - var encoder = new CustomUnicodeEncoderBase(); - var output = new StringWriter(); - output.Dispose(); // Throws ODE if written to. - - // Act - encoder.Encode("abc", 2, 0, output); - - // Assert - // If we got this far (without TextWriter throwing), success! - } - - [Fact] - public void Encode_StringSubstring_AllCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz", 4, 2, output); - - // Assert - Assert.Equal("xy", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_EntireString_AllCharsValid_ForwardDirectlyToOutput() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc", 0, 3, output); - - // Assert - Assert.Equal("abc", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_AllCharsInvalid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz", 4, 2, output); - - // Assert - Assert.Equal("[U+0078][U+0079]", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_SomeCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz", 2, 3, output); - - // Assert - Assert.Equal("c[U+0026]x", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_EntireString_SomeCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - const string input = "abc&xyz"; - encoder.Encode(input, 0, input.Length, output); - - // Assert - Assert.Equal("abc[U+0026]xyz", output.ToString()); - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - - private sealed class CustomCodePointFilter : ICodePointFilter - { - private readonly int[] _allowedCodePoints; - - public CustomCodePointFilter(params int[] allowedCodePoints) - { - _allowedCodePoints = allowedCodePoints; - } - - public IEnumerable GetAllowedCodePoints() - { - return _allowedCodePoints; - } - } - - private sealed class CustomUnicodeEncoderBase : UnicodeEncoderBase - { - // We pass a (known bad) value of 1 for 'max output chars per input char', - // which also tests that the code behaves properly even if the original - // estimate is incorrect. - public CustomUnicodeEncoderBase(CodePointFilter filter) - : base(filter, maxOutputCharsPerInputChar: 1) - { - } - - public CustomUnicodeEncoderBase(params UnicodeRange[] allowedRanges) - : this(new CodePointFilter(allowedRanges)) - { - } - - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - writer.Write(String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", value)); - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs deleted file mode 100644 index 57ba091465..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public unsafe class UnicodeHelpersTests - { - private const int UnicodeReplacementChar = '\uFFFD'; - - private static readonly UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); - - [Fact] - public void GetDefinedCharacterBitmap_ReturnsSingletonInstance() - { - // Act - uint[] retVal1 = UnicodeHelpers.GetDefinedCharacterBitmap(); - uint[] retVal2 = UnicodeHelpers.GetDefinedCharacterBitmap(); - - // Assert - Assert.Same(retVal1, retVal2); - } - - public static TheoryData Utf16ScalarValues - { - get - { - var dataset = new TheoryData(); - dataset.Add(1, "a", (int)'a'); // normal BMP char, end of string - dataset.Add(2, "ab", (int)'a'); // normal BMP char, not end of string - dataset.Add(3, "\uDFFF", UnicodeReplacementChar); // trailing surrogate, end of string - dataset.Add(4, "\uDFFFx", UnicodeReplacementChar); // trailing surrogate, not end of string - dataset.Add(5, "\uD800", UnicodeReplacementChar); // leading surrogate, end of string - dataset.Add(6, "\uD800x", UnicodeReplacementChar); // leading surrogate, not end of string, followed by non-surrogate - dataset.Add(7, "\uD800\uD800", UnicodeReplacementChar); // leading surrogate, not end of string, followed by leading surrogate - dataset.Add(8, "\uD800\uDFFF", 0x103FF); // leading surrogate, not end of string, followed by trailing surrogate - - return dataset; - } - } - - [Theory] - [MemberData(nameof(Utf16ScalarValues))] - public void GetScalarValueFromUtf16(int unused, string input, int expectedResult) - { - // The 'unused' parameter exists because the xunit runner can't distinguish - // the individual malformed data test cases from each other without this - // additional identifier. - - fixed (char* pInput = input) - { - Assert.Equal(expectedResult, UnicodeHelpers.GetScalarValueFromUtf16(pInput, endOfString: (input.Length == 1))); - } - } - - [Fact] - public void GetUtf8RepresentationForScalarValue() - { - for (int i = 0; i <= 0x10FFFF; i++) - { - if (i <= 0xFFFF && Char.IsSurrogate((char)i)) - { - continue; // no surrogates - } - - // Arrange - byte[] expectedUtf8Bytes = _utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(i)); - - // Act - List actualUtf8Bytes = new List(4); - uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue((uint)i); - do - { - actualUtf8Bytes.Add((byte)asUtf8); - } while ((asUtf8 >>= 8) != 0); - - // Assert - Assert.Equal(expectedUtf8Bytes, actualUtf8Bytes); - } - } - - [Fact] - public void IsCharacterDefined() - { - // Arrange - bool[] definedChars = ReadListOfDefinedCharacters(); - List errors = new List(); - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - bool expected = definedChars[i]; - bool actual = UnicodeHelpers.IsCharacterDefined((char)i); - if (expected != actual) - { - errors.Add($"Character U+{i:X4}: expected = {expected}, actual = {actual}"); - } - } - - if (errors.Count > 0) - { - Assert.True(false, String.Join(Environment.NewLine, errors)); - } - } - - private static bool[] ReadListOfDefinedCharacters() - { - HashSet allowedCategories = new HashSet(); - - // Letters - allowedCategories.Add("Lu"); - allowedCategories.Add("Ll"); - allowedCategories.Add("Lt"); - allowedCategories.Add("Lm"); - allowedCategories.Add("Lo"); - - // Marks - allowedCategories.Add("Mn"); - allowedCategories.Add("Mc"); - allowedCategories.Add("Me"); - - // Numbers - allowedCategories.Add("Nd"); - allowedCategories.Add("Nl"); - allowedCategories.Add("No"); - - // Punctuation - allowedCategories.Add("Pc"); - allowedCategories.Add("Pd"); - allowedCategories.Add("Ps"); - allowedCategories.Add("Pe"); - allowedCategories.Add("Pi"); - allowedCategories.Add("Pf"); - allowedCategories.Add("Po"); - - // Symbols - allowedCategories.Add("Sm"); - allowedCategories.Add("Sc"); - allowedCategories.Add("Sk"); - allowedCategories.Add("So"); - - // Separators - // With the exception of U+0020 SPACE, these aren't allowed - - // Other - // We only allow one category of 'other' characters - allowedCategories.Add("Cf"); - - HashSet seenCategories = new HashSet(); - - bool[] retVal = new bool[0x10000]; - - var assembly = typeof(UnicodeHelpersTests).GetTypeInfo().Assembly; - var resourceName = assembly.GetName().Name + ".UnicodeData.txt"; - string[] allLines = new StreamReader(assembly.GetManifestResourceStream(resourceName)).ReadAllLines(); - - foreach (string line in allLines) - { - string[] splitLine = line.Split(';'); - uint codePoint = UInt32.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); - string name = splitLine[1]; - if (codePoint >= retVal.Length) - { - continue; // don't care about supplementary chars - } - - if (name.EndsWith(", First>", StringComparison.Ordinal) || name.EndsWith(", Last>", StringComparison.Ordinal)) - { - // ignore spans - we'll handle them separately - continue; - } - - if (codePoint == (uint)' ') - { - retVal[codePoint] = true; // we allow U+0020 SPACE as our only valid Zs (whitespace) char - } - else - { - string category = splitLine[2]; - if (allowedCategories.Contains(category)) - { - retVal[codePoint] = true; // chars in this category are allowable - seenCategories.Add(category); - } - } - } - - // Handle known spans from Unicode 8.0's UnicodeData.txt - - // CJK Ideograph Extension A - for (int i = '\u3400'; i <= '\u4DB5'; i++) - { - retVal[i] = true; - } - // CJK Ideograph - for (int i = '\u4E00'; i <= '\u9FD5'; i++) - { - retVal[i] = true; - } - // Hangul Syllable - for (int i = '\uAC00'; i <= '\uD7A3'; i++) - { - retVal[i] = true; - } - - // Finally, we need to make sure we've seen every category which contains - // allowed characters. This provides extra defense against having a typo - // in the list of categories. - Assert.Equal(allowedCategories.OrderBy(c => c), seenCategories.OrderBy(c => c)); - - return retVal; - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs deleted file mode 100644 index dd9302f2a1..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UnicodeRangeTests - { - [Theory] - [InlineData(-1, 16)] - [InlineData(0x10000, 16)] - public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int rangeSize) - { - var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); - Assert.Equal("firstCodePoint", ex.ParamName); - } - - [Theory] - [InlineData(0x0100, -1)] - [InlineData(0x0100, 0x10000)] - public void Ctor_FailureCase_RangeSize(int firstCodePoint, int rangeSize) - { - var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); - Assert.Equal("rangeSize", ex.ParamName); - } - - [Fact] - public void Ctor_SuccessCase() - { - // Act - var range = new UnicodeRange(0x0100, 128); // Latin Extended-A - - // Assert - Assert.Equal(0x0100, range.FirstCodePoint); - Assert.Equal(128, range.RangeSize); - } - - [Fact] - public void FromSpan_FailureCase() - { - var ex = Assert.Throws(() => UnicodeRange.FromSpan('\u0020', '\u0010')); - Assert.Equal("lastChar", ex.ParamName); - } - - [Fact] - public void FromSpan_SuccessCase() - { - // Act - var range = UnicodeRange.FromSpan('\u0180', '\u024F'); // Latin Extended-B - - // Assert - Assert.Equal(0x0180, range.FirstCodePoint); - Assert.Equal(208, range.RangeSize); - } - - [Fact] - public void FromSpan_SuccessCase_All() - { - // Act - var range = UnicodeRange.FromSpan('\u0000', '\uFFFF'); - - // Assert - Assert.Equal(0, range.FirstCodePoint); - Assert.Equal(0x10000, range.RangeSize); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs deleted file mode 100644 index ddb4b1c646..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Reflection; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UnicodeRangesTests - { - [Fact] - public void Range_None() - { - UnicodeRange range = UnicodeRanges.None; - Assert.NotNull(range); - - // Test 1: the range should be empty - Assert.Equal(0, range.FirstCodePoint); - Assert.Equal(0, range.RangeSize); - - // Test 2: calling the property multiple times should cache and return the same range instance - UnicodeRange range2 = UnicodeRanges.None; - Assert.Same(range, range2); - } - - [Fact] - public void Range_All() - { - Range_Unicode('\u0000', '\uFFFF', nameof(UnicodeRanges.All)); - } - - [Theory] - [InlineData('\u0000', '\u007F', nameof(UnicodeRanges.BasicLatin))] - [InlineData('\u0080', '\u00FF', nameof(UnicodeRanges.Latin1Supplement))] - [InlineData('\u0100', '\u017F', nameof(UnicodeRanges.LatinExtendedA))] - [InlineData('\u0180', '\u024F', nameof(UnicodeRanges.LatinExtendedB))] - [InlineData('\u0250', '\u02AF', nameof(UnicodeRanges.IPAExtensions))] - [InlineData('\u02B0', '\u02FF', nameof(UnicodeRanges.SpacingModifierLetters))] - [InlineData('\u0300', '\u036F', nameof(UnicodeRanges.CombiningDiacriticalMarks))] - [InlineData('\u0370', '\u03FF', nameof(UnicodeRanges.GreekandCoptic))] - [InlineData('\u0400', '\u04FF', nameof(UnicodeRanges.Cyrillic))] - [InlineData('\u0500', '\u052F', nameof(UnicodeRanges.CyrillicSupplement))] - [InlineData('\u0530', '\u058F', nameof(UnicodeRanges.Armenian))] - [InlineData('\u0590', '\u05FF', nameof(UnicodeRanges.Hebrew))] - [InlineData('\u0600', '\u06FF', nameof(UnicodeRanges.Arabic))] - [InlineData('\u0700', '\u074F', nameof(UnicodeRanges.Syriac))] - [InlineData('\u0750', '\u077F', nameof(UnicodeRanges.ArabicSupplement))] - [InlineData('\u0780', '\u07BF', nameof(UnicodeRanges.Thaana))] - [InlineData('\u07C0', '\u07FF', nameof(UnicodeRanges.NKo))] - [InlineData('\u0800', '\u083F', nameof(UnicodeRanges.Samaritan))] - [InlineData('\u0840', '\u085F', nameof(UnicodeRanges.Mandaic))] - [InlineData('\u08A0', '\u08FF', nameof(UnicodeRanges.ArabicExtendedA))] - [InlineData('\u0900', '\u097F', nameof(UnicodeRanges.Devanagari))] - [InlineData('\u0980', '\u09FF', nameof(UnicodeRanges.Bengali))] - [InlineData('\u0A00', '\u0A7F', nameof(UnicodeRanges.Gurmukhi))] - [InlineData('\u0A80', '\u0AFF', nameof(UnicodeRanges.Gujarati))] - [InlineData('\u0B00', '\u0B7F', nameof(UnicodeRanges.Oriya))] - [InlineData('\u0B80', '\u0BFF', nameof(UnicodeRanges.Tamil))] - [InlineData('\u0C00', '\u0C7F', nameof(UnicodeRanges.Telugu))] - [InlineData('\u0C80', '\u0CFF', nameof(UnicodeRanges.Kannada))] - [InlineData('\u0D00', '\u0D7F', nameof(UnicodeRanges.Malayalam))] - [InlineData('\u0D80', '\u0DFF', nameof(UnicodeRanges.Sinhala))] - [InlineData('\u0E00', '\u0E7F', nameof(UnicodeRanges.Thai))] - [InlineData('\u0E80', '\u0EFF', nameof(UnicodeRanges.Lao))] - [InlineData('\u0F00', '\u0FFF', nameof(UnicodeRanges.Tibetan))] - [InlineData('\u1000', '\u109F', nameof(UnicodeRanges.Myanmar))] - [InlineData('\u10A0', '\u10FF', nameof(UnicodeRanges.Georgian))] - [InlineData('\u1100', '\u11FF', nameof(UnicodeRanges.HangulJamo))] - [InlineData('\u1200', '\u137F', nameof(UnicodeRanges.Ethiopic))] - [InlineData('\u1380', '\u139F', nameof(UnicodeRanges.EthiopicSupplement))] - [InlineData('\u13A0', '\u13FF', nameof(UnicodeRanges.Cherokee))] - [InlineData('\u1400', '\u167F', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabics))] - [InlineData('\u1680', '\u169F', nameof(UnicodeRanges.Ogham))] - [InlineData('\u16A0', '\u16FF', nameof(UnicodeRanges.Runic))] - [InlineData('\u1700', '\u171F', nameof(UnicodeRanges.Tagalog))] - [InlineData('\u1720', '\u173F', nameof(UnicodeRanges.Hanunoo))] - [InlineData('\u1740', '\u175F', nameof(UnicodeRanges.Buhid))] - [InlineData('\u1760', '\u177F', nameof(UnicodeRanges.Tagbanwa))] - [InlineData('\u1780', '\u17FF', nameof(UnicodeRanges.Khmer))] - [InlineData('\u1800', '\u18AF', nameof(UnicodeRanges.Mongolian))] - [InlineData('\u18B0', '\u18FF', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabicsExtended))] - [InlineData('\u1900', '\u194F', nameof(UnicodeRanges.Limbu))] - [InlineData('\u1950', '\u197F', nameof(UnicodeRanges.TaiLe))] - [InlineData('\u1980', '\u19DF', nameof(UnicodeRanges.NewTaiLue))] - [InlineData('\u19E0', '\u19FF', nameof(UnicodeRanges.KhmerSymbols))] - [InlineData('\u1A00', '\u1A1F', nameof(UnicodeRanges.Buginese))] - [InlineData('\u1A20', '\u1AAF', nameof(UnicodeRanges.TaiTham))] - [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeRanges.CombiningDiacriticalMarksExtended))] - [InlineData('\u1B00', '\u1B7F', nameof(UnicodeRanges.Balinese))] - [InlineData('\u1B80', '\u1BBF', nameof(UnicodeRanges.Sundanese))] - [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeRanges.Batak))] - [InlineData('\u1C00', '\u1C4F', nameof(UnicodeRanges.Lepcha))] - [InlineData('\u1C50', '\u1C7F', nameof(UnicodeRanges.OlChiki))] - [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeRanges.SundaneseSupplement))] - [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeRanges.VedicExtensions))] - [InlineData('\u1D00', '\u1D7F', nameof(UnicodeRanges.PhoneticExtensions))] - [InlineData('\u1D80', '\u1DBF', nameof(UnicodeRanges.PhoneticExtensionsSupplement))] - [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeRanges.CombiningDiacriticalMarksSupplement))] - [InlineData('\u1E00', '\u1EFF', nameof(UnicodeRanges.LatinExtendedAdditional))] - [InlineData('\u1F00', '\u1FFF', nameof(UnicodeRanges.GreekExtended))] - [InlineData('\u2000', '\u206F', nameof(UnicodeRanges.GeneralPunctuation))] - [InlineData('\u2070', '\u209F', nameof(UnicodeRanges.SuperscriptsandSubscripts))] - [InlineData('\u20A0', '\u20CF', nameof(UnicodeRanges.CurrencySymbols))] - [InlineData('\u20D0', '\u20FF', nameof(UnicodeRanges.CombiningDiacriticalMarksforSymbols))] - [InlineData('\u2100', '\u214F', nameof(UnicodeRanges.LetterlikeSymbols))] - [InlineData('\u2150', '\u218F', nameof(UnicodeRanges.NumberForms))] - [InlineData('\u2190', '\u21FF', nameof(UnicodeRanges.Arrows))] - [InlineData('\u2200', '\u22FF', nameof(UnicodeRanges.MathematicalOperators))] - [InlineData('\u2300', '\u23FF', nameof(UnicodeRanges.MiscellaneousTechnical))] - [InlineData('\u2400', '\u243F', nameof(UnicodeRanges.ControlPictures))] - [InlineData('\u2440', '\u245F', nameof(UnicodeRanges.OpticalCharacterRecognition))] - [InlineData('\u2460', '\u24FF', nameof(UnicodeRanges.EnclosedAlphanumerics))] - [InlineData('\u2500', '\u257F', nameof(UnicodeRanges.BoxDrawing))] - [InlineData('\u2580', '\u259F', nameof(UnicodeRanges.BlockElements))] - [InlineData('\u25A0', '\u25FF', nameof(UnicodeRanges.GeometricShapes))] - [InlineData('\u2600', '\u26FF', nameof(UnicodeRanges.MiscellaneousSymbols))] - [InlineData('\u2700', '\u27BF', nameof(UnicodeRanges.Dingbats))] - [InlineData('\u27C0', '\u27EF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsA))] - [InlineData('\u27F0', '\u27FF', nameof(UnicodeRanges.SupplementalArrowsA))] - [InlineData('\u2800', '\u28FF', nameof(UnicodeRanges.BraillePatterns))] - [InlineData('\u2900', '\u297F', nameof(UnicodeRanges.SupplementalArrowsB))] - [InlineData('\u2980', '\u29FF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsB))] - [InlineData('\u2A00', '\u2AFF', nameof(UnicodeRanges.SupplementalMathematicalOperators))] - [InlineData('\u2B00', '\u2BFF', nameof(UnicodeRanges.MiscellaneousSymbolsandArrows))] - [InlineData('\u2C00', '\u2C5F', nameof(UnicodeRanges.Glagolitic))] - [InlineData('\u2C60', '\u2C7F', nameof(UnicodeRanges.LatinExtendedC))] - [InlineData('\u2C80', '\u2CFF', nameof(UnicodeRanges.Coptic))] - [InlineData('\u2D00', '\u2D2F', nameof(UnicodeRanges.GeorgianSupplement))] - [InlineData('\u2D30', '\u2D7F', nameof(UnicodeRanges.Tifinagh))] - [InlineData('\u2D80', '\u2DDF', nameof(UnicodeRanges.EthiopicExtended))] - [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeRanges.CyrillicExtendedA))] - [InlineData('\u2E00', '\u2E7F', nameof(UnicodeRanges.SupplementalPunctuation))] - [InlineData('\u2E80', '\u2EFF', nameof(UnicodeRanges.CJKRadicalsSupplement))] - [InlineData('\u2F00', '\u2FDF', nameof(UnicodeRanges.KangxiRadicals))] - [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeRanges.IdeographicDescriptionCharacters))] - [InlineData('\u3000', '\u303F', nameof(UnicodeRanges.CJKSymbolsandPunctuation))] - [InlineData('\u3040', '\u309F', nameof(UnicodeRanges.Hiragana))] - [InlineData('\u30A0', '\u30FF', nameof(UnicodeRanges.Katakana))] - [InlineData('\u3100', '\u312F', nameof(UnicodeRanges.Bopomofo))] - [InlineData('\u3130', '\u318F', nameof(UnicodeRanges.HangulCompatibilityJamo))] - [InlineData('\u3190', '\u319F', nameof(UnicodeRanges.Kanbun))] - [InlineData('\u31A0', '\u31BF', nameof(UnicodeRanges.BopomofoExtended))] - [InlineData('\u31C0', '\u31EF', nameof(UnicodeRanges.CJKStrokes))] - [InlineData('\u31F0', '\u31FF', nameof(UnicodeRanges.KatakanaPhoneticExtensions))] - [InlineData('\u3200', '\u32FF', nameof(UnicodeRanges.EnclosedCJKLettersandMonths))] - [InlineData('\u3300', '\u33FF', nameof(UnicodeRanges.CJKCompatibility))] - [InlineData('\u3400', '\u4DBF', nameof(UnicodeRanges.CJKUnifiedIdeographsExtensionA))] - [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeRanges.YijingHexagramSymbols))] - [InlineData('\u4E00', '\u9FFF', nameof(UnicodeRanges.CJKUnifiedIdeographs))] - [InlineData('\uA000', '\uA48F', nameof(UnicodeRanges.YiSyllables))] - [InlineData('\uA490', '\uA4CF', nameof(UnicodeRanges.YiRadicals))] - [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeRanges.Lisu))] - [InlineData('\uA500', '\uA63F', nameof(UnicodeRanges.Vai))] - [InlineData('\uA640', '\uA69F', nameof(UnicodeRanges.CyrillicExtendedB))] - [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeRanges.Bamum))] - [InlineData('\uA700', '\uA71F', nameof(UnicodeRanges.ModifierToneLetters))] - [InlineData('\uA720', '\uA7FF', nameof(UnicodeRanges.LatinExtendedD))] - [InlineData('\uA800', '\uA82F', nameof(UnicodeRanges.SylotiNagri))] - [InlineData('\uA830', '\uA83F', nameof(UnicodeRanges.CommonIndicNumberForms))] - [InlineData('\uA840', '\uA87F', nameof(UnicodeRanges.Phagspa))] - [InlineData('\uA880', '\uA8DF', nameof(UnicodeRanges.Saurashtra))] - [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeRanges.DevanagariExtended))] - [InlineData('\uA900', '\uA92F', nameof(UnicodeRanges.KayahLi))] - [InlineData('\uA930', '\uA95F', nameof(UnicodeRanges.Rejang))] - [InlineData('\uA960', '\uA97F', nameof(UnicodeRanges.HangulJamoExtendedA))] - [InlineData('\uA980', '\uA9DF', nameof(UnicodeRanges.Javanese))] - [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeRanges.MyanmarExtendedB))] - [InlineData('\uAA00', '\uAA5F', nameof(UnicodeRanges.Cham))] - [InlineData('\uAA60', '\uAA7F', nameof(UnicodeRanges.MyanmarExtendedA))] - [InlineData('\uAA80', '\uAADF', nameof(UnicodeRanges.TaiViet))] - [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeRanges.MeeteiMayekExtensions))] - [InlineData('\uAB00', '\uAB2F', nameof(UnicodeRanges.EthiopicExtendedA))] - [InlineData('\uAB30', '\uAB6F', nameof(UnicodeRanges.LatinExtendedE))] - [InlineData('\uAB70', '\uABBF', nameof(UnicodeRanges.CherokeeSupplement))] - [InlineData('\uABC0', '\uABFF', nameof(UnicodeRanges.MeeteiMayek))] - [InlineData('\uAC00', '\uD7AF', nameof(UnicodeRanges.HangulSyllables))] - [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeRanges.HangulJamoExtendedB))] - [InlineData('\uF900', '\uFAFF', nameof(UnicodeRanges.CJKCompatibilityIdeographs))] - [InlineData('\uFB00', '\uFB4F', nameof(UnicodeRanges.AlphabeticPresentationForms))] - [InlineData('\uFB50', '\uFDFF', nameof(UnicodeRanges.ArabicPresentationFormsA))] - [InlineData('\uFE00', '\uFE0F', nameof(UnicodeRanges.VariationSelectors))] - [InlineData('\uFE10', '\uFE1F', nameof(UnicodeRanges.VerticalForms))] - [InlineData('\uFE20', '\uFE2F', nameof(UnicodeRanges.CombiningHalfMarks))] - [InlineData('\uFE30', '\uFE4F', nameof(UnicodeRanges.CJKCompatibilityForms))] - [InlineData('\uFE50', '\uFE6F', nameof(UnicodeRanges.SmallFormVariants))] - [InlineData('\uFE70', '\uFEFF', nameof(UnicodeRanges.ArabicPresentationFormsB))] - [InlineData('\uFF00', '\uFFEF', nameof(UnicodeRanges.HalfwidthandFullwidthForms))] - [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeRanges.Specials))] - public void Range_Unicode(char first, char last, string blockName) - { - Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 - Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF - Assert.True(first < last); // code point ranges should be ordered - - var propInfo = typeof(UnicodeRanges).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); - Assert.NotNull(propInfo); - - UnicodeRange range = (UnicodeRange)propInfo.GetValue(null); - Assert.NotNull(range); - - // Test 1: the range should span the range first..last - Assert.Equal(first, range.FirstCodePoint); - Assert.Equal(last, range.FirstCodePoint + range.RangeSize - 1); - - // Test 2: calling the property multiple times should cache and return the same range instance - UnicodeRange range2 = (UnicodeRange)propInfo.GetValue(null); - Assert.Same(range, range2); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs deleted file mode 100644 index 2f31e0e16f..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UrlEncoderTests - { - private static UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); - - [Fact] - public void Ctor_WithCodePointFilter() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - UrlEncoder encoder = new UrlEncoder(filter); - - // Act & assert - Assert.Equal("a", encoder.UrlEncode("a")); - Assert.Equal("b", encoder.UrlEncode("b")); - Assert.Equal("%63", encoder.UrlEncode("c")); - Assert.Equal("d", encoder.UrlEncode("d")); - Assert.Equal("%00", encoder.UrlEncode("\0")); // we still always encode control chars - Assert.Equal("%26", encoder.UrlEncode("&")); // we still always encode HTML-special chars - Assert.Equal("%EF%BF%BF", encoder.UrlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); - - // Act & assert - Assert.Equal("%61", encoder.UrlEncode("a")); - Assert.Equal("\u00E9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.UrlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Ctor_WithNoParameters_DefaultsToBasicLatin() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - - // Act & assert - Assert.Equal("a", encoder.UrlEncode("a")); - Assert.Equal("%C3%A9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("%E2%98%81", encoder.UrlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Default_EquivalentToBasicLatin() - { - // Arrange - UrlEncoder controlEncoder = new UrlEncoder(UnicodeRanges.BasicLatin); - UrlEncoder testEncoder = UrlEncoder.Default; - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (!IsSurrogateCodePoint(i)) - { - string input = new String((char)i, 1); - Assert.Equal(controlEncoder.UrlEncode(input), testEncoder.UrlEncode(input)); - } - } - } - - [Fact] - public void Default_ReturnsSingletonInstance() - { - // Act - UrlEncoder encoder1 = UrlEncoder.Default; - UrlEncoder encoder2 = UrlEncoder.Default; - - // Assert - Assert.Same(encoder1, encoder2); - } - - [Fact] - public void UrlEncode_AllRangesAllowed_StillEncodesForbiddenChars() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "%EF%BF%BD"; // unpaired surrogate -> Unicode replacement char - } - else - { - bool mustEncode = true; - - // RFC 3987, Sec. 2.2 gives the list of allowed chars - // (We allow 'ipchar' except for "'", "&", "+", "%", and "=" - if (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z') || ('0' <= i && i <= '9')) - { - mustEncode = false; // ALPHA / DIGIT - } - else if ((0x00A0 <= i && i <= 0xD7FF) | (0xF900 <= i && i <= 0xFDCF) | (0xFDF0 <= i && i <= 0xFFEF)) - { - mustEncode = !UnicodeHelpers.IsCharacterDefined((char)i); // 'ucschar' - } - else - { - switch (i) - { - // iunreserved - case '-': - case '.': - case '_': - case '~': - - // isegment-nz-nc - case '@': - - // sub-delims - case '!': - case '$': - case '(': - case ')': - case '*': - case ',': - case ';': - mustEncode = false; - break; - } - } - - if (mustEncode) - { - expected = GetKnownGoodPercentEncodedValue(i); - } - else - { - expected = input; // no encoding - } - } - - string retVal = encoder.UrlEncode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = GetKnownGoodPercentEncodedValue(i); - string retVal = encoder.UrlEncode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void UrlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a%EF%BF%BDb%EF%BF%BDc%EF%BF%BD%EF%BF%BDd%EF%BF%BD%F0%90%8F%BFe%EF%BF%BD"; // 'D800' 'DFFF' was preserved since it's valid - - // Act - string retVal = encoder.UrlEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void UrlEncode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - - // Act & assert - Assert.Equal("", encoder.UrlEncode("")); - } - - [Fact] - public void UrlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - string input = "Hello,there!"; - - // Act & assert - Assert.Same(input, encoder.UrlEncode(input)); - } - - [Fact] - public void UrlEncode_NullInput_ReturnsNull() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - - // Act & assert - Assert.Null(encoder.UrlEncode(null)); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal(@"%26Hello,there!", new UrlEncoder().UrlEncode("&Hello,there!")); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal(@"Hello,there!%26", new UrlEncoder().UrlEncode("Hello,there!&")); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal(@"Hello,%20%26there!", new UrlEncoder().UrlEncode("Hello, &there!")); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal(@"Hello,%20%3Cthere%3E!", new UrlEncoder().UrlEncode("Hello, !")); - } - - [Fact] - public void UrlEncode_CharArray() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - var output = new StringWriter(); - - // Act - encoder.UrlEncode("Hello+world!".ToCharArray(), 3, 5, output); - - // Assert - Assert.Equal("lo%2Bwo", output.ToString()); - } - - [Fact] - public void UrlEncode_StringSubstring() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - var output = new StringWriter(); - - // Act - encoder.UrlEncode("Hello+world!", 3, 5, output); - - // Assert - Assert.Equal("lo%2Bwo", output.ToString()); - } - - [Fact] - public void UrlEncode_DoesNotOutputHtmlSensitiveCharacters() - { - // Per the design document, we provide additional defense-in-depth - // by never emitting HTML-sensitive characters unescaped. - - // Arrange - UrlEncoder urlEncoder = new UrlEncoder(UnicodeRanges.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); - - // Act & assert - for (int i = 0; i <= 0x10FFFF; i++) - { - if (IsSurrogateCodePoint(i)) - { - continue; // surrogates don't matter here - } - - string urlEncoded = urlEncoder.UrlEncode(Char.ConvertFromUtf32(i)); - string thenHtmlEncoded = htmlEncoder.HtmlEncode(urlEncoded); - Assert.Equal(urlEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters - } - } - - private static string GetKnownGoodPercentEncodedValue(int codePoint) - { - // Convert the code point to UTF16, then call Encoding.UTF8.GetBytes, then hex-encode everything - return String.Concat(_utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(codePoint)).Select(b => String.Format(CultureInfo.InvariantCulture, "%{0:X2}", b))); - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json index 87d9e98e9c..c2b08aa51f 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -18,6 +18,5 @@ "System.Text.Encoding.Extensions": "4.0.11-beta-*" } } - }, - "resource": "..\\..\\unicode\\UnicodeData.txt" + } } diff --git a/unicode/Blocks.txt b/unicode/Blocks.txt deleted file mode 100644 index 0a4a580763..0000000000 --- a/unicode/Blocks.txt +++ /dev/null @@ -1,298 +0,0 @@ -# Blocks-8.0.0.txt -# Date: 2014-11-10, 23:04:00 GMT [KW] -# -# Unicode Character Database -# Copyright (c) 1991-2014 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ -# -# Format: -# Start Code..End Code; Block Name - -# ================================================ - -# Note: When comparing block names, casing, whitespace, hyphens, -# and underbars are ignored. -# For example, "Latin Extended-A" and "latin extended a" are equivalent. -# For more information on the comparison of property values, -# see UAX #44: http://www.unicode.org/reports/tr44/ -# -# All block ranges start with a value where (cp MOD 16) = 0, -# and end with a value where (cp MOD 16) = 15. In other words, -# the last hexadecimal digit of the start of range is ...0 -# and the last hexadecimal digit of the end of range is ...F. -# This constraint on block ranges guarantees that allocations -# are done in terms of whole columns, and that code chart display -# never involves splitting columns in the charts. -# -# All code points not explicitly listed for Block -# have the value No_Block. - -# Property: Block -# -# @missing: 0000..10FFFF; No_Block - -0000..007F; Basic Latin -0080..00FF; Latin-1 Supplement -0100..017F; Latin Extended-A -0180..024F; Latin Extended-B -0250..02AF; IPA Extensions -02B0..02FF; Spacing Modifier Letters -0300..036F; Combining Diacritical Marks -0370..03FF; Greek and Coptic -0400..04FF; Cyrillic -0500..052F; Cyrillic Supplement -0530..058F; Armenian -0590..05FF; Hebrew -0600..06FF; Arabic -0700..074F; Syriac -0750..077F; Arabic Supplement -0780..07BF; Thaana -07C0..07FF; NKo -0800..083F; Samaritan -0840..085F; Mandaic -08A0..08FF; Arabic Extended-A -0900..097F; Devanagari -0980..09FF; Bengali -0A00..0A7F; Gurmukhi -0A80..0AFF; Gujarati -0B00..0B7F; Oriya -0B80..0BFF; Tamil -0C00..0C7F; Telugu -0C80..0CFF; Kannada -0D00..0D7F; Malayalam -0D80..0DFF; Sinhala -0E00..0E7F; Thai -0E80..0EFF; Lao -0F00..0FFF; Tibetan -1000..109F; Myanmar -10A0..10FF; Georgian -1100..11FF; Hangul Jamo -1200..137F; Ethiopic -1380..139F; Ethiopic Supplement -13A0..13FF; Cherokee -1400..167F; Unified Canadian Aboriginal Syllabics -1680..169F; Ogham -16A0..16FF; Runic -1700..171F; Tagalog -1720..173F; Hanunoo -1740..175F; Buhid -1760..177F; Tagbanwa -1780..17FF; Khmer -1800..18AF; Mongolian -18B0..18FF; Unified Canadian Aboriginal Syllabics Extended -1900..194F; Limbu -1950..197F; Tai Le -1980..19DF; New Tai Lue -19E0..19FF; Khmer Symbols -1A00..1A1F; Buginese -1A20..1AAF; Tai Tham -1AB0..1AFF; Combining Diacritical Marks Extended -1B00..1B7F; Balinese -1B80..1BBF; Sundanese -1BC0..1BFF; Batak -1C00..1C4F; Lepcha -1C50..1C7F; Ol Chiki -1CC0..1CCF; Sundanese Supplement -1CD0..1CFF; Vedic Extensions -1D00..1D7F; Phonetic Extensions -1D80..1DBF; Phonetic Extensions Supplement -1DC0..1DFF; Combining Diacritical Marks Supplement -1E00..1EFF; Latin Extended Additional -1F00..1FFF; Greek Extended -2000..206F; General Punctuation -2070..209F; Superscripts and Subscripts -20A0..20CF; Currency Symbols -20D0..20FF; Combining Diacritical Marks for Symbols -2100..214F; Letterlike Symbols -2150..218F; Number Forms -2190..21FF; Arrows -2200..22FF; Mathematical Operators -2300..23FF; Miscellaneous Technical -2400..243F; Control Pictures -2440..245F; Optical Character Recognition -2460..24FF; Enclosed Alphanumerics -2500..257F; Box Drawing -2580..259F; Block Elements -25A0..25FF; Geometric Shapes -2600..26FF; Miscellaneous Symbols -2700..27BF; Dingbats -27C0..27EF; Miscellaneous Mathematical Symbols-A -27F0..27FF; Supplemental Arrows-A -2800..28FF; Braille Patterns -2900..297F; Supplemental Arrows-B -2980..29FF; Miscellaneous Mathematical Symbols-B -2A00..2AFF; Supplemental Mathematical Operators -2B00..2BFF; Miscellaneous Symbols and Arrows -2C00..2C5F; Glagolitic -2C60..2C7F; Latin Extended-C -2C80..2CFF; Coptic -2D00..2D2F; Georgian Supplement -2D30..2D7F; Tifinagh -2D80..2DDF; Ethiopic Extended -2DE0..2DFF; Cyrillic Extended-A -2E00..2E7F; Supplemental Punctuation -2E80..2EFF; CJK Radicals Supplement -2F00..2FDF; Kangxi Radicals -2FF0..2FFF; Ideographic Description Characters -3000..303F; CJK Symbols and Punctuation -3040..309F; Hiragana -30A0..30FF; Katakana -3100..312F; Bopomofo -3130..318F; Hangul Compatibility Jamo -3190..319F; Kanbun -31A0..31BF; Bopomofo Extended -31C0..31EF; CJK Strokes -31F0..31FF; Katakana Phonetic Extensions -3200..32FF; Enclosed CJK Letters and Months -3300..33FF; CJK Compatibility -3400..4DBF; CJK Unified Ideographs Extension A -4DC0..4DFF; Yijing Hexagram Symbols -4E00..9FFF; CJK Unified Ideographs -A000..A48F; Yi Syllables -A490..A4CF; Yi Radicals -A4D0..A4FF; Lisu -A500..A63F; Vai -A640..A69F; Cyrillic Extended-B -A6A0..A6FF; Bamum -A700..A71F; Modifier Tone Letters -A720..A7FF; Latin Extended-D -A800..A82F; Syloti Nagri -A830..A83F; Common Indic Number Forms -A840..A87F; Phags-pa -A880..A8DF; Saurashtra -A8E0..A8FF; Devanagari Extended -A900..A92F; Kayah Li -A930..A95F; Rejang -A960..A97F; Hangul Jamo Extended-A -A980..A9DF; Javanese -A9E0..A9FF; Myanmar Extended-B -AA00..AA5F; Cham -AA60..AA7F; Myanmar Extended-A -AA80..AADF; Tai Viet -AAE0..AAFF; Meetei Mayek Extensions -AB00..AB2F; Ethiopic Extended-A -AB30..AB6F; Latin Extended-E -AB70..ABBF; Cherokee Supplement -ABC0..ABFF; Meetei Mayek -AC00..D7AF; Hangul Syllables -D7B0..D7FF; Hangul Jamo Extended-B -D800..DB7F; High Surrogates -DB80..DBFF; High Private Use Surrogates -DC00..DFFF; Low Surrogates -E000..F8FF; Private Use Area -F900..FAFF; CJK Compatibility Ideographs -FB00..FB4F; Alphabetic Presentation Forms -FB50..FDFF; Arabic Presentation Forms-A -FE00..FE0F; Variation Selectors -FE10..FE1F; Vertical Forms -FE20..FE2F; Combining Half Marks -FE30..FE4F; CJK Compatibility Forms -FE50..FE6F; Small Form Variants -FE70..FEFF; Arabic Presentation Forms-B -FF00..FFEF; Halfwidth and Fullwidth Forms -FFF0..FFFF; Specials -10000..1007F; Linear B Syllabary -10080..100FF; Linear B Ideograms -10100..1013F; Aegean Numbers -10140..1018F; Ancient Greek Numbers -10190..101CF; Ancient Symbols -101D0..101FF; Phaistos Disc -10280..1029F; Lycian -102A0..102DF; Carian -102E0..102FF; Coptic Epact Numbers -10300..1032F; Old Italic -10330..1034F; Gothic -10350..1037F; Old Permic -10380..1039F; Ugaritic -103A0..103DF; Old Persian -10400..1044F; Deseret -10450..1047F; Shavian -10480..104AF; Osmanya -10500..1052F; Elbasan -10530..1056F; Caucasian Albanian -10600..1077F; Linear A -10800..1083F; Cypriot Syllabary -10840..1085F; Imperial Aramaic -10860..1087F; Palmyrene -10880..108AF; Nabataean -108E0..108FF; Hatran -10900..1091F; Phoenician -10920..1093F; Lydian -10980..1099F; Meroitic Hieroglyphs -109A0..109FF; Meroitic Cursive -10A00..10A5F; Kharoshthi -10A60..10A7F; Old South Arabian -10A80..10A9F; Old North Arabian -10AC0..10AFF; Manichaean -10B00..10B3F; Avestan -10B40..10B5F; Inscriptional Parthian -10B60..10B7F; Inscriptional Pahlavi -10B80..10BAF; Psalter Pahlavi -10C00..10C4F; Old Turkic -10C80..10CFF; Old Hungarian -10E60..10E7F; Rumi Numeral Symbols -11000..1107F; Brahmi -11080..110CF; Kaithi -110D0..110FF; Sora Sompeng -11100..1114F; Chakma -11150..1117F; Mahajani -11180..111DF; Sharada -111E0..111FF; Sinhala Archaic Numbers -11200..1124F; Khojki -11280..112AF; Multani -112B0..112FF; Khudawadi -11300..1137F; Grantha -11480..114DF; Tirhuta -11580..115FF; Siddham -11600..1165F; Modi -11680..116CF; Takri -11700..1173F; Ahom -118A0..118FF; Warang Citi -11AC0..11AFF; Pau Cin Hau -12000..123FF; Cuneiform -12400..1247F; Cuneiform Numbers and Punctuation -12480..1254F; Early Dynastic Cuneiform -13000..1342F; Egyptian Hieroglyphs -14400..1467F; Anatolian Hieroglyphs -16800..16A3F; Bamum Supplement -16A40..16A6F; Mro -16AD0..16AFF; Bassa Vah -16B00..16B8F; Pahawh Hmong -16F00..16F9F; Miao -1B000..1B0FF; Kana Supplement -1BC00..1BC9F; Duployan -1BCA0..1BCAF; Shorthand Format Controls -1D000..1D0FF; Byzantine Musical Symbols -1D100..1D1FF; Musical Symbols -1D200..1D24F; Ancient Greek Musical Notation -1D300..1D35F; Tai Xuan Jing Symbols -1D360..1D37F; Counting Rod Numerals -1D400..1D7FF; Mathematical Alphanumeric Symbols -1D800..1DAAF; Sutton SignWriting -1E800..1E8DF; Mende Kikakui -1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols -1F000..1F02F; Mahjong Tiles -1F030..1F09F; Domino Tiles -1F0A0..1F0FF; Playing Cards -1F100..1F1FF; Enclosed Alphanumeric Supplement -1F200..1F2FF; Enclosed Ideographic Supplement -1F300..1F5FF; Miscellaneous Symbols and Pictographs -1F600..1F64F; Emoticons -1F650..1F67F; Ornamental Dingbats -1F680..1F6FF; Transport and Map Symbols -1F700..1F77F; Alchemical Symbols -1F780..1F7FF; Geometric Shapes Extended -1F800..1F8FF; Supplemental Arrows-C -1F900..1F9FF; Supplemental Symbols and Pictographs -20000..2A6DF; CJK Unified Ideographs Extension B -2A700..2B73F; CJK Unified Ideographs Extension C -2B740..2B81F; CJK Unified Ideographs Extension D -2B820..2CEAF; CJK Unified Ideographs Extension E -2F800..2FA1F; CJK Compatibility Ideographs Supplement -E0000..E007F; Tags -E0100..E01EF; Variation Selectors Supplement -F0000..FFFFF; Supplementary Private Use Area-A -100000..10FFFF; Supplementary Private Use Area-B - -# EOF diff --git a/unicode/Generators/DefinedCharListGenerator/App.config b/unicode/Generators/DefinedCharListGenerator/App.config deleted file mode 100644 index 9c05822ff5..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj b/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj deleted file mode 100644 index b1e3df2dc8..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4} - Exe - Properties - DefinedCharListGenerator - DefinedCharListGenerator - v4.5.1 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - UnicodeData.txt - PreserveNewest - - - - - \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/Program.cs b/unicode/Generators/DefinedCharListGenerator/Program.cs deleted file mode 100644 index edcd0f3602..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/Program.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; - -namespace DefinedCharListGenerator -{ - /// - /// This program outputs the 'unicode-defined-chars.bin' bitmap file. - /// - class Program - { - static void Main(string[] args) - { - // The input file should be UnicodeData.txt from the UCD corresponding to the - // version of the Unicode spec we're consuming. - // More info: http://www.unicode.org/reports/tr44/tr44-14.html#UCD_Files - // Latest UnicodeData.txt: http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt - - const uint MAX_UNICODE_CHAR = 0x10FFFF; // Unicode range is U+0000 .. U+10FFFF - bool[] definedChars = new bool[MAX_UNICODE_CHAR + 1]; - Dictionary spans = new Dictionary(); - - // Read all defined characters from the input file. - string[] allLines = File.ReadAllLines("UnicodeData.txt"); - - // Each line is a semicolon-delimited list of information: - // ;;;... - foreach (string line in allLines) - { - string[] splitLine = line.Split(new char[] { ';' }, 4); - uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); - string rawName = splitLine[1]; - string category = splitLine[2]; - - // spans go into their own dictionary for later processing - string spanName; - bool isStartOfSpan; - if (IsSpanDefinition(rawName, out spanName, out isStartOfSpan)) - { - if (isStartOfSpan) - { - spans.Add(spanName, new Span() { FirstCodePoint = codepoint, Category = category }); - } - else - { - var existingSpan = spans[spanName]; - Debug.Assert(existingSpan.FirstCodePoint != 0, "We should've seen the start of this span already."); - Debug.Assert(existingSpan.LastCodePoint == 0, "We shouldn't have seen the end of this span already."); - Debug.Assert(existingSpan.Category == category, "Span start Unicode category doesn't match span end Unicode category."); - existingSpan.LastCodePoint = codepoint; - } - continue; - } - - // We only allow certain categories of code points. - // Zs (space separators) aren't included, but we allow U+0020 SPACE as a special case - - if (!(codepoint == (uint)' ' || IsAllowedUnicodeCategory(category))) - { - continue; - } - - Debug.Assert(codepoint <= MAX_UNICODE_CHAR); - definedChars[codepoint] = true; - } - - // Next, populate characters that weren't defined on their own lines - // but which are instead defined as members of a named span. - foreach (var span in spans.Values) - { - if (IsAllowedUnicodeCategory(span.Category)) - { - Debug.Assert(span.FirstCodePoint <= MAX_UNICODE_CHAR); - Debug.Assert(span.LastCodePoint <= MAX_UNICODE_CHAR); - for (uint i = span.FirstCodePoint; i <= span.LastCodePoint; i++) - { - definedChars[i] = true; - } - } - } - - // Finally, write the list of defined characters out as a bitmap. - // Each consecutive block of 8 chars is written as a single byte. - // For instance, the first byte of the output file contains the - // bitmap for the following codepoints: - // - (bit 7) U+0007 [MSB] - // - (bit 6) U+0006 - // - (bit 5) U+0005 - // - (bit 4) U+0004 - // - (bit 3) U+0003 - // - (bit 2) U+0002 - // - (bit 1) U+0001 - // - (bit 0) U+0000 [LSB] - // The next byte will contain the bitmap for U+000F to U+0008, - // and so on until the last byte, which is U+FFFF to U+FFF8. - // The bytes are written out in little-endian order. - // We're only concerned about the BMP (U+0000 .. U+FFFF) for now. - MemoryStream outBuffer = new MemoryStream(); - for (int i = 0; i < 0x10000; i += 8) - { - int thisByte = 0; - for (int j = 7; j >= 0; j--) - { - thisByte <<= 1; - if (definedChars[i + j]) - { - thisByte |= 0x1; - } - } - outBuffer.WriteByte((byte)thisByte); - } - - File.WriteAllBytes("unicode-defined-chars.bin", outBuffer.ToArray()); - } - - private static bool IsAllowedUnicodeCategory(string category) - { - // We only allow certain classes of characters - return category == "Lu" /* letters */ - || category == "Ll" - || category == "Lt" - || category == "Lm" - || category == "Lo" - || category == "Mn" /* marks */ - || category == "Mc" - || category == "Me" - || category == "Nd" /* numbers */ - || category == "Nl" - || category == "No" - || category == "Pc" /* punctuation */ - || category == "Pd" - || category == "Ps" - || category == "Pe" - || category == "Pi" - || category == "Pf" - || category == "Po" - || category == "Sm" /* symbols */ - || category == "Sc" - || category == "Sk" - || category == "So" - || category == "Cf"; /* other */ - } - - private static bool IsSpanDefinition(string rawName, out string spanName, out bool isStartOfSpan) - { - // Spans are represented within angle brackets, such as the following: - // DC00;;Cs;0;L;;;;;N;;;;; - // DFFF;;Cs;0;L;;;;;N;;;;; - if (rawName.StartsWith("<", StringComparison.Ordinal)) - { - if (rawName.EndsWith(", First>", StringComparison.Ordinal)) - { - spanName = rawName.Substring(1, rawName.Length - 1 - ", First>".Length); - isStartOfSpan = true; - return true; - } - else if (rawName.EndsWith(", Last>", StringComparison.Ordinal)) - { - spanName = rawName.Substring(1, rawName.Length - 1 - ", Last>".Length); - isStartOfSpan = false; - return true; - } - } - - // not surrounded by <>, or or some other non-span - spanName = null; - isStartOfSpan = false; - return false; - } - - private class Span - { - public uint FirstCodePoint; - public uint LastCodePoint; - public string Category; - } - } -} diff --git a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index 693c041be1..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("DefinedCharListGenerator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DefinedCharListGenerator")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("5089f890-38f7-413c-87b0-d8eb1e238ef5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/unicode/Generators/Generators.sln b/unicode/Generators/Generators.sln deleted file mode 100644 index acfaad9b24..0000000000 --- a/unicode/Generators/Generators.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DefinedCharListGenerator", "DefinedCharListGenerator\DefinedCharListGenerator.csproj", "{0E87CEC9-46CE-4B6B-A613-93AA773C10A4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnicodeTablesGenerator", "UnicodeTablesGenerator\UnicodeTablesGenerator.csproj", "{3D181114-6946-4D34-A3B9-0F83B6B8FEAE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.Build.0 = Release|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/unicode/Generators/UnicodeTablesGenerator/App.config b/unicode/Generators/UnicodeTablesGenerator/App.config deleted file mode 100644 index 9c05822ff5..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/unicode/Generators/UnicodeTablesGenerator/Program.cs b/unicode/Generators/UnicodeTablesGenerator/Program.cs deleted file mode 100644 index 76e4d7bd15..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/Program.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; - -namespace UnicodeTablesGenerator -{ - /// - /// This program outputs the 'UnicodeBlocks.generated.txt' and - /// 'UnicodeBlocksTests.generated.txt' source files. - /// - /// - /// The generated files require some hand-tweaking. For instance, you'll need - /// to remove surrogates and private use blocks. The files can then be merged - /// into the *.generated.cs files as appropriate. - /// - class Program - { - private const string _codePointFiltersGeneratedFormat = @" -/// -/// A corresponding to the '{0}' Unicode block (U+{1}..U+{2}). -/// -/// -/// See http://www.unicode.org/charts/PDF/U{1}.pdf for the full set of characters in this block. -/// -public static UnicodeRange {3} => Volatile.Read(ref _{4}) ?? CreateRange(ref _{4}, first: '\u{1}', last: '\u{2}'); -private static UnicodeRange _{4}; -"; - - private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeRanges.{0}))]"; - - private static void Main() - { - // The input file should be Blocks.txt from the UCD corresponding to the - // version of the Unicode spec we're consuming. - // More info: http://www.unicode.org/reports/tr44/ - // Latest Blocks.txt: http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt - - StringBuilder runtimeCodeBuilder = new StringBuilder(); - StringBuilder testCodeBuilder = new StringBuilder(); - string[] allLines = File.ReadAllLines("Blocks.txt"); - - Regex regex = new Regex(@"^(?[0-9A-F]{4})\.\.(?[0-9A-F]{4}); (?.+)$"); - - foreach (var line in allLines) - { - // We only care about lines of the form "XXXX..XXXX; Block name" - var match = regex.Match(line); - if (match == null || !match.Success) - { - continue; - } - - string startCode = match.Groups["startCode"].Value; - string endCode = match.Groups["endCode"].Value; - string blockName = match.Groups["blockName"].Value; - string blockNameAsProperty = RemoveAllNonAlphanumeric(blockName); - string blockNameAsField = WithDotNetFieldCasing(blockNameAsProperty); - - runtimeCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersGeneratedFormat, - blockName, startCode, endCode, blockNameAsProperty, blockNameAsField); - - testCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersTestsGeneratedFormat, - blockNameAsProperty, startCode, endCode); - testCodeBuilder.AppendLine(); - } - - File.WriteAllText("UnicodeRanges.generated.txt", runtimeCodeBuilder.ToString()); - File.WriteAllText("UnicodeRangesTests.generated.txt", testCodeBuilder.ToString()); - } - - private static string RemoveAllNonAlphanumeric(string blockName) - { - // Allow only A-Z 0-9 - return new String(blockName.ToCharArray().Where(c => ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9')).ToArray()); - } - - private static string WithDotNetFieldCasing(string input) - { - char[] chars = input.ToCharArray(); - for (int i = 0; i < chars.Length; i++) - { - if (Char.IsLower(chars[i])) - { - if (i > 1) - { - // restore original casing for the previous char unless the previous - // char was at the front of the string - chars[i - 1] = input[i - 1]; - } - break; - } - else - { - chars[i] = Char.ToLowerInvariant(chars[i]); - } - } - return new String(chars); - } - } -} diff --git a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index b7fc3fb222..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("UnicodeTablesGenerator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("UnicodeTablesGenerator")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c9286457-3d25-4143-9458-028aabedc4f5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj b/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj deleted file mode 100644 index 2821a1533c..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE} - Exe - Properties - UnicodeTablesGenerator - UnicodeTablesGenerator - v4.5.1 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - Blocks.txt - PreserveNewest - - - - - \ No newline at end of file diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt deleted file mode 100644 index aa0e914f84..0000000000 --- a/unicode/UnicodeData.txt +++ /dev/null @@ -1,29215 +0,0 @@ -0000;;Cc;0;BN;;;;;N;NULL;;;; -0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; -0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; -0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; -0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; -0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; -0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; -0007;;Cc;0;BN;;;;;N;BELL;;;; -0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; -0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; -000A;;Cc;0;B;;;;;N;LINE FEED (LF);;;; -000B;;Cc;0;S;;;;;N;LINE TABULATION;;;; -000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;; -000D;;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; -000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; -000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; -0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; -0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; -0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; -0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; -0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; -0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; -0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; -0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; -0018;;Cc;0;BN;;;;;N;CANCEL;;;; -0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; -001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; -001B;;Cc;0;BN;;;;;N;ESCAPE;;;; -001C;;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; -001D;;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; -001E;;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; -001F;;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; -0020;SPACE;Zs;0;WS;;;;;N;;;;; -0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; -0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; -0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; -0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; -0026;AMPERSAND;Po;0;ON;;;;;N;;;;; -0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; -0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; -0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; -002A;ASTERISK;Po;0;ON;;;;;N;;;;; -002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; -002C;COMMA;Po;0;CS;;;;;N;;;;; -002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; -002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; -002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; -0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; -0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; -0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; -0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; -0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; -0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; -0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; -0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; -0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; -0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; -003A;COLON;Po;0;CS;;;;;N;;;;; -003B;SEMICOLON;Po;0;ON;;;;;N;;;;; -003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; -003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; -003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; -003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; -0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; -0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; -0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; -0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; -0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; -0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; -0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; -0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; -0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; -0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; -004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; -004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; -004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; -004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; -004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; -004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; -0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; -0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; -0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; -0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; -0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; -0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; -0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; -0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; -0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; -0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; -005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; -005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; -005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; -005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; -005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; -005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; -0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; -0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 -0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 -0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 -0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 -0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 -0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 -0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 -0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 -0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 -006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A -006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B -006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C -006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D -006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E -006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F -0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 -0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 -0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 -0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 -0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 -0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 -0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 -0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 -0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 -0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 -007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A -007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; -007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; -007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; -007E;TILDE;Sm;0;ON;;;;;N;;;;; -007F;;Cc;0;BN;;;;;N;DELETE;;;; -0080;;Cc;0;BN;;;;;N;;;;; -0081;;Cc;0;BN;;;;;N;;;;; -0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; -0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; -0084;;Cc;0;BN;;;;;N;;;;; -0085;;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; -0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; -0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; -0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; -0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; -008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; -008B;;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; -008C;;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; -008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; -008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; -008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; -0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; -0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; -0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; -0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; -0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; -0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; -0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; -0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; -0098;;Cc;0;BN;;;;;N;START OF STRING;;;; -0099;;Cc;0;BN;;;;;N;;;;; -009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; -009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; -009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; -009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; -009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; -009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; -00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; -00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; -00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; -00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; -00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; -00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; -00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; -00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; -00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; -00AA;FEMININE ORDINAL INDICATOR;Lo;0;L; 0061;;;;N;;;;; -00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; -00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; -00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; -00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; -00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; -00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; -00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; -00B2;SUPERSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; -00B3;SUPERSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; -00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; -00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C -00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; -00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; -00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; -00B9;SUPERSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; -00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L; 006F;;;;N;;;;; -00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; -00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; -00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; -00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; -00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; -00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; -00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; -00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; -00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; -00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; -00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; -00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; -00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; -00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; -00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; -00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; -00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; -00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; -00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; -00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; -00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; -00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; -00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; -00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; -00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; -00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; -00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; -00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; -00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; -00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; -00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; -00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; -00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; -00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; -00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; -00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; -00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; -00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 -00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 -00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 -00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 -00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 -00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 -00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 -00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 -00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 -00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 -00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA -00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB -00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC -00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD -00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE -00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF -00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 -00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 -00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 -00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 -00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 -00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 -00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 -00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; -00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 -00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 -00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA -00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB -00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC -00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD -00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE -00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 -0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; -0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 -0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; -0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 -0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; -0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 -0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; -0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 -0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; -0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 -010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; -010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A -010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; -010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C -010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; -010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E -0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; -0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 -0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; -0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 -0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; -0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 -0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; -0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 -0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; -0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 -011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; -011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A -011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; -011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C -011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; -011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E -0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; -0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 -0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; -0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 -0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; -0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 -0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; -0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 -0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; -0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 -012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; -012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A -012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; -012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C -012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; -012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E -0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; -0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 -0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; -0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 -0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; -0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 -0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; -0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 -0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; -0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; -013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 -013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; -013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B -013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; -013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D -013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; -0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F -0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; -0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 -0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; -0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 -0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; -0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 -0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; -0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 -0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; -014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; -014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A -014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; -014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C -014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; -014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E -0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; -0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 -0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; -0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 -0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; -0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 -0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; -0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 -0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; -0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 -015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; -015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A -015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; -015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C -015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; -015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E -0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; -0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 -0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; -0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 -0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; -0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 -0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; -0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 -0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; -0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 -016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; -016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A -016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; -016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C -016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; -016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E -0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; -0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 -0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; -0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 -0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; -0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 -0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; -0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 -0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; -0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; -017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 -017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; -017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B -017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; -017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D -017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 -0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 -0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; -0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; -0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 -0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; -0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 -0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; -0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; -0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 -0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; -018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; -018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; -018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B -018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; -018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; -018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; -0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; -0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; -0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 -0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; -0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; -0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 -0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; -0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; -0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; -0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 -019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D -019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; -019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; -019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; -019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 -019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; -01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; -01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 -01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; -01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 -01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; -01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 -01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; -01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; -01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 -01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; -01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; -01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; -01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; -01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC -01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; -01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; -01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF -01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; -01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; -01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; -01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 -01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; -01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 -01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; -01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; -01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 -01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; -01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; -01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; -01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC -01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; -01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 -01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; -01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; -01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; -01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; -01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 -01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 -01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 -01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 -01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 -01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 -01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB -01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB -01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB -01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; -01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD -01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; -01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF -01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; -01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 -01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; -01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 -01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; -01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 -01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; -01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 -01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; -01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 -01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; -01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB -01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E -01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; -01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE -01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; -01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 -01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; -01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 -01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; -01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 -01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; -01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 -01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; -01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 -01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; -01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA -01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; -01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC -01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; -01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE -01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; -01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 -01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3;01F2 -01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 -01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; -01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 -01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; -01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; -01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; -01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 -01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; -01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA -01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; -01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC -01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; -01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE -0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; -0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 -0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; -0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 -0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; -0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 -0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; -0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 -0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; -0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 -020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; -020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A -020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; -020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C -020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; -020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E -0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; -0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 -0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; -0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 -0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; -0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 -0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; -0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 -0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; -0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 -021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; -021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A -021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; -021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C -021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; -021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E -0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; -0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; -0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; -0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 -0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; -0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 -0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; -0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 -0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; -0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 -022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; -022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A -022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; -022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C -022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; -022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E -0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; -0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 -0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; -0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 -0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; -0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; -0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; -0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; -0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; -0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; -023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; -023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; -023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B -023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; -023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; -023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E -0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F -0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; -0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 -0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; -0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; -0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; -0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; -0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 -0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; -0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 -024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; -024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A -024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; -024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C -024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; -024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E -0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F -0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D -0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 -0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 -0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 -0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; -0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 -0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A -0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; -0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F -025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; -025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 -025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB -025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; -025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; -025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; -0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 -0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC -0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; -0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 -0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; -0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D -0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA -0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; -0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 -0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 -026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; -026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 -026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD -026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; -026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; -026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C -0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; -0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E -0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D -0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; -0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; -0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F -0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; -0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; -0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; -0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; -027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; -027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 -027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; -027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; -0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 -0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; -0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; -0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 -0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; -0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; -0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; -0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 -0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE -0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 -028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 -028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 -028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 -028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; -028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; -028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; -0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; -0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; -0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 -0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; -0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; -0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; -0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; -0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; -0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; -029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; -029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; -029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; -029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 -029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 -029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; -02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; -02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; -02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; -02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; -02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; -02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; -02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; -02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; -02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; -02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; -02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; -02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; -02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; -02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; -02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; -02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; -02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; -02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; -02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; -02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; -02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; -02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; -02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; -02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; -02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; -02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; -02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; -02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; -02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; -02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; -02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; -02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; -02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; -02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; -02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; -02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; -02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; -02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; -02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; -02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; -02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; -02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; -02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; -02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; -02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; -02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; -02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; -02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; -02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; -02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; -02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; -02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;;;; -02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; -02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; -02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; -02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; -02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; -02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; -02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; -02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; -02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; -02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; -02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; -02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; -02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; -02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; -02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; -02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; -02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; -02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; -02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; -02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; -02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; -02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; -02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; -02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; -02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; -02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; -02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; -02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; -02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; -02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; -02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; -02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; -0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; -0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; -0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; -0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; -0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; -0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; -0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; -0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; -0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; -0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; -030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; -030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; -030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; -030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; -030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; -030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; -0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; -0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; -0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; -0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; -0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; -0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; -0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; -0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; -0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; -0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; -031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; -031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; -031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; -031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; -031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; -031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; -0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; -0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; -0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; -0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; -0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; -0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; -0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; -0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; -0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; -0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; -032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; -032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; -032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; -032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; -032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; -032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; -0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; -0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; -0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; -0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; -0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; -0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; -0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; -0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; -0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; -0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; -033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; -033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; -033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; -033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; -033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; -033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; -0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; -0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; -0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; -0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; -0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; -0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 -0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; -0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; -0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; -0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; -034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; -034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; -034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; -034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; -0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; -0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; -0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; -0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; -0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; -0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; -035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; -035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; -035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; -035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; -035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; -035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; -0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; -0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; -0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; -0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; -0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; -0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; -0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; -0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; -0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; -0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; -036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; -036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; -036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; -036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; -036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; -036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; -0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; -0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 -0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; -0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 -0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; -0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; -0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; -0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 -037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; -037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD -037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE -037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF -037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; -037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; -0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; -0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; -0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; -0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; -0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; -0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; -038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; -038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; -038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; -038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; -0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; -0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; -0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; -0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; -0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; -0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; -0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; -0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; -0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; -0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; -039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; -039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; -039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; -039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; -039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; -039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; -03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; -03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; -03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; -03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; -03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; -03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; -03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; -03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; -03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; -03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; -03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; -03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 -03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 -03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 -03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A -03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; -03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 -03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 -03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 -03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 -03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 -03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 -03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 -03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 -03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 -03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A -03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B -03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C -03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D -03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E -03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F -03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 -03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 -03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 -03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 -03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 -03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 -03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 -03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 -03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 -03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 -03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA -03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB -03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C -03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E -03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F -03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; -03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 -03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 -03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; -03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; -03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; -03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 -03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 -03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF -03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; -03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 -03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; -03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA -03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; -03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC -03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; -03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE -03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; -03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 -03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; -03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 -03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; -03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 -03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; -03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 -03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; -03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 -03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; -03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA -03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; -03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC -03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; -03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE -03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A -03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 -03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 -03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F -03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; -03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395 -03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; -03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; -03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 -03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L; 03A3;;;;N;;;;03F2; -03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; -03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA -03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; -03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; -03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; -03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; -0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; -0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; -0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; -0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; -0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; -0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; -0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; -0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; -0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; -0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; -040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; -040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; -040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; -040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; -040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; -040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; -0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; -0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; -0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; -0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; -0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; -0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; -0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; -0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; -0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; -0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; -041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; -041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; -041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; -041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; -041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; -041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; -0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; -0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; -0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; -0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; -0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; -0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; -0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; -0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; -0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; -0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; -042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; -042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; -042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; -042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; -042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; -042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; -0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 -0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 -0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 -0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 -0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 -0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 -0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 -0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 -0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 -0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 -043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A -043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B -043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C -043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D -043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E -043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F -0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 -0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 -0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 -0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 -0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 -0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 -0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 -0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 -0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 -0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 -044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A -044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B -044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C -044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D -044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E -044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F -0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 -0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 -0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 -0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 -0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 -0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 -0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 -0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 -0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 -0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 -045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A -045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B -045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C -045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D -045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E -045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F -0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; -0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 -0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; -0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 -0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; -0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 -0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; -0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 -0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; -0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 -046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; -046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A -046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; -046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C -046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; -046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E -0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; -0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 -0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; -0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 -0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; -0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 -0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; -0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 -0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; -0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 -047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; -047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A -047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; -047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C -047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; -047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E -0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; -0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 -0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; -0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; -0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; -0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; -0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; -0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; -0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; -0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; -048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A -048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; -048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C -048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; -048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E -0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; -0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 -0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; -0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 -0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; -0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 -0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; -0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 -0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; -0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 -049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; -049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A -049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; -049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C -049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; -049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E -04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; -04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 -04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; -04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 -04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; -04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 -04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; -04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 -04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; -04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 -04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; -04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA -04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; -04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC -04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; -04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE -04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; -04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 -04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; -04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 -04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; -04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 -04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; -04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 -04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; -04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 -04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; -04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA -04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; -04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC -04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; -04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE -04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; -04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; -04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 -04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; -04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 -04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; -04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 -04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; -04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 -04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; -04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 -04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; -04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB -04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; -04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD -04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 -04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; -04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 -04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; -04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 -04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; -04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 -04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; -04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 -04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; -04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 -04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; -04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA -04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; -04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC -04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; -04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE -04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; -04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 -04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; -04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 -04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; -04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 -04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; -04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 -04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; -04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 -04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; -04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA -04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; -04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC -04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; -04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE -04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; -04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 -04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; -04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 -04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; -04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 -04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; -04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 -04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; -04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 -04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; -04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA -04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; -04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC -04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; -04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE -0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; -0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 -0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; -0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 -0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; -0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 -0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; -0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 -0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; -0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 -050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; -050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A -050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; -050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C -050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; -050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E -0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; -0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 -0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; -0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 -0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; -0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 -0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; -0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 -0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; -0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 -051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; -051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A -051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; -051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C -051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; -051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E -0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; -0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 -0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; -0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 -0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; -0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 -0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; -0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 -0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; -0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 -052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; -052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A -052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; -052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C -052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; -052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E -0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; -0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; -0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; -0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; -0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; -0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; -0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; -0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; -0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; -053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; -053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; -053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; -053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; -053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; -053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; -0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; -0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; -0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; -0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; -0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; -0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; -0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; -0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; -0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; -0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; -054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; -054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; -054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; -054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; -054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; -054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; -0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; -0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; -0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; -0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; -0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; -0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; -0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; -0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; -055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; -055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; -055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; -055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; -055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; -055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; -0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 -0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 -0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 -0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 -0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 -0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 -0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 -0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 -0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 -056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A -056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B -056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C -056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D -056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E -056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F -0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 -0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 -0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 -0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 -0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 -0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 -0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 -0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 -0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 -0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 -057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A -057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B -057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C -057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D -057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E -057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F -0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 -0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 -0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 -0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 -0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 -0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 -0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 -0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; -0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; -058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; -058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; -058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; -058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; -0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; -0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; -0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; -0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; -0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; -0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; -0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; -0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; -0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; -059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; -059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; -059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; -059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; -059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; -059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; -05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; -05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; -05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; -05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; -05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; -05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; -05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; -05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; -05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; -05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; -05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; -05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; -05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; -05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; -05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; -05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; -05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; -05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; -05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; -05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; -05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; -05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; -05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; -05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; -05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; -05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; -05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; -05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; -05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; -05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; -05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; -05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; -05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; -05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; -05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; -05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; -05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; -05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; -05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; -05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; -05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; -05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; -05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; -05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; -05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; -05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; -05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; -05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; -05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; -05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; -05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; -05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; -05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; -05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; -05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; -05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; -05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; -05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; -05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; -05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; -05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; -05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; -05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; -05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; -05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; -05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; -05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; -05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; -05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; -05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; -0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; -0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; -0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; -0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; -0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; -0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; -0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; -0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; -0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; -0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; -060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; -060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; -060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; -060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; -060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; -060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; -0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; -0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; -0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; -0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; -0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; -0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; -0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; -0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; -0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; -0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; -061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; -061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; -061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; -061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; -061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; -0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; -0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; -0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; -0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; -0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; -0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; -0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; -0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; -0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; -0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; -062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; -062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; -062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; -062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; -062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; -062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; -0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; -0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; -0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; -0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; -0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; -0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; -0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; -0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; -0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; -0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; -063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; -063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; -0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; -0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; -0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; -0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; -0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; -0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; -0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; -0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; -0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; -064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; -064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; -064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; -064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; -064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; -064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; -0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; -0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; -0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; -0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; -0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; -0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; -0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; -0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; -0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; -0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; -065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; -065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; -065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; -065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; -065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; -065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; -0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; -0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; -0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; -0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; -0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; -0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; -0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; -0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; -0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; -0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; -066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; -066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; -066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; -066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; -066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; -066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; -0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; -0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; -0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; -0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; -0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; -0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; -0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; -0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; -0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; -0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; -067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; -067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; -067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; -067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; -067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; -067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; -0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; -0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; -0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; -0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; -0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; -0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; -0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; -0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; -0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; -0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; -068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; -068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; -068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; -068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; -068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; -0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; -0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; -0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; -0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; -0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; -0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; -0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; -0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; -0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; -069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; -069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; -06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; -06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; -06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; -06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; -06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; -06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; -06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; -06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; -06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; -06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; -06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; -06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; -06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; -06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; -06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; -06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; -06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; -06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; -06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; -06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; -06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; -06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; -06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; -06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; -06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; -06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; -06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; -06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; -06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; -06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; -06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; -06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; -06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; -06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; -06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; -06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; -06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; -06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; -06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; -06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; -06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; -06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; -06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; -06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; -06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; -06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; -06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; -06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; -06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; -06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; -06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; -06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; -06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; -06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; -06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; -06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; -06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; -06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; -06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; -06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; -06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; -06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; -06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; -06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; -06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; -06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; -06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; -06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; -06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; -06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; -06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; -06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; -06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; -06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; -06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; -06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; -06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; -0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; -0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; -0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; -0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; -0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; -0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; -0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; -0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; -0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; -070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; -070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; -070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; -070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; -070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; -0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; -0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; -0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; -0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; -0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; -0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; -0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; -0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; -0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; -0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; -071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; -071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; -071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; -071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; -071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; -071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; -0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; -0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; -0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; -0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; -0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; -0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; -0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; -0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; -0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; -0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; -072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; -072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; -072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; -072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; -072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; -072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; -0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; -0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; -0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; -0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; -0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; -0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; -0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; -0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; -0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; -0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; -073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; -073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; -073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; -073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; -073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; -073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; -0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; -0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; -0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; -0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; -0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; -0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; -074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; -074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; -074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; -074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; -0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; -0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; -0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; -0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; -0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; -075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; -075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; -075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; -075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; -0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; -0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; -076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; -076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; -076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; -076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; -076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; -076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; -0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; -0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; -0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; -0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; -0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; -077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; -077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; -0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; -0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; -0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; -0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; -0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; -0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; -0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; -0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; -0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; -078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; -078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; -078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; -078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; -078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; -078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; -0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; -0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; -0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; -0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; -0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; -0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; -0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; -0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; -0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; -0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; -079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; -079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; -079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; -079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; -079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; -079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; -07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; -07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; -07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; -07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; -07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; -07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; -07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; -07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; -07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; -07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; -07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; -07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; -07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; -07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; -07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; -07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; -07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; -07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; -07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; -07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; -07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; -07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; -07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; -07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; -07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; -07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; -07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; -07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; -07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; -07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; -07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; -07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; -07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; -07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; -07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; -07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; -07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; -07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; -07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; -07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; -07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; -07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; -07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; -07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; -07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; -07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; -07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; -07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; -07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; -07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; -07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; -07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; -07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; -07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; -07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; -07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; -07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; -07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; -07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; -07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; -07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; -07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; -07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; -07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; -07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; -07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; -07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; -07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; -07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; -07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; -07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; -07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; -07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; -07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; -07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; -07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; -0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; -0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; -0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; -0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; -0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; -0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; -0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; -0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; -0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; -0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; -080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; -080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; -080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; -080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; -080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; -080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; -0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; -0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; -0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; -0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; -0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; -0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; -0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; -0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; -0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; -0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; -081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; -081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; -081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; -081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; -081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; -081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; -0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; -0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; -0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; -0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; -0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; -0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; -0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; -0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; -0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; -0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; -082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; -082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; -082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; -082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; -0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; -0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; -0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; -0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; -0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; -0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; -0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; -0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; -0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; -0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; -083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; -083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; -083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; -083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; -083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; -0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; -0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; -0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; -0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; -0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; -0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; -0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; -0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; -0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; -0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; -084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; -084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; -084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; -084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; -084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; -084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; -0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; -0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; -0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; -0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; -0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; -0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; -0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; -0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; -0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; -0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; -085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; -085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; -085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; -08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; -08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; -08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; -08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; -08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; -08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; -08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; -08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; -08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; -08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; -08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; -08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; -08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; -08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; -08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; -08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; -08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; -08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; -08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; -08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; -08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; -08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; -08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; -08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; -08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; -08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; -08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; -08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; -08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; -08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; -08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; -08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; -08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; -08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; -0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; -0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; -0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; -0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; -0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; -0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; -090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; -090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; -090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; -090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; -0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; -0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; -0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; -0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; -0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; -0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; -0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; -0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; -0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; -0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; -091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; -091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; -091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; -091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; -091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; -091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; -0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; -0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; -0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; -0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; -0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; -0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; -0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; -0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; -092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; -092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; -092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; -092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; -092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; -092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; -0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; -0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; -0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; -0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; -0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; -0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; -0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; -0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; -0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; -0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; -093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; -093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; -093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; -0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; -0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; -094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; -094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; -094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; -0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; -0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; -0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; -0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; -0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; -0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; -0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; -0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; -0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; -0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; -095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; -095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; -095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; -095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; -095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; -095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; -0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; -0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; -0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; -0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; -0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; -0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; -0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; -0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; -0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; -0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; -097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; -097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; -097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; -097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; -097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; -0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; -0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; -0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; -0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; -0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; -0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; -098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; -098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; -0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; -0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; -0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; -0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; -0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; -0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; -0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; -0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; -099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; -099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; -099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; -099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; -099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; -099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; -09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; -09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; -09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; -09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; -09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; -09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; -09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; -09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; -09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; -09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; -09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; -09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; -09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; -09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; -09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; -09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; -09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; -09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; -09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; -09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; -09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; -09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; -09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; -09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; -09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; -09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; -09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; -09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; -09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; -09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; -09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; -09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; -09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; -09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; -09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; -09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; -09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; -09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; -0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; -0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; -0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; -0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; -0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; -0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; -0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; -0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; -0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; -0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; -0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; -0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; -0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; -0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; -0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; -0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; -0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; -0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; -0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; -0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; -0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; -0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; -0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; -0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; -0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; -0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; -0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; -0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; -0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; -0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; -0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; -0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; -0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; -0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; -0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; -0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; -0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; -0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; -0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; -0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; -0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; -0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; -0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; -0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; -0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; -0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; -0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; -0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; -0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; -0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; -0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; -0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; -0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; -0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; -0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; -0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; -0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; -0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; -0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; -0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; -0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; -0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; -0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; -0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; -0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; -0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; -0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; -0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; -0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; -0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; -0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; -0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; -0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; -0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; -0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; -0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; -0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; -0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; -0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; -0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; -0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; -0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; -0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; -0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; -0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; -0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; -0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; -0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; -0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; -0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; -0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; -0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; -0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; -0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; -0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; -0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; -0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; -0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; -0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; -0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; -0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; -0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; -0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; -0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; -0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; -0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; -0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; -0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; -0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; -0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; -0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; -0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; -0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; -0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; -0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; -0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; -0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; -0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; -0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; -0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; -0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; -0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; -0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; -0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; -0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; -0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; -0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; -0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; -0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; -0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; -0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; -0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; -0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; -0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; -0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; -0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; -0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; -0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; -0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; -0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; -0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; -0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; -0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; -0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; -0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; -0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; -0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; -0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; -0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; -0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; -0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; -0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; -0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; -0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; -0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; -0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; -0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; -0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; -0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; -0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; -0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; -0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; -0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; -0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; -0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; -0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; -0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; -0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; -0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; -0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; -0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; -0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; -0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; -0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; -0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; -0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; -0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; -0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; -0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; -0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; -0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; -0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; -0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; -0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; -0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; -0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; -0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; -0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; -0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; -0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; -0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; -0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; -0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; -0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; -0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; -0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; -0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; -0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; -0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; -0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; -0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; -0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; -0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; -0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; -0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; -0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; -0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; -0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; -0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; -0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; -0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; -0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; -0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; -0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; -0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; -0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; -0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; -0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; -0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; -0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; -0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; -0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; -0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; -0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; -0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; -0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; -0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; -0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; -0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; -0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; -0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; -0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; -0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; -0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; -0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; -0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; -0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; -0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; -0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; -0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; -0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; -0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; -0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; -0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; -0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; -0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; -0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; -0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; -0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; -0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; -0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; -0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; -0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; -0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; -0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; -0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; -0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; -0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; -0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; -0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; -0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; -0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; -0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; -0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; -0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; -0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; -0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; -0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; -0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; -0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; -0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; -0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; -0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; -0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; -0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; -0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; -0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; -0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; -0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; -0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; -0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; -0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; -0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; -0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; -0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; -0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; -0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; -0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; -0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; -0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; -0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; -0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; -0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; -0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; -0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; -0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; -0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; -0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; -0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; -0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; -0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; -0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; -0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; -0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; -0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; -0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; -0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; -0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; -0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; -0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; -0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; -0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; -0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; -0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; -0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; -0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; -0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; -0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; -0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; -0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; -0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; -0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; -0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; -0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; -0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; -0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; -0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; -0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; -0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; -0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; -0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; -0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; -0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; -0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; -0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; -0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; -0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; -0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; -0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; -0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; -0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; -0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; -0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; -0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; -0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; -0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; -0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; -0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; -0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; -0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; -0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; -0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; -0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; -0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; -0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; -0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; -0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; -0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; -0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; -0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; -0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; -0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; -0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; -0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; -0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; -0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; -0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; -0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; -0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; -0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; -0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; -0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; -0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; -0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; -0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; -0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; -0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; -0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; -0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; -0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; -0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; -0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; -0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; -0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; -0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; -0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; -0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; -0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; -0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; -0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; -0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; -0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; -0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; -0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; -0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; -0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; -0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; -0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; -0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; -0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; -0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; -0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; -0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; -0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; -0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; -0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; -0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; -0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; -0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; -0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; -0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; -0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; -0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; -0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; -0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; -0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; -0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; -0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; -0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; -0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; -0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; -0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; -0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; -0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; -0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; -0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; -0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; -0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; -0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; -0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; -0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; -0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; -0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; -0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; -0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; -0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; -0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; -0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; -0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; -0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; -0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; -0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; -0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; -0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; -0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; -0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; -0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; -0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; -0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; -0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; -0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; -0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; -0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; -0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; -0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; -0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; -0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; -0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; -0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; -0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; -0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; -0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; -0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; -0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; -0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; -0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; -0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; -0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; -0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; -0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; -0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; -0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; -0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; -0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; -0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; -0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; -0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; -0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; -0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; -0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; -0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; -0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; -0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; -0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; -0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; -0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; -0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; -0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; -0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; -0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; -0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; -0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; -0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; -0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; -0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; -0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; -0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; -0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; -0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; -0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; -0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; -0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; -0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; -0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; -0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; -0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; -0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; -0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; -0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; -0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; -0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; -0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; -0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; -0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; -0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; -0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; -0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; -0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; -0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; -0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; -0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; -0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; -0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; -0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; -0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; -0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; -0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; -0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; -0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; -0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; -0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; -0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; -0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; -0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; -0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; -0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; -0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; -0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; -0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; -0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; -0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; -0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; -0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; -0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; -0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; -0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; -0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; -0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; -0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; -0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; -0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; -0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; -0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; -0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; -0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; -0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; -0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; -0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; -0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; -0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; -0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; -0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; -0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; -0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; -0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; -0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; -0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; -0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; -0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; -0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; -0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; -0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; -0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; -0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; -0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; -0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; -0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; -0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; -0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; -0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; -0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; -0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; -0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; -0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; -0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; -0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; -0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; -0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; -0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; -0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; -0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; -0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; -0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; -0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; -0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; -0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; -0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; -0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; -0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; -0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; -0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; -0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; -0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; -0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; -0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; -0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; -0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; -0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;;;; -0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; -0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; -0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; -0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; -0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; -0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; -0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; -0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; -0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; -0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; -0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; -0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; -0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; -0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; -0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; -0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; -0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; -0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; -0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; -0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; -0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; -0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; -0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; -0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; -0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; -0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; -0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; -0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; -0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; -0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; -0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; -0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; -0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; -0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; -0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; -0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; -0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; -0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; -0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; -0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; -0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; -0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; -0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; -0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; -0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; -0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; -0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; -0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; -0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; -0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; -0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; -0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; -0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; -0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; -0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; -0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; -0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; -0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; -0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; -0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; -0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; -0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; -0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; -0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; -0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; -0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; -0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; -0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; -0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; -0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; -0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; -0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; -0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; -0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; -0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; -0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; -0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; -0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; -0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; -0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; -0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; -0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; -0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; -0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; -0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; -0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; -0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; -0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; -0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; -0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; -0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; -0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; -0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; -0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; -0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; -0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; -0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; -0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; -0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; -0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; -0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; -0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; -0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; -0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; -0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; -0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; -0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; -0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; -0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; -0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; -0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; -0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; -0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; -0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; -0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; -0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; -0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; -0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; -0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; -0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; -0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; -0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; -0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; -0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; -0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; -0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; -0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; -0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; -0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; -0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; -0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; -0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; -0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; -0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; -0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; -0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; -0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; -0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; -0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; -0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; -0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; -0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; -0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; -0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; -0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; -0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; -0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; -0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; -0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; -0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; -0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; -0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; -0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; -0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; -0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; -0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; -0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; -0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; -0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; -0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; -0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; -0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; -0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; -0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; -0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; -0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; -0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; -0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; -0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; -0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; -0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; -0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; -0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; -0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; -0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; -0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; -0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; -0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; -0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; -0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; -0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; -0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; -0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; -0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; -0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; -0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; -0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; -0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; -1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; -1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; -1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; -1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; -1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; -1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; -1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; -1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; -1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; -1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; -100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; -100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; -100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; -100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; -100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; -100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; -1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; -1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; -1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; -1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; -1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; -1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; -1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; -1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; -1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; -1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; -101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; -101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; -101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; -101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; -101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; -101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; -1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; -1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; -1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; -1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; -1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; -1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; -1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; -1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; -1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; -1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; -102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; -102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; -102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; -1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; -1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; -1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; -1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; -1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; -103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; -103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; -103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; -103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; -103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; -1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; -104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; -104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; -104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; -104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; -104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; -1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; -1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; -1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; -105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; -105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; -105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; -105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; -105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; -1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; -1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; -1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; -1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; -1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; -1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; -1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; -1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; -1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; -1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; -106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; -106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; -106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; -106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; -106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; -106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; -1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; -1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; -1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; -1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; -1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; -1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; -1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; -1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; -1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; -1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; -107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; -107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; -107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; -107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; -107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; -107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; -1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; -1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; -1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; -1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; -1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; -1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; -1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; -1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; -1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; -1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; -108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; -108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; -108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; -108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; -108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; -108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; -1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; -109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; -109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; -109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; -109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; -109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; -10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; -10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; -10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; -10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; -10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; -10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; -10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; -10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; -10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; -10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; -10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; -10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; -10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; -10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; -10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; -10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; -10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; -10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; -10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; -10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; -10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; -10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; -10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; -10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; -10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; -10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; -10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; -10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; -10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; -10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; -10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; -10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; -10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; -10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; -10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; -10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; -10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; -10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; -10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; -10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; -10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; -10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; -10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; -10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; -10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; -10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; -10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; -10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; -10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; -10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; -10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; -10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; -10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; -10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; -10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; -10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; -10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; -10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; -10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; -10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; -10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; -10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; -10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; -10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; -10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; -10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; -10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; -10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; -10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; -10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; -10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; -10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; -10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; -10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; -10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; -10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; -10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; -10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; -10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; -10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; -10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; -10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; -10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; -10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L; 10DC;;;;N;;;;; -10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;; -10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;; -10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;; -1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; -1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; -1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; -1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; -1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; -1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; -1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; -1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; -1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; -110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; -110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; -110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; -110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; -110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; -110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; -1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; -1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; -1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; -1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; -1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; -1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; -1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; -1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; -1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; -1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; -111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; -111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; -111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; -111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; -111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; -111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; -1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; -1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; -1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; -1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; -1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; -112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; -112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; -112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; -1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; -1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; -1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; -1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; -1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; -1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; -1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; -113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; -113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; -113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; -113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; -113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; -113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; -1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; -1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; -1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; -1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; -1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; -1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; -1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; -1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; -1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; -1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; -114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; -114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; -114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; -114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; -114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; -114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; -1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; -1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; -1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; -1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; -1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; -1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; -1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; -1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; -1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; -1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; -115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; -115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; -115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; -115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; -115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; -115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; -1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; -1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; -1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; -1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; -1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; -1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; -1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; -1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; -1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; -1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; -116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; -116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; -116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; -116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; -116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; -116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; -1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; -1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; -1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; -1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; -1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; -1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; -1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; -1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; -1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; -1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; -117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; -117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; -117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; -117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; -117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; -117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; -1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; -1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; -1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; -1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; -1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; -1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; -1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; -1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; -1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; -1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; -118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; -118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; -118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; -118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; -118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; -118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; -1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; -1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; -1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; -1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; -1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; -1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; -1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; -1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; -1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; -1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; -119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; -119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; -119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; -119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; -119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; -119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; -11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; -11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; -11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; -11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; -11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; -11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; -11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; -11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; -11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; -11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; -11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; -11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; -11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; -11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; -11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; -11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; -11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; -11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; -11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; -11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; -11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; -11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; -11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; -11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; -11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; -11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; -11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; -11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; -11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; -11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; -11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; -11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; -11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; -11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; -11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; -11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; -11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; -11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; -11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; -11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; -11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; -11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; -11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; -11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; -11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; -11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; -11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; -11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; -11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; -11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; -11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; -11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; -11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; -11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; -11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; -11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; -11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; -11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; -11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; -11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; -11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; -11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; -11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; -11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; -11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; -11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; -11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; -11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; -11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; -11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; -11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; -11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; -11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; -11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; -11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; -11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; -11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; -11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; -11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; -1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; -1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; -1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; -1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; -1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; -1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; -1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; -1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; -1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; -1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; -120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; -120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; -120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; -120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; -120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; -120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; -1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; -1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; -1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; -1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; -1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; -1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; -1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; -1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; -1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; -1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; -121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; -121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; -121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; -121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; -121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; -121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; -1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; -1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; -1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; -1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; -1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; -1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; -1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; -1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; -1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; -1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; -122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; -122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; -122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; -122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; -122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; -122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; -1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; -1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; -1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; -1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; -1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; -1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; -1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; -1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; -1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; -123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; -123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; -123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; -1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; -1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; -1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; -1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; -1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; -1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; -1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; -1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; -1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; -124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; -124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; -124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; -124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; -1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; -1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; -1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; -1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; -1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; -1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; -1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; -1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; -125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; -125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; -125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; -125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; -1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; -1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; -1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; -1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; -1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; -1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; -1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; -1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; -1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; -1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; -126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; -126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; -126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; -126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; -126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; -126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; -1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; -1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; -1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; -1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; -1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; -1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; -1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; -1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; -1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; -1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; -127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; -127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; -127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; -127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; -127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; -127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; -1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; -1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; -1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; -1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; -1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; -1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; -1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; -1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; -1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; -128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; -128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; -128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; -128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; -1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; -1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; -1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; -1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; -1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; -1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; -1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; -1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; -1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; -1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; -129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; -129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; -129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; -12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; -12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; -12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; -12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; -12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; -12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; -12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; -12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; -12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; -12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; -12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; -12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; -12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; -12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; -12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; -12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; -12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; -12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; -12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; -12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; -12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; -12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; -12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; -12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; -12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; -12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; -12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; -12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; -12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; -12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; -12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; -12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; -12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; -12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; -12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; -12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; -12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; -12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; -12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; -12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; -12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; -12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; -12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; -12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; -12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; -12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; -12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; -12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; -12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; -12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; -12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; -12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; -12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; -12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; -12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; -12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; -12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; -12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; -12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; -12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; -12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; -12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; -12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; -12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; -12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; -12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; -12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; -12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; -12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; -12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; -12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; -12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; -12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; -12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; -12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; -12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; -12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; -12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; -12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; -1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; -1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; -1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; -1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; -1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; -1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; -1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; -1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; -1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; -1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; -130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; -130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; -130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; -130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; -130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; -130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; -1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; -1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; -1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; -1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; -1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; -1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; -1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; -131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; -131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; -131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; -131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; -131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; -131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; -1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; -1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; -1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; -1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; -1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; -1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; -1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; -1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; -1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; -1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; -132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; -132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; -132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; -132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; -132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; -132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; -1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; -1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; -1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; -1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; -1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; -1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; -1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; -1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; -1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; -1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; -133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; -133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; -133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; -133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; -133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; -133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; -1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; -1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; -1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; -1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; -1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; -1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; -1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; -1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; -1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; -1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; -134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; -134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; -134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; -134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; -134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; -134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; -1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; -1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; -1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; -1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; -1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; -1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; -1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; -1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; -1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; -1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; -135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; -135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; -135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; -135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; -1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; -1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; -1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; -1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; -1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; -1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; -1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; -1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; -1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; -136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; -136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; -136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; -136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; -136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; -136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; -1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; -1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; -1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; -1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; -1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; -1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; -1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; -1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; -1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; -137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; -137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; -1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; -1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; -1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; -1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; -1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; -1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; -1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; -1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; -1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; -1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; -138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; -138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; -138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; -138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; -138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; -138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; -1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; -1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; -1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; -1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; -1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; -1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; -1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; -1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; -1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; -1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; -13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; -13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; -13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; -13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; -13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; -13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; -13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; -13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; -13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; -13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; -13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; -13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; -13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; -13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; -13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; -13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; -13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; -13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; -13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; -13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; -13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; -13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; -13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; -13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; -13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; -13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; -13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; -13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; -13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; -13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; -13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; -13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; -13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; -13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; -13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; -13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; -13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; -13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; -13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; -13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; -13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; -13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; -13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; -13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; -13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; -13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; -13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; -13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; -13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; -13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; -13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; -13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; -13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; -13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; -13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; -13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; -13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; -13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; -13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; -13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; -13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; -13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; -13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; -13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; -13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; -13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; -13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; -13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; -13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; -13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; -13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; -13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; -13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; -13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; -13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; -13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; -13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; -13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; -13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; -13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; -13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; -13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; -13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; -13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; -13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; -13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; -13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 -13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 -13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 -13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 -13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 -13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 -1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; -1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; -1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; -1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; -1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; -1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; -1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; -1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; -1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; -1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; -140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; -140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; -140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; -140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; -140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; -140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; -1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; -1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; -1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; -1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; -1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; -1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; -1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; -1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; -1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; -1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; -141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; -141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; -141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; -141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; -141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; -1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; -1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; -1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; -1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; -1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; -1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; -1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; -1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; -1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; -1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; -142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; -142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; -142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; -142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; -142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; -142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; -1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; -1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; -1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; -1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; -1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; -1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; -1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; -1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; -1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; -1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; -143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; -143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; -143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; -143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; -143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; -143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; -1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; -1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; -1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; -1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; -1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; -1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; -1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; -1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; -1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; -1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; -144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; -144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; -144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; -144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; -144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; -144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; -1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; -1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; -1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; -1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; -1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; -1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; -1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; -1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; -1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; -1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; -145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; -145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; -145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; -145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; -145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; -145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; -1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; -1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; -1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; -1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; -1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; -1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; -1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; -1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; -1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; -1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; -146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; -146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; -146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; -146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; -146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; -146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; -1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; -1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; -1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; -1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; -1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; -1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; -1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; -1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; -1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; -1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; -147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; -147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; -147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; -147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; -147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; -147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; -1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; -1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; -1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; -1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; -1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; -1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; -1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; -1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; -1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; -1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; -148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; -148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; -148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; -148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; -148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; -148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; -1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; -1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; -1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; -1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; -1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; -1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; -1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; -1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; -1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; -1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; -149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; -149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; -149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; -149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; -149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; -149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; -14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; -14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; -14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; -14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; -14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; -14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; -14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; -14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; -14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; -14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; -14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; -14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; -14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; -14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; -14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; -14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; -14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; -14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; -14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; -14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; -14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; -14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; -14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; -14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; -14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; -14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; -14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; -14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; -14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; -14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; -14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; -14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; -14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; -14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; -14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; -14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; -14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; -14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; -14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; -14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; -14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; -14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; -14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; -14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; -14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; -14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; -14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; -14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; -14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; -14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; -14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; -14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; -14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; -14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; -14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; -14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; -14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; -14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; -14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; -14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; -14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; -14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; -14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; -14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; -14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; -14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; -14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; -14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; -14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; -14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; -14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; -14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; -14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; -14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; -14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; -14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; -14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; -14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; -14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; -14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; -14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; -14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; -14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; -14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; -14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; -14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; -14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; -14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; -14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; -14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; -14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; -14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; -14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; -14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; -14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; -14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; -1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; -1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; -1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; -1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; -1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; -1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; -1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; -1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; -1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; -1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; -150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; -150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; -150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; -150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; -150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; -150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; -1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; -1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; -1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; -1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; -1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; -1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; -1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; -1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; -1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; -1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; -151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; -151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; -151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; -151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; -151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; -151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; -1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; -1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; -1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; -1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; -1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; -1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; -1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; -1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; -1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; -1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; -152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; -152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; -152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; -152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; -152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; -152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; -1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; -1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; -1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; -1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; -1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; -1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; -1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; -1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; -1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; -1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; -153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; -153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; -153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; -153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; -153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; -153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; -1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; -1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; -1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; -1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; -1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; -1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; -1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; -1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; -1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; -1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; -154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; -154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; -154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; -154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; -154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; -154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; -1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; -1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; -1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; -1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; -1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; -1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; -1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; -1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; -1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; -1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; -155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; -155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; -155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; -155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; -155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; -155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; -1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; -1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; -1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; -1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; -1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; -1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; -1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; -1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; -1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; -1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; -156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; -156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; -156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; -156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; -156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; -156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; -1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; -1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; -1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; -1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; -1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; -1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; -1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; -1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; -1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; -1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; -157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; -157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; -157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; -157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; -157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; -157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; -1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; -1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; -1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; -1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; -1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; -1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; -1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; -1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; -1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; -1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; -158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; -158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; -158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; -158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; -158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; -158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; -1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; -1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; -1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; -1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; -1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; -1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; -1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; -1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; -1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; -1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; -159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; -159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; -159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; -159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; -159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; -159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; -15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; -15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; -15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; -15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; -15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; -15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; -15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; -15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; -15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; -15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; -15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; -15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; -15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; -15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; -15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; -15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; -15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; -15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; -15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; -15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; -15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; -15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; -15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; -15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; -15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; -15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; -15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; -15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; -15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; -15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; -15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; -15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; -15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; -15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; -15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; -15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; -15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; -15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; -15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; -15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; -15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; -15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; -15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; -15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; -15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; -15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; -15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; -15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; -15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; -15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; -15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; -15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; -15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; -15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; -15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; -15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; -15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; -15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; -15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; -15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; -15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; -15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; -15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; -15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; -15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; -15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; -15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; -15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; -15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; -15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; -15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; -15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; -15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; -15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; -15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; -15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; -15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; -15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; -15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; -15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; -15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; -15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; -15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; -15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; -15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; -15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; -15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; -15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; -15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; -15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; -15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; -15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; -15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; -15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; -15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; -15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; -1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; -1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; -1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; -1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; -1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; -1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; -1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; -1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; -1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; -1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; -160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; -160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; -160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; -160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; -160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; -160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; -1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; -1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; -1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; -1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; -1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; -1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; -1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; -1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; -1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; -1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; -161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; -161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; -161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; -161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; -161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; -161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; -1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; -1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; -1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; -1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; -1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; -1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; -1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; -1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; -1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; -1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; -162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; -162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; -162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; -162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; -162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; -162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; -1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; -1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; -1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; -1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; -1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; -1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; -1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; -1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; -1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; -1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; -163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; -163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; -163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; -163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; -163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; -163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; -1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; -1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; -1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; -1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; -1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; -1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; -1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; -1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; -1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; -1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; -164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; -164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; -164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; -164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; -164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; -164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; -1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; -1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; -1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; -1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; -1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; -1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; -1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; -1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; -1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; -1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; -165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; -165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; -165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; -165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; -165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; -165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; -1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; -1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; -1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; -1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; -1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; -1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; -1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; -1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; -1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; -1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; -166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; -166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; -166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; -166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; -166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; -166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; -1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; -1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; -1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; -1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; -1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; -1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; -1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; -1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; -1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; -1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; -167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; -167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; -167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; -167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; -167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; -167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; -1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; -1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; -1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; -1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; -1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; -1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; -1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; -1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; -1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; -1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; -168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; -168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; -168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; -168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; -168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; -168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; -1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; -1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; -1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; -1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; -1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; -1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; -1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; -1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; -1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; -1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; -169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; -169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; -169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; -16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; -16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; -16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; -16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; -16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; -16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; -16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; -16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; -16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; -16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; -16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; -16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; -16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; -16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; -16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; -16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; -16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; -16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; -16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; -16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; -16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; -16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; -16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; -16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; -16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; -16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; -16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; -16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; -16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; -16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; -16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; -16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; -16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; -16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; -16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; -16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; -16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; -16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; -16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; -16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; -16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; -16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; -16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; -16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; -16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; -16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; -16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; -16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; -16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; -16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; -16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; -16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; -16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; -16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; -16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; -16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; -16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; -16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; -16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; -16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; -16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; -16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; -16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; -16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; -16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; -16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; -16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; -16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; -16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; -16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; -16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; -16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; -16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; -16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; -16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; -16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; -16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; -16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; -16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; -16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; -16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; -16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; -16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; -16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; -16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; -16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; -16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; -16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; -16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; -1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; -1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; -1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; -1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; -1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; -1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; -1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; -1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; -1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; -1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; -170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; -170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; -170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; -170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; -170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; -1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; -1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; -1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; -1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; -1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; -1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; -1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; -1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; -1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; -1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; -1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; -1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; -172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; -172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; -172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; -172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; -172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; -172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; -1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; -1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; -1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; -1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; -1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; -1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; -1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; -1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; -1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; -1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; -1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; -1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; -1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; -1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; -1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; -174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; -174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; -174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; -174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; -174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; -174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; -1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; -1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; -1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; -1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; -1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; -1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; -1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; -1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; -1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; -1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; -1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; -1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; -176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; -176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; -176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; -176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; -176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; -1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; -1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; -1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; -1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; -1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; -1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; -1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; -1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; -1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; -1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; -1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; -178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; -178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; -178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; -178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; -178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; -178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; -1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; -1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; -1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; -1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; -1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; -1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; -1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; -1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; -1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; -1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; -179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; -179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; -179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; -179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; -179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; -179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; -17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; -17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; -17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; -17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; -17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; -17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; -17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; -17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; -17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; -17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; -17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; -17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; -17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; -17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; -17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; -17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; -17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; -17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; -17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; -17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; -17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; -17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; -17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; -17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; -17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; -17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; -17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; -17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; -17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; -17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; -17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; -17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; -17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; -17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; -17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; -17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; -17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; -17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; -17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; -17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; -17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; -17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; -17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; -17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; -17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; -17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; -17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; -17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; -17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; -17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; -17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; -17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; -17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; -17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; -17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; -17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; -17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; -17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; -17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; -17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; -17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; -17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; -1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; -1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; -1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; -1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; -1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; -1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; -1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; -1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; -1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; -1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; -180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; -180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; -180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; -180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; -180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; -1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; -1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; -1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; -1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; -1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; -1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; -1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; -1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; -1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; -1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; -182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; -182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; -182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; -182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; -182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; -182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; -1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; -1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; -1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; -1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; -1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; -1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; -1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; -1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; -1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; -1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; -183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; -183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; -183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; -183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; -183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; -183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; -1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; -1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; -1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; -1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; -1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; -1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; -1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; -1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; -1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; -1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; -184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; -184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; -184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; -184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; -184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; -184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; -1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; -1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; -1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; -1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; -1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; -1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; -1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; -1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; -1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; -1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; -185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; -185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; -185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; -185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; -185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; -185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; -1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; -1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; -1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; -1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; -1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; -1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; -1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; -1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; -1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; -1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; -186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; -186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; -186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; -186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; -186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; -186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; -1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; -1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; -1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; -1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; -1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; -1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; -1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; -1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; -1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; -1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; -1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; -1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; -1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; -1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; -1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; -1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; -1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; -1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; -188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; -188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; -188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; -188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; -188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; -188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; -1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; -1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; -1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; -1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; -1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; -1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; -1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; -1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; -1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; -189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; -189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; -189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; -189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; -189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; -18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; -18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; -18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; -18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; -18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; -18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; -18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; -18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; -18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; -18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; -18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; -18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; -18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; -18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; -18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; -18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; -18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; -18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; -18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; -18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; -18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; -18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; -18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; -18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; -18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; -18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; -18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; -18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; -18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; -18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; -18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; -18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; -18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; -18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; -18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; -18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; -18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; -18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; -18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; -18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; -18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; -18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; -18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; -18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; -18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; -18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; -18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; -18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; -18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; -18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; -18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; -18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; -18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; -18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; -18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; -18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; -18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; -18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; -18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; -18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; -18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; -18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; -18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; -18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; -18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; -18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; -18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; -18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; -18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; -18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; -18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; -18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; -18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; -18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; -18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; -18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; -18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; -18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; -18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; -18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; -1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; -1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; -1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; -1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; -1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; -1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; -1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; -1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; -1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; -1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; -190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; -190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; -190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; -190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; -190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; -190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; -1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; -1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; -1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; -1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; -1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; -1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; -1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; -1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; -1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; -1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; -191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; -191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; -191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; -191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; -191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; -1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; -1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; -192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; -192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; -1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; -1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; -1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; -1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; -1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; -1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; -1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; -1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; -1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; -1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; -193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; -193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; -1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; -1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; -1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; -1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; -1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; -1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; -1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; -1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; -1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; -1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; -1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; -1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; -195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; -195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; -195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; -195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; -195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; -195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; -1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; -1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; -1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; -1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; -1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; -1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; -1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; -1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; -1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; -1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; -196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; -196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; -196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; -196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; -1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; -1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; -1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; -1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; -1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; -1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; -1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; -1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; -1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; -1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; -1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; -1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; -1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; -1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; -1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; -198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; -198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; -198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; -198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; -198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; -198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; -1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; -1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; -1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; -1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; -1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; -1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; -1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; -1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; -1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; -1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; -199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; -199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; -199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; -199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; -199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; -199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; -19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; -19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; -19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; -19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; -19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; -19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; -19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; -19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; -19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; -19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; -19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; -19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; -19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; -19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; -19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; -19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; -19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; -19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; -19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; -19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; -19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; -19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; -19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; -19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; -19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; -19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; -19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; -19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; -19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; -19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; -19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; -19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; -19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; -19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; -19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; -19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; -19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; -19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; -19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; -19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; -19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; -19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; -19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; -19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; -19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; -19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; -19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; -19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; -19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; -19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; -19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; -19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; -19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; -19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; -19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; -19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; -19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; -19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; -19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; -19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; -19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; -19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; -19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; -19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; -19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; -19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; -19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; -19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; -19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; -19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; -19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; -19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; -19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; -1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; -1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; -1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; -1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; -1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; -1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; -1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; -1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; -1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; -1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; -1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; -1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; -1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; -1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; -1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; -1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; -1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; -1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; -1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; -1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; -1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; -1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; -1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; -1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; -1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; -1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; -1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; -1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; -1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; -1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; -1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; -1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; -1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; -1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; -1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; -1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; -1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; -1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; -1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; -1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; -1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; -1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; -1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; -1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; -1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; -1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; -1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; -1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; -1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; -1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; -1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; -1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; -1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; -1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; -1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; -1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; -1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; -1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; -1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; -1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; -1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; -1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; -1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; -1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; -1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; -1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; -1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; -1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; -1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; -1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; -1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; -1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; -1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; -1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; -1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; -1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; -1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; -1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; -1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; -1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; -1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; -1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; -1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; -1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; -1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; -1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; -1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; -1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; -1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; -1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; -1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; -1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; -1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; -1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; -1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; -1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; -1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; -1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; -1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; -1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; -1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; -1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; -1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; -1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; -1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; -1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; -1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; -1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; -1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; -1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; -1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; -1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; -1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; -1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; -1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; -1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; -1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; -1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; -1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; -1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; -1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; -1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; -1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; -1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; -1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; -1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; -1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; -1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; -1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; -1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; -1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; -1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; -1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; -1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; -1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; -1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; -1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; -1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; -1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; -1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; -1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; -1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; -1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; -1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; -1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; -1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; -1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; -1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; -1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; -1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; -1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; -1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; -1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; -1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; -1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; -1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; -1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; -1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; -1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; -1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; -1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; -1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; -1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; -1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; -1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; -1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; -1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; -1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; -1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; -1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; -1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; -1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; -1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; -1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; -1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; -1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; -1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; -1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; -1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; -1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; -1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; -1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; -1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; -1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; -1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; -1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; -1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; -1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; -1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; -1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; -1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; -1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; -1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; -1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; -1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; -1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; -1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; -1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; -1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; -1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; -1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; -1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; -1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; -1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; -1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; -1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; -1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; -1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; -1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; -1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; -1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; -1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; -1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; -1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; -1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; -1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; -1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; -1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; -1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; -1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; -1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; -1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; -1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; -1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; -1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; -1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; -1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; -1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; -1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; -1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; -1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; -1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; -1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; -1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; -1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; -1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; -1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; -1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; -1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; -1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; -1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; -1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; -1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; -1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; -1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; -1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; -1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; -1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; -1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; -1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; -1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; -1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; -1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; -1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; -1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; -1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; -1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; -1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; -1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; -1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; -1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; -1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; -1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; -1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; -1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; -1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; -1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; -1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; -1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; -1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; -1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; -1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; -1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; -1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; -1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; -1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; -1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; -1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; -1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; -1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; -1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; -1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; -1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; -1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; -1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; -1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; -1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; -1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; -1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; -1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; -1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; -1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; -1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; -1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; -1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; -1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; -1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; -1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; -1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; -1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; -1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; -1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; -1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; -1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; -1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; -1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; -1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; -1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; -1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; -1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; -1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; -1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; -1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; -1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; -1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; -1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; -1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; -1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; -1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; -1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; -1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; -1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; -1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; -1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; -1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; -1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; -1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; -1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; -1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; -1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; -1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; -1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; -1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; -1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; -1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; -1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; -1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; -1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; -1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; -1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; -1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; -1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; -1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; -1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; -1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; -1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; -1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; -1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; -1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; -1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; -1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; -1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; -1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; -1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; -1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; -1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; -1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; -1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; -1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; -1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; -1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; -1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; -1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; -1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; -1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; -1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; -1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; -1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; -1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; -1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; -1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; -1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; -1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; -1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; -1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; -1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; -1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; -1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; -1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; -1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; -1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; -1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; -1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; -1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; -1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; -1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; -1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; -1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; -1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; -1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; -1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; -1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; -1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; -1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; -1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; -1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; -1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; -1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; -1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; -1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; -1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; -1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; -1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; -1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; -1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; -1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; -1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; -1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; -1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; -1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; -1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; -1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; -1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; -1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; -1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; -1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; -1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; -1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; -1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; -1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; -1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; -1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; -1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; -1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; -1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; -1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; -1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; -1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; -1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; -1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; -1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; -1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; -1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; -1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; -1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; -1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; -1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; -1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; -1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; -1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; -1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; -1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; -1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; -1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; -1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; -1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; -1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; -1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; -1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; -1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; -1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; -1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; -1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; -1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; -1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; -1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; -1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; -1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; -1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; -1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; -1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; -1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; -1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; -1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; -1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; -1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; -1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; -1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; -1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; -1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; -1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; -1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; -1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; -1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; -1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; -1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; -1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; -1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; -1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; -1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; -1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; -1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; -1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; -1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; -1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; -1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; -1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; -1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; -1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;; -1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;; -1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; -1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; -1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; -1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; -1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; -1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; -1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; -1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; -1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; -1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; -1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; -1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; -1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; -1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; -1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; -1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; -1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; -1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; -1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; -1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; -1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; -1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; -1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; -1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; -1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; -1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; -1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; -1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; -1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; -1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; -1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; -1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; -1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; -1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; -1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; -1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; -1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; -1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; -1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; -1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; -1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; -1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; -1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; -1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; -1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; -1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; -1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; -1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L; 0041;;;;N;;;;; -1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L; 00C6;;;;N;;;;; -1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L; 0042;;;;N;;;;; -1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; -1D30;MODIFIER LETTER CAPITAL D;Lm;0;L; 0044;;;;N;;;;; -1D31;MODIFIER LETTER CAPITAL E;Lm;0;L; 0045;;;;N;;;;; -1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L; 018E;;;;N;;;;; -1D33;MODIFIER LETTER CAPITAL G;Lm;0;L; 0047;;;;N;;;;; -1D34;MODIFIER LETTER CAPITAL H;Lm;0;L; 0048;;;;N;;;;; -1D35;MODIFIER LETTER CAPITAL I;Lm;0;L; 0049;;;;N;;;;; -1D36;MODIFIER LETTER CAPITAL J;Lm;0;L; 004A;;;;N;;;;; -1D37;MODIFIER LETTER CAPITAL K;Lm;0;L; 004B;;;;N;;;;; -1D38;MODIFIER LETTER CAPITAL L;Lm;0;L; 004C;;;;N;;;;; -1D39;MODIFIER LETTER CAPITAL M;Lm;0;L; 004D;;;;N;;;;; -1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L; 004E;;;;N;;;;; -1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; -1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L; 004F;;;;N;;;;; -1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L; 0222;;;;N;;;;; -1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L; 0050;;;;N;;;;; -1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L; 0052;;;;N;;;;; -1D40;MODIFIER LETTER CAPITAL T;Lm;0;L; 0054;;;;N;;;;; -1D41;MODIFIER LETTER CAPITAL U;Lm;0;L; 0055;;;;N;;;;; -1D42;MODIFIER LETTER CAPITAL W;Lm;0;L; 0057;;;;N;;;;; -1D43;MODIFIER LETTER SMALL A;Lm;0;L; 0061;;;;N;;;;; -1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L; 0250;;;;N;;;;; -1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L; 0251;;;;N;;;;; -1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L; 1D02;;;;N;;;;; -1D47;MODIFIER LETTER SMALL B;Lm;0;L; 0062;;;;N;;;;; -1D48;MODIFIER LETTER SMALL D;Lm;0;L; 0064;;;;N;;;;; -1D49;MODIFIER LETTER SMALL E;Lm;0;L; 0065;;;;N;;;;; -1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L; 0259;;;;N;;;;; -1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L; 025B;;;;N;;;;; -1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L; 025C;;;;N;;;;; -1D4D;MODIFIER LETTER SMALL G;Lm;0;L; 0067;;;;N;;;;; -1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; -1D4F;MODIFIER LETTER SMALL K;Lm;0;L; 006B;;;;N;;;;; -1D50;MODIFIER LETTER SMALL M;Lm;0;L; 006D;;;;N;;;;; -1D51;MODIFIER LETTER SMALL ENG;Lm;0;L; 014B;;;;N;;;;; -1D52;MODIFIER LETTER SMALL O;Lm;0;L; 006F;;;;N;;;;; -1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L; 0254;;;;N;;;;; -1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L; 1D16;;;;N;;;;; -1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L; 1D17;;;;N;;;;; -1D56;MODIFIER LETTER SMALL P;Lm;0;L; 0070;;;;N;;;;; -1D57;MODIFIER LETTER SMALL T;Lm;0;L; 0074;;;;N;;;;; -1D58;MODIFIER LETTER SMALL U;Lm;0;L; 0075;;;;N;;;;; -1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L; 1D1D;;;;N;;;;; -1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L; 026F;;;;N;;;;; -1D5B;MODIFIER LETTER SMALL V;Lm;0;L; 0076;;;;N;;;;; -1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L; 1D25;;;;N;;;;; -1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L; 03B2;;;;N;;;;; -1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L; 03B3;;;;N;;;;; -1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L; 03B4;;;;N;;;;; -1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L; 03C6;;;;N;;;;; -1D61;MODIFIER LETTER SMALL CHI;Lm;0;L; 03C7;;;;N;;;;; -1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; -1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L; 0072;;;;N;;;;; -1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L; 0075;;;;N;;;;; -1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L; 0076;;;;N;;;;; -1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L; 03B2;;;;N;;;;; -1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L; 03B3;;;;N;;;;; -1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L; 03C1;;;;N;;;;; -1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L; 03C6;;;;N;;;;; -1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L; 03C7;;;;N;;;;; -1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; -1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; -1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L; 043D;;;;N;;;;; -1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D -1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; -1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; -1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; -1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 -1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; -1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; -1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; -1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L; 0252;;;;N;;;;; -1D9C;MODIFIER LETTER SMALL C;Lm;0;L; 0063;;;;N;;;;; -1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L; 0255;;;;N;;;;; -1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L; 00F0;;;;N;;;;; -1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L; 025C;;;;N;;;;; -1DA0;MODIFIER LETTER SMALL F;Lm;0;L; 0066;;;;N;;;;; -1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L; 025F;;;;N;;;;; -1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L; 0261;;;;N;;;;; -1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L; 0265;;;;N;;;;; -1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L; 0268;;;;N;;;;; -1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L; 0269;;;;N;;;;; -1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L; 026A;;;;N;;;;; -1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L; 1D7B;;;;N;;;;; -1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L; 029D;;;;N;;;;; -1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L; 026D;;;;N;;;;; -1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L; 1D85;;;;N;;;;; -1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L; 029F;;;;N;;;;; -1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L; 0271;;;;N;;;;; -1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L; 0270;;;;N;;;;; -1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L; 0272;;;;N;;;;; -1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L; 0273;;;;N;;;;; -1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L; 0274;;;;N;;;;; -1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L; 0275;;;;N;;;;; -1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L; 0278;;;;N;;;;; -1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L; 0282;;;;N;;;;; -1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L; 0283;;;;N;;;;; -1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L; 01AB;;;;N;;;;; -1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L; 0289;;;;N;;;;; -1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L; 028A;;;;N;;;;; -1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L; 1D1C;;;;N;;;;; -1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L; 028B;;;;N;;;;; -1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L; 028C;;;;N;;;;; -1DBB;MODIFIER LETTER SMALL Z;Lm;0;L; 007A;;;;N;;;;; -1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L; 0290;;;;N;;;;; -1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L; 0291;;;;N;;;;; -1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L; 0292;;;;N;;;;; -1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L; 03B8;;;;N;;;;; -1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; -1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; -1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; -1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; -1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; -1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; -1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; -1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; -1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; -1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; -1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; -1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; -1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; -1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; -1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; -1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; -1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; -1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; -1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; -1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; -1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; -1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; -1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; -1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; -1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; -1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; -1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; -1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; -1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; -1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; -1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; -1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; -1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; -1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; -1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; -1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; -1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; -1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; -1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; -1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; -1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; -1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; -1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; -1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; -1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; -1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; -1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; -1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; -1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; -1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; -1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; -1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; -1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; -1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; -1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; -1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; -1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; -1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 -1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; -1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 -1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; -1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 -1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; -1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 -1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; -1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 -1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; -1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A -1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; -1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C -1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; -1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E -1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; -1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 -1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; -1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 -1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; -1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 -1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; -1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 -1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; -1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 -1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; -1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A -1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; -1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C -1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; -1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E -1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; -1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 -1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; -1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 -1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; -1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 -1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; -1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 -1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; -1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 -1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; -1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A -1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; -1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C -1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; -1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E -1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; -1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 -1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; -1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 -1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; -1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 -1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; -1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 -1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; -1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 -1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; -1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A -1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; -1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C -1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; -1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E -1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; -1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 -1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; -1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 -1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; -1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 -1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; -1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 -1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; -1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 -1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; -1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A -1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; -1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C -1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; -1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E -1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; -1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 -1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; -1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 -1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; -1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 -1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; -1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 -1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; -1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 -1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; -1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A -1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; -1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C -1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; -1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E -1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; -1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 -1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; -1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 -1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; -1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 -1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; -1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 -1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; -1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 -1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; -1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A -1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; -1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C -1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; -1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E -1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; -1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 -1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; -1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 -1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; -1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 -1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; -1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 -1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; -1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 -1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; -1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A -1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; -1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C -1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; -1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E -1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; -1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 -1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; -1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 -1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; -1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 -1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; -1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 -1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; -1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 -1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; -1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A -1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; -1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C -1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; -1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E -1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; -1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 -1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; -1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 -1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; -1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 -1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; -1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; -1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; -1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; -1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; -1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 -1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; -1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; -1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; -1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; -1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; -1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 -1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; -1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 -1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; -1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 -1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; -1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 -1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; -1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 -1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; -1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA -1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; -1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC -1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; -1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE -1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; -1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 -1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; -1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 -1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; -1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 -1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; -1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 -1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; -1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 -1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; -1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA -1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; -1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC -1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; -1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE -1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; -1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 -1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; -1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 -1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; -1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 -1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; -1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 -1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; -1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 -1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; -1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA -1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; -1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC -1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; -1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE -1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; -1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 -1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; -1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 -1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; -1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 -1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; -1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 -1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; -1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 -1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; -1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA -1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; -1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC -1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; -1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE -1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; -1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 -1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; -1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 -1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; -1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 -1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; -1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 -1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; -1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 -1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; -1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA -1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; -1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC -1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; -1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE -1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; -1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 -1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; -1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 -1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; -1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 -1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; -1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 -1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; -1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 -1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; -1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA -1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; -1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC -1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; -1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE -1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 -1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 -1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A -1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B -1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C -1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D -1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E -1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F -1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; -1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; -1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; -1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; -1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; -1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; -1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; -1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; -1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 -1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 -1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A -1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B -1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C -1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D -1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; -1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; -1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; -1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; -1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; -1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; -1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 -1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 -1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A -1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B -1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C -1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D -1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E -1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F -1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; -1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; -1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; -1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; -1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; -1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; -1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; -1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; -1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 -1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 -1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A -1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B -1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C -1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D -1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E -1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F -1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; -1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; -1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; -1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; -1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; -1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; -1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; -1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; -1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 -1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 -1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A -1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B -1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C -1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D -1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; -1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; -1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; -1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; -1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; -1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; -1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; -1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 -1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; -1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B -1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; -1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D -1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; -1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F -1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; -1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; -1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; -1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; -1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 -1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 -1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A -1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B -1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C -1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D -1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E -1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F -1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; -1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; -1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; -1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; -1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; -1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; -1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; -1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; -1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA -1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB -1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 -1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 -1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA -1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB -1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA -1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB -1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 -1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 -1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA -1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB -1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA -1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB -1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 -1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 -1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A -1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B -1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C -1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D -1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E -1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F -1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; -1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; -1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; -1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; -1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; -1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; -1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; -1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; -1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 -1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 -1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A -1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B -1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C -1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D -1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E -1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F -1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; -1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; -1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; -1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; -1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; -1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; -1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; -1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; -1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 -1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 -1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA -1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB -1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC -1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD -1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE -1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF -1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; -1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; -1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; -1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; -1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; -1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; -1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; -1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; -1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 -1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 -1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; -1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC -1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; -1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; -1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; -1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; -1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; -1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; -1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; -1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; -1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; -1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 -1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; -1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; -1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; -1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; -1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC -1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; -1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; -1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; -1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; -1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; -1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; -1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; -1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; -1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; -1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; -1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; -1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 -1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 -1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; -1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; -1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; -1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; -1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; -1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; -1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; -1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; -1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; -1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; -1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; -1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 -1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 -1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; -1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; -1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; -1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC -1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; -1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; -1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; -1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; -1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; -1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; -1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; -1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; -1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; -1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; -1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; -1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC -1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; -1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; -1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; -1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; -1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; -1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; -1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; -1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; -1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; -1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; -2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; -2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; -2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; -2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; -2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; -2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; -200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; -200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; -200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; -200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; -200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; -200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; -2010;HYPHEN;Pd;0;ON;;;;;N;;;;; -2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; -2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; -2013;EN DASH;Pd;0;ON;;;;;N;;;;; -2014;EM DASH;Pd;0;ON;;;;;N;;;;; -2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; -2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; -2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; -2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; -2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; -201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; -201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; -201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; -201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; -201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; -201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; -2020;DAGGER;Po;0;ON;;;;;N;;;;; -2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; -2022;BULLET;Po;0;ON;;;;;N;;;;; -2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; -2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; -2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; -2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; -2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; -2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; -2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; -202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; -202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; -202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; -202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; -202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; -202F;NARROW NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;;;;; -2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; -2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; -2032;PRIME;Po;0;ET;;;;;N;;;;; -2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; -2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; -2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; -2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; -2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; -2038;CARET;Po;0;ON;;;;;N;;;;; -2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; -203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; -203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; -203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; -203D;INTERROBANG;Po;0;ON;;;;;N;;;;; -203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; -203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; -2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; -2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; -2042;ASTERISM;Po;0;ON;;;;;N;;;;; -2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; -2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; -2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; -2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; -2047;DOUBLE QUESTION MARK;Po;0;ON; 003F 003F;;;;N;;;;; -2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; -2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; -204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; -204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; -204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; -204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; -204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; -204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; -2050;CLOSE UP;Po;0;ON;;;;;N;;;;; -2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; -2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; -2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; -2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; -2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; -2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2057;QUADRUPLE PRIME;Po;0;ON; 2032 2032 2032 2032;;;;N;;;;; -2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; -205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; -205D;TRICOLON;Po;0;ON;;;;;N;;;;; -205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; -205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS; 0020;;;;N;;;;; -2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; -2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; -2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; -2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; -2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; -2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; -2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; -2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; -2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; -206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; -206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; -206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; -206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; -206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; -206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; -2070;SUPERSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; -2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; -2074;SUPERSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; -2075;SUPERSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; -2076;SUPERSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; -2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; -2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; -2079;SUPERSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; -207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -207B;SUPERSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; -207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; -207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; -207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; -2080;SUBSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; -2081;SUBSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; -2082;SUBSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; -2083;SUBSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; -2084;SUBSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; -2085;SUBSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; -2086;SUBSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; -2087;SUBSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; -2088;SUBSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; -2089;SUBSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; -208A;SUBSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -208B;SUBSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; -208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; -208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; -2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L; 0061;;;;N;;;;; -2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L; 0065;;;;N;;;;; -2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L; 006F;;;;N;;;;; -2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L; 0078;;;;N;;;;; -2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L; 0259;;;;N;;;;; -2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L; 0068;;;;N;;;;; -2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L; 006B;;;;N;;;;; -2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L; 006C;;;;N;;;;; -2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L; 006D;;;;N;;;;; -2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; -209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L; 0070;;;;N;;;;; -209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L; 0073;;;;N;;;;; -209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L; 0074;;;;N;;;;; -20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; -20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; -20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; -20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; -20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; -20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; -20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; -20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; -20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; -20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; -20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; -20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; -20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; -20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; -20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; -20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; -20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; -20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; -20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; -20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; -20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; -20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; -20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; -20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; -20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; -20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; -20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; -20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; -20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; -20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; -20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; -20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; -20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; -20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; -20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; -20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; -20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; -20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; -20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; -20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; -20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; -20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; -20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; -20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; -20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; -20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; -20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; -20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; -20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; -20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; -20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; -20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; -20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; -20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; -20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; -20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; -20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; -20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; -20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; -20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; -20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; -2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; -2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; -2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; -2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; -2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; -2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; -2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; -2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; -2108;SCRUPLE;So;0;ON;;;;;N;;;;; -2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; -210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; -210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; -210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; -210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; -210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; -210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; -2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; -2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; -2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; -2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; -2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; -2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; -2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; -2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; -2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; -211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; -211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; -211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; -211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; -211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; -211F;RESPONSE;So;0;ON;;;;;N;;;;; -2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; -2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; -2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; -2123;VERSICLE;So;0;ON;;;;;N;;;;; -2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; -2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; -2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; -2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; -2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; -2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; -212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; -212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; -212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; -212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; -212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; -212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; -2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; -2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; -2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; -2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; -2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; -2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; -2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; -2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; -2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; -2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; -213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; -213B;FACSIMILE SIGN;So;0;ON; 0046 0041 0058;;;;N;;;;; -213C;DOUBLE-STRUCK SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON; 2211;;;;Y;;;;; -2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; -2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; -2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; -2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; -2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; -214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; -214C;PER SIGN;So;0;ON;;;;;N;;;;; -214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; -214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 -214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; -2150;VULGAR FRACTION ONE SEVENTH;No;0;ON; 0031 2044 0037;;;1/7;N;;;;; -2151;VULGAR FRACTION ONE NINTH;No;0;ON; 0031 2044 0039;;;1/9;N;;;;; -2152;VULGAR FRACTION ONE TENTH;No;0;ON; 0031 2044 0031 0030;;;1/10;N;;;;; -2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; -2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; -2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; -2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; -2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; -2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; -2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; -215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; -215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; -215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; -215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; -215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; -215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; -2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; -2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; -2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; -2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; -2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; -2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; -2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; -2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; -2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; -2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; -216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; -216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; -216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; -216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; -216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; -216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; -2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 -2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 -2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 -2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 -2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 -2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 -2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 -2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 -2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 -2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 -217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A -217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B -217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C -217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D -217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E -217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F -2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; -2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; -2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; -2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; -2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 -2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; -2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; -2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; -2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; -2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; -218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; -218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; -2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; -2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; -2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; -2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; -2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; -2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; -2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; -2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; -2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; -2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; -219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; -219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; -219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; -219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; -219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; -219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; -21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; -21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; -21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; -21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; -21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; -21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; -21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; -21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; -21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; -21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; -21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; -21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; -21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; -21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; -21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; -21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; -21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; -21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; -21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; -21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; -21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; -21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; -21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; -21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; -21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; -21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; -21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; -21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; -21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; -21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; -21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; -21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; -21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; -21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; -21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; -21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; -21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; -21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; -21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; -21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; -21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; -21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; -21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; -21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; -21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; -21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; -21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; -21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; -21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; -21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; -21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; -21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; -21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; -21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; -21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; -21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; -21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; -21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; -21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; -21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; -21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; -21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; -21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; -21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; -21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; -21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; -21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; -21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; -21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; -21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; -21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; -21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; -21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; -21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; -21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; -21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; -21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; -21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; -21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; -21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; -21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; -21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; -21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; -21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; -21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; -21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; -2200;FOR ALL;Sm;0;ON;;;;;N;;;;; -2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; -2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; -2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; -2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; -2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; -2206;INCREMENT;Sm;0;ON;;;;;N;;;;; -2207;NABLA;Sm;0;ON;;;;;N;;;;; -2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; -2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; -220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; -220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; -220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; -220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; -220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; -220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; -2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; -2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; -2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; -2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; -2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; -2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; -2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; -2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; -2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; -2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; -221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; -221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; -221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; -221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; -221E;INFINITY;Sm;0;ON;;;;;N;;;;; -221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; -2220;ANGLE;Sm;0;ON;;;;;Y;;;;; -2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; -2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; -2223;DIVIDES;Sm;0;ON;;;;;N;;;;; -2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; -2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; -2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; -2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; -222A;UNION;Sm;0;ON;;;;;N;;;;; -222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; -222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; -222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; -222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; -2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; -2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2234;THEREFORE;Sm;0;ON;;;;;N;;;;; -2235;BECAUSE;Sm;0;ON;;;;;N;;;;; -2236;RATIO;Sm;0;ON;;;;;N;;;;; -2237;PROPORTION;Sm;0;ON;;;;;N;;;;; -2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; -2239;EXCESS;Sm;0;ON;;;;;Y;;;;; -223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; -223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; -223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; -223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; -223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; -2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; -2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; -2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; -2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; -2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; -2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; -224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; -224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; -224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; -2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; -2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; -2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; -2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; -2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; -2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; -2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; -2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; -2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; -225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; -225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; -225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; -225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; -225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; -225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; -2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; -2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; -2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; -2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; -2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; -2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; -2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; -2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; -226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; -226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; -226C;BETWEEN;Sm;0;ON;;;;;N;;;;; -226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; -226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; -226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; -2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; -2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; -2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; -2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; -2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; -2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; -2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; -2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; -2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; -2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; -227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; -227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; -2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; -2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; -2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; -2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; -2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; -2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; -2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; -228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; -228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; -228C;MULTISET;Sm;0;ON;;;;;Y;;;;; -228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; -228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; -228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; -2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; -2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; -2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; -2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; -2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; -2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; -2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; -2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; -229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; -229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; -229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; -229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; -229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; -22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; -22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; -22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; -22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; -22A5;UP TACK;Sm;0;ON;;;;;N;;;;; -22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; -22A7;MODELS;Sm;0;ON;;;;;Y;;;;; -22A8;TRUE;Sm;0;ON;;;;;Y;;;;; -22A9;FORCES;Sm;0;ON;;;;;Y;;;;; -22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; -22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; -22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; -22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; -22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; -22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; -22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; -22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; -22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; -22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; -22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; -22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; -22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; -22BB;XOR;Sm;0;ON;;;;;N;;;;; -22BC;NAND;Sm;0;ON;;;;;N;;;;; -22BD;NOR;Sm;0;ON;;;;;N;;;;; -22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; -22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; -22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; -22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; -22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; -22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; -22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; -22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; -22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; -22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; -22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; -22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; -22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; -22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; -22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; -22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; -22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; -22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; -22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; -22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; -22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; -22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; -22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; -22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; -22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; -22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; -22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; -22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; -22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; -22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; -22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; -22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; -22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; -22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; -22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; -22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; -22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; -22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; -22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; -22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; -22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; -22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; -22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; -22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; -2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; -2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; -2302;HOUSE;So;0;ON;;;;;N;;;;; -2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; -2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; -2305;PROJECTIVE;So;0;ON;;;;;N;;;;; -2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; -2307;WAVY LINE;So;0;ON;;;;;N;;;;; -2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; -2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; -230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; -230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; -230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; -230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; -230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; -230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; -2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; -2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; -2312;ARC;So;0;ON;;;;;N;;;;; -2313;SEGMENT;So;0;ON;;;;;N;;;;; -2314;SECTOR;So;0;ON;;;;;N;;;;; -2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; -2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; -2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; -2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; -2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; -231A;WATCH;So;0;ON;;;;;N;;;;; -231B;HOURGLASS;So;0;ON;;;;;N;;;;; -231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; -231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; -231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; -231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; -2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2322;FROWN;So;0;ON;;;;;N;;;;; -2323;SMILE;So;0;ON;;;;;N;;;;; -2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; -2325;OPTION KEY;So;0;ON;;;;;N;;;;; -2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; -2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; -2328;KEYBOARD;So;0;ON;;;;;N;;;;; -2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; -232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; -232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; -232C;BENZENE RING;So;0;ON;;;;;N;;;;; -232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; -232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; -232F;SYMMETRY;So;0;ON;;;;;N;;;;; -2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; -2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; -2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; -2333;SLOPE;So;0;ON;;;;;N;;;;; -2334;COUNTERBORE;So;0;ON;;;;;N;;;;; -2335;COUNTERSINK;So;0;ON;;;;;N;;;;; -2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; -2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; -2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; -2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; -233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; -233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; -233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; -233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; -233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; -233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; -2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; -2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; -2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; -2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; -2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; -2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; -2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; -2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; -2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; -2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; -234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; -234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; -234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; -234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; -234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; -234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; -2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; -2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; -2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; -2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; -2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; -2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; -2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; -2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; -2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; -2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; -235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; -235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; -235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; -235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; -235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; -235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; -2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; -2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; -2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; -2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; -2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; -2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; -2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; -2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; -2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; -2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; -236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; -236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; -236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; -236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; -236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; -236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; -2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; -2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; -2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; -2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; -2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; -2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; -2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; -2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; -2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; -2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; -237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; -237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; -237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; -237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; -237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; -237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; -2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; -2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; -2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; -2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; -2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; -2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; -2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; -2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; -2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; -2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; -238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; -238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; -238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; -238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; -238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; -238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; -2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; -2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; -2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; -2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; -2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; -2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; -2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; -2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; -2398;NEXT PAGE;So;0;ON;;;;;N;;;;; -2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; -239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; -239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; -239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; -239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; -239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; -239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; -23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; -23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; -23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; -23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; -23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; -23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; -23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; -23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; -23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; -23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; -23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; -23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; -23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; -23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; -23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; -23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; -23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; -23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; -23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; -23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; -23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; -23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; -23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; -23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; -23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; -23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; -23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; -23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; -23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; -23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; -23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; -23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; -23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; -23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; -23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; -23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; -23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; -23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; -23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; -23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; -23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; -23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; -23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; -23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; -23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; -23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; -23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; -23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; -23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; -23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; -23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; -23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; -23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; -23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; -23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; -23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; -23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; -23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; -23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; -23DB;FUSE;So;0;ON;;;;;N;;;;; -23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; -23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; -23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; -23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; -23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; -23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; -23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; -23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; -23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; -23E5;FLATNESS;So;0;ON;;;;;N;;;;; -23E6;AC CURRENT;So;0;ON;;;;;N;;;;; -23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; -23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; -23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; -23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; -23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; -23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; -23F1;STOPWATCH;So;0;ON;;;;;N;;;;; -23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; -23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; -23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; -23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; -23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; -2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; -2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; -2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; -2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; -2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; -2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; -2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; -2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; -2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; -2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; -240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; -240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; -240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; -240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; -240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; -240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; -2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; -2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; -2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; -2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; -2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; -2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; -2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; -2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; -2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; -2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; -241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; -241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; -241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; -241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; -241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; -241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; -2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; -2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; -2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; -2423;OPEN BOX;So;0;ON;;;;;N;;;;; -2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; -2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; -2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; -2440;OCR HOOK;So;0;ON;;;;;N;;;;; -2441;OCR CHAIR;So;0;ON;;;;;N;;;;; -2442;OCR FORK;So;0;ON;;;;;N;;;;; -2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; -2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; -2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; -2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; -2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; -2448;OCR DASH;So;0;ON;;;;;N;;;;; -2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; -244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; -2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; -2461;CIRCLED DIGIT TWO;No;0;ON; 0032;;2;2;N;;;;; -2462;CIRCLED DIGIT THREE;No;0;ON; 0033;;3;3;N;;;;; -2463;CIRCLED DIGIT FOUR;No;0;ON; 0034;;4;4;N;;;;; -2464;CIRCLED DIGIT FIVE;No;0;ON; 0035;;5;5;N;;;;; -2465;CIRCLED DIGIT SIX;No;0;ON; 0036;;6;6;N;;;;; -2466;CIRCLED DIGIT SEVEN;No;0;ON; 0037;;7;7;N;;;;; -2467;CIRCLED DIGIT EIGHT;No;0;ON; 0038;;8;8;N;;;;; -2468;CIRCLED DIGIT NINE;No;0;ON; 0039;;9;9;N;;;;; -2469;CIRCLED NUMBER TEN;No;0;ON; 0031 0030;;;10;N;;;;; -246A;CIRCLED NUMBER ELEVEN;No;0;ON; 0031 0031;;;11;N;;;;; -246B;CIRCLED NUMBER TWELVE;No;0;ON; 0031 0032;;;12;N;;;;; -246C;CIRCLED NUMBER THIRTEEN;No;0;ON; 0031 0033;;;13;N;;;;; -246D;CIRCLED NUMBER FOURTEEN;No;0;ON; 0031 0034;;;14;N;;;;; -246E;CIRCLED NUMBER FIFTEEN;No;0;ON; 0031 0035;;;15;N;;;;; -246F;CIRCLED NUMBER SIXTEEN;No;0;ON; 0031 0036;;;16;N;;;;; -2470;CIRCLED NUMBER SEVENTEEN;No;0;ON; 0031 0037;;;17;N;;;;; -2471;CIRCLED NUMBER EIGHTEEN;No;0;ON; 0031 0038;;;18;N;;;;; -2472;CIRCLED NUMBER NINETEEN;No;0;ON; 0031 0039;;;19;N;;;;; -2473;CIRCLED NUMBER TWENTY;No;0;ON; 0032 0030;;;20;N;;;;; -2474;PARENTHESIZED DIGIT ONE;No;0;ON; 0028 0031 0029;;1;1;N;;;;; -2475;PARENTHESIZED DIGIT TWO;No;0;ON; 0028 0032 0029;;2;2;N;;;;; -2476;PARENTHESIZED DIGIT THREE;No;0;ON; 0028 0033 0029;;3;3;N;;;;; -2477;PARENTHESIZED DIGIT FOUR;No;0;ON; 0028 0034 0029;;4;4;N;;;;; -2478;PARENTHESIZED DIGIT FIVE;No;0;ON; 0028 0035 0029;;5;5;N;;;;; -2479;PARENTHESIZED DIGIT SIX;No;0;ON; 0028 0036 0029;;6;6;N;;;;; -247A;PARENTHESIZED DIGIT SEVEN;No;0;ON; 0028 0037 0029;;7;7;N;;;;; -247B;PARENTHESIZED DIGIT EIGHT;No;0;ON; 0028 0038 0029;;8;8;N;;;;; -247C;PARENTHESIZED DIGIT NINE;No;0;ON; 0028 0039 0029;;9;9;N;;;;; -247D;PARENTHESIZED NUMBER TEN;No;0;ON; 0028 0031 0030 0029;;;10;N;;;;; -247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON; 0028 0031 0031 0029;;;11;N;;;;; -247F;PARENTHESIZED NUMBER TWELVE;No;0;ON; 0028 0031 0032 0029;;;12;N;;;;; -2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON; 0028 0031 0033 0029;;;13;N;;;;; -2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON; 0028 0031 0034 0029;;;14;N;;;;; -2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON; 0028 0031 0035 0029;;;15;N;;;;; -2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON; 0028 0031 0036 0029;;;16;N;;;;; -2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON; 0028 0031 0037 0029;;;17;N;;;;; -2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON; 0028 0031 0038 0029;;;18;N;;;;; -2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON; 0028 0031 0039 0029;;;19;N;;;;; -2487;PARENTHESIZED NUMBER TWENTY;No;0;ON; 0028 0032 0030 0029;;;20;N;;;;; -2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; -2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; -248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; -248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; -248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; -248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; -248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; -248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; -2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; -2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; -2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; -2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; -2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; -2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; -2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; -2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; -2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; -2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; -249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; -249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; -249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; -249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; -249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; -249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; -24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; -24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; -24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; -24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; -24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; -24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; -24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; -24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; -24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; -24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; -24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; -24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; -24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; -24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; -24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; -24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; -24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; -24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; -24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; -24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; -24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; -24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; -24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; -24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; -24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; -24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; -24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; -24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; -24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; -24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; -24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; -24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; -24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; -24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; -24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; -24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; -24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; -24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; -24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; -24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; -24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; -24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; -24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; -24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; -24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; -24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; -24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; -24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; -24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 -24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 -24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 -24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 -24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA -24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB -24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC -24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD -24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE -24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF -24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 -24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 -24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 -24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 -24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 -24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 -24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 -24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 -24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 -24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 -24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA -24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB -24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC -24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD -24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE -24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF -24EA;CIRCLED DIGIT ZERO;No;0;ON; 0030;;0;0;N;;;;; -24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; -24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; -24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; -24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; -24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; -24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; -24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; -24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; -24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; -24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; -24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; -24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; -24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; -24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; -24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; -24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; -24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; -24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; -24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; -24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; -24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; -2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; -2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; -2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; -2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; -2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; -2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; -2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; -2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; -2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; -2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; -250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; -250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; -250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; -250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; -250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; -250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; -2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; -2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; -2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; -2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; -2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; -2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; -2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; -2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; -2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; -2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; -251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; -251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; -251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; -251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; -251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; -251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; -2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; -2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; -2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; -2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; -2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; -2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; -2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; -2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; -2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; -2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; -252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; -252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; -252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; -252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; -252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; -252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; -2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; -2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; -2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; -2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; -2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; -2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; -2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; -2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; -2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; -2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; -253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; -253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; -253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; -253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; -253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; -253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; -2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; -2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; -2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; -2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; -2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; -2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; -2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; -2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; -2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; -2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; -254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; -254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; -254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; -254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; -254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; -254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; -2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; -2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; -2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; -2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; -2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; -2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; -2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; -2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; -2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; -2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; -255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; -255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; -255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; -255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; -255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; -255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; -2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; -2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; -2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; -2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; -2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; -2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; -2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; -2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; -2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; -2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; -256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; -256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; -256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; -256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; -256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; -256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; -2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; -2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; -2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; -2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; -2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; -2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; -2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; -2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; -2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; -2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; -257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; -257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; -257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; -257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; -257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; -257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; -2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; -2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; -2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; -2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; -2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2588;FULL BLOCK;So;0;ON;;;;;N;;;;; -2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; -258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; -258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; -258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; -2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; -2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; -2593;DARK SHADE;So;0;ON;;;;;N;;;;; -2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; -2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; -2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; -2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; -259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; -259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; -259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; -25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; -25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; -25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; -25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; -25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; -25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; -25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; -25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; -25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; -25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; -25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; -25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; -25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; -25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; -25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; -25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; -25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; -25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; -25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; -25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; -25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; -25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; -25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; -25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; -25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; -25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; -25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; -25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; -25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; -25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; -25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; -25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; -25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; -25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; -25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; -25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; -25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; -25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; -25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; -25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; -25C9;FISHEYE;So;0;ON;;;;;N;;;;; -25CA;LOZENGE;So;0;ON;;;;;N;;;;; -25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; -25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; -25CE;BULLSEYE;So;0;ON;;;;;N;;;;; -25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; -25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; -25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; -25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; -25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; -25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; -25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; -25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; -25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; -25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; -25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; -25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; -25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; -25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; -25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; -25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; -25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; -25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; -25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; -25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; -25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; -25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; -25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; -2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; -2601;CLOUD;So;0;ON;;;;;N;;;;; -2602;UMBRELLA;So;0;ON;;;;;N;;;;; -2603;SNOWMAN;So;0;ON;;;;;N;;;;; -2604;COMET;So;0;ON;;;;;N;;;;; -2605;BLACK STAR;So;0;ON;;;;;N;;;;; -2606;WHITE STAR;So;0;ON;;;;;N;;;;; -2607;LIGHTNING;So;0;ON;;;;;N;;;;; -2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; -2609;SUN;So;0;ON;;;;;N;;;;; -260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; -260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; -260C;CONJUNCTION;So;0;ON;;;;;N;;;;; -260D;OPPOSITION;So;0;ON;;;;;N;;;;; -260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; -260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; -2610;BALLOT BOX;So;0;ON;;;;;N;;;;; -2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; -2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; -2613;SALTIRE;So;0;ON;;;;;N;;;;; -2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; -2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; -2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; -2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; -2618;SHAMROCK;So;0;ON;;;;;N;;;;; -2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; -261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; -261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; -2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; -2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; -2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; -2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; -2624;CADUCEUS;So;0;ON;;;;;N;;;;; -2625;ANKH;So;0;ON;;;;;N;;;;; -2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; -2627;CHI RHO;So;0;ON;;;;;N;;;;; -2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; -2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; -262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; -262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; -262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; -262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; -262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; -262F;YIN YANG;So;0;ON;;;;;N;;;;; -2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; -2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; -2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; -2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; -2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; -2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; -2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; -2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; -2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; -263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; -263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; -263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; -263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; -263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; -263F;MERCURY;So;0;ON;;;;;N;;;;; -2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; -2641;EARTH;So;0;ON;;;;;N;;;;; -2642;MALE SIGN;So;0;ON;;;;;N;;;;; -2643;JUPITER;So;0;ON;;;;;N;;;;; -2644;SATURN;So;0;ON;;;;;N;;;;; -2645;URANUS;So;0;ON;;;;;N;;;;; -2646;NEPTUNE;So;0;ON;;;;;N;;;;; -2647;PLUTO;So;0;ON;;;;;N;;;;; -2648;ARIES;So;0;ON;;;;;N;;;;; -2649;TAURUS;So;0;ON;;;;;N;;;;; -264A;GEMINI;So;0;ON;;;;;N;;;;; -264B;CANCER;So;0;ON;;;;;N;;;;; -264C;LEO;So;0;ON;;;;;N;;;;; -264D;VIRGO;So;0;ON;;;;;N;;;;; -264E;LIBRA;So;0;ON;;;;;N;;;;; -264F;SCORPIUS;So;0;ON;;;;;N;;;;; -2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; -2651;CAPRICORN;So;0;ON;;;;;N;;;;; -2652;AQUARIUS;So;0;ON;;;;;N;;;;; -2653;PISCES;So;0;ON;;;;;N;;;;; -2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; -2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; -2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; -2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; -2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; -2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; -265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; -265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; -265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; -265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; -265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; -265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; -2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; -2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; -2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; -2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; -2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; -2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; -2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; -2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; -2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; -2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; -266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; -266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; -266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; -266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; -266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; -266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; -2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; -2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; -2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; -2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; -2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; -2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; -2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; -2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; -2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; -2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; -267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; -267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; -267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; -267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; -267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; -267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; -2680;DIE FACE-1;So;0;ON;;;;;N;;;;; -2681;DIE FACE-2;So;0;ON;;;;;N;;;;; -2682;DIE FACE-3;So;0;ON;;;;;N;;;;; -2683;DIE FACE-4;So;0;ON;;;;;N;;;;; -2684;DIE FACE-5;So;0;ON;;;;;N;;;;; -2685;DIE FACE-6;So;0;ON;;;;;N;;;;; -2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; -2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; -2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; -2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; -268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; -268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; -268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; -268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; -268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; -268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; -2690;WHITE FLAG;So;0;ON;;;;;N;;;;; -2691;BLACK FLAG;So;0;ON;;;;;N;;;;; -2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; -2693;ANCHOR;So;0;ON;;;;;N;;;;; -2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; -2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; -2696;SCALES;So;0;ON;;;;;N;;;;; -2697;ALEMBIC;So;0;ON;;;;;N;;;;; -2698;FLOWER;So;0;ON;;;;;N;;;;; -2699;GEAR;So;0;ON;;;;;N;;;;; -269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; -269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; -269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; -269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; -269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; -269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; -26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; -26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; -26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; -26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; -26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; -26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; -26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; -26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; -26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; -26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; -26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; -26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; -26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; -26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; -26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; -26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; -26B0;COFFIN;So;0;ON;;;;;N;;;;; -26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; -26B2;NEUTER;So;0;ON;;;;;N;;;;; -26B3;CERES;So;0;ON;;;;;N;;;;; -26B4;PALLAS;So;0;ON;;;;;N;;;;; -26B5;JUNO;So;0;ON;;;;;N;;;;; -26B6;VESTA;So;0;ON;;;;;N;;;;; -26B7;CHIRON;So;0;ON;;;;;N;;;;; -26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; -26B9;SEXTILE;So;0;ON;;;;;N;;;;; -26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; -26BB;QUINCUNX;So;0;ON;;;;;N;;;;; -26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; -26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; -26BE;BASEBALL;So;0;ON;;;;;N;;;;; -26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; -26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; -26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; -26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; -26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; -26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; -26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; -26C6;RAIN;So;0;ON;;;;;N;;;;; -26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; -26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; -26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; -26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; -26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; -26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; -26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; -26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; -26CF;PICK;So;0;ON;;;;;N;;;;; -26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; -26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; -26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; -26D3;CHAINS;So;0;ON;;;;;N;;;;; -26D4;NO ENTRY;So;0;ON;;;;;N;;;;; -26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; -26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; -26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; -26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; -26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; -26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; -26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; -26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; -26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; -26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; -26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; -26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; -26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; -26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; -26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; -26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; -26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; -26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; -26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; -26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; -26EA;CHURCH;So;0;ON;;;;;N;;;;; -26EB;CASTLE;So;0;ON;;;;;N;;;;; -26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; -26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; -26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; -26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; -26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; -26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; -26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; -26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; -26F4;FERRY;So;0;ON;;;;;N;;;;; -26F5;SAILBOAT;So;0;ON;;;;;N;;;;; -26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; -26F7;SKIER;So;0;ON;;;;;N;;;;; -26F8;ICE SKATE;So;0;ON;;;;;N;;;;; -26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; -26FA;TENT;So;0;ON;;;;;N;;;;; -26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; -26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; -26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; -26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; -26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; -2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; -2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; -2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; -2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; -2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; -2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; -2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; -2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; -2708;AIRPLANE;So;0;ON;;;;;N;;;;; -2709;ENVELOPE;So;0;ON;;;;;N;;;;; -270A;RAISED FIST;So;0;ON;;;;;N;;;;; -270B;RAISED HAND;So;0;ON;;;;;N;;;;; -270C;VICTORY HAND;So;0;ON;;;;;N;;;;; -270D;WRITING HAND;So;0;ON;;;;;N;;;;; -270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; -270F;PENCIL;So;0;ON;;;;;N;;;;; -2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; -2711;WHITE NIB;So;0;ON;;;;;N;;;;; -2712;BLACK NIB;So;0;ON;;;;;N;;;;; -2713;CHECK MARK;So;0;ON;;;;;N;;;;; -2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; -2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; -2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; -2717;BALLOT X;So;0;ON;;;;;N;;;;; -2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; -2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; -271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; -271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; -271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; -271D;LATIN CROSS;So;0;ON;;;;;N;;;;; -271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; -271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; -2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; -2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; -2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; -2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; -2728;SPARKLES;So;0;ON;;;;;N;;;;; -2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; -272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; -272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; -272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; -272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; -272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; -272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; -2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; -2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; -2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; -2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; -2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; -2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; -273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; -273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; -273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; -2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; -2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; -2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; -2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; -2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; -2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; -2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; -2747;SPARKLE;So;0;ON;;;;;N;;;;; -2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; -2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; -274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; -274C;CROSS MARK;So;0;ON;;;;;N;;;;; -274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; -274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; -274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; -2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; -2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; -2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; -275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; -275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; -2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; -2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; -2766;FLORAL HEART;So;0;ON;;;;;N;;;;; -2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; -2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; -276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; -276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; -276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; -276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; -2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; -2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; -2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; -277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; -277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; -277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; -277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; -277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; -277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; -2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; -2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; -2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; -2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; -2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; -2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; -2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; -2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; -2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; -2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; -278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; -278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; -278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; -278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; -278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; -278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; -2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; -2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; -2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; -2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; -2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; -2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; -2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; -2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; -2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; -2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; -279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; -279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; -279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; -279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; -279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; -279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; -27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; -27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; -27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; -27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; -27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; -27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; -27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; -27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; -27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; -27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; -27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; -27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; -27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; -27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; -27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; -27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; -27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; -27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; -27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; -27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; -27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; -27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; -27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; -27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; -27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; -27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; -27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; -27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; -27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; -27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; -27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; -27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; -27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; -27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; -27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; -27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; -27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; -27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; -27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; -27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; -27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; -27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; -27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; -27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; -27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; -27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; -27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; -27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; -27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; -27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; -27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; -27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; -27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; -27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; -27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; -27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; -27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; -27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; -27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; -27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; -27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; -27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; -27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; -27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; -27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; -27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; -27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; -27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; -27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; -27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; -27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; -27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; -27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; -27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; -27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; -2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; -2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; -2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; -2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; -2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; -2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; -2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; -2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; -2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; -2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; -280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; -280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; -280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; -280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; -280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; -280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; -2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; -2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; -2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; -2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; -2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; -2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; -2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; -2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; -2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; -2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; -281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; -281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; -281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; -281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; -281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; -281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; -2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; -2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; -2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; -2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; -2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; -2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; -2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; -2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; -2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; -2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; -282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; -282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; -282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; -282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; -282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; -282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; -2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; -2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; -2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; -2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; -2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; -2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; -2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; -2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; -2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; -2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; -283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; -283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; -283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; -283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; -283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; -283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; -2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; -2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; -2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; -2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; -2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; -2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; -2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; -2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; -2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; -2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; -284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; -284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; -284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; -284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; -284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; -284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; -2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; -2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; -2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; -2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; -2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; -2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; -2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; -2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; -2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; -2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; -285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; -285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; -285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; -285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; -285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; -285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; -2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; -2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; -2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; -2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; -2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; -2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; -2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; -2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; -2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; -2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; -286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; -286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; -286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; -286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; -286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; -286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; -2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; -2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; -2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; -2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; -2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; -2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; -2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; -2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; -2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; -2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; -287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; -287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; -287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; -287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; -287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; -287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; -2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; -2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; -2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; -2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; -2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; -2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; -2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; -2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; -2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; -2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; -288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; -288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; -288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; -288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; -288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; -288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; -2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; -2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; -2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; -2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; -2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; -2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; -2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; -2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; -2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; -2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; -289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; -289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; -289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; -289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; -289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; -289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; -28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; -28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; -28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; -28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; -28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; -28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; -28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; -28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; -28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; -28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; -28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; -28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; -28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; -28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; -28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; -28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; -28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; -28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; -28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; -28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; -28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; -28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; -28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; -28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; -28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; -28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; -28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; -28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; -28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; -28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; -28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; -28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; -28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; -28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; -28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; -28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; -28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; -28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; -28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; -28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; -28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; -28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; -28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; -28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; -28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; -28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; -28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; -28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; -28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; -28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; -28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; -28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; -28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; -28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; -28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; -28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; -28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; -28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; -28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; -28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; -28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; -28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; -28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; -28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; -28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; -28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; -28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; -28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; -28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; -28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; -28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; -28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; -28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; -28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; -28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; -28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; -28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; -28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; -28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; -28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; -28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; -28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; -28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; -28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; -28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; -28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; -28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; -28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; -28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; -28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; -28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; -28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; -28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; -28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; -28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; -28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; -2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; -290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; -290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; -2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; -2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; -2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; -2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; -292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; -292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; -2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; -2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; -2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; -2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; -2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; -293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; -293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; -2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; -2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; -2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; -294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; -294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; -294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; -294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; -294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; -2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; -2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; -2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; -2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; -2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; -2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; -2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; -2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; -2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; -2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; -295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; -295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; -295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; -295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; -295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; -295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; -2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; -2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; -2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; -2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; -2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; -296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; -296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; -296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; -296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; -2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; -2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; -297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; -297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; -297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; -297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; -2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; -2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; -2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; -2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; -2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; -2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; -2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; -2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; -2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; -2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; -298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; -298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; -298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; -298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; -298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; -298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; -2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; -2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; -2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; -2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; -2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; -2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; -2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; -2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; -2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; -2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; -299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; -299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; -299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; -299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; -299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; -299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; -29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; -29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; -29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; -29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; -29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; -29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; -29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; -29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; -29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; -29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; -29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; -29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; -29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; -29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; -29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; -29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; -29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; -29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; -29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; -29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; -29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; -29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; -29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; -29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; -29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; -29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; -29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; -29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; -29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; -29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; -29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; -29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; -29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; -29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; -29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; -29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; -29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; -29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; -29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; -29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; -29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; -29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; -29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; -29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; -29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; -29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; -29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; -29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; -29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; -29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; -29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; -29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; -29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; -29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; -29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; -29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; -29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; -29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; -29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; -29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; -29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; -29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; -29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; -29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; -29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; -29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; -29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; -29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; -29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; -29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; -29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; -29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; -29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; -29FE;TINY;Sm;0;ON;;;;;N;;;;; -29FF;MINY;Sm;0;ON;;;;;N;;;;; -2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; -2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; -2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; -2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; -2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; -2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; -2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; -2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; -2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; -2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; -2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON; 222B 222B 222B 222B;;;;Y;;;;; -2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; -2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; -2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; -2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; -2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; -2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; -2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; -2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; -2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; -2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; -2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; -2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -2A1D;JOIN;Sm;0;ON;;;;;N;;;;; -2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; -2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; -2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; -2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; -2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; -2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; -2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; -2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; -2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; -2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; -2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; -2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; -2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; -2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; -2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; -2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; -2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; -2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; -2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; -2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; -2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; -2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; -2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; -2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; -2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; -2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; -2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; -2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; -2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; -2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; -2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; -2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; -2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; -2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; -2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; -2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; -2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; -2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; -2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; -2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; -2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; -2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; -2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; -2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; -2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; -2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; -2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; -2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; -2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A74;DOUBLE COLON EQUAL;Sm;0;ON; 003A 003A 003D;;;;Y;;;;; -2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D;;;;N;;;;; -2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D 003D;;;;N;;;;; -2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; -2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; -2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; -2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; -2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; -2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; -2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; -2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; -2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; -2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; -2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; -2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; -2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; -2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; -2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; -2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; -2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; -2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; -2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; -2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; -2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; -2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; -2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; -2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; -2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; -2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; -2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; -2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; -2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; -2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; -2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; -2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; -2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; -2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; -2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; -2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; -2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; -2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; -2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; -2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; -2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; -2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; -2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; -2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; -2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; -2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; -2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; -2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; -2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; -2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; -2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; -2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; -2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; -2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; -2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; -2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; -2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; -2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; -2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; -2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; -2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; -2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; -2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; -2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; -2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; -2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; -2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; -2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; -2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; -2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; -2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; -2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; -2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; -2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; -2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; -2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; -2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; -2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; -2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; -2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; -2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; -2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; -2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; -2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; -2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; -2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; -2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; -2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; -2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; -2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; -2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; -2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; -2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; -2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; -2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; -2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; -2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; -2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; -2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; -2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; -2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; -2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; -2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; -2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; -2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; -2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; -2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; -2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; -2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; -2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; -2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; -2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; -2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; -2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; -2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; -2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; -2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; -2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; -2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; -2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; -2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; -2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; -2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; -2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; -2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; -2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; -2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; -2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; -2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; -2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; -2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; -2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; -2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; -2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; -2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; -2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; -2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; -2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; -2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; -2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; -2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; -2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; -2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; -2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; -2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; -2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; -2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; -2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; -2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; -2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; -2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; -2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; -2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; -2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; -2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; -2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; -2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; -2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; -2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; -2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; -2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; -2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; -2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; -2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; -2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; -2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; -2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; -2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; -2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; -2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; -2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; -2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; -2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; -2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; -2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; -2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; -2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; -2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; -2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; -2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; -2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; -2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; -2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; -2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; -2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; -2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; -2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; -2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; -2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; -2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; -2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; -2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; -2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; -2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; -2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 -2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 -2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 -2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 -2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 -2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 -2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 -2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 -2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 -2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 -2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A -2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B -2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C -2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D -2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E -2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F -2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 -2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 -2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 -2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 -2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 -2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 -2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 -2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 -2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 -2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 -2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A -2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B -2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C -2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D -2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E -2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F -2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 -2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 -2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 -2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 -2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 -2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 -2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 -2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 -2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 -2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 -2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A -2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B -2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C -2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D -2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E -2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; -2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 -2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; -2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; -2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; -2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A -2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E -2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; -2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 -2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; -2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 -2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; -2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B -2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; -2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; -2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; -2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; -2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; -2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; -2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 -2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; -2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; -2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 -2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; -2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; -2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; -2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; -2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; -2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L; 006A;;;;N;;;;; -2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L; 0056;;;;N;;;;; -2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; -2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; -2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; -2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 -2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; -2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 -2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; -2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 -2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; -2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 -2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; -2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 -2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; -2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A -2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; -2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C -2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; -2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E -2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; -2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 -2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; -2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 -2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; -2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 -2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; -2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 -2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; -2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 -2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; -2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A -2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; -2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C -2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; -2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E -2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; -2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 -2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; -2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 -2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; -2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 -2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; -2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 -2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; -2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 -2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; -2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA -2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; -2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC -2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; -2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE -2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; -2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 -2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; -2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 -2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; -2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 -2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; -2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 -2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; -2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 -2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; -2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA -2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; -2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC -2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; -2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE -2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; -2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 -2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; -2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 -2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; -2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 -2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; -2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 -2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; -2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 -2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; -2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA -2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; -2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC -2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; -2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE -2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; -2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 -2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; -2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 -2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; -2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 -2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; -2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 -2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; -2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 -2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; -2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA -2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; -2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC -2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; -2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE -2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; -2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 -2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; -2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 -2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; -2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; -2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; -2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; -2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; -2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; -2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; -2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; -2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB -2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; -2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED -2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; -2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; -2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; -2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; -2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 -2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; -2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; -2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; -2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; -2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; -2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; -2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; -2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 -2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 -2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 -2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 -2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 -2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 -2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 -2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 -2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 -2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 -2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA -2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB -2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC -2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD -2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE -2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF -2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 -2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 -2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 -2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 -2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 -2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 -2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 -2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 -2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 -2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 -2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA -2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB -2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC -2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD -2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE -2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF -2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 -2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 -2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 -2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 -2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 -2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 -2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 -2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD -2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; -2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; -2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; -2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; -2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; -2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; -2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; -2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; -2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; -2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; -2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; -2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; -2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; -2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; -2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; -2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; -2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; -2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; -2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; -2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; -2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; -2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; -2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; -2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; -2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; -2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; -2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; -2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; -2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; -2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; -2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; -2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; -2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; -2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; -2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; -2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; -2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; -2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; -2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; -2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; -2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; -2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; -2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; -2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; -2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; -2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; -2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; -2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; -2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; -2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; -2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; -2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; -2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; -2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; -2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; -2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; -2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L; 2D61;;;;N;;;;; -2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; -2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; -2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; -2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; -2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; -2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; -2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; -2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; -2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; -2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; -2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; -2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; -2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; -2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; -2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; -2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; -2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; -2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; -2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; -2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; -2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; -2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; -2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; -2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; -2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; -2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; -2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; -2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; -2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; -2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; -2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; -2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; -2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; -2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; -2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; -2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; -2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; -2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; -2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; -2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; -2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; -2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; -2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; -2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; -2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; -2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; -2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; -2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; -2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; -2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; -2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; -2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; -2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; -2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; -2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; -2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; -2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; -2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; -2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; -2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; -2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; -2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; -2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; -2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; -2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; -2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; -2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; -2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; -2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; -2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; -2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; -2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; -2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; -2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; -2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; -2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; -2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; -2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; -2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; -2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; -2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; -2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; -2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; -2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; -2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; -2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; -2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; -2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; -2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; -2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; -2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; -2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; -2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; -2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; -2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; -2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; -2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; -2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; -2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; -2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; -2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; -2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; -2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; -2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; -2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; -2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; -2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; -2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; -2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; -2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; -2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; -2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; -2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; -2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; -2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; -2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; -2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; -2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; -2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; -2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; -2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; -2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; -2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; -2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; -2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; -2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; -2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; -2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; -2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; -2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; -2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; -2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; -2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; -2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; -2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; -2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; -2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; -2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; -2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; -2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; -2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; -2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; -2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; -2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; -2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; -2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; -2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; -2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; -2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; -2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; -2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; -2E30;RING POINT;Po;0;ON;;;;;N;;;;; -2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; -2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; -2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; -2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; -2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; -2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; -2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; -2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; -2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; -2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; -2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; -2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; -2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; -2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; -2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; -2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; -2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; -2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; -2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; -2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; -2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; -2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; -2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; -2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; -2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; -2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; -2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; -2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; -2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; -2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; -2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; -2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; -2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; -2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; -2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; -2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; -2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; -2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; -2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; -2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; -2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; -2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; -2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; -2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; -2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; -2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; -2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; -2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; -2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; -2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; -2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; -2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; -2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; -2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; -2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; -2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; -2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; -2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; -2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; -2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; -2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; -2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; -2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; -2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; -2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; -2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; -2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; -2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; -2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; -2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; -2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; -2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; -2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; -2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; -2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; -2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; -2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; -2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; -2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; -2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; -2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; -2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; -2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; -2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; -2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; -2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; -2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; -2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; -2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; -2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; -2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; -2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; -2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; -2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; -2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; -2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; -2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; -2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; -2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; -2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; -2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; -2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; -2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; -2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; -2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; -2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; -2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; -2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; -2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; -2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; -2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; -2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; -2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; -2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; -2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; -2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; -2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; -2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; -2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; -2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; -2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; -2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; -2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; -2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; -2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; -2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; -2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; -2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; -2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; -2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; -2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; -2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; -2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; -2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; -2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; -2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; -2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; -2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; -2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; -2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; -2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; -2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; -2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; -2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; -2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; -2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; -2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; -2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; -2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; -2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; -2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; -2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; -2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; -2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; -2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; -2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; -2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; -2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; -2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; -2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; -2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; -2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; -2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; -2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; -2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; -2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; -2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; -2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; -2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; -2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; -2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; -2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; -2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; -2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; -2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; -2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; -2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; -2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; -2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; -2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; -2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; -2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; -2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; -2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; -2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; -2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; -2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; -2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; -2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; -2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; -2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; -2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; -2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; -2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; -2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; -2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; -2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; -2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; -2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; -2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; -2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; -2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; -2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; -2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; -2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; -2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; -2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; -2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; -2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; -2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; -2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; -2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; -2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; -2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; -2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; -2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; -2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; -2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; -2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; -2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; -2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; -2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; -2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; -2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; -2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; -2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; -2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; -2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; -2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; -2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; -2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; -2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; -2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; -2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; -2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; -2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; -2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; -2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; -2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; -2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; -2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; -2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; -2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; -2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; -2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; -2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; -2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; -2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; -2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; -2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; -2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; -2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; -2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; -2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; -2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; -2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; -2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; -2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; -2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; -2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; -2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; -2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; -2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; -2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; -2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; -2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; -2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; -2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; -2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; -2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; -2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; -2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; -2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; -2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; -2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; -2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; -2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; -2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; -2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; -2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; -2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; -2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; -2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; -2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; -2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; -2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; -2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; -2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; -2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; -2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; -2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; -2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; -2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; -2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; -2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; -2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; -2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; -2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; -2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; -2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; -2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; -2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; -2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; -2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; -2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; -2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; -2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; -2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; -2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; -2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; -2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; -2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; -2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; -2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; -2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; -2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; -2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; -2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; -2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; -2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; -2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; -2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; -2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; -2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; -2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; -2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; -2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; -2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; -2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; -2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; -2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; -2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; -2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; -2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; -2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; -2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; -2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; -2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; -2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; -2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; -2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; -2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; -2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; -2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; -2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; -2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; -2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; -2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; -2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; -2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; -2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; -2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; -2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; -2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; -2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; -2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; -2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; -2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; -2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; -3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; -3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; -3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; -3003;DITTO MARK;Po;0;ON;;;;;N;;;;; -3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; -3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; -3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; -3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; -3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; -3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; -300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; -300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; -300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; -300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; -300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; -300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; -3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; -3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; -3012;POSTAL MARK;So;0;ON;;;;;N;;;;; -3013;GETA MARK;So;0;ON;;;;;N;;;;; -3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; -3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; -3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; -3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; -3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; -3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; -301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; -301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; -301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; -301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; -301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; -301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; -3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; -3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; -3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; -3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; -3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; -3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; -3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; -3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; -3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; -3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; -302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; -302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; -302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; -302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; -302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; -302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; -3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; -3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; -3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; -3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; -3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; -3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; -3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; -3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; -3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; -3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; -303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; -303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; -303C;MASU MARK;Lo;0;L;;;;;N;;;;; -303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; -303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; -303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; -3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; -3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; -3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; -3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; -3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; -3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; -3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; -3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; -304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; -304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; -304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; -304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; -304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; -304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; -3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; -3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; -3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; -3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; -3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; -3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; -3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; -3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; -3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; -3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; -305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; -305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; -305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; -305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; -305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; -305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; -3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; -3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; -3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; -3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; -3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; -3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; -3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; -3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; -3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; -3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; -306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; -306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; -306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; -306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; -306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; -306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; -3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; -3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; -3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; -3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; -3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; -3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; -3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; -3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; -3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; -3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; -307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; -307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; -307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; -307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; -307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; -307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; -3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; -3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; -3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; -3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; -3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; -3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; -3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; -3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; -3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; -3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; -308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; -308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; -308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; -308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; -308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; -308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; -3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; -3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; -3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; -3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; -3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; -3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; -3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; -3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; -309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; -309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; -309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; -309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; -309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; -309F;HIRAGANA DIGRAPH YORI;Lo;0;L; 3088 308A;;;;N;;;;; -30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; -30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; -30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; -30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; -30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; -30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; -30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; -30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; -30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; -30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; -30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; -30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; -30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; -30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; -30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; -30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; -30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; -30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; -30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; -30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; -30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; -30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; -30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; -30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; -30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; -30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; -30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; -30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; -30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; -30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; -30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; -30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; -30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; -30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; -30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; -30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; -30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; -30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; -30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; -30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; -30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; -30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; -30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; -30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; -30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; -30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; -30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; -30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; -30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; -30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; -30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; -30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; -30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; -30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; -30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; -30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; -30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; -30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; -30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; -30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; -30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; -30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; -30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; -30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; -30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; -30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; -30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; -30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; -30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; -30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; -30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; -30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; -30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; -30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; -30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; -30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; -30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; -30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; -30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; -30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; -30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; -30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; -30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; -30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; -30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; -30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; -30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; -30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; -30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; -30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; -30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; -30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; -30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; -30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; -30FF;KATAKANA DIGRAPH KOTO;Lo;0;L; 30B3 30C8;;;;N;;;;; -3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; -3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; -3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; -3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; -3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; -310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; -310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; -310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; -310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; -310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; -310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; -3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; -3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; -3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; -3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; -3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; -3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; -3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; -3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; -3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; -3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; -311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; -311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; -311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; -311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; -311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; -311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; -3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; -3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; -3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; -3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; -3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; -3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; -3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; -3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; -3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; -3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; -312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; -312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; -312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; -312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; -3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; -3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; -3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; -3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; -3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; -3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; -3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; -3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; -3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; -313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; -313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; -313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; -313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; -313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; -313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; -3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; -3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; -3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; -3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; -3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; -3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; -3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; -3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; -3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; -3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; -314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; -314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; -314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; -314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; -314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; -314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; -3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; -3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; -3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; -3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; -3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; -3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; -3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; -3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; -3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; -3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; -315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; -315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; -315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; -315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; -315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; -315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; -3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; -3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; -3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; -3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; -3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; -3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; -3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; -3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; -3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; -3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; -316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; -316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; -316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; -316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; -316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; -316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; -3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; -3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; -3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; -3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; -3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; -3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; -3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; -3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; -3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; -3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; -317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; -317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; -317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; -317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; -317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; -317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; -3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; -3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; -3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; -3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; -3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; -3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; -3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; -3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; -3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; -3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; -318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; -318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; -318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; -318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; -318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; -3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; -3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; -3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;;;; -3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;;;; -3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;;;; -3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;;;; -3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;;;; -3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;;;; -3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;;;; -3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;;;; -319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;;;; -319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;;;; -319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;;;; -319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;;;; -319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;;;; -319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;;;; -31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; -31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; -31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; -31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; -31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; -31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; -31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; -31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; -31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; -31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; -31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; -31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; -31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; -31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; -31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; -31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; -31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; -31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; -31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; -31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; -31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; -31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; -31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; -31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; -31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; -31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; -31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; -31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; -31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; -31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; -31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; -31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; -31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; -31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; -31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; -31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; -31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; -31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; -31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; -31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; -31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; -31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; -31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; -31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; -31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; -31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; -31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; -31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; -31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; -31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; -31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; -31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; -31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; -31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; -31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; -31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; -31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; -31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; -31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; -31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; -31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; -31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; -31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; -31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; -31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; -31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; -31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; -31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; -31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; -31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; -31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; -31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; -31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; -31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; -31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; -31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; -31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; -31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; -31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; -3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; -3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; -3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; -3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; -3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; -3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; -3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; -3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; -3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; -3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; -320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; -320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; -320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; -320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; -320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; -320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; -3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; -3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; -3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; -3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; -3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; -3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; -3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; -3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; -3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; -3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; -321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; -321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; -321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; -321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON; 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; -321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON; 0028 110B 1169 1112 116E 0029;;;;N;;;;; -3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; -3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; -3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; -3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; -3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; -3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; -3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; -3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; -3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; -3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; -322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; -322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; -322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; -322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; -322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; -322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; -3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; -3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; -3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; -3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; -3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; -3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; -3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; -3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; -3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; -3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; -323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; -323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; -323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; -323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; -323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; -323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; -3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; -3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; -3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; -3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; -3244;CIRCLED IDEOGRAPH QUESTION;So;0;L; 554F;;;;N;;;;; -3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L; 5E7C;;;;N;;;;; -3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L; 6587;;;;N;;;;; -3247;CIRCLED IDEOGRAPH KOTO;So;0;L; 7B8F;;;;N;;;;; -3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; -3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; -324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; -324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; -324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; -324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; -324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; -324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; -3250;PARTNERSHIP SIGN;So;0;ON; 0050 0054 0045;;;;N;;;;; -3251;CIRCLED NUMBER TWENTY ONE;No;0;ON; 0032 0031;;;21;N;;;;; -3252;CIRCLED NUMBER TWENTY TWO;No;0;ON; 0032 0032;;;22;N;;;;; -3253;CIRCLED NUMBER TWENTY THREE;No;0;ON; 0032 0033;;;23;N;;;;; -3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON; 0032 0034;;;24;N;;;;; -3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON; 0032 0035;;;25;N;;;;; -3256;CIRCLED NUMBER TWENTY SIX;No;0;ON; 0032 0036;;;26;N;;;;; -3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON; 0032 0037;;;27;N;;;;; -3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON; 0032 0038;;;28;N;;;;; -3259;CIRCLED NUMBER TWENTY NINE;No;0;ON; 0032 0039;;;29;N;;;;; -325A;CIRCLED NUMBER THIRTY;No;0;ON; 0033 0030;;;30;N;;;;; -325B;CIRCLED NUMBER THIRTY ONE;No;0;ON; 0033 0031;;;31;N;;;;; -325C;CIRCLED NUMBER THIRTY TWO;No;0;ON; 0033 0032;;;32;N;;;;; -325D;CIRCLED NUMBER THIRTY THREE;No;0;ON; 0033 0033;;;33;N;;;;; -325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON; 0033 0034;;;34;N;;;;; -325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON; 0033 0035;;;35;N;;;;; -3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; -3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; -3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; -3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; -3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; -3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; -3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; -3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; -3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; -3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; -326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; -326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; -326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; -326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; -326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; -326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; -3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; -3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; -3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; -3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; -3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; -3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; -3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; -3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; -3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; -3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; -327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; -327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; -327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON; 110E 1161 11B7 1100 1169;;;;N;;;;; -327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON; 110C 116E 110B 1174;;;;N;;;;; -327E;CIRCLED HANGUL IEUNG U;So;0;ON; 110B 116E;;;;N;;;;; -327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; -3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; -3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; -3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; -3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; -3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; -3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; -3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; -3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; -3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; -3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; -328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; -328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; -328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; -328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; -328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; -328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; -3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; -3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; -3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; -3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; -3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; -3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; -3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; -3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; -3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; -3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; -329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; -329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; -329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; -329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; -329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; -329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; -32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; -32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; -32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; -32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; -32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; -32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; -32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; -32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; -32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; -32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; -32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; -32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; -32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; -32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; -32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; -32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; -32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; -32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON; 0033 0036;;;36;N;;;;; -32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON; 0033 0037;;;37;N;;;;; -32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON; 0033 0038;;;38;N;;;;; -32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON; 0033 0039;;;39;N;;;;; -32B5;CIRCLED NUMBER FORTY;No;0;ON; 0034 0030;;;40;N;;;;; -32B6;CIRCLED NUMBER FORTY ONE;No;0;ON; 0034 0031;;;41;N;;;;; -32B7;CIRCLED NUMBER FORTY TWO;No;0;ON; 0034 0032;;;42;N;;;;; -32B8;CIRCLED NUMBER FORTY THREE;No;0;ON; 0034 0033;;;43;N;;;;; -32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON; 0034 0034;;;44;N;;;;; -32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON; 0034 0035;;;45;N;;;;; -32BB;CIRCLED NUMBER FORTY SIX;No;0;ON; 0034 0036;;;46;N;;;;; -32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON; 0034 0037;;;47;N;;;;; -32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON; 0034 0038;;;48;N;;;;; -32BE;CIRCLED NUMBER FORTY NINE;No;0;ON; 0034 0039;;;49;N;;;;; -32BF;CIRCLED NUMBER FIFTY;No;0;ON; 0035 0030;;;50;N;;;;; -32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; -32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; -32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; -32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; -32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; -32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; -32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; -32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; -32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; -32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; -32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; -32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; -32CC;SQUARE HG;So;0;ON; 0048 0067;;;;N;;;;; -32CD;SQUARE ERG;So;0;ON; 0065 0072 0067;;;;N;;;;; -32CE;SQUARE EV;So;0;ON; 0065 0056;;;;N;;;;; -32CF;LIMITED LIABILITY SIGN;So;0;ON; 004C 0054 0044;;;;N;;;;; -32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; -32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; -32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; -32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; -32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; -32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; -32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; -32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; -32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; -32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; -32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; -32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; -32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; -32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; -32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; -32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; -32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; -32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; -32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; -32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; -32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; -32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; -32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; -32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; -32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; -32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; -32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; -32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; -32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; -32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; -32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; -32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; -32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; -32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; -32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; -32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; -32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; -32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; -32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; -32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; -32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; -32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; -32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; -32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; -32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; -32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; -32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; -3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; -3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; -3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; -3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; -3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; -3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; -3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; -3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; -3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; -3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; -330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; -330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; -330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; -330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; -330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; -330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; -3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; -3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; -3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; -3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; -3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; -3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; -3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; -3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; -3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; -3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; -331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; -331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; -331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; -331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; -331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; -331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; -3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; -3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; -3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; -3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; -3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; -3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; -3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; -3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; -3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; -3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; -332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; -332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; -332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; -332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; -332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; -332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; -3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; -3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; -3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; -3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; -3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; -3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; -3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; -3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; -3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; -3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; -333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; -333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; -333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; -333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; -333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; -333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; -3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; -3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; -3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; -3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; -3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; -3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; -3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; -3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; -3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; -3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; -334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; -334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; -334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; -334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; -334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; -334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; -3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; -3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; -3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; -3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; -3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; -3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; -3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; -3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; -3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; -3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; -335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; -335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; -335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; -335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; -335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; -335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; -3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; -3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; -3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; -3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; -3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; -3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; -3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; -3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; -3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; -3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; -336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; -336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; -336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; -336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; -336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; -336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; -3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; -3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; -3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; -3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; -3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; -3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; -3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; -3377;SQUARE DM;So;0;ON; 0064 006D;;;;N;;;;; -3378;SQUARE DM SQUARED;So;0;ON; 0064 006D 00B2;;;;N;;;;; -3379;SQUARE DM CUBED;So;0;ON; 0064 006D 00B3;;;;N;;;;; -337A;SQUARE IU;So;0;ON; 0049 0055;;;;N;;;;; -337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; -337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; -337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; -337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; -337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; -3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; -3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; -3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; -3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; -3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; -3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; -3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; -3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; -3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; -3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; -338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; -338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; -338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; -338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; -338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; -338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; -3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; -3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; -3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; -3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; -3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; -3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; -3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; -3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; -3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; -3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; -339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; -339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; -339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; -339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; -339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; -339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; -33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; -33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; -33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; -33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; -33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; -33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; -33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; -33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; -33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; -33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; -33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; -33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; -33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; -33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; -33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; -33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; -33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; -33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; -33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; -33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; -33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; -33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; -33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; -33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; -33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; -33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; -33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; -33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; -33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; -33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; -33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; -33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; -33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; -33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; -33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; -33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; -33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; -33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; -33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; -33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; -33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; -33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; -33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; -33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; -33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; -33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; -33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; -33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; -33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; -33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; -33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; -33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; -33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; -33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; -33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; -33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; -33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; -33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; -33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; -33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; -33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; -33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; -33DE;SQUARE V OVER M;So;0;ON; 0056 2215 006D;;;;N;;;;; -33DF;SQUARE A OVER M;So;0;ON; 0041 2215 006D;;;;N;;;;; -33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; -33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; -33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; -33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; -33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; -33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; -33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; -33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; -33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; -33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; -33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; -33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; -33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; -33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; -33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; -33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; -33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; -33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; -33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; -33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; -33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; -33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; -33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; -33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; -33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; -33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; -33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; -33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; -33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; -33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; -33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; -33FF;SQUARE GAL;So;0;ON; 0067 0061 006C;;;;N;;;;; -3400;;Lo;0;L;;;;;N;;;;; -4DB5;;Lo;0;L;;;;;N;;;;; -4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; -4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; -4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; -4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; -4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; -4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; -4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; -4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; -4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; -4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; -4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; -4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; -4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; -4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; -4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; -4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; -4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; -4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; -4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; -4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; -4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; -4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; -4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; -4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; -4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; -4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; -4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; -4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; -4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; -4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; -4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; -4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; -4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; -4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; -4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; -4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; -4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; -4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; -4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; -4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; -4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; -4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; -4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; -4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; -4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; -4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; -4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; -4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; -4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; -4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; -4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; -4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; -4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; -4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; -4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; -4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; -4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; -4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; -4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; -4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; -4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; -4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; -4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; -4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; -4E00;;Lo;0;L;;;;;N;;;;; -9FD5;;Lo;0;L;;;;;N;;;;; -A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; -A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; -A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; -A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; -A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; -A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; -A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; -A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; -A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; -A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; -A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; -A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; -A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; -A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; -A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; -A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; -A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; -A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; -A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; -A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; -A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; -A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; -A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; -A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; -A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; -A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; -A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; -A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; -A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; -A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; -A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; -A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; -A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; -A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; -A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; -A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; -A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; -A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; -A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; -A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; -A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; -A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; -A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; -A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; -A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; -A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; -A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; -A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; -A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; -A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; -A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; -A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; -A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; -A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; -A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; -A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; -A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; -A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; -A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; -A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; -A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; -A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; -A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; -A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; -A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; -A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; -A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; -A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; -A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; -A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; -A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; -A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; -A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; -A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; -A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; -A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; -A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; -A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; -A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; -A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; -A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; -A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; -A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; -A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; -A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; -A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; -A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; -A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; -A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; -A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; -A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; -A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; -A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; -A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; -A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; -A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; -A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; -A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; -A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; -A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; -A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; -A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; -A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; -A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; -A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; -A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; -A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; -A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; -A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; -A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; -A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; -A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; -A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; -A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; -A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; -A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; -A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; -A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; -A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; -A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; -A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; -A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; -A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; -A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; -A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; -A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; -A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; -A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; -A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; -A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; -A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; -A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; -A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; -A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; -A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; -A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; -A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; -A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; -A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; -A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; -A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; -A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; -A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; -A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; -A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; -A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; -A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; -A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; -A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; -A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; -A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; -A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; -A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; -A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; -A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; -A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; -A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; -A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; -A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; -A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; -A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; -A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; -A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; -A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; -A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; -A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; -A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; -A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; -A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; -A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; -A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; -A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; -A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; -A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; -A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; -A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; -A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; -A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; -A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; -A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; -A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; -A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; -A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; -A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; -A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; -A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; -A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; -A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; -A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; -A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; -A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; -A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; -A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; -A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; -A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; -A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; -A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; -A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; -A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; -A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; -A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; -A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; -A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; -A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; -A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; -A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; -A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; -A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; -A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; -A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; -A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; -A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; -A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; -A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; -A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; -A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; -A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; -A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; -A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; -A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; -A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; -A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; -A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; -A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; -A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; -A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; -A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; -A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; -A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; -A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; -A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; -A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; -A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; -A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; -A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; -A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; -A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; -A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; -A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; -A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; -A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; -A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; -A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; -A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; -A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; -A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; -A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; -A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; -A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; -A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; -A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; -A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; -A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; -A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; -A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; -A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; -A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; -A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; -A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; -A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; -A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; -A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; -A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; -A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; -A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; -A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; -A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; -A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; -A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; -A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; -A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; -A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; -A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; -A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; -A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; -A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; -A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; -A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; -A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; -A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; -A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; -A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; -A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; -A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; -A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; -A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; -A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; -A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; -A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; -A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; -A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; -A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; -A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; -A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; -A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; -A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; -A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; -A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; -A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; -A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; -A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; -A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; -A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; -A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; -A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; -A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; -A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; -A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; -A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; -A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; -A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; -A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; -A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; -A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; -A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; -A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; -A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; -A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; -A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; -A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; -A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; -A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; -A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; -A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; -A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; -A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; -A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; -A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; -A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; -A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; -A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; -A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; -A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; -A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; -A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; -A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; -A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; -A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; -A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; -A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; -A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; -A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; -A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; -A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; -A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; -A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; -A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; -A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; -A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; -A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; -A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; -A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; -A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; -A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; -A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; -A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; -A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; -A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; -A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; -A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; -A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; -A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; -A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; -A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; -A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; -A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; -A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; -A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; -A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; -A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; -A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; -A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; -A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; -A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; -A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; -A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; -A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; -A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; -A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; -A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; -A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; -A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; -A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; -A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; -A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; -A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; -A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; -A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; -A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; -A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; -A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; -A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; -A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; -A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; -A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; -A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; -A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; -A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; -A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; -A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; -A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; -A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; -A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; -A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; -A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; -A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; -A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; -A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; -A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; -A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; -A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; -A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; -A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; -A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; -A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; -A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; -A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; -A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; -A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; -A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; -A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; -A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; -A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; -A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; -A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; -A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; -A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; -A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; -A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; -A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; -A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; -A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; -A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; -A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; -A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; -A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; -A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; -A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; -A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; -A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; -A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; -A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; -A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; -A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; -A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; -A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; -A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; -A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; -A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; -A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; -A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; -A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; -A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; -A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; -A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; -A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; -A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; -A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; -A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; -A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; -A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; -A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; -A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; -A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; -A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; -A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; -A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; -A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; -A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; -A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; -A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; -A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; -A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; -A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; -A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; -A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; -A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; -A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; -A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; -A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; -A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; -A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; -A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; -A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; -A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; -A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; -A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; -A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; -A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; -A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; -A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; -A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; -A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; -A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; -A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; -A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; -A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; -A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; -A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; -A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; -A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; -A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; -A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; -A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; -A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; -A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; -A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; -A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; -A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; -A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; -A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; -A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; -A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; -A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; -A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; -A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; -A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; -A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; -A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; -A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; -A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; -A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; -A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; -A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; -A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; -A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; -A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; -A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; -A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; -A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; -A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; -A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; -A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; -A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; -A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; -A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; -A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; -A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; -A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; -A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; -A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; -A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; -A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; -A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; -A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; -A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; -A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; -A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; -A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; -A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; -A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; -A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; -A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; -A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; -A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; -A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; -A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; -A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; -A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; -A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; -A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; -A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; -A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; -A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; -A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; -A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; -A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; -A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; -A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; -A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; -A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; -A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; -A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; -A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; -A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; -A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; -A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; -A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; -A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; -A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; -A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; -A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; -A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; -A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; -A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; -A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; -A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; -A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; -A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; -A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; -A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; -A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; -A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; -A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; -A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; -A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; -A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; -A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; -A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; -A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; -A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; -A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; -A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; -A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; -A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; -A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; -A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; -A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; -A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; -A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; -A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; -A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; -A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; -A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; -A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; -A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; -A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; -A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; -A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; -A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; -A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; -A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; -A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; -A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; -A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; -A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; -A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; -A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; -A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; -A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; -A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; -A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; -A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; -A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; -A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; -A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; -A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; -A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; -A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; -A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; -A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; -A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; -A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; -A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; -A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; -A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; -A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; -A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; -A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; -A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; -A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; -A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; -A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; -A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; -A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; -A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; -A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; -A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; -A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; -A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; -A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; -A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; -A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; -A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; -A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; -A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; -A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; -A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; -A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; -A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; -A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; -A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; -A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; -A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; -A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; -A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; -A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; -A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; -A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; -A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; -A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; -A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; -A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; -A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; -A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; -A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; -A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; -A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; -A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; -A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; -A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; -A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; -A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; -A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; -A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; -A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; -A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; -A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; -A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; -A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; -A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; -A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; -A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; -A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; -A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; -A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; -A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; -A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; -A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; -A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; -A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; -A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; -A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; -A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; -A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; -A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; -A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; -A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; -A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; -A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; -A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; -A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; -A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; -A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; -A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; -A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; -A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; -A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; -A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; -A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; -A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; -A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; -A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; -A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; -A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; -A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; -A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; -A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; -A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; -A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; -A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; -A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; -A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; -A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; -A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; -A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; -A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; -A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; -A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; -A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; -A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; -A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; -A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; -A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; -A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; -A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; -A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; -A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; -A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; -A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; -A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; -A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; -A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; -A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; -A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; -A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; -A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; -A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; -A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; -A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; -A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; -A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; -A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; -A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; -A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; -A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; -A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; -A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; -A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; -A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; -A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; -A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; -A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; -A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; -A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; -A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; -A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; -A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; -A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; -A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; -A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; -A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; -A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; -A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; -A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; -A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; -A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; -A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; -A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; -A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; -A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; -A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; -A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; -A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; -A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; -A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; -A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; -A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; -A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; -A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; -A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; -A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; -A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; -A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; -A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; -A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; -A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; -A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; -A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; -A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; -A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; -A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; -A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; -A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; -A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; -A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; -A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; -A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; -A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; -A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; -A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; -A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; -A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; -A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; -A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; -A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; -A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; -A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; -A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; -A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; -A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; -A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; -A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; -A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; -A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; -A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; -A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; -A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; -A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; -A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; -A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; -A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; -A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; -A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; -A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; -A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; -A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; -A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; -A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; -A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; -A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; -A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; -A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; -A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; -A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; -A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; -A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; -A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; -A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; -A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; -A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; -A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; -A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; -A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; -A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; -A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; -A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; -A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; -A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; -A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; -A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; -A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; -A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; -A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; -A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; -A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; -A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; -A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; -A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; -A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; -A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; -A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; -A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; -A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; -A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; -A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; -A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; -A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; -A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; -A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; -A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; -A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; -A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; -A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; -A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; -A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; -A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; -A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; -A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; -A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; -A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; -A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; -A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; -A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; -A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; -A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; -A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; -A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; -A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; -A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; -A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; -A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; -A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; -A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; -A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; -A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; -A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; -A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; -A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; -A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; -A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; -A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; -A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; -A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; -A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; -A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; -A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; -A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; -A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; -A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; -A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; -A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; -A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; -A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; -A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; -A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; -A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; -A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; -A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; -A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; -A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; -A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; -A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; -A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; -A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; -A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; -A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; -A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; -A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; -A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; -A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; -A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; -A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; -A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; -A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; -A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; -A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; -A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; -A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; -A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; -A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; -A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; -A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; -A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; -A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; -A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; -A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; -A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; -A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; -A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; -A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; -A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; -A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; -A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; -A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; -A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; -A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; -A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; -A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; -A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; -A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; -A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; -A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; -A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; -A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; -A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; -A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; -A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; -A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; -A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; -A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; -A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; -A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; -A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; -A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; -A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; -A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; -A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; -A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; -A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; -A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; -A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; -A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; -A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; -A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; -A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; -A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; -A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; -A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; -A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; -A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; -A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; -A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; -A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; -A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; -A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; -A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; -A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; -A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; -A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; -A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; -A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; -A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; -A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; -A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; -A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; -A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; -A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; -A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; -A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; -A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; -A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; -A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; -A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; -A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; -A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; -A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; -A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; -A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; -A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; -A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; -A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; -A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; -A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; -A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; -A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; -A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; -A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; -A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; -A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; -A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; -A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; -A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; -A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; -A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; -A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; -A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; -A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; -A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; -A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; -A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; -A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; -A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; -A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; -A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; -A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; -A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; -A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; -A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; -A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; -A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; -A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; -A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; -A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; -A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; -A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; -A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; -A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; -A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; -A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; -A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; -A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; -A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; -A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; -A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; -A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; -A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; -A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; -A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; -A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; -A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; -A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; -A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; -A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; -A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; -A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; -A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; -A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; -A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; -A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; -A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; -A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; -A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; -A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; -A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; -A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; -A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; -A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; -A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; -A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; -A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; -A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; -A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; -A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; -A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; -A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; -A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; -A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; -A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; -A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; -A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; -A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; -A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; -A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; -A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; -A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; -A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; -A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; -A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; -A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; -A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; -A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; -A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; -A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; -A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; -A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; -A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; -A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; -A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; -A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; -A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; -A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; -A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; -A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; -A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; -A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; -A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; -A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; -A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; -A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; -A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; -A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; -A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; -A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; -A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; -A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; -A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; -A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; -A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; -A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; -A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; -A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; -A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; -A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; -A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; -A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; -A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; -A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; -A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; -A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; -A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; -A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; -A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; -A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; -A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; -A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; -A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; -A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; -A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; -A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; -A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; -A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; -A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; -A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; -A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; -A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; -A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; -A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; -A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; -A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; -A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; -A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; -A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; -A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; -A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; -A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; -A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; -A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; -A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; -A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; -A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; -A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; -A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; -A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; -A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; -A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; -A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; -A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; -A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; -A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; -A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; -A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; -A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; -A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; -A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; -A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; -A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; -A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; -A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; -A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; -A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; -A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; -A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; -A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; -A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; -A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; -A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; -A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; -A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; -A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; -A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; -A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; -A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; -A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; -A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; -A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; -A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; -A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; -A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; -A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; -A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; -A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; -A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; -A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; -A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; -A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; -A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; -A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; -A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; -A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; -A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; -A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; -A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; -A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; -A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; -A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; -A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; -A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; -A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; -A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; -A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; -A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; -A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; -A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; -A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; -A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; -A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; -A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; -A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; -A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; -A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; -A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; -A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; -A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; -A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; -A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; -A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; -A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; -A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; -A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; -A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; -A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; -A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; -A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; -A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; -A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; -A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; -A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; -A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; -A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; -A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; -A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; -A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; -A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; -A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; -A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; -A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; -A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; -A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; -A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; -A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; -A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; -A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; -A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; -A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; -A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; -A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; -A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; -A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; -A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; -A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; -A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; -A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; -A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; -A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; -A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; -A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; -A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; -A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; -A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; -A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; -A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; -A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; -A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; -A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; -A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; -A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; -A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; -A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; -A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; -A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; -A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; -A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; -A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; -A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; -A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; -A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; -A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; -A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; -A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; -A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; -A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; -A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; -A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; -A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; -A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; -A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; -A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; -A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; -A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; -A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; -A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; -A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; -A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; -A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; -A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; -A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; -A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; -A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; -A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; -A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; -A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; -A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; -A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; -A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; -A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; -A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; -A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; -A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; -A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; -A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; -A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; -A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; -A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; -A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; -A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; -A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; -A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; -A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; -A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; -A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; -A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; -A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; -A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; -A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; -A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; -A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; -A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; -A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; -A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; -A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; -A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; -A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; -A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; -A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; -A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; -A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; -A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; -A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; -A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; -A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; -A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; -A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; -A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; -A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; -A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; -A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; -A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; -A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; -A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; -A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; -A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; -A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; -A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; -A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; -A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; -A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; -A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; -A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; -A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; -A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; -A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; -A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; -A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; -A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; -A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; -A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; -A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; -A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; -A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; -A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; -A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; -A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; -A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; -A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; -A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; -A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; -A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; -A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; -A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; -A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; -A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; -A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; -A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; -A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; -A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; -A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; -A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; -A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; -A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; -A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; -A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; -A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; -A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; -A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; -A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; -A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; -A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; -A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; -A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; -A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; -A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; -A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; -A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; -A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; -A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; -A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; -A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; -A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; -A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; -A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; -A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; -A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; -A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; -A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; -A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; -A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; -A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; -A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; -A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; -A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; -A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; -A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; -A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; -A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; -A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; -A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; -A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; -A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; -A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; -A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; -A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; -A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; -A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; -A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; -A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; -A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; -A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; -A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; -A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; -A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; -A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; -A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; -A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; -A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; -A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; -A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; -A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; -A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; -A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; -A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; -A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; -A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; -A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; -A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; -A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; -A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; -A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 -A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; -A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 -A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; -A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 -A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; -A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 -A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; -A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 -A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; -A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A -A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; -A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C -A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; -A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E -A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; -A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 -A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; -A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 -A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; -A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 -A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; -A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 -A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; -A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 -A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; -A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A -A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; -A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C -A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; -A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E -A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; -A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 -A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; -A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 -A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; -A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 -A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; -A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 -A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; -A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 -A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; -A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A -A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; -A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C -A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; -A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; -A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; -A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; -A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; -A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; -A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; -A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; -A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; -A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; -A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; -A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; -A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; -A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; -A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; -A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; -A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 -A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; -A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 -A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; -A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 -A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; -A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 -A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; -A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 -A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; -A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A -A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; -A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C -A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; -A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E -A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; -A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 -A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; -A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 -A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; -A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 -A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; -A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 -A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; -A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 -A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; -A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A -A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; -A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; -A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; -A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; -A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; -A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; -A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; -A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; -A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; -A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; -A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; -A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; -A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; -A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; -A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; -A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; -A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; -A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; -A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; -A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; -A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; -A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; -A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; -A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; -A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; -A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; -A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; -A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; -A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; -A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; -A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; -A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; -A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; -A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; -A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; -A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; -A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; -A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; -A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; -A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; -A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; -A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; -A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; -A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; -A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; -A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; -A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; -A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; -A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; -A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; -A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; -A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; -A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; -A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; -A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; -A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; -A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; -A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; -A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; -A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; -A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; -A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; -A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; -A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; -A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; -A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; -A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; -A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; -A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; -A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; -A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; -A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; -A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; -A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; -A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; -A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; -A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; -A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; -A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; -A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; -A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; -A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; -A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; -A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; -A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; -A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; -A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; -A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; -A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; -A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; -A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; -A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; -A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; -A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; -A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; -A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; -A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; -A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; -A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; -A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; -A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; -A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; -A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; -A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; -A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; -A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; -A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; -A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; -A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; -A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; -A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; -A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; -A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 -A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; -A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 -A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; -A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 -A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; -A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 -A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; -A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A -A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; -A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C -A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; -A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E -A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; -A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; -A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; -A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 -A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; -A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 -A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; -A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 -A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; -A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 -A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; -A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A -A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; -A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C -A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; -A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E -A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; -A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 -A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; -A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 -A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; -A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 -A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; -A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 -A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; -A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 -A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; -A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A -A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; -A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C -A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; -A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E -A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; -A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 -A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; -A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 -A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; -A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 -A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; -A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 -A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; -A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 -A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; -A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A -A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; -A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C -A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; -A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E -A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; -A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 -A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; -A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 -A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; -A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 -A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; -A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 -A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; -A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 -A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; -A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A -A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; -A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C -A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; -A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E -A770;MODIFIER LETTER US;Lm;0;L; A76F;;;;N;;;;; -A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; -A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; -A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; -A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; -A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; -A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; -A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; -A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; -A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; -A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 -A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; -A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B -A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; -A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; -A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E -A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; -A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 -A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; -A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 -A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; -A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 -A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; -A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 -A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; -A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; -A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; -A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; -A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B -A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; -A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; -A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; -A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; -A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 -A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; -A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 -A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; -A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 -A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; -A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 -A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; -A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A -A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; -A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C -A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; -A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E -A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; -A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 -A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; -A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 -A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; -A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 -A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; -A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 -A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; -A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 -A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; -A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; -A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; -A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; -A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; -A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; -A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; -A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; -A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; -A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 -A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; -A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 -A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; -A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; -A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; -A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; -A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; -A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; -A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; -A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; -A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; -A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; -A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; -A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; -A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; -A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; -A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; -A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; -A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; -A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; -A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; -A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; -A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; -A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; -A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; -A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; -A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; -A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; -A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; -A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; -A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; -A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; -A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; -A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; -A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; -A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; -A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; -A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; -A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; -A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; -A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; -A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; -A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; -A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; -A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; -A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; -A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; -A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; -A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; -A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; -A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; -A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; -A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; -A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; -A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; -A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; -A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; -A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; -A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; -A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; -A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; -A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; -A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; -A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; -A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; -A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; -A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; -A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; -A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; -A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; -A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; -A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; -A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; -A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; -A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; -A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; -A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; -A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; -A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; -A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; -A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; -A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; -A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; -A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; -A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; -A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; -A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; -A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; -A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; -A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; -A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; -A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; -A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; -A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; -A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; -A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; -A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; -A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; -A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; -A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; -A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; -A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; -A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; -A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; -A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; -A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; -A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; -A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; -A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; -A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; -A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; -A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; -A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; -A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; -A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; -A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; -A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; -A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; -A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; -A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; -A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; -A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; -A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; -A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; -A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; -A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; -A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; -A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; -A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; -A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; -A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; -A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; -A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; -A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; -A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; -A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; -A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; -A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; -A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; -A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; -A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; -A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; -A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; -A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; -A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; -A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; -A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; -A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; -A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; -A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; -A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; -A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; -A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; -A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; -A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; -A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; -A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; -A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; -A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; -A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; -A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; -A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; -A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; -A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; -A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; -A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; -A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; -A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; -A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; -A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; -A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; -A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; -A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; -A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; -A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; -A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; -A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; -A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; -A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; -A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; -A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; -A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; -A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; -A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; -A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; -A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; -A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; -A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; -A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; -A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; -A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; -A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; -A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; -A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; -A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; -A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; -A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; -A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; -A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; -A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; -A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; -A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; -A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; -A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; -A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; -A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; -A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; -A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; -A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; -A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; -A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; -A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; -A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; -A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; -A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; -A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; -A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; -A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; -A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; -A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; -A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; -A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; -A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; -A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; -A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; -A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; -A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; -A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; -A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; -A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; -A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; -A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; -A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; -A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; -A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; -A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; -A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; -A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; -A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; -A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; -A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; -A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; -A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; -A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; -A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; -A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; -A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; -A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; -A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; -A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; -A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; -A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; -A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; -A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; -A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; -A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; -A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; -A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; -A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; -A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; -A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; -A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; -A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; -A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; -A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; -A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; -A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; -A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; -A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; -A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; -A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; -A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; -A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; -A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; -A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; -A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; -A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; -A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; -A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; -A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; -A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; -A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; -A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; -A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; -A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; -A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; -A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; -A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; -A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; -A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; -A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; -A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; -A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; -A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; -A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; -A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; -A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; -A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; -A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; -A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; -A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; -A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; -A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; -A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; -A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; -A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; -A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; -A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; -A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; -A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; -A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; -A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; -A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; -A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; -A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; -A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; -A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; -A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; -A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; -A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; -A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; -A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; -A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; -A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; -A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; -A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; -A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; -A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; -A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; -A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; -A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; -A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; -A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; -A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; -A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; -A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; -A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; -A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; -A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; -A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; -A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; -A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; -A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; -A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; -A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;; -A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; -A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; -A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; -A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; -A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; -A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; -A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; -A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; -A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; -A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; -A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; -A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; -A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; -A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; -A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; -A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; -A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; -A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; -A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; -A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; -A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; -A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; -A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; -A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; -A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; -A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; -A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; -A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; -A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; -A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; -A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; -A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; -A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; -A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; -A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; -A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; -A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; -A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; -A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; -A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; -AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; -AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; -AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; -AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; -AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; -AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; -AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; -AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; -AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; -AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; -AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; -AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; -AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; -AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; -AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; -AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; -AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; -AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; -AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; -AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; -AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; -AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; -AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; -AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; -AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; -AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; -AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; -AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; -AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; -AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; -AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; -AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; -AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; -AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; -AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; -AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; -AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; -AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; -AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; -AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; -AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; -AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; -AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; -AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; -AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; -AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; -AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; -AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; -AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; -AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; -AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; -AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; -AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; -AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; -AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; -AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; -AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; -AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; -AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; -AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; -AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; -AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; -AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; -AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; -AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; -AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; -AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; -AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; -AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; -AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; -AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; -AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; -AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; -AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; -AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; -AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; -AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; -AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; -AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; -AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; -AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; -AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; -AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; -AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; -AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; -AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; -AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; -AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; -AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; -AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; -AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; -AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; -AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; -AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; -AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; -AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; -AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; -AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; -AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; -AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; -AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; -AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; -AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; -AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; -AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; -AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; -AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; -AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; -AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; -AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; -AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; -AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; -AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; -AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; -AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; -AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; -AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; -AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; -AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; -AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; -AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; -AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; -AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; -AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; -AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; -AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; -AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; -AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; -AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; -AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; -AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; -AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; -AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; -AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; -AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; -AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; -AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; -AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; -AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; -AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; -AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; -AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; -AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; -AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; -AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; -AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; -AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; -AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; -AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; -AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; -AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; -AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; -AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; -AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; -AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; -AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; -AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; -AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; -AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; -AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; -AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; -AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; -AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; -AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; -AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; -AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; -AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; -AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; -AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; -AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; -AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; -AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; -AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; -AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; -AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; -AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; -AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; -AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; -AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; -AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; -AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; -AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; -AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; -AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; -AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; -AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; -AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; -AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; -AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; -AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; -AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; -AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; -AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; -AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; -AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; -AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; -AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; -AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; -AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; -AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; -AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; -AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; -AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; -AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; -AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; -AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; -AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; -AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; -AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; -AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; -AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; -AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; -AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; -AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; -AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; -AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; -AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; -AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; -AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; -AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; -AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; -AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; -AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; -AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; -AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; -AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; -AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; -AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; -AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; -AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; -AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; -AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; -AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; -AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; -AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; -AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; -AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; -AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; -AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; -AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; -AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; -AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; -AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; -AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; -AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; -AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; -AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; -AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 -AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; -AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; -AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; -AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; -AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; -AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; -AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; -AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; -AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; -AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; -AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; -AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; -AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; -AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; -AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; -AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; -AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; -AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 -AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 -AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 -AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 -AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 -AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 -AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 -AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 -AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 -AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 -AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA -AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB -AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC -AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD -AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE -AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF -AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 -AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 -AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 -AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 -AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 -AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 -AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 -AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 -AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 -AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 -AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA -AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB -AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC -AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD -AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE -AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF -AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 -AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 -AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 -AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 -AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 -AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 -AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 -AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 -AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 -AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 -AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA -AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB -AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC -AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD -AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE -AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF -ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 -ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 -ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 -ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 -ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 -ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 -ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 -ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 -ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 -ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 -ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA -ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB -ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC -ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD -ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE -ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF -ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 -ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 -ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 -ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 -ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 -ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 -ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 -ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 -ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 -ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 -ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA -ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB -ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC -ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED -ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE -ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF -ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; -ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; -ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; -ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; -ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; -ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; -ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; -ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; -ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; -ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; -ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; -ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; -ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; -ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; -ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; -ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; -ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; -ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; -ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; -ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; -ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; -ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; -ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; -ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; -ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; -ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; -ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; -ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; -ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; -ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; -ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; -ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; -ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; -ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; -ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; -ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; -ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; -ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; -ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; -ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; -ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; -ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; -ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; -ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; -ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; -ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; -ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -AC00;;Lo;0;L;;;;;N;;;;; -D7A3;;Lo;0;L;;;;;N;;;;; -D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; -D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; -D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; -D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; -D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; -D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; -D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; -D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; -D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; -D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; -D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; -D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; -D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; -D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; -D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; -D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; -D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; -D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; -D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; -D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; -D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; -D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; -D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; -D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; -D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; -D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; -D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; -D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; -D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; -D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; -D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; -D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; -D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; -D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; -D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; -D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; -D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; -D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; -D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; -D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; -D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; -D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; -D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; -D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; -D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; -D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; -D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; -D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; -D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; -D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; -D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; -D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; -D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; -D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; -D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; -D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; -D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; -D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; -D800;;Cs;0;L;;;;;N;;;;; -DB7F;;Cs;0;L;;;;;N;;;;; -DB80;;Cs;0;L;;;;;N;;;;; -DBFF;;Cs;0;L;;;;;N;;;;; -DC00;;Cs;0;L;;;;;N;;;;; -DFFF;;Cs;0;L;;;;;N;;;;; -E000;;Co;0;L;;;;;N;;;;; -F8FF;;Co;0;L;;;;;N;;;;; -F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; -F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; -F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; -F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; -F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; -F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; -F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; -F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; -F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; -F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; -F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; -F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; -F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; -F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; -F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; -F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; -F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; -F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; -F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; -F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; -F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; -F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; -F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; -F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; -F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; -F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; -F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; -F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; -F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; -F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; -F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; -F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; -F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; -F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; -F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; -F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; -F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; -F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; -F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; -F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; -F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; -F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; -F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; -F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; -F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; -F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; -F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; -F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; -F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; -F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; -F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; -F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; -F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; -F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; -F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; -F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; -F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; -F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; -F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; -F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; -F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; -F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; -F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; -F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; -F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; -F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; -F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; -F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; -F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; -F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; -F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; -F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; -F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; -F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; -F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; -F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; -F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; -F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; -F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; -F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; -F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; -F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; -F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; -F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; -F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; -F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; -F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; -F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; -F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; -F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; -F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; -F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; -F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; -F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; -F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; -F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; -F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; -F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; -F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; -F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; -F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; -F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; -F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; -F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; -F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; -F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; -F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; -F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; -F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; -F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; -F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; -F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; -F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; -F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; -F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; -F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; -F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; -F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; -F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; -F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; -F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; -F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; -F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; -F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; -F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; -F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; -F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; -F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; -F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; -F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; -F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; -F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; -F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; -F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; -F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; -F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; -F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; -F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; -F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; -F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; -F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; -F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; -F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; -F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; -F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; -F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; -F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; -F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; -F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; -F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; -F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; -F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; -F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; -F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; -F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; -F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; -F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; -F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; -F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; -F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; -F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; -F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; -F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; -F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; -F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; -F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; -F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; -F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; -F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; -F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; -F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; -F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; -F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; -F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; -F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; -F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; -F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; -F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; -F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; -F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; -F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; -F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; -F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; -F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; -F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; -F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; -F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; -F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; -F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; -F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; -F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; -F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; -F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; -F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; -F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; -F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; -F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; -F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; -F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; -F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; -F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; -F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; -F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; -F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; -F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; -F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; -F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; -F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; -F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; -F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; -F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; -F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; -F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; -F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; -F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; -F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; -F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; -F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; -F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; -F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; -F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; -F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; -F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; -F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; -F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; -F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; -F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; -F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; -F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; -F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; -F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; -F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; -F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; -F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; -F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; -F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; -F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; -F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; -F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; -F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; -F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; -F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; -F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; -F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; -F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; -F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; -F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; -F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; -F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; -F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; -F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; -F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; -F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; -F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; -F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; -F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; -FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; -FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; -FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; -FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; -FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; -FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; -FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; -FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; -FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; -FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; -FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; -FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; -FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; -FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; -FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; -FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; -FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; -FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; -FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; -FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; -FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; -FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; -FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; -FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; -FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; -FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; -FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; -FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; -FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; -FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; -FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; -FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; -FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; -FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; -FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; -FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; -FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; -FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; -FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; -FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; -FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; -FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; -FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; -FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; -FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; -FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; -FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; -FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; -FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; -FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; -FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; -FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; -FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; -FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; -FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; -FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; -FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; -FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; -FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; -FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; -FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; -FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; -FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; -FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; -FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; -FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; -FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; -FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; -FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; -FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; -FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; -FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; -FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; -FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; -FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; -FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; -FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; -FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; -FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; -FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; -FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; -FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; -FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; -FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; -FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; -FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; -FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; -FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; -FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; -FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; -FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; -FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; -FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; -FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; -FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; -FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; -FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; -FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; -FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; -FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; -FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; -FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; -FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; -FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; -FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; -FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; -FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; -FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; -FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; -FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; -FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; -FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; -FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; -FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; -FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; -FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; -FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; -FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; -FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; -FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; -FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; -FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; -FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; -FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; -FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; -FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; -FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; -FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; -FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; -FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; -FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; -FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; -FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; -FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; -FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; -FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; -FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; -FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; -FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; -FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; -FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; -FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; -FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; -FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; -FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; -FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; -FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; -FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; -FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; -FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; -FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; -FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; -FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; -FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; -FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; -FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; -FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; -FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; -FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; -FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; -FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; -FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; -FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; -FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; -FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; -FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; -FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; -FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; -FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; -FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; -FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; -FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; -FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; -FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; -FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; -FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; -FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; -FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; -FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; -FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; -FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; -FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; -FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; -FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; -FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; -FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; -FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; -FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; -FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; -FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; -FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; -FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; -FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; -FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; -FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; -FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; -FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; -FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; -FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; -FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; -FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; -FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; -FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; -FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; -FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; -FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; -FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; -FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; -FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; -FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; -FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; -FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; -FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; -FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; -FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; -FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; -FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; -FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; -FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; -FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; -FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; -FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; -FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; -FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; -FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; -FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; -FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; -FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; -FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; -FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; -FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; -FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; -FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; -FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; -FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; -FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; -FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; -FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; -FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; -FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; -FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; -FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; -FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; -FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; -FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; -FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; -FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; -FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; -FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; -FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; -FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; -FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; -FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; -FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; -FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; -FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; -FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; -FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; -FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; -FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; -FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; -FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; -FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; -FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; -FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; -FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; -FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; -FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; -FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; -FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; -FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; -FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; -FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; -FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; -FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; -FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; -FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; -FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; -FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; -FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; -FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; -FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; -FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; -FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; -FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; -FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; -FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; -FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; -FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; -FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; -FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; -FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; -FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; -FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; -FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; -FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; -FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; -FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; -FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; -FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; -FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; -FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; -FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; -FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; -FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; -FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; -FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; -FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; -FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; -FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; -FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; -FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; -FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; -FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; -FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; -FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; -FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; -FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; -FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; -FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; -FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; -FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; -FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; -FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; -FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; -FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; -FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; -FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; -FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; -FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; -FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; -FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; -FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; -FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; -FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; -FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; -FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; -FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; -FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; -FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; -FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; -FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; -FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; -FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; -FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; -FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; -FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; -FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; -FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; -FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; -FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; -FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; -FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; -FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; -FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; -FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; -FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; -FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; -FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; -FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; -FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; -FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; -FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; -FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; -FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; -FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; -FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; -FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; -FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; -FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; -FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; -FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; -FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; -FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; -FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; -FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; -FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; -FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; -FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; -FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; -FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; -FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; -FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; -FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; -FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; -FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; -FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; -FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; -FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; -FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; -FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; -FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; -FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; -FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; -FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; -FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; -FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; -FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; -FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; -FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; -FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; -FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; -FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; -FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; -FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; -FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; -FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; -FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; -FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; -FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; -FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; -FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; -FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; -FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; -FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; -FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; -FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; -FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; -FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; -FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; -FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; -FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; -FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; -FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; -FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; -FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; -FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; -FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; -FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; -FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; -FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; -FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; -FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; -FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; -FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; -FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; -FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; -FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; -FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; -FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; -FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; -FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; -FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; -FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; -FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; -FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; -FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; -FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; -FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; -FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; -FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; -FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; -FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; -FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; -FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; -FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; -FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; -FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; -FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; -FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; -FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; -FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; -FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; -FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; -FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; -FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; -FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; -FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; -FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; -FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; -FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; -FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; -FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; -FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; -FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; -FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; -FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; -FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; -FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; -FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; -FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; -FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; -FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; -FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; -FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; -FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; -FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; -FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; -FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; -FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; -FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; -FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; -FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; -FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; -FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; -FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; -FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; -FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; -FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; -FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; -FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; -FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; -FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; -FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; -FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; -FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; -FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; -FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; -FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; -FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; -FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; -FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; -FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; -FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; -FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; -FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; -FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; -FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; -FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; -FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; -FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; -FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; -FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; -FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; -FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; -FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; -FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; -FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; -FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; -FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; -FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; -FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; -FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; -FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; -FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; -FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; -FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; -FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; -FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; -FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; -FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; -FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; -FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; -FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; -FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; -FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; -FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; -FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; -FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; -FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; -FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; -FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; -FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; -FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; -FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; -FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; -FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; -FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; -FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; -FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; -FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; -FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; -FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; -FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; -FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; -FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; -FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; -FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; -FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; -FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; -FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; -FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; -FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; -FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; -FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; -FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; -FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; -FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; -FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; -FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; -FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; -FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; -FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; -FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; -FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; -FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; -FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; -FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; -FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; -FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; -FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; -FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; -FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; -FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; -FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; -FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; -FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; -FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; -FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; -FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; -FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; -FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; -FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; -FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; -FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; -FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; -FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; -FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; -FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; -FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; -FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; -FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; -FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; -FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; -FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; -FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; -FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; -FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; -FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; -FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; -FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; -FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; -FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; -FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; -FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; -FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; -FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; -FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; -FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; -FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; -FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; -FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; -FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; -FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; -FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; -FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; -FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; -FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; -FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; -FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; -FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; -FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; -FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; -FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; -FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; -FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; -FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; -FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; -FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; -FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; -FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; -FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; -FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; -FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; -FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; -FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; -FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; -FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; -FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; -FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; -FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; -FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; -FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; -FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; -FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; -FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; -FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; -FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; -FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; -FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; -FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; -FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; -FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; -FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; -FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; -FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; -FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; -FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; -FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; -FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; -FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; -FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; -FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; -FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; -FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; -FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; -FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; -FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; -FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; -FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; -FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; -FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; -FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; -FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; -FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; -FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; -FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; -FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; -FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; -FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; -FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; -FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; -FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; -FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; -FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; -FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; -FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; -FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; -FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; -FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; -FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; -FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; -FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; -FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; -FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; -FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; -FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; -FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; -FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; -FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; -FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; -FDFC;RIAL SIGN;Sc;0;AL; 0631 06CC 0627 0644;;;;N;;;;; -FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; -FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; -FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; -FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; -FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; -FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; -FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; -FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; -FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; -FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; -FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; -FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; -FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; -FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; -FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; -FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; -FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; -FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON; 002C;;;;N;;;;; -FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;;;;; -FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON; 003A;;;;N;;;;; -FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON; 3016;;;;N;;;;; -FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON; 3017;;;;N;;;;; -FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON; 2026;;;;N;;;;; -FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; -FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; -FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; -FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; -FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; -FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; -FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; -FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; -FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; -FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; -FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; -FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; -FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; -FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; -FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; -FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; -FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; -FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; -FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; -FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; -FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; -FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; -FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; -FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; -FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; -FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;;;;; -FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;;;;; -FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; -FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; -FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; -FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; -FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; -FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; -FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; -FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; -FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; -FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; -FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; -FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; -FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; -FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; -FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; -FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; -FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; -FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; -FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; -FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; -FE62;SMALL PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -FE63;SMALL HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; -FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; -FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; -FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; -FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; -FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; -FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; -FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; -FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; -FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; -FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; -FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; -FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; -FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; -FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; -FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; -FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; -FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; -FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; -FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; -FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; -FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; -FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; -FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; -FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; -FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; -FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; -FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; -FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; -FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; -FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; -FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; -FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; -FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; -FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; -FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; -FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; -FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; -FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; -FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; -FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; -FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; -FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; -FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; -FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; -FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; -FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; -FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; -FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; -FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; -FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; -FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; -FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; -FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; -FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; -FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; -FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; -FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; -FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; -FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; -FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; -FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; -FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; -FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; -FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; -FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; -FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; -FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; -FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; -FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; -FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; -FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; -FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; -FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; -FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; -FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; -FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; -FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; -FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; -FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; -FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; -FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; -FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; -FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; -FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; -FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; -FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; -FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; -FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; -FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; -FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; -FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; -FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; -FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; -FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; -FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; -FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; -FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; -FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; -FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; -FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; -FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; -FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; -FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; -FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; -FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; -FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; -FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; -FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; -FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; -FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; -FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; -FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; -FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; -FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; -FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; -FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; -FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; -FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; -FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; -FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; -FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; -FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; -FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; -FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; -FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; -FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; -FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; -FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; -FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; -FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; -FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; -FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; -FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; -FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; -FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; -FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; -FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; -FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; -FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; -FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; -FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; -FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; -FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; -FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; -FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; -FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; -FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; -FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; -FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; -FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; -FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; -FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; -FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; -FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; -FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; -FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; -FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; -FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; -FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; -FF0F;FULLWIDTH SOLIDUS;Po;0;CS; 002F;;;;N;FULLWIDTH SLASH;;;; -FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; -FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; -FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; -FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; -FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; -FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; -FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; -FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; -FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; -FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; -FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; -FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; -FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; -FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; -FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; -FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; -FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; -FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; -FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; -FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; -FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; -FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; -FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; -FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; -FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; -FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; -FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; -FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; -FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; -FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; -FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; -FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; -FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; -FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; -FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; -FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; -FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 -FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 -FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 -FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 -FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 -FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 -FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 -FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 -FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 -FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A -FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B -FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C -FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D -FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E -FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F -FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 -FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 -FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 -FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 -FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 -FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 -FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 -FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 -FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 -FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 -FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A -FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; -FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; -FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; -FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; -FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON; 2985;;;;Y;;;;; -FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON; 2986;;;;Y;;;;; -FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; -FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; -FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; -FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON; 30FB;;;;N;;;;; -FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; -FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; -FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; -FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; -FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; -FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; -FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; -FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; -FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; -FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; -FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; -FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; -FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; -FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; -FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; -FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; -FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; -FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; -FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; -FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; -FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; -FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; -FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; -FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; -FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; -FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; -FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; -FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; -FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; -FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; -FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; -FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; -FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; -FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; -FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; -FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; -FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; -FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; -FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; -FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; -FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; -FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; -FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; -FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; -FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; -FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; -FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; -FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; -FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; -FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; -FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; -FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; -FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; -FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; -FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; -FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; -FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; -FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; -FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; -FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; -FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; -FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; -FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; -FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; -FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; -FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; -FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; -FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; -FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; -FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; -FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; -FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; -FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; -FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; -FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; -FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; -FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; -FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; -FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; -FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; -FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; -FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; -FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; -FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; -FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; -FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; -FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; -FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; -FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; -FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; -FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; -FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; -FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; -FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; -FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; -FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; -FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; -FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; -FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; -FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; -FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; -FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; -FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; -FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; -FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; -FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; -FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; -FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; -FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; -FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; -FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; -FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; -FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; -FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; -FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; -FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; -FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; -FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; -FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; -FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; -FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; -FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; -FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; -FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; -FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; -FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; -FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; -FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; -FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; -10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; -10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; -10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; -10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; -10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; -10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; -10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; -10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; -10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; -10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; -1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; -1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; -1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; -1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; -1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; -10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; -10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; -10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; -10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; -10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; -10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; -10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; -10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; -10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; -10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; -1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; -1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; -1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; -1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; -1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; -1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; -10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; -10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; -10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; -10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; -10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; -10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; -10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; -10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; -10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; -1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; -1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; -1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; -1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; -1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; -1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; -10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; -10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; -10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; -10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; -10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; -10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; -10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; -10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; -10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; -10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; -1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; -1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; -1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; -1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; -10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; -10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; -10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; -10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; -10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; -10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; -10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; -10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; -10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; -10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; -1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; -1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; -1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; -1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; -10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; -10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; -10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; -10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; -10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; -10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; -10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; -10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; -10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; -10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; -1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; -1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; -1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; -1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; -10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; -10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; -10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; -10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; -10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; -10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; -10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; -10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; -10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; -10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; -1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; -1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; -1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; -1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; -1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; -1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; -10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; -10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; -10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; -10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; -10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; -10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; -10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; -10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; -10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; -10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; -1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; -1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; -1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; -1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; -1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; -1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; -100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; -100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; -100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; -100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; -100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; -100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; -100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; -100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; -100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; -100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; -100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; -100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; -100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; -100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; -100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; -100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; -100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; -100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; -100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; -100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; -100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; -100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; -100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; -100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; -100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; -100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; -100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; -100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; -100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; -100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; -100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; -100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; -100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; -100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; -100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; -100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; -100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; -100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; -100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; -100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; -100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; -100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; -100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; -100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; -100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; -100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; -100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; -100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; -100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; -100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; -100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; -100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; -100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; -100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; -100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; -100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; -100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; -100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; -100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; -100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; -100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; -100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; -100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; -100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; -100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; -100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; -100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; -100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; -100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; -100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; -100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; -100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; -100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; -100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; -100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; -100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; -100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; -100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; -100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; -100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; -100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; -100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; -100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; -100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; -100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; -100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; -100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; -100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; -100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; -100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; -100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; -10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; -10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; -10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; -10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; -10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; -10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; -1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; -1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; -1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; -1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; -1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; -1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; -10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; -10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; -10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; -10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; -10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; -10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; -10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; -10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; -1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; -1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; -1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; -1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; -1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; -10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; -10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; -10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; -10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; -10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; -10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; -10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; -10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; -10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; -1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; -1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; -1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; -1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; -1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; -1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; -10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; -10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; -10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; -10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; -10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; -10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; -10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; -1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; -1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; -1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; -1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; -1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; -1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; -10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; -10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; -10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; -10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; -10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; -10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; -10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; -10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; -10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; -1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; -1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; -1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; -1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; -1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; -1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; -10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; -10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; -10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; -10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; -10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; -10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; -10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; -10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; -10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; -10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; -1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; -1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; -1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; -1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; -1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; -1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; -10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; -10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; -10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; -10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; -10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; -10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; -10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; -10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; -10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; -10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; -1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; -1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; -1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; -10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; -10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; -10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; -10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; -10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; -10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; -10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; -10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; -1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; -1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; -1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; -1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; -1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; -1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; -10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; -10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; -10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; -10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; -10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; -10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; -10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; -10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; -10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; -10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; -1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; -1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; -1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; -10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; -10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; -10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; -10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; -10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; -10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; -10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; -10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; -10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; -10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; -1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; -1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; -101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; -101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; -101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; -101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; -101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; -101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; -101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; -101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; -101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; -101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; -101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; -101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; -101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; -101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; -101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; -101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; -101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; -101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; -101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; -101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; -101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; -101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; -101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; -101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; -101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; -101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; -101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; -101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; -101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; -101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; -101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; -101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; -101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; -101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; -101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; -101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; -101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; -101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; -101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; -101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; -101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; -101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; -101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; -101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; -101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; -101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; -101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; -10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; -10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; -10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; -10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; -10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; -10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; -10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; -10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; -10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; -10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; -1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; -1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; -1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; -1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; -1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; -1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; -10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; -10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; -10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; -10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; -10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; -10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; -10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; -10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; -10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; -10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; -1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; -1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; -1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; -102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; -102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; -102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; -102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; -102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; -102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; -102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; -102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; -102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; -102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; -102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; -102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; -102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; -102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; -102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; -102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; -102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; -102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; -102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; -102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; -102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; -102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; -102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; -102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; -102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; -102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; -102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; -102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; -102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; -102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; -102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; -102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; -102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; -102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; -102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; -102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; -102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; -102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; -102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; -102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; -102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; -102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; -102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; -102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; -102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; -102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; -102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; -102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; -102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; -102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; -102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; -102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; -102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; -102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; -102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; -102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; -102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; -102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; -102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; -102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; -102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; -102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; -102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; -102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; -102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; -102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; -102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; -102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; -102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; -102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; -102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; -102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; -102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; -102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; -102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; -102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; -102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; -10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; -10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; -10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; -10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; -10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; -10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; -10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; -10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; -10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; -10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; -1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; -1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; -1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; -1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; -1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; -1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; -10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; -10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; -10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; -10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; -10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; -10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; -10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; -10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; -10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; -10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; -1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; -1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; -1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; -1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; -1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; -1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; -10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; -10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; -10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; -10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; -10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; -10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; -10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; -10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; -10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; -10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; -10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; -10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; -10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; -10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; -1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; -1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; -1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; -1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; -1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; -1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; -10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; -10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; -10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; -10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; -10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; -10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; -10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; -10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; -10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; -10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; -1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; -10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; -10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; -10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; -10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; -10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; -10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; -10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; -10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; -10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; -10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; -1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; -1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; -1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; -1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; -1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; -1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; -10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; -10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; -10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; -10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; -10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; -10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; -10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; -10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; -10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; -10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; -1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; -1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; -1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; -1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; -1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; -1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; -10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; -10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; -10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; -10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; -10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; -10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; -10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; -10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; -10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; -10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; -1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; -10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; -10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; -10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; -10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; -10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; -10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; -10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; -10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; -10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; -10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; -1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; -1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; -1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; -1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; -1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; -1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; -10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; -10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; -10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; -10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; -10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; -10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; -10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; -10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; -10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; -10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; -1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; -1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; -1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; -1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; -1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; -103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; -103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; -103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; -103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; -103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; -103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; -103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; -103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; -103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; -103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; -103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; -103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; -103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; -103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; -103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; -103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; -103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; -103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; -103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; -103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; -103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; -103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; -103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; -103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; -103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; -103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; -103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; -103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; -103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; -103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; -103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; -103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; -103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; -103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; -103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; -103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; -103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; -103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; -103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; -103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; -103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; -103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; -103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; -103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; -103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; -103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; -103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; -103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; -103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; -103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; -10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; -10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; -10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; -10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; -10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; -10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; -10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; -10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; -10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; -10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; -1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; -1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; -1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; -1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; -1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; -1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; -10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; -10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; -10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; -10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; -10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; -10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; -10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; -10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; -10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; -10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; -1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; -1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; -1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; -1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; -1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; -1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; -10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; -10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; -10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; -10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; -10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; -10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; -10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; -10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; -10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 -10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 -1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 -1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 -1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 -1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 -1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 -1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 -10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 -10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 -10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A -10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B -10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C -10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D -10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E -10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F -10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 -10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 -1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 -1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 -1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 -1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 -1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 -1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 -10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 -10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 -10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A -10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B -10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C -10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D -10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E -10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F -10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 -10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 -1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 -1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 -1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 -1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 -1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 -1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 -10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; -10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; -10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; -10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; -10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; -10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; -10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; -10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; -10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; -10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; -1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; -1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; -1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; -1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; -1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; -1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; -10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; -10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; -10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; -10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; -10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; -10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; -10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; -10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; -10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; -10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; -1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; -1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; -1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; -1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; -1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; -1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; -10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; -10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; -10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; -10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; -10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; -10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; -10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; -10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; -10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; -10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; -1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; -1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; -1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; -1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; -1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; -1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; -10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; -10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; -10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; -10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; -10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; -10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; -10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; -10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; -10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; -10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; -1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; -1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; -1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; -1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; -1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; -1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; -10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; -10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; -10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; -10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; -10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; -10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; -10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; -10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; -10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; -10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; -1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; -1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; -1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; -1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; -104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; -10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; -10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; -10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; -10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; -10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; -10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; -10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; -10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; -10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; -1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; -1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; -1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; -1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; -1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; -1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; -10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; -10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; -10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; -10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; -10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; -10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; -10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; -10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; -10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; -10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; -1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; -1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; -1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; -1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; -1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; -1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; -10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; -10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; -10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; -10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; -10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; -10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; -10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; -10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; -10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; -10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; -10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; -10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; -10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; -10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; -10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; -10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; -10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; -10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; -1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; -1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; -1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; -1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; -1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; -1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; -10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; -10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; -10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; -10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; -10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; -10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; -10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; -10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; -10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; -10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; -1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; -1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; -1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; -1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; -1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; -1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; -10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; -10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; -10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; -10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; -10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; -10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; -10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; -10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; -10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; -10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; -1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; -1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; -1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; -1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; -1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; -1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; -10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; -10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; -10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; -10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; -1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; -10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; -10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; -10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; -10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; -10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; -10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; -10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; -10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; -10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; -10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; -1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; -1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; -1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; -1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; -1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; -1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; -10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; -10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; -10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; -10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; -10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; -10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; -10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; -10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; -10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; -10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; -1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; -1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; -1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; -1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; -1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; -1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; -10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; -10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; -10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; -10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; -10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; -10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; -10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; -10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; -10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; -10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; -1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; -1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; -1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; -1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; -1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; -1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; -10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; -10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; -10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; -10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; -10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; -10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; -10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; -10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; -10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; -10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; -1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; -1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; -1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; -1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; -1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; -1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; -10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; -10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; -10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; -10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; -10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; -10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; -10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; -10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; -10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; -10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; -1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; -1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; -1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; -1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; -1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; -1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; -10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; -10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; -10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; -10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; -10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; -10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; -10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; -10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; -10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; -10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; -1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; -1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; -1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; -1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; -1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; -1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; -10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; -10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; -10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; -10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; -10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; -10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; -10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; -10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; -10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; -10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; -1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; -1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; -1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; -1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; -1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; -1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; -10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; -10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; -10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; -10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; -10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; -10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; -10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; -10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; -10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; -10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; -1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; -1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; -1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; -1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; -1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; -1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; -10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; -10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; -10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; -10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; -10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; -10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; -10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; -10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; -10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; -10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; -1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; -1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; -1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; -1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; -1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; -1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; -10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; -10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; -10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; -10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; -10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; -10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; -10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; -10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; -10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; -10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; -1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; -1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; -1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; -1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; -1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; -1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; -106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; -106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; -106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; -106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; -106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; -106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; -106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; -106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; -106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; -106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; -106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; -106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; -106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; -106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; -106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; -106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; -106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; -106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; -106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; -106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; -106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; -106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; -106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; -106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; -106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; -106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; -106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; -106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; -106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; -106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; -106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; -106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; -106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; -106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; -106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; -106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; -106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; -106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; -106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; -106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; -106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; -106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; -106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; -106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; -106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; -106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; -106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; -106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; -106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; -106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; -106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; -106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; -106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; -106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; -106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; -106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; -106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; -106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; -106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; -106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; -106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; -106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; -106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; -106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; -106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; -106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; -106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; -106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; -106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; -106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; -106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; -106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; -106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; -106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; -106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; -106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; -106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; -106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; -106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; -106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; -106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; -106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; -106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; -106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; -106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; -106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; -106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; -106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; -106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; -106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; -106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; -106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; -106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; -106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; -106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; -106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; -10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; -10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; -10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; -10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; -10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; -10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; -10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; -10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; -10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; -10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; -1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; -1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; -1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; -1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; -1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; -1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; -10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; -10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; -10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; -10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; -10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; -10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; -10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; -10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; -10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; -10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; -1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; -1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; -1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; -1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; -1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; -1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; -10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; -10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; -10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; -10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; -10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; -10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; -10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; -10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; -10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; -10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; -1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; -1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; -1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; -1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; -1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; -1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; -10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; -10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; -10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; -10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; -10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; -10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; -10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; -10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; -10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; -10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; -10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; -10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; -10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; -10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; -10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; -10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; -10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; -1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; -1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; -1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; -1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; -1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; -1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; -10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; -10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; -10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; -10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; -10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; -10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; -10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; -10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; -10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; -10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; -10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; -10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; -10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; -10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; -10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; -10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; -10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; -10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; -10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; -10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; -10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; -1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; -1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; -1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; -1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; -1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; -1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; -10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; -10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; -10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; -10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; -10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; -10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; -10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; -10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; -10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; -10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; -1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; -1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; -1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; -1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; -1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; -1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; -10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; -10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; -10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; -10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; -10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; -10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; -10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; -10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; -10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; -10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; -1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; -1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; -1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; -1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; -1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; -1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; -10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; -10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; -10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; -10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; -10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; -10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; -10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; -10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; -1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; -1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; -10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; -10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; -10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; -10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; -10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; -10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; -10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; -1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; -1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; -1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; -1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; -10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; -10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; -10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; -10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; -10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; -10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; -10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; -10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; -10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; -1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; -1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; -1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; -1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; -10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; -10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; -10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; -10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; -10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; -10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; -10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; -1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; -1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; -1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; -1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; -1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; -10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; -10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; -10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; -10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; -10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; -10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; -10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; -10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; -10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; -1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; -1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; -1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; -1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; -1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; -1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; -10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; -10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; -10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; -10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; -1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; -1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; -1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; -1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; -1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; -10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; -10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; -10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; -10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; -10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; -1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; -1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; -108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; -108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; -108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; -108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; -108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; -108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; -108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; -108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; -108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; -108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; -108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; -108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; -108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; -108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; -108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; -108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; -108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; -108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; -108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; -108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; -108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; -108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; -10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; -10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; -10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; -10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; -10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; -10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; -10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; -10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; -10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; -1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; -1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; -1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; -1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; -1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; -1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; -10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; -10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; -10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; -10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; -10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; -10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; -1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; -1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; -10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; -10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; -10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; -10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; -10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; -10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; -10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; -10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; -10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; -10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; -1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; -1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; -1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; -1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; -1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; -1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; -10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; -10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; -10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; -10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; -10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; -10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; -10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; -10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; -10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; -10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; -1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; -10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; -10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; -10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; -10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; -10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; -10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; -10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; -10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; -10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; -10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; -1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; -1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; -1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; -1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; -1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; -1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; -10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; -10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; -10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; -10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; -10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; -10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; -10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; -10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; -10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; -10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; -1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; -1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; -1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; -1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; -1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; -1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; -109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; -109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; -109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; -109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; -109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; -109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; -109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; -109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; -109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; -109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; -109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; -109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; -109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; -109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; -109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; -109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; -109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; -109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; -109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; -109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; -109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; -109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; -109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; -109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; -109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; -109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; -109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; -109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; -109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; -109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; -109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; -109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; -109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; -109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; -109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; -109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; -109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; -109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; -109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; -109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; -109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; -109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; -109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; -109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; -109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; -109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; -109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; -109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; -109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; -109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; -109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; -109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; -109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; -109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; -109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; -109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; -109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; -109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; -109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; -109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; -109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; -109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; -109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; -109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; -109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; -109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; -109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; -109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; -109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; -109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; -109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; -109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; -109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; -109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; -109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; -109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; -109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; -109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; -109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; -109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; -109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; -109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; -109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; -109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; -109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; -109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; -109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; -109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; -10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; -10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; -10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; -10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; -10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; -10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; -10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; -10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; -10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; -10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; -10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; -10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; -10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; -10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; -10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; -10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; -10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; -10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; -10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; -10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; -10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; -10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; -10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; -10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; -10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; -10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; -10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; -10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; -10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; -10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; -10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; -10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; -10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; -10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; -10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; -10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; -10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; -10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; -10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; -10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; -10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; -10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; -10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; -10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; -10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; -10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; -10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; -10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; -10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; -10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; -10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; -10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; -10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; -10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; -10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; -10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; -10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; -10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; -10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; -10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; -10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; -10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; -10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; -10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; -10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; -10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; -10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; -10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; -10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; -10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; -10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; -10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; -10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; -10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; -10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; -10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; -10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; -10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; -10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; -10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; -10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; -10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; -10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; -10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; -10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; -10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; -10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; -10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; -10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; -10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; -10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; -10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; -10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; -10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; -10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; -10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; -10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; -10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; -10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; -10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; -10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; -10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; -10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; -10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; -10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; -10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; -10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; -10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; -10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; -10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; -10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; -10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; -10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; -10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; -10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; -10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; -10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; -10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; -10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; -10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; -10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; -10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; -10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; -10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; -10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; -10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; -10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; -10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; -10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; -10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; -10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; -10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; -10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; -10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; -10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; -10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; -10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; -10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; -10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; -10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; -10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; -10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; -10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; -10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; -10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; -10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; -10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; -10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; -10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; -10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; -10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; -10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; -10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; -10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; -10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; -10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; -10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; -10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; -10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; -10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; -10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; -10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; -10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; -10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; -10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; -10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; -10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; -10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; -10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; -10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; -10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; -10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; -10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; -10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; -10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; -10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; -10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; -10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; -10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; -10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; -10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; -10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; -10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; -10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; -10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; -10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; -10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; -10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; -10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; -10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; -10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; -10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; -10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; -10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; -10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; -10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; -10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; -10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; -10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; -10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; -10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; -10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; -10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; -10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; -10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; -10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; -10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; -10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; -10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; -10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; -10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; -10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; -10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; -10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; -10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; -10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; -10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; -10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; -10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; -10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; -10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; -10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; -10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; -10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; -10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; -10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; -10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; -10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; -10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; -10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; -10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; -10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; -10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; -10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; -10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; -10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; -10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; -10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; -10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; -10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; -10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; -10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; -10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; -10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; -10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; -10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; -10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; -10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; -10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; -10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; -10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; -10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; -10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; -10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; -10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; -10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; -10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; -10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; -10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; -10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; -10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; -10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; -10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; -10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; -10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; -10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; -10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; -10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; -10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; -10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; -10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; -10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; -10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; -10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; -10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; -10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; -10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; -10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; -10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; -10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; -10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; -10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; -10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; -10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; -10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; -10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; -10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; -10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; -10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; -10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; -10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; -10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; -10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; -10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; -10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; -10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; -10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; -10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; -10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; -10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; -10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; -10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; -10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; -10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; -10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; -10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; -10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; -10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; -10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; -10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; -10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; -10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; -10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; -10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; -10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; -10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; -10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; -10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; -10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; -10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; -10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; -10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; -10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; -10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; -10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; -10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; -10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; -10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; -10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; -10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; -10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; -10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; -10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; -10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; -10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; -10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; -10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; -10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; -10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; -10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; -10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; -10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; -10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; -10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; -10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; -10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; -10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; -10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; -10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; -10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; -10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; -10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; -10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; -10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; -10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; -10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; -10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; -10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; -10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; -10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; -10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; -10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; -10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; -10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; -10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; -10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; -10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 -10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 -10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 -10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 -10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 -10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 -10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 -10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 -10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 -10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 -10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A -10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B -10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C -10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D -10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E -10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F -10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 -10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 -10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 -10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 -10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 -10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 -10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 -10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 -10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 -10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 -10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A -10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B -10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C -10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D -10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E -10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F -10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 -10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 -10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 -10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 -10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 -10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 -10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 -10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 -10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 -10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 -10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA -10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB -10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC -10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD -10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE -10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF -10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 -10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 -10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 -10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; -10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; -10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; -10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; -10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; -10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; -10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; -10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; -10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; -10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; -10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; -10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; -10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; -10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; -10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; -10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; -10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; -10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; -10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; -10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; -10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; -10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; -10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; -10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; -10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; -10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; -10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; -10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; -10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; -10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; -10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; -10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; -11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; -11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; -11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; -11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; -11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; -11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; -1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; -1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; -11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; -11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; -11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; -11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; -11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; -11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; -11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; -11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; -11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; -11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; -1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; -1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; -1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; -1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; -1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; -1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; -11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; -11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; -11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; -11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; -11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; -11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; -11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; -11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; -11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; -1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; -1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; -1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; -1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; -1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; -1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; -11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; -11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; -11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; -11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; -11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; -11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; -11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; -11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; -11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; -1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; -11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; -11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; -1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; -1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; -1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; -1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; -11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; -11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; -11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; -11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; -11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; -11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; -11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; -11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; -1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; -1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; -1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; -1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; -1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; -1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; -11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; -11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; -11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; -11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; -11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; -11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; -11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; -11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; -11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; -11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; -11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; -11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; -11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; -11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; -1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; -1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; -1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; -1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; -1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; -1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; -11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; -11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; -11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; -11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; -11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; -11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; -11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; -11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; -11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; -1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; -1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; -1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; -1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; -1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; -1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; -110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; -110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; -110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; -110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; -110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; -110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; -110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; -110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; -110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; -110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; -110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; -110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; -110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; -110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; -110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; -110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; -110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; -110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; -110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; -110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; -110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; -110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; -110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; -110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; -110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; -110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; -110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; -110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; -110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; -110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; -110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; -110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; -110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; -110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; -110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; -110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; -110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; -110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; -110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; -110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; -110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; -110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; -110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; -110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; -110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; -110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; -110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; -11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; -11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; -11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; -11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; -11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; -11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; -11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; -11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; -11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; -1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; -1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; -1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; -1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; -1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; -1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; -11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; -11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; -11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; -11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; -11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; -11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; -11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; -11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; -11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; -11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; -1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; -1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; -1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; -1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; -1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; -1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; -11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; -11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; -11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; -11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; -11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; -11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; -11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; -11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; -11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; -1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; -11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; -11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; -11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; -11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; -11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; -11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; -11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; -11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; -11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; -11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; -11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; -11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; -11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; -11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; -11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; -11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; -11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; -11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; -11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; -1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; -1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; -1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; -1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; -1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; -1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; -11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; -11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; -11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; -11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; -11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; -11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; -11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; -11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; -1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; -1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; -1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; -1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; -1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; -1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; -11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; -11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; -11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; -11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; -11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; -11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; -11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; -11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; -11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; -11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; -11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; -11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; -1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; -1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; -11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; -11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; -11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; -11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; -11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; -11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; -11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; -11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; -11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; -11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; -1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; -1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; -1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; -1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; -1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; -1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; -111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; -111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; -111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; -111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; -111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; -111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; -111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; -111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; -111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; -111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; -111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; -111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; -111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; -111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; -111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; -111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; -111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; -111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; -111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; -111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; -111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; -111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; -111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; -111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;; -111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; -111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; -111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; -111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; -111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; -111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; -111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; -111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; -111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; -111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; -111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; -111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; -111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; -111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; -111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; -111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; -111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; -111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; -111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; -111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; -111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; -111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; -111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; -111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; -111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; -111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; -11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; -11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; -11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; -11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; -11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; -11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; -11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; -11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; -11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; -1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; -1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; -1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; -1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; -1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; -1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; -11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; -11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; -11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; -11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; -11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; -11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; -11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; -1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; -1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; -1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; -1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; -1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; -1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; -11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; -11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; -11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; -11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; -11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; -11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; -11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; -11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; -11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; -11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; -1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; -1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; -1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; -11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; -11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; -1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; -1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; -1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; -11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; -11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; -11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; -11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; -11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; -11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; -11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; -1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; -1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; -1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; -1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; -1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; -11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; -11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; -11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; -11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; -11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; -11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; -11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; -11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; -1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; -1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; -1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; -1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; -1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; -112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; -112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; -112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; -112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; -112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; -112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; -112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; -112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; -112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; -112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; -112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; -112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; -112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; -112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; -112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; -112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; -112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; -112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; -112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; -112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; -112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; -112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; -112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; -112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; -112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; -112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; -112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; -112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; -112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; -112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; -112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; -112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; -112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; -112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; -112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; -112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; -112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; -112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; -112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; -112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; -112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; -112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; -112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; -112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; -112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; -112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; -112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; -112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; -112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; -112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; -112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; -112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; -112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; -112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; -112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; -112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; -112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; -112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; -11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; -11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; -11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; -11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; -11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; -1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; -1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; -11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; -11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; -11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; -11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; -11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; -11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; -11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; -11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; -1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; -1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; -1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; -1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; -1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; -1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; -11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; -11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; -11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; -11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; -11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; -11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; -11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; -11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; -11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; -1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; -1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; -1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; -1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; -1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; -1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; -11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; -11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; -11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; -11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; -11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; -11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; -11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; -11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; -1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; -1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; -1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; -11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; -1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; -1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; -11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; -11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; -11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; -11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; -11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; -11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; -1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; -1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; -1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; -11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; -11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; -11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; -11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; -11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; -11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; -11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; -11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; -11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; -11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; -11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; -11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; -11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; -1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; -1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; -1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; -1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; -11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; -11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; -11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; -11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; -11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; -11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; -11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; -11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; -11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; -11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; -1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; -1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; -1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; -1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; -1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; -1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; -114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; -114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; -114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; -114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; -114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; -114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; -114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; -114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; -114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; -114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; -114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; -114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; -114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; -114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; -114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; -114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; -114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; -114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; -114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; -114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; -114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; -114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; -114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; -114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; -11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; -11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; -11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; -11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; -11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; -11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; -1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; -1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; -1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; -1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; -1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; -11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; -11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; -11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; -11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; -11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; -11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; -11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; -11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; -11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; -11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; -1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; -1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; -1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; -1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; -1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; -1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; -115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; -115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; -115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; -115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; -115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; -115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; -115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; -115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; -115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; -115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; -115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; -115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; -115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; -115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; -115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; -115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; -115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; -115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; -115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; -115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; -115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; -115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; -115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; -115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; -115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; -115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; -115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; -115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; -115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; -115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; -115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; -115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; -115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; -115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; -115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; -115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; -115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; -115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; -115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; -115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; -115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; -115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; -11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; -11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; -11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; -11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; -11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; -11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; -11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; -1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; -1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; -1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; -1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; -1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; -11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; -11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; -11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; -11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; -11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; -11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; -11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; -11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; -11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; -11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; -1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; -1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; -1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; -1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; -1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; -1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; -11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; -11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; -11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; -11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; -11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; -11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; -11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; -11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; -11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; -11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; -1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; -1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; -1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; -1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; -1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; -1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; -11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; -11641;MODI DANDA;Po;0;L;;;;;N;;;;; -11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; -11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; -11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; -11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; -11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; -11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; -11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; -11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; -11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; -11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; -11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; -1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; -1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; -1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; -1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; -1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; -1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; -11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; -11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; -11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; -11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; -11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; -11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; -11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; -11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; -1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; -1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; -1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; -1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; -1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; -1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; -116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; -116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; -116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; -116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; -116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; -116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; -116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; -116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; -116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; -116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; -116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; -116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; -11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; -11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; -11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; -11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; -11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; -11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; -11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; -11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; -11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; -1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; -1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; -1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; -1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; -1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; -1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; -11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; -11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; -11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; -11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; -11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; -11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; -11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; -11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; -11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; -11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; -1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; -1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; -1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; -11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; -11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; -1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; -11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; -1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; -1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; -1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; -1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; -1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; -118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; -118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; -118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; -118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; -118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; -118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; -118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; -118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; -118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; -118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; -118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; -118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; -118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; -118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; -118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; -118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; -118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; -118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; -118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; -118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; -118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; -118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; -118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; -118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; -118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; -118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; -118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; -118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; -118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; -118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; -118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; -118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; -118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 -118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 -118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 -118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 -118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 -118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 -118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 -118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 -118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 -118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 -118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA -118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB -118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC -118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD -118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE -118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF -118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 -118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 -118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 -118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 -118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 -118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 -118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 -118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 -118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 -118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 -118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA -118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB -118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC -118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD -118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE -118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF -118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; -118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; -118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; -118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; -118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; -118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; -118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; -118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; -11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; -11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; -11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; -11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; -11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; -11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; -11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; -11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; -11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; -11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; -11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; -11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; -11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; -11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; -11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; -11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; -11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; -11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; -11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; -11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; -11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; -11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; -11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; -11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; -11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; -11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; -11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; -11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; -11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; -11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; -11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; -11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; -11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; -11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; -11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; -11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; -11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; -11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; -11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; -11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; -11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; -11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; -11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; -11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; -11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; -11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; -11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; -11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; -11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; -11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; -11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; -12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; -12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; -12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; -12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; -12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; -12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; -12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; -12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; -12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; -1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; -1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; -1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; -1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; -1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; -12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; -12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; -12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; -12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; -12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; -12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; -12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; -12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; -1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; -1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; -1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; -1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; -1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; -12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; -12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; -12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; -12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; -12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; -12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; -12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; -12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; -12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; -12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; -1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; -1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; -1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; -1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; -1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; -1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; -12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; -12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; -12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; -12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; -12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; -12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; -12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; -12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; -12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; -12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; -1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; -1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; -1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; -1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; -1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; -1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; -12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; -12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; -12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; -12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; -12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; -12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; -12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; -12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; -12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; -12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; -1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; -1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; -1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; -1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; -1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; -12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; -12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; -12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; -12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; -12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; -12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; -12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; -12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; -12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; -12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; -1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; -1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; -1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; -1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; -1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; -1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; -12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; -12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; -12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; -12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; -12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; -12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; -12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; -12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; -12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; -12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; -1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; -1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; -1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; -1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; -1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; -1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; -12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; -12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; -12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; -12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; -12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; -12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; -12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; -12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; -12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; -12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; -1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; -1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; -1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; -1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; -1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; -1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; -12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; -12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; -12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; -12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; -12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; -12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; -12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; -12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; -12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; -12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; -1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; -1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; -1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; -1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; -1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; -1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; -12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; -12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; -12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; -12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; -12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; -12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; -12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; -12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; -12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; -12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; -1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; -1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; -1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; -1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; -1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; -120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; -120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; -120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; -120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; -120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; -120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; -120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; -120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; -120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; -120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; -120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; -120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; -120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; -120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; -120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; -120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; -120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; -120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; -120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; -120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; -120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; -120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; -120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; -120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; -120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; -120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; -120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; -120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; -120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; -120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; -120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; -120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; -120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; -120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; -120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; -120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; -120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; -120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; -120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; -120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; -120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; -120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; -120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; -120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; -120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; -120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; -120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; -120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; -120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; -120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; -120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; -120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; -120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; -120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; -120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; -120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; -120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; -120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; -120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; -120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; -120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; -120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; -120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; -120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; -120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; -120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; -120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; -120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; -120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; -120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; -120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; -120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; -120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; -120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; -120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; -120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; -120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; -120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; -120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; -120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; -120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; -120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; -120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; -120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; -120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; -120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; -120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; -120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; -120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; -12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; -12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; -12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; -12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; -12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; -12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; -12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; -12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; -12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; -12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; -1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; -1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; -1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; -1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; -1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; -12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; -12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; -12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; -12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; -12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; -12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; -12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; -12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; -12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; -12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; -1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; -1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; -1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; -1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; -1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; -12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; -12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; -12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; -12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; -12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; -12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; -12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; -12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; -12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; -12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; -1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; -1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; -1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; -1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; -1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; -1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; -12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; -12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; -12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; -12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; -12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; -12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; -12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; -12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; -12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; -12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; -1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; -1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; -1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; -1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; -1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; -1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; -12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; -12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; -12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; -12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; -12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; -12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; -12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; -12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; -12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; -12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; -1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; -1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; -1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; -1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; -1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; -12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; -12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; -12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; -12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; -12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; -12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; -12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; -12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; -12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; -12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; -1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; -1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; -1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; -1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; -1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; -1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; -12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; -12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; -12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; -12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; -12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; -12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; -12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; -12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; -12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; -1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; -1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; -1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; -1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; -1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; -1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; -12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; -12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; -12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; -12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; -12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; -12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; -12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; -12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; -12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; -12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; -1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; -1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; -1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; -1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; -1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; -1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; -12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; -12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; -12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; -12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; -12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; -12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; -12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; -12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; -12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; -12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; -1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; -1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; -1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; -1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; -1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; -1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; -12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; -12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; -12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; -12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; -12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; -12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; -12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; -12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; -12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; -1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; -1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; -1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; -1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; -1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; -1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; -121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; -121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; -121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; -121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; -121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; -121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; -121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; -121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; -121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; -121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; -121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; -121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; -121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; -121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; -121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; -121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; -121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; -121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; -121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; -121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; -121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; -121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; -121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; -121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; -121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; -121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; -121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; -121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; -121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; -121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; -121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; -121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; -121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; -121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; -121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; -121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; -121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; -121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; -121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; -121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; -121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; -121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; -121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; -121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; -121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; -121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; -121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; -121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; -121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; -121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; -121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; -121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; -121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; -121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; -121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; -121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; -121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; -121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; -121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; -121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; -121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; -121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; -121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; -121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; -121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; -121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; -121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; -121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; -121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; -121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; -121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; -121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; -121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; -121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; -121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; -121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; -121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; -121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; -121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; -121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; -121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; -121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; -121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; -121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; -121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; -121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; -121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; -121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; -121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; -121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; -121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; -121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; -121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; -121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; -12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; -12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; -12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; -12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; -12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; -12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; -12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; -12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; -12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; -1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; -1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; -1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; -1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; -1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; -12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; -12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; -12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; -12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; -12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; -12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; -12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; -12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; -12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; -12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; -1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; -1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; -1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; -1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; -1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; -1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; -12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; -12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; -12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; -12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; -12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; -12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; -12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; -12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; -12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; -12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; -1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; -1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; -1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; -1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; -1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; -1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; -12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; -12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; -12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; -12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; -12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; -12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; -12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; -12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; -12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; -12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; -1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; -1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; -1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; -1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; -1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; -1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; -12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; -12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; -12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; -12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; -12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; -12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; -12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; -12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; -12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; -12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; -1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; -1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; -1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; -1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; -1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; -1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; -12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; -12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; -12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; -12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; -12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; -12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; -12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; -12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; -12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; -1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; -1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; -1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; -1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; -1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; -1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; -12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; -12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; -12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; -12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; -12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; -12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; -12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; -12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; -12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; -12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; -1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; -1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; -1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; -1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; -1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; -1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; -12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; -12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; -12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; -12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; -12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; -12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; -12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; -12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; -12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; -1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; -1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; -1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; -1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; -1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; -1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; -12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; -12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; -12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; -12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; -12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; -12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; -12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; -12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; -12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; -12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; -1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; -1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; -1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; -1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; -1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; -1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; -12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; -12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; -12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; -12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; -12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; -12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; -12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; -12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; -12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; -12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; -1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; -1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; -1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; -1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; -1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; -1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; -122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; -122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; -122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; -122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; -122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; -122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; -122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; -122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; -122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; -122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; -122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; -122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; -122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; -122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; -122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; -122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; -122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; -122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; -122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; -122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; -122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; -122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; -122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; -122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; -122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; -122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; -122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; -122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; -122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; -122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; -122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; -122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; -122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; -122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; -122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; -122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; -122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; -122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; -122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; -122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; -122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; -122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; -122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; -122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; -122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; -122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; -122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; -122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; -122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; -122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; -122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; -122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; -122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; -122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; -122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; -122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; -122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; -122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; -122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; -122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; -122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; -122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; -122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; -122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; -122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; -122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; -122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; -122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; -122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; -122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; -122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; -122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; -122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; -122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; -122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; -122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; -122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; -122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; -122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; -122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; -122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; -122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; -122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; -122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; -122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; -122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; -122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; -122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; -122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; -122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; -122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; -122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; -122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; -122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; -12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; -12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; -12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; -12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; -12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; -12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; -12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; -12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; -12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; -1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; -1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; -1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; -1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; -1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; -1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; -12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; -12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; -12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; -12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; -12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; -12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; -12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; -12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; -12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; -12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; -1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; -1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; -1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; -1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; -1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; -1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; -12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; -12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; -12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; -12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; -12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; -12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; -12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; -12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; -12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; -12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; -1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; -1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; -1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; -1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; -1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; -1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; -12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; -12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; -12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; -12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; -12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; -12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; -12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; -12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; -12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; -12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; -1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; -1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; -1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; -1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; -1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; -12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; -12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; -12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; -12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; -12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; -12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; -12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; -12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; -12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; -12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; -1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; -1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; -1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; -1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; -1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; -1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; -12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; -12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; -12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; -12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; -12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; -12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; -12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; -12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; -12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; -12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; -1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; -1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; -1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; -1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; -1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; -1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; -12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; -12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; -12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; -12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; -12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; -12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; -12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; -12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; -12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; -12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; -1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; -1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; -1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; -1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; -1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; -1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; -12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; -12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; -12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; -12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; -12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; -12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; -12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; -12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; -12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; -12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; -1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; -1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; -1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; -1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; -1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; -1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; -12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; -12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; -12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; -12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; -12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; -12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; -12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; -12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; -12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; -12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; -1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; -1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; -1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; -1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; -1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; -1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; -12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; -12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; -12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; -12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; -12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; -12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; -12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; -12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; -12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;; -12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; -12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; -12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; -12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; -12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; -12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; -12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; -12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; -12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; -12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; -1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; -1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; -1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; -1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; -1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; -1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; -12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; -12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; -12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; -12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; -12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; -12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; -12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; -12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; -12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; -12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; -1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; -1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; -1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; -1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; -1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; -1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; -12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; -12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; -12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; -12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; -12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; -12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; -12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; -12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; -12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; -12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; -1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; -1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; -1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; -1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; -1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; -1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; -12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; -12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; -12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; -12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; -12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; -12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; -12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; -12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; -12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; -12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; -1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; -1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; -1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; -1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; -1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; -1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; -12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; -12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; -12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; -12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; -12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; -12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; -12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; -12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; -12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; -12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; -1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; -1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; -1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; -1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; -1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; -1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; -12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; -12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; -12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; -12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; -12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; -12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; -12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; -12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; -12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; -12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; -1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; -1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; -1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; -1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; -1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; -1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; -12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; -12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; -12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; -12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; -12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; -12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; -12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; -12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; -12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; -12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; -1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; -1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; -1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; -1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; -1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; -12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; -12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; -12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; -12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; -12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; -12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; -12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; -12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; -12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; -12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; -12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; -12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; -12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; -12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; -12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; -1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; -1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; -1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; -1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; -1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; -1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; -12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; -12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; -12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; -12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; -12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; -12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; -12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; -12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; -12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; -12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; -1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; -1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; -1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; -1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; -1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; -124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; -124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; -124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; -124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; -124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; -124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; -124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; -124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; -124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; -124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; -124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; -124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; -124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; -124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; -124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; -124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; -124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; -124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; -124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; -124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; -124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; -124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; -124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; -124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; -124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; -124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; -124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; -124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; -124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; -124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; -124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; -124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; -124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; -124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; -124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; -124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; -124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; -124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; -124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; -124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; -124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; -124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; -124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; -124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; -124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; -124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; -124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; -124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; -124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; -124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; -124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; -124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; -124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; -124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; -124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; -124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; -124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; -124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; -124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; -124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; -124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; -124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; -124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; -124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; -124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; -124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; -124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; -124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; -124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; -124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; -124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; -124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; -124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; -124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; -124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; -124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; -124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; -124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; -124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; -124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; -124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; -124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; -124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; -124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; -124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; -124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; -124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; -124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; -124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; -124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; -124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; -12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; -12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; -12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; -12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; -12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; -12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; -12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; -12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; -12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; -12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; -1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; -1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; -1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; -1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; -1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; -1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; -12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; -12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; -12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; -12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; -12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; -12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; -12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; -12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; -1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; -1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; -1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; -1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; -1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; -12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; -12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; -12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; -12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; -12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; -12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; -12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; -12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; -12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; -12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; -1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; -1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; -1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; -1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; -1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; -1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; -12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; -12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; -12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; -12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; -12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; -12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; -12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; -12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; -12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; -12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; -1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; -1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; -1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; -1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; -1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; -12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; -12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; -12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; -12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; -13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; -13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; -13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; -13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; -13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; -13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; -13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; -13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; -13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; -13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; -1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; -1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; -1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; -1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; -1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; -1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; -13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; -13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; -13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; -13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; -13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; -13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; -13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; -13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; -13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; -13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; -1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; -1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; -1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; -1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; -1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; -1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; -13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; -13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; -13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; -13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; -13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; -13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; -13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; -13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; -13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; -13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; -1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; -1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; -1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; -1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; -1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; -1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; -13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; -13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; -13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; -13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; -13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; -13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; -13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; -13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; -13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; -13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; -1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; -1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; -1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; -1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; -1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; -1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; -13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; -13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; -13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; -13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; -13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; -13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; -13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; -13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; -13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; -13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; -1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; -1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; -1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; -1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; -1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; -1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; -13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; -13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; -13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; -13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; -13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; -13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; -13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; -13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; -13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; -13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; -1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; -1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; -1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; -1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; -1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; -1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; -13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; -13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; -13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; -13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; -13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; -13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; -13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; -13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; -13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; -13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; -1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; -1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; -1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; -1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; -1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; -1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; -13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; -13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; -13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; -13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; -13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; -13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; -13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; -13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; -13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; -13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; -1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; -1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; -1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; -1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; -1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; -1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; -13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; -13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; -13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; -13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; -13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; -13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; -13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; -13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; -13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; -13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; -1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; -1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; -1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; -1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; -1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; -1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; -13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; -13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; -13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; -13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; -13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; -13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; -13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; -13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; -13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; -13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; -1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; -1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; -1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; -1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; -1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; -1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; -130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; -130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; -130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; -130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; -130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; -130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; -130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; -130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; -130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; -130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; -130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; -130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; -130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; -130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; -130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; -130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; -130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; -130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; -130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; -130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; -130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; -130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; -130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; -130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; -130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; -130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; -130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; -130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; -130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; -130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; -130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; -130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; -130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; -130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; -130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; -130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; -130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; -130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; -130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; -130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; -130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; -130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; -130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; -130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; -130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; -130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; -130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; -130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; -130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; -130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; -130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; -130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; -130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; -130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; -130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; -130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; -130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; -130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; -130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; -130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; -130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; -130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; -130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; -130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; -130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; -130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; -130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; -130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; -130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; -130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; -130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; -130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; -130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; -130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; -130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; -130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; -130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; -130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; -130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; -130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; -130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; -130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; -130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; -130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; -130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; -130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; -130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; -130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; -130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; -130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; -130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; -130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; -130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; -130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; -130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; -130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; -13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; -13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; -13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; -13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; -13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; -13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; -13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; -13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; -13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; -13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; -1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; -1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; -1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; -1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; -1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; -1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; -13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; -13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; -13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; -13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; -13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; -13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; -13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; -13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; -13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; -13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; -1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; -1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; -1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; -1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; -1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; -1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; -13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; -13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; -13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; -13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; -13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; -13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; -13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; -13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; -13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; -13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; -1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; -1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; -1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; -1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; -1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; -1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; -13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; -13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; -13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; -13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; -13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; -13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; -13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; -13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; -13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; -13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; -1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; -1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; -1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; -1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; -1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; -1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; -13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; -13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; -13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; -13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; -13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; -13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; -13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; -13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; -13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; -13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; -1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; -1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; -1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; -1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; -1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; -1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; -13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; -13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; -13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; -13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; -13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; -13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; -13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; -13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; -13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; -13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; -1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; -1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; -1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; -1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; -1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; -1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; -13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; -13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; -13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; -13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; -13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; -13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; -13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; -13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; -13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; -13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; -1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; -1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; -1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; -1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; -1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; -1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; -13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; -13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; -13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; -13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; -13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; -13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; -13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; -13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; -13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; -13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; -1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; -1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; -1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; -1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; -1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; -1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; -13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; -13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; -13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; -13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; -13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; -13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; -13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; -13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; -13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; -13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; -1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; -1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; -1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; -1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; -1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; -1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; -13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; -13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; -13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; -13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; -13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; -13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; -13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; -13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; -13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; -13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; -1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; -1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; -1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; -1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; -1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; -1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; -131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; -131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; -131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; -131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; -131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; -131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; -131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; -131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; -131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; -131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; -131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; -131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; -131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; -131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; -131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; -131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; -131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; -131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; -131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; -131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; -131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; -131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; -131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; -131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; -131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; -131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; -131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; -131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; -131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; -131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; -131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; -131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; -131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; -131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; -131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; -131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; -131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; -131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; -131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; -131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; -131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; -131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; -131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; -131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; -131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; -131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; -131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; -131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; -131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; -131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; -131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; -131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; -131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; -131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; -131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; -131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; -131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; -131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; -131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; -131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; -131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; -131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; -131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; -131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; -131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; -131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; -131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; -131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; -131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; -131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; -131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; -131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; -131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; -131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; -131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; -131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; -131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; -131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; -131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; -131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; -131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; -131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; -131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; -131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; -131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; -131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; -131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; -131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; -131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; -131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; -131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; -131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; -131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; -131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; -131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; -131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; -13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; -13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; -13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; -13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; -13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; -13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; -13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; -13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; -13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; -13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; -1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; -1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; -1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; -1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; -1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; -1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; -13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; -13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; -13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; -13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; -13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; -13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; -13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; -13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; -13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; -13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; -1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; -1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; -1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; -1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; -1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; -1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; -13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; -13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; -13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; -13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; -13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; -13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; -13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; -13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; -13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; -13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; -1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; -1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; -1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; -1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; -1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; -1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; -13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; -13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; -13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; -13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; -13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; -13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; -13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; -13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; -13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; -13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; -1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; -1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; -1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; -1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; -1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; -1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; -13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; -13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; -13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; -13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; -13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; -13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; -13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; -13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; -13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; -13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; -1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; -1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; -1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; -1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; -1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; -1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; -13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; -13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; -13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; -13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; -13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; -13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; -13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; -13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; -13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; -13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; -1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; -1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; -1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; -1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; -1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; -1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; -13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; -13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; -13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; -13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; -13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; -13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; -13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; -13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; -13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; -13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; -1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; -1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; -1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; -1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; -1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; -1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; -13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; -13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; -13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; -13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; -13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; -13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; -13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; -13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; -13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; -13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; -1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; -1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; -1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; -1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; -1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; -1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; -13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; -13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; -13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; -13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; -13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; -13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; -13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; -13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; -13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; -13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; -1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; -1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; -1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; -1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; -1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; -1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; -13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; -13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; -13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; -13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; -13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; -13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; -13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; -13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; -13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; -13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; -1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; -1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; -1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; -1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; -1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; -1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; -132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; -132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; -132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; -132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; -132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; -132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; -132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; -132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; -132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; -132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; -132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; -132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; -132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; -132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; -132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; -132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; -132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; -132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; -132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; -132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; -132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; -132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; -132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; -132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; -132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; -132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; -132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; -132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; -132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; -132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; -132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; -132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; -132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; -132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; -132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; -132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; -132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; -132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; -132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; -132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; -132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; -132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; -132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; -132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; -132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; -132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; -132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; -132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; -132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; -132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; -132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; -132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; -132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; -132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; -132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; -132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; -132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; -132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; -132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; -132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; -132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; -132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; -132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; -132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; -132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; -132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; -132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; -132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; -132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; -132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; -132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; -132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; -132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; -132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; -132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; -132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; -132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; -132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; -132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; -132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; -132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; -132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; -132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; -132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; -132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; -132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; -132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; -132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; -132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; -132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; -132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; -132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; -132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; -132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; -132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; -132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; -13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; -13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; -13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; -13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; -13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; -13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; -13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; -13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; -13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; -13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; -1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; -1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; -1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; -1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; -1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; -1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; -13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; -13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; -13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; -13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; -13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; -13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; -13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; -13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; -13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; -13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; -1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; -1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; -1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; -1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; -1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; -1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; -13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; -13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; -13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; -13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; -13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; -13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; -13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; -13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; -13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; -13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; -1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; -1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; -1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; -1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; -1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; -1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; -13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; -13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; -13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; -13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; -13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; -13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; -13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; -13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; -13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; -13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; -1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; -1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; -1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; -1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; -1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; -1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; -13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; -13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; -13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; -13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; -13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; -13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; -13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; -13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; -13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; -13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; -1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; -1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; -1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; -1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; -1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; -1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; -13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; -13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; -13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; -13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; -13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; -13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; -13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; -13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; -13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; -13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; -1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; -1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; -1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; -1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; -1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; -1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; -13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; -13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; -13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; -13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; -13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; -13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; -13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; -13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; -13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; -13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; -1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; -1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; -1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; -1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; -1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; -1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; -13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; -13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; -13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; -13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; -13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; -13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; -13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; -13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; -13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; -13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; -1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; -1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; -1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; -1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; -1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; -1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; -13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; -13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; -13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; -13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; -13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; -13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; -13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; -13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; -13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; -13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; -1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; -1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; -1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; -1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; -1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; -1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; -13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; -13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; -13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; -13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; -13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; -13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; -13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; -13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; -13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; -13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; -1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; -1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; -1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; -1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; -1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; -1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; -133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; -133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; -133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; -133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; -133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; -133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; -133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; -133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; -133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; -133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; -133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; -133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; -133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; -133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; -133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; -133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; -133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; -133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; -133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; -133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; -133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; -133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; -133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; -133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; -133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; -133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; -133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; -133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; -133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; -133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; -133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; -133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; -133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; -133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; -133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; -133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; -133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; -133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; -133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; -133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; -133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; -133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; -133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; -133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; -133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; -133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; -133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; -133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; -133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; -133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; -133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; -133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; -133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; -133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; -133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; -133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; -133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; -133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; -133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; -133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; -133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; -133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; -133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; -133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; -133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; -133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; -133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; -133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; -133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; -133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; -133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; -133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; -133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; -133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; -133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; -133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; -133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; -133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; -133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; -133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; -133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; -133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; -133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; -133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; -133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; -133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; -133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; -133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; -133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; -133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; -133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; -133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; -133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; -133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; -133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; -133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; -13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; -13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; -13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; -13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; -13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; -13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; -13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; -13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; -13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; -13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; -1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; -1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; -1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; -1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; -1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; -1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; -13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; -13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; -13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; -13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; -13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; -13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; -13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; -13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; -13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; -13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; -1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; -1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; -1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; -1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; -1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; -1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; -13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; -13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; -13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; -13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; -13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; -13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; -13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; -13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; -13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; -13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; -1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; -1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; -1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; -1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; -1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; -14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; -14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; -14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; -14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; -14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; -14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; -14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; -14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; -14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; -14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; -1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; -1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; -1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; -1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; -1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; -1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; -14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; -14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; -14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; -14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; -14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; -14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; -14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; -14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; -14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; -14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; -1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; -1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; -1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; -1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; -1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; -1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; -14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; -14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; -14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; -14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; -14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; -14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; -14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; -14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; -14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; -14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; -1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; -1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; -1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; -1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; -1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; -1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; -14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; -14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; -14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; -14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; -14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; -14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; -14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; -14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; -14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; -14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; -1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; -1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; -1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; -1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; -1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; -1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; -14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; -14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; -14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; -14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; -14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; -14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; -14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; -14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; -14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; -14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; -1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; -1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; -1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; -1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; -1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; -1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; -14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; -14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; -14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; -14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; -14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; -14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; -14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; -14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; -14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; -14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; -1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; -1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; -1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; -1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; -1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; -1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; -14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; -14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; -14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; -14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; -14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; -14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; -14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; -14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; -14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; -14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; -1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; -1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; -1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; -1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; -1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; -1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; -14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; -14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; -14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; -14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; -14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; -14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; -14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; -14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; -14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; -14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; -1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; -1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; -1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; -1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; -1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; -1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; -14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; -14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; -14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; -14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; -14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; -14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; -14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; -14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; -14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; -14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; -1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; -1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; -1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; -1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; -1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; -1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; -14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; -14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; -14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; -14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; -14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; -14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; -14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; -14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; -14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; -14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; -1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; -1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; -1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; -1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; -1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; -1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; -144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; -144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; -144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; -144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; -144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; -144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; -144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; -144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; -144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; -144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; -144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; -144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; -144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; -144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; -144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; -144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; -144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; -144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; -144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; -144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; -144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; -144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; -144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; -144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; -144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; -144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; -144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; -144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; -144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; -144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; -144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; -144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; -144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; -144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; -144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; -144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; -144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; -144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; -144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; -144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; -144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; -144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; -144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; -144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; -144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; -144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; -144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; -144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; -144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; -144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; -144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; -144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; -144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; -144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; -144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; -144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; -144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; -144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; -144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; -144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; -144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; -144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; -144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; -144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; -144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; -144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; -144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; -144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; -144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; -144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; -144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; -144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; -144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; -144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; -144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; -144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; -144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; -144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; -144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; -144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; -144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; -144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; -144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; -144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; -144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; -144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; -144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; -144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; -144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; -144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; -144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; -144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; -144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; -144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; -144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; -144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; -14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; -14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; -14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; -14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; -14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; -14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; -14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; -14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; -14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; -14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; -1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; -1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; -1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; -1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; -1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; -1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; -14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; -14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; -14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; -14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; -14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; -14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; -14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; -14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; -14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; -14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; -1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; -1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; -1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; -1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; -1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; -1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; -14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; -14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; -14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; -14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; -14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; -14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; -14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; -14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; -14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; -14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; -1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; -1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; -1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; -1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; -1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; -1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; -14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; -14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; -14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; -14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; -14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; -14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; -14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; -14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; -14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; -14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; -1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; -1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; -1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; -1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; -1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; -1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; -14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; -14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; -14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; -14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; -14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; -14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; -14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; -14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; -14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; -14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; -1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; -1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; -1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; -1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; -1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; -1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; -14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; -14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; -14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; -14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; -14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; -14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; -14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; -14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; -14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; -14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; -1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; -1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; -1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; -1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; -1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; -1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; -14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; -14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; -14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; -14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; -14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; -14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; -14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; -14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; -14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; -14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; -1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; -1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; -1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; -1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; -1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; -1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; -14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; -14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; -14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; -14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; -14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; -14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; -14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; -14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; -14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; -14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; -1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; -1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; -1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; -1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; -1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; -1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; -14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; -14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; -14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; -14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; -14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; -14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; -14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; -14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; -14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; -14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; -1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; -1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; -1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; -1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; -1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; -1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; -14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; -14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; -14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; -14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; -14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; -14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; -14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; -14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; -14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; -14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; -1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; -1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; -1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; -1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; -1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; -1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; -145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; -145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; -145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; -145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; -145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; -145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; -145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; -145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; -145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; -145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; -145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; -145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; -145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; -145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; -145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; -145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; -145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; -145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; -145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; -145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; -145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; -145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; -145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; -145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; -145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; -145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; -145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; -145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; -145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; -145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; -145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; -145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; -145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; -145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; -145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; -145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; -145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; -145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; -145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; -145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; -145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; -145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; -145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; -145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; -145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; -145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; -145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; -145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; -145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; -145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; -145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; -145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; -145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; -145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; -145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; -145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; -145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; -145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; -145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; -145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; -145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; -145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; -145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; -145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; -145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; -145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; -145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; -145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; -145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; -145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; -145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; -145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; -145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; -145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; -145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; -145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; -145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; -145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; -145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; -145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; -145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; -145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; -145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; -145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; -145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; -145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; -145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; -145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; -145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; -145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; -145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; -145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; -145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; -145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; -145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; -145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; -14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; -14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; -14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; -14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; -14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; -14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; -14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; -14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; -14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; -14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; -1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; -1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; -1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; -1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; -1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; -1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; -14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; -14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; -14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; -14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; -14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; -14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; -14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; -14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; -14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; -14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; -1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; -1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; -1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; -1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; -1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; -1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; -14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; -14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; -14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; -14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; -14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; -14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; -14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; -14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; -14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; -14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; -1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; -1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; -1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; -1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; -1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; -1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; -14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; -14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; -14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; -14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; -14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; -14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; -14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; -14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; -14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; -14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; -1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; -1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; -1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; -1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; -1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; -1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; -14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; -14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; -14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; -14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; -14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; -14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; -14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; -16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; -16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; -16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; -16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; -16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; -16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; -16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; -16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; -16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; -16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; -1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; -1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; -1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; -1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; -1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; -1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; -16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; -16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; -16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; -16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; -16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; -16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; -16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; -16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; -16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; -16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; -1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; -1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; -1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; -1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; -1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; -1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; -16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; -16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; -16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; -16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; -16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; -16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; -16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; -16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; -16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; -16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; -1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; -1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; -1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; -1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; -1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; -1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; -16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; -16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; -16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; -16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; -16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; -16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; -16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; -16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; -16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; -16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; -1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; -1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; -1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; -1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; -1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; -1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; -16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; -16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; -16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; -16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; -16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; -16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; -16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; -16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; -16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; -16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; -1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; -1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; -1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; -1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; -1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; -1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; -16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; -16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; -16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; -16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; -16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; -16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; -16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; -16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; -16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; -16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; -1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; -1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; -1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; -1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; -1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; -1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; -16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; -16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; -16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; -16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; -16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; -16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; -16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; -16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; -16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; -16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; -1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; -1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; -1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; -1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; -1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; -1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; -16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; -16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; -16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; -16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; -16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; -16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; -16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; -16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; -16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; -16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; -1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; -1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; -1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; -1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; -1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; -1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; -16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; -16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; -16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; -16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; -16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; -16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; -16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; -16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; -16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; -16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; -1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; -1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; -1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; -1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; -1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; -1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; -16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; -16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; -16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; -16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; -16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; -16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; -16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; -16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; -16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; -16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; -1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; -1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; -1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; -1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; -1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; -1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; -168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; -168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; -168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; -168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; -168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; -168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; -168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; -168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; -168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; -168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; -168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; -168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; -168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; -168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; -168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; -168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; -168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; -168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; -168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; -168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; -168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; -168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; -168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; -168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; -168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; -168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; -168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; -168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; -168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; -168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; -168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; -168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; -168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; -168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; -168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; -168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; -168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; -168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; -168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; -168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; -168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; -168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; -168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; -168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; -168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; -168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; -168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; -168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; -168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; -168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; -168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; -168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; -168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; -168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; -168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; -168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; -168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; -168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; -168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; -168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; -168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; -168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; -168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; -168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; -168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; -168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; -168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; -168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; -168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; -168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; -168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; -168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; -168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; -168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; -168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; -168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; -168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; -168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; -168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; -168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; -168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; -168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; -168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; -168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; -168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; -168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; -168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; -168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; -168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; -168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; -168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; -168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; -168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; -168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; -168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; -168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; -16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; -16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; -16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; -16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; -16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; -16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; -16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; -16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; -16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; -16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; -1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; -1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; -1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; -1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; -1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; -1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; -16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; -16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; -16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; -16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; -16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; -16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; -16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; -16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; -16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; -16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; -1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; -1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; -1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; -1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; -1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; -1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; -16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; -16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; -16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; -16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; -16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; -16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; -16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; -16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; -16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; -16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; -1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; -1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; -1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; -1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; -1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; -1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; -16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; -16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; -16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; -16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; -16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; -16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; -16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; -16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; -16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; -16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; -1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; -1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; -1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; -1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; -1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; -1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; -16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; -16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; -16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; -16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; -16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; -16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; -16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; -16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; -16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; -16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; -1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; -1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; -1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; -1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; -1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; -1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; -16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; -16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; -16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; -16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; -16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; -16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; -16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; -16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; -16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; -16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; -1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; -1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; -1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; -1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; -1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; -1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; -16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; -16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; -16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; -16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; -16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; -16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; -16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; -16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; -16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; -16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; -1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; -1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; -1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; -1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; -1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; -1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; -16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; -16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; -16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; -16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; -16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; -16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; -16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; -16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; -16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; -16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; -1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; -1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; -1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; -1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; -1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; -1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; -16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; -16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; -16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; -16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; -16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; -16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; -16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; -16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; -16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; -16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; -1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; -1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; -1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; -1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; -1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; -1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; -16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; -16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; -16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; -16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; -16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; -16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; -16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; -16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; -16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; -16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; -1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; -1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; -1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; -1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; -1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; -1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; -169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; -169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; -169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; -169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; -169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; -169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; -169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; -169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; -169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; -169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; -169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; -169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; -169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; -169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; -169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; -169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; -169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; -169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; -169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; -169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; -169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; -169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; -169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; -169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; -169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; -169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; -169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; -169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; -169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; -169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; -169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; -169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; -169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; -169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; -169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; -169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; -169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; -169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; -169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; -169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; -169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; -169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; -169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; -169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; -169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; -169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; -169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; -169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; -169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; -169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; -169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; -169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; -169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; -169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; -169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; -169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; -169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; -169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; -169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; -169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; -169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; -169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; -169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; -169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; -169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; -169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; -169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; -169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; -169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; -169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; -169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; -169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; -169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; -169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; -169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; -169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; -169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; -169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; -169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; -169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; -169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; -169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; -169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; -169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; -169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; -169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; -169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; -169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; -169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; -169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; -169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; -169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; -169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; -169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; -169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; -169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; -16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; -16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; -16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; -16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; -16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; -16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; -16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; -16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; -16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; -16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; -16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; -16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; -16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; -16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; -16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; -16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; -16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; -16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; -16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; -16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; -16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; -16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; -16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; -16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; -16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; -16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; -16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; -16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; -16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; -16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; -16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; -16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; -16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; -16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; -16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; -16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; -16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; -16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; -16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; -16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; -16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; -16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; -16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; -16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; -16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; -16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; -16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; -16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; -16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; -16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; -16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; -16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; -16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; -16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; -16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; -16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; -16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; -16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; -16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; -16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; -16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; -16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; -16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; -16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; -16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; -16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; -16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; -16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; -16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; -16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; -16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; -16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; -16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; -16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; -16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; -16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; -16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; -16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; -16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; -16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; -16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; -16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; -16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; -16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; -16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; -16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; -16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; -16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; -16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; -16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; -16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; -16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; -16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; -16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; -16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; -16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; -16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; -16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; -16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; -16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; -16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; -16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; -16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; -16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; -16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; -16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; -16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; -16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; -16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; -16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; -16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; -16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; -16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; -16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; -16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; -16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; -16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; -16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; -16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; -16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; -16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; -16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; -16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; -16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; -16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; -16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; -16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; -16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; -16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; -16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; -16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; -16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; -16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; -16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; -16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; -16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; -16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; -16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; -16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; -16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; -16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; -16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; -16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; -16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; -16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; -16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; -16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; -16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; -16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; -16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; -16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; -16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; -16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; -16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; -16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; -16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; -16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; -16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; -16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; -16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; -16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; -16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; -16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; -16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; -16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; -16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; -16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; -16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; -16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; -16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; -16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; -16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; -16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; -16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; -16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; -16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; -16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; -16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; -16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; -16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; -16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; -16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; -16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; -16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; -16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; -16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; -16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; -16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; -16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; -16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; -16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; -16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; -16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; -16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; -16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; -16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; -16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; -16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; -16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; -16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; -16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; -16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; -16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; -16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; -16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; -16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; -16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; -16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; -16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; -16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; -16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; -16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; -16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; -16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; -16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; -16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; -16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; -16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; -16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; -16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; -16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; -16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; -16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; -16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; -16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; -16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; -16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; -16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; -16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; -16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; -16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; -16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; -16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; -16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; -16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; -16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; -16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; -16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; -16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; -16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; -16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; -16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; -16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; -16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; -16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; -16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; -16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; -16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; -16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; -16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; -16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; -16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; -16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; -16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; -16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; -16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; -16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; -16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; -16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; -16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; -16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; -16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; -16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; -16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; -16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; -16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; -16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; -16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; -16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; -16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; -16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; -16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; -16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; -16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; -16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; -16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; -16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; -16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; -16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; -16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; -16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; -16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; -16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; -16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; -16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; -16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; -16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; -16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; -16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; -16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; -16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; -16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; -16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; -16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; -16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; -16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; -16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; -16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; -16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; -16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; -16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; -16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; -16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; -16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; -16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; -16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; -16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; -16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; -16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; -16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; -16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; -16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; -16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; -16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; -16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; -16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; -16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; -16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; -16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; -16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; -16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; -16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; -16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; -16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; -16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; -16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; -16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; -16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; -16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; -16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; -16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; -16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; -16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; -16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; -16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; -16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; -16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; -16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; -16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; -16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; -16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; -16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; -16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; -16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; -16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; -16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; -16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; -16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; -16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; -16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; -16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; -16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; -16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; -16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; -16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; -16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; -16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; -16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; -16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; -16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; -16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; -16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; -16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; -16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; -1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; -1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; -1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; -1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; -1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; -1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; -1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; -1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; -1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; -1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; -1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; -1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; -1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; -1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; -1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; -1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; -1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; -1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; -1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; -1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; -1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; -1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; -1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; -1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; -1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; -1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; -1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; -1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; -1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; -1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; -1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; -1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; -1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; -1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; -1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; -1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; -1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; -1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; -1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; -1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; -1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; -1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; -1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; -1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; -1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; -1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; -1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; -1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; -1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; -1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; -1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; -1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; -1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; -1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; -1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; -1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; -1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; -1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; -1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; -1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; -1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; -1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; -1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; -1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; -1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; -1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; -1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; -1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; -1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; -1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; -1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; -1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; -1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; -1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; -1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; -1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; -1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; -1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; -1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; -1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; -1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; -1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; -1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; -1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; -1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; -1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; -1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; -1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; -1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; -1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; -1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; -1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; -1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; -1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; -1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; -1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; -1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; -1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; -1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; -1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; -1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; -1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; -1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; -1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; -1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; -1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; -1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; -1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; -1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; -1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; -1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; -1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; -1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; -1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; -1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; -1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; -1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; -1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; -1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; -1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; -1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; -1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; -1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; -1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; -1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; -1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; -1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; -1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; -1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; -1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; -1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; -1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; -1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; -1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; -1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; -1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; -1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; -1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; -1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; -1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; -1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; -1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; -1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; -1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; -1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; -1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; -1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; -1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; -1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; -1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; -1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; -1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; -1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; -1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; -1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; -1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; -1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; -1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; -1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; -1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; -1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; -1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; -1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; -1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; -1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; -1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; -1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; -1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; -1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; -1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; -1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; -1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; -1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; -1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; -1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; -1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; -1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; -1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; -1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; -1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; -1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; -1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; -1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; -1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; -1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; -1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; -1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; -1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; -1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; -1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; -1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; -1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; -1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; -1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; -1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; -1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; -1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; -1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; -1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; -1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; -1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; -1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; -1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; -1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; -1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; -1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; -1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; -1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; -1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; -1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; -1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; -1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; -1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; -1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; -1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; -1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; -1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; -1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; -1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; -1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; -1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; -1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; -1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; -1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; -1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; -1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; -1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; -1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; -1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; -1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; -1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; -1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; -1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; -1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; -1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; -1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; -1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; -1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; -1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; -1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; -1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; -1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; -1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; -1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; -1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; -1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; -1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; -1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; -1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; -1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; -1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; -1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; -1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; -1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; -1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; -1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; -1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; -1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; -1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; -1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; -1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; -1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; -1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; -1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; -1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; -1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; -1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; -1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; -1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; -1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; -1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; -1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; -1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; -1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; -1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; -1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; -1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; -1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; -1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; -1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; -1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; -1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; -1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; -1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; -1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; -1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; -1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; -1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; -1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; -1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; -1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; -1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; -1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; -1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; -1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; -1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; -1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; -1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; -1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; -1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; -1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; -1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; -1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; -1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; -1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; -1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; -1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; -1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; -1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; -1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; -1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; -1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; -1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; -1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; -1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; -1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; -1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; -1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; -1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; -1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; -1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; -1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; -1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; -1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; -1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; -1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; -1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; -1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; -1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; -1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; -1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; -1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; -1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; -1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; -1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; -1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; -1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; -1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; -1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; -1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; -1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; -1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; -1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; -1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; -1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; -1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; -1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; -1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; -1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; -1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; -1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; -1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; -1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; -1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; -1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; -1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; -1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; -1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; -1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; -1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; -1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; -1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; -1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; -1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; -1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; -1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; -1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; -1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; -1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; -1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; -1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; -1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; -1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; -1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; -1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; -1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; -1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; -1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; -1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; -1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; -1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; -1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; -1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; -1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; -1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; -1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; -1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; -1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; -1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; -1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; -1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; -1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; -1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; -1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; -1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; -1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; -1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; -1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; -1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; -1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; -1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; -1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; -1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; -1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; -1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; -1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; -1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; -1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; -1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; -1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; -1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; -1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; -1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; -1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; -1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; -1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; -1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; -1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; -1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; -1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; -1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; -1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; -1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; -1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; -1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; -1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; -1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; -1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; -1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; -1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; -1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; -1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; -1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; -1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; -1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; -1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; -1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; -1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; -1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; -1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; -1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; -1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; -1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; -1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; -1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; -1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; -1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; -1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; -1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; -1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; -1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; -1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; -1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; -1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; -1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; -1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; -1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; -1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; -1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; -1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; -1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; -1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; -1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; -1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; -1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; -1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; -1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; -1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; -1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; -1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; -1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; -1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; -1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; -1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; -1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; -1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; -1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; -1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; -1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; -1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; -1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; -1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; -1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; -1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; -1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; -1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; -1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; -1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; -1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; -1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; -1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; -1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; -1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; -1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; -1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; -1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; -1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; -1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; -1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; -1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; -1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; -1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; -1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; -1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; -1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; -1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; -1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; -1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; -1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; -1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; -1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; -1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; -1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; -1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; -1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; -1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; -1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; -1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; -1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; -1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; -1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; -1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; -1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; -1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; -1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; -1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; -1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; -1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; -1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; -1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; -1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; -1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; -1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; -1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; -1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; -1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; -1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; -1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; -1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; -1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; -1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; -1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; -1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; -1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; -1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; -1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; -1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; -1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; -1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; -1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; -1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; -1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; -1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; -1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; -1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; -1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; -1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; -1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; -1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; -1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; -1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; -1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; -1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; -1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; -1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; -1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; -1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; -1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; -1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; -1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; -1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; -1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; -1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; -1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; -1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; -1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; -1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; -1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; -1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; -1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; -1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; -1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; -1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; -1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; -1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; -1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; -1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; -1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; -1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; -1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; -1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; -1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; -1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; -1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; -1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; -1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; -1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; -1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; -1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; -1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; -1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; -1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; -1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; -1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; -1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; -1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; -1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; -1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; -1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; -1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; -1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; -1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; -1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; -1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; -1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; -1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; -1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; -1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; -1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; -1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; -1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; -1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; -1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; -1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; -1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; -1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; -1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; -1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; -1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; -1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; -1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; -1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; -1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; -1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; -1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; -1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; -1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; -1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; -1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; -1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; -1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; -1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; -1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; -1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; -1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; -1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; -1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; -1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; -1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; -1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; -1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; -1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; -1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; -1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; -1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; -1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; -1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; -1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; -1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; -1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; -1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; -1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; -1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; -1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; -1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; -1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; -1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; -1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; -1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; -1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; -1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; -1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; -1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; -1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; -1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; -1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; -1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; -1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; -1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; -1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; -1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; -1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; -1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; -1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; -1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; -1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; -1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; -1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; -1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; -1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; -1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; -1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; -1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; -1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; -1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; -1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; -1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; -1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; -1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; -1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; -1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; -1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; -1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; -1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; -1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; -1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; -1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; -1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; -1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; -1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; -1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; -1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; -1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; -1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; -1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; -1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; -1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; -1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; -1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; -1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; -1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; -1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; -1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; -1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; -1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; -1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; -1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; -1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; -1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; -1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; -1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; -1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; -1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; -1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; -1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; -1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; -1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; -1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; -1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; -1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; -1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; -1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; -1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; -1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; -1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; -1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; -1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; -1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; -1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; -1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; -1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; -1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; -1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; -1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; -1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; -1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; -1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; -1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; -1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; -1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; -1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; -1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; -1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; -1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; -1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; -1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; -1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; -1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; -1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; -1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; -1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; -1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; -1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; -1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; -1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; -1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; -1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; -1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; -1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; -1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; -1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; -1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; -1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; -1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L; 0131;;;;N;;;;; -1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L; 0237;;;;N;;;;; -1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; -1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; -1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L; 03DC;;;;N;;;;; -1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L; 03DD;;;;N;;;;; -1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; -1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; -1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; -1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; -1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; -1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; -1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; -1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; -1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; -1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; -1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; -1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; -1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; -1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; -1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; -1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; -1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; -1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; -1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; -1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; -1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; -1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; -1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; -1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; -1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; -1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; -1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; -1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; -1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; -1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; -1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; -1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; -1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; -1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; -1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; -1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; -1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; -1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; -1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; -1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; -1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; -1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; -1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; -1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; -1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; -1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; -1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; -1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; -1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; -1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; -1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; -1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; -1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; -1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; -1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; -1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; -1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; -1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; -1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; -1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; -1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; -1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; -1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; -1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; -1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; -1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; -1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; -1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; -1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; -1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; -1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; -1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; -1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; -1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; -1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; -1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; -1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; -1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; -1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; -1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; -1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; -1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; -1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; -1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; -1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; -1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; -1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; -1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; -1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; -1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; -1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; -1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; -1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; -1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; -1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; -1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; -1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; -1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; -1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; -1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; -1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; -1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; -1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; -1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; -1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; -1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; -1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; -1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; -1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; -1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; -1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; -1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; -1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; -1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; -1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; -1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; -1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; -1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; -1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; -1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; -1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; -1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; -1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; -1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; -1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; -1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; -1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; -1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; -1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; -1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; -1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; -1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; -1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; -1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; -1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; -1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; -1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; -1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; -1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; -1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; -1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; -1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; -1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; -1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; -1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; -1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; -1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; -1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; -1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; -1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; -1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; -1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; -1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; -1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; -1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; -1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; -1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; -1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; -1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; -1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; -1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; -1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; -1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; -1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; -1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; -1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; -1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; -1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; -1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; -1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; -1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; -1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; -1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; -1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; -1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; -1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; -1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; -1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; -1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; -1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; -1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; -1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; -1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; -1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; -1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; -1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; -1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; -1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; -1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; -1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; -1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; -1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; -1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; -1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; -1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; -1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; -1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; -1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; -1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; -1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; -1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; -1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; -1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; -1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; -1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; -1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; -1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; -1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; -1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; -1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; -1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; -1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; -1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; -1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; -1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; -1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; -1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; -1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; -1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; -1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; -1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; -1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; -1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; -1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; -1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; -1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; -1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; -1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; -1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; -1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; -1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; -1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; -1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; -1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; -1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; -1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; -1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; -1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; -1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; -1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; -1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; -1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; -1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; -1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; -1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; -1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; -1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; -1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; -1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; -1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; -1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; -1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; -1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; -1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; -1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; -1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; -1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; -1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; -1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; -1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; -1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; -1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; -1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; -1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; -1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; -1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; -1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; -1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; -1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; -1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; -1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; -1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; -1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; -1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; -1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; -1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; -1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; -1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; -1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; -1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; -1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; -1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; -1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; -1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; -1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; -1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; -1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; -1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; -1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; -1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; -1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; -1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; -1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; -1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; -1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; -1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; -1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; -1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; -1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; -1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; -1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; -1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; -1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; -1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; -1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; -1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; -1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; -1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; -1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; -1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; -1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; -1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; -1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; -1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; -1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; -1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; -1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; -1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; -1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; -1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; -1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; -1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; -1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; -1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; -1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; -1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; -1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; -1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; -1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; -1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; -1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; -1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; -1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; -1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; -1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; -1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; -1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; -1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; -1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; -1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; -1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; -1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; -1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; -1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; -1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; -1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; -1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; -1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; -1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; -1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; -1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; -1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; -1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; -1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; -1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; -1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; -1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; -1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; -1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; -1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; -1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; -1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; -1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; -1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; -1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; -1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; -1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; -1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; -1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; -1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; -1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; -1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; -1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; -1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; -1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; -1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; -1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; -1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; -1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; -1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; -1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; -1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; -1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; -1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; -1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; -1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; -1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; -1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; -1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; -1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; -1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; -1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; -1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; -1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; -1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; -1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; -1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; -1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; -1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; -1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; -1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; -1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; -1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; -1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; -1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; -1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; -1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; -1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; -1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; -1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; -1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; -1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; -1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; -1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; -1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; -1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; -1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; -1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; -1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; -1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; -1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; -1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; -1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; -1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; -1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; -1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; -1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; -1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; -1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; -1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; -1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; -1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; -1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; -1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; -1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; -1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; -1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; -1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; -1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; -1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; -1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; -1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; -1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; -1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; -1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; -1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; -1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; -1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; -1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; -1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; -1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; -1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; -1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; -1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; -1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; -1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; -1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; -1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; -1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; -1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; -1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; -1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; -1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; -1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; -1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; -1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; -1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; -1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; -1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; -1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; -1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; -1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; -1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; -1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; -1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; -1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; -1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; -1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; -1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; -1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; -1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; -1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; -1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; -1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; -1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; -1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; -1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; -1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; -1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; -1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; -1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; -1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; -1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; -1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; -1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; -1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; -1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; -1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; -1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; -1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; -1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; -1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; -1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; -1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; -1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; -1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; -1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; -1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; -1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; -1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; -1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; -1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; -1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; -1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; -1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; -1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; -1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; -1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; -1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; -1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; -1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; -1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; -1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; -1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; -1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; -1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; -1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; -1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; -1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; -1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; -1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; -1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; -1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; -1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; -1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; -1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; -1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; -1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; -1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; -1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; -1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; -1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; -1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; -1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; -1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; -1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; -1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; -1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; -1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; -1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; -1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; -1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; -1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; -1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; -1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; -1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; -1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; -1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; -1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; -1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; -1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; -1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; -1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; -1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; -1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; -1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; -1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; -1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; -1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; -1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; -1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; -1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; -1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; -1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; -1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; -1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; -1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; -1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; -1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; -1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; -1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; -1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; -1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; -1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; -1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; -1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; -1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; -1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; -1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; -1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; -1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; -1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; -1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; -1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; -1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; -1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; -1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; -1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; -1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; -1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; -1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; -1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; -1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; -1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; -1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; -1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; -1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; -1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; -1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; -1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; -1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; -1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; -1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; -1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; -1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; -1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; -1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; -1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; -1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; -1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; -1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; -1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; -1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; -1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; -1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; -1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; -1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; -1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; -1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; -1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; -1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; -1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; -1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; -1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; -1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; -1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; -1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; -1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; -1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; -1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; -1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; -1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; -1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; -1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; -1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; -1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; -1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; -1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; -1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; -1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; -1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; -1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; -1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; -1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; -1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; -1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; -1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; -1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; -1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; -1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; -1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; -1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; -1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; -1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; -1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; -1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; -1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; -1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; -1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; -1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; -1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; -1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; -1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; -1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; -1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; -1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; -1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; -1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; -1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; -1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; -1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; -1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; -1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; -1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; -1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; -1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; -1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; -1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; -1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; -1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; -1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; -1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; -1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; -1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; -1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; -1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; -1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; -1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; -1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; -1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; -1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; -1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; -1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; -1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; -1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; -1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; -1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; -1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; -1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; -1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; -1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; -1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; -1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; -1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; -1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; -1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; -1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; -1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; -1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; -1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; -1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; -1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; -1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; -1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; -1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; -1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; -1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; -1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; -1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; -1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; -1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; -1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; -1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; -1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; -1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; -1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; -1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; -1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; -1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; -1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; -1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; -1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; -1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; -1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; -1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; -1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; -1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; -1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; -1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; -1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; -1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; -1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; -1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; -1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; -1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; -1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; -1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; -1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; -1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; -1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; -1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; -1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; -1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; -1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; -1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; -1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; -1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; -1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; -1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; -1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; -1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; -1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; -1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; -1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; -1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; -1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; -1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL; 0627;;;;N;;;;; -1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL; 062F;;;;N;;;;; -1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL; 0648;;;;N;;;;; -1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL; 0632;;;;N;;;;; -1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL; 0637;;;;N;;;;; -1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL; 0643;;;;N;;;;; -1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL; 0631;;;;N;;;;; -1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL; 0630;;;;N;;;;; -1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; -1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; -1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; -1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; -1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL; 0647;;;;N;;;;; -1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL; 0643;;;;N;;;;; -1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; -1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; -1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL; 0647;;;;N;;;;; -1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL; 0637;;;;N;;;;; -1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL; 0643;;;;N;;;;; -1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; -1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; -1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL; 0627;;;;N;;;;; -1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL; 062F;;;;N;;;;; -1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL; 0647;;;;N;;;;; -1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL; 0648;;;;N;;;;; -1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL; 0632;;;;N;;;;; -1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL; 0637;;;;N;;;;; -1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL; 0631;;;;N;;;;; -1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL; 0630;;;;N;;;;; -1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL; 0628;;;;N;;;;; -1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL; 062F;;;;N;;;;; -1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL; 0648;;;;N;;;;; -1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL; 0632;;;;N;;;;; -1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL; 062D;;;;N;;;;; -1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL; 0637;;;;N;;;;; -1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL; 064A;;;;N;;;;; -1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL; 0644;;;;N;;;;; -1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL; 0646;;;;N;;;;; -1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL; 0639;;;;N;;;;; -1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL; 0641;;;;N;;;;; -1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL; 0635;;;;N;;;;; -1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL; 0642;;;;N;;;;; -1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL; 0631;;;;N;;;;; -1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL; 062A;;;;N;;;;; -1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL; 062B;;;;N;;;;; -1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL; 0630;;;;N;;;;; -1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL; 0636;;;;N;;;;; -1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; -1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; -1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; -1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; -1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; -1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; -1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; -1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; -1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; -1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; -1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; -1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; -1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; -1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; -1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; -1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; -1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; -1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; -1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; -1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; -1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; -1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; -1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; -1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; -1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; -1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; -1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; -1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; -1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; -1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; -1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; -1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; -1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; -1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; -1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; -1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; -1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; -1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; -1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; -1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; -1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; -1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; -1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; -1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; -1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; -1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; -1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; -1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; -1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; -1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; -1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; -1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; -1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; -1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; -1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; -1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; -1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; -1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; -1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; -1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; -1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; -1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; -1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; -1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; -1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; -1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; -1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; -1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; -1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; -1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; -1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; -1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; -1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; -1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; -1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; -1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; -1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; -1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; -1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; -1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; -1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; -1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; -1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; -1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; -1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; -1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; -1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; -1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; -1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; -1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; -1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; -1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; -1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; -1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; -1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; -1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; -1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; -1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; -1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; -1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; -1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; -1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; -1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; -1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; -1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; -1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; -1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; -1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; -1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; -1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; -1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; -1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; -1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; -1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; -1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; -1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; -1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; -1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; -1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; -1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; -1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; -1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; -1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; -1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; -1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; -1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; -1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; -1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; -1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; -1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; -1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; -1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; -1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; -1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; -1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; -1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; -1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; -1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; -1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; -1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; -1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; -1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; -1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; -1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; -1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; -1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; -1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; -1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; -1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; -1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; -1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; -1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; -1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; -1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; -1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; -1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; -1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; -1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; -1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; -1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; -1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; -1F100;DIGIT ZERO FULL STOP;No;0;EN; 0030 002E;;0;0;N;;;;; -1F101;DIGIT ZERO COMMA;No;0;EN; 0030 002C;;0;0;N;;;;; -1F102;DIGIT ONE COMMA;No;0;EN; 0031 002C;;1;1;N;;;;; -1F103;DIGIT TWO COMMA;No;0;EN; 0032 002C;;2;2;N;;;;; -1F104;DIGIT THREE COMMA;No;0;EN; 0033 002C;;3;3;N;;;;; -1F105;DIGIT FOUR COMMA;No;0;EN; 0034 002C;;4;4;N;;;;; -1F106;DIGIT FIVE COMMA;No;0;EN; 0035 002C;;5;5;N;;;;; -1F107;DIGIT SIX COMMA;No;0;EN; 0036 002C;;6;6;N;;;;; -1F108;DIGIT SEVEN COMMA;No;0;EN; 0037 002C;;7;7;N;;;;; -1F109;DIGIT EIGHT COMMA;No;0;EN; 0038 002C;;8;8;N;;;;; -1F10A;DIGIT NINE COMMA;No;0;EN; 0039 002C;;9;9;N;;;;; -1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; -1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; -1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L; 0028 0041 0029;;;;N;;;;; -1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L; 0028 0042 0029;;;;N;;;;; -1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L; 0028 0043 0029;;;;N;;;;; -1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L; 0028 0044 0029;;;;N;;;;; -1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L; 0028 0045 0029;;;;N;;;;; -1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L; 0028 0046 0029;;;;N;;;;; -1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L; 0028 0047 0029;;;;N;;;;; -1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L; 0028 0048 0029;;;;N;;;;; -1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L; 0028 0049 0029;;;;N;;;;; -1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L; 0028 004A 0029;;;;N;;;;; -1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L; 0028 004B 0029;;;;N;;;;; -1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L; 0028 004C 0029;;;;N;;;;; -1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L; 0028 004D 0029;;;;N;;;;; -1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L; 0028 004E 0029;;;;N;;;;; -1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L; 0028 004F 0029;;;;N;;;;; -1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L; 0028 0050 0029;;;;N;;;;; -1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L; 0028 0051 0029;;;;N;;;;; -1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L; 0028 0052 0029;;;;N;;;;; -1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L; 0028 0053 0029;;;;N;;;;; -1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L; 0028 0054 0029;;;;N;;;;; -1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L; 0028 0055 0029;;;;N;;;;; -1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L; 0028 0056 0029;;;;N;;;;; -1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L; 0028 0057 0029;;;;N;;;;; -1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L; 0028 0058 0029;;;;N;;;;; -1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L; 0028 0059 0029;;;;N;;;;; -1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L; 0028 005A 0029;;;;N;;;;; -1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L; 3014 0053 3015;;;;N;;;;; -1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; -1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; -1F12D;CIRCLED CD;So;0;L; 0043 0044;;;;N;;;;; -1F12E;CIRCLED WZ;So;0;L; 0057 005A;;;;N;;;;; -1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; -1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; -1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; -1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; -1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; -1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; -1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; -1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; -1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; -1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; -1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; -1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; -1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; -1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; -1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; -1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; -1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; -1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; -1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; -1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; -1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; -1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; -1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; -1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; -1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; -1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; -1F14A;SQUARED HV;So;0;L; 0048 0056;;;;N;;;;; -1F14B;SQUARED MV;So;0;L; 004D 0056;;;;N;;;;; -1F14C;SQUARED SD;So;0;L; 0053 0044;;;;N;;;;; -1F14D;SQUARED SS;So;0;L; 0053 0053;;;;N;;;;; -1F14E;SQUARED PPV;So;0;L; 0050 0050 0056;;;;N;;;;; -1F14F;SQUARED WC;So;0;L; 0057 0043;;;;N;;;;; -1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; -1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; -1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; -1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; -1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; -1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; -1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; -1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; -1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; -1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; -1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; -1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; -1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; -1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; -1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; -1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; -1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; -1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; -1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; -1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; -1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; -1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; -1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; -1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; -1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; -1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; -1F16A;RAISED MC SIGN;So;0;ON; 004D 0043;;;;N;;;;; -1F16B;RAISED MD SIGN;So;0;ON; 004D 0044;;;;N;;;;; -1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; -1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; -1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; -1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; -1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; -1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; -1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; -1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; -1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; -1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; -1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; -1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; -1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; -1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; -1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; -1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; -1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; -1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; -1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; -1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; -1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; -1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; -1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; -1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; -1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; -1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; -1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; -1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; -1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; -1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; -1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; -1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; -1F190;SQUARE DJ;So;0;L; 0044 004A;;;;N;;;;; -1F191;SQUARED CL;So;0;L;;;;;N;;;;; -1F192;SQUARED COOL;So;0;L;;;;;N;;;;; -1F193;SQUARED FREE;So;0;L;;;;;N;;;;; -1F194;SQUARED ID;So;0;L;;;;;N;;;;; -1F195;SQUARED NEW;So;0;L;;;;;N;;;;; -1F196;SQUARED NG;So;0;L;;;;;N;;;;; -1F197;SQUARED OK;So;0;L;;;;;N;;;;; -1F198;SQUARED SOS;So;0;L;;;;;N;;;;; -1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; -1F19A;SQUARED VS;So;0;L;;;;;N;;;;; -1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; -1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; -1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; -1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; -1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; -1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; -1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; -1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; -1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; -1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; -1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; -1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; -1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; -1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; -1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; -1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; -1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; -1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; -1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; -1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; -1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; -1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; -1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; -1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; -1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; -1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; -1F200;SQUARE HIRAGANA HOKA;So;0;L; 307B 304B;;;;N;;;;; -1F201;SQUARED KATAKANA KOKO;So;0;L; 30B3 30B3;;;;N;;;;; -1F202;SQUARED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; -1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L; 624B;;;;N;;;;; -1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L; 5B57;;;;N;;;;; -1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L; 53CC;;;;N;;;;; -1F213;SQUARED KATAKANA DE;So;0;L; 30C7;;;;N;;;;; -1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 4E8C;;;;N;;;;; -1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L; 591A;;;;N;;;;; -1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L; 89E3;;;;N;;;;; -1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L; 5929;;;;N;;;;; -1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L; 4EA4;;;;N;;;;; -1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L; 6620;;;;N;;;;; -1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L; 7121;;;;N;;;;; -1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L; 6599;;;;N;;;;; -1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L; 524D;;;;N;;;;; -1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L; 5F8C;;;;N;;;;; -1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L; 518D;;;;N;;;;; -1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L; 65B0;;;;N;;;;; -1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L; 521D;;;;N;;;;; -1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L; 7D42;;;;N;;;;; -1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L; 751F;;;;N;;;;; -1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L; 8CA9;;;;N;;;;; -1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L; 58F0;;;;N;;;;; -1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L; 5439;;;;N;;;;; -1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L; 6F14;;;;N;;;;; -1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L; 6295;;;;N;;;;; -1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L; 6355;;;;N;;;;; -1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L; 4E00;;;;N;;;;; -1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 4E09;;;;N;;;;; -1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L; 904A;;;;N;;;;; -1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L; 5DE6;;;;N;;;;; -1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L; 4E2D;;;;N;;;;; -1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L; 53F3;;;;N;;;;; -1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L; 6307;;;;N;;;;; -1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L; 8D70;;;;N;;;;; -1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 6253;;;;N;;;;; -1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L; 7981;;;;N;;;;; -1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L; 7A7A;;;;N;;;;; -1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L; 5408;;;;N;;;;; -1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L; 6E80;;;;N;;;;; -1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L; 6709;;;;N;;;;; -1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L; 6708;;;;N;;;;; -1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L; 7533;;;;N;;;;; -1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L; 5272;;;;N;;;;; -1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L; 55B6;;;;N;;;;; -1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L; 3014 672C 3015;;;;N;;;;; -1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 3014 4E09 3015;;;;N;;;;; -1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 3014 4E8C 3015;;;;N;;;;; -1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L; 3014 5B89 3015;;;;N;;;;; -1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L; 3014 70B9 3015;;;;N;;;;; -1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 3014 6253 3015;;;;N;;;;; -1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L; 3014 76D7 3015;;;;N;;;;; -1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L; 3014 52DD 3015;;;;N;;;;; -1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L; 3014 6557 3015;;;;N;;;;; -1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L; 5F97;;;;N;;;;; -1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L; 53EF;;;;N;;;;; -1F300;CYCLONE;So;0;ON;;;;;N;;;;; -1F301;FOGGY;So;0;ON;;;;;N;;;;; -1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; -1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; -1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; -1F305;SUNRISE;So;0;ON;;;;;N;;;;; -1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; -1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; -1F308;RAINBOW;So;0;ON;;;;;N;;;;; -1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; -1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; -1F30B;VOLCANO;So;0;ON;;;;;N;;;;; -1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; -1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; -1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; -1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; -1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; -1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; -1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; -1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; -1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; -1F321;THERMOMETER;So;0;ON;;;;;N;;;;; -1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; -1F323;WHITE SUN;So;0;ON;;;;;N;;;;; -1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; -1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; -1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; -1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; -1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; -1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; -1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; -1F32B;FOG;So;0;ON;;;;;N;;;;; -1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; -1F32D;HOT DOG;So;0;ON;;;;;N;;;;; -1F32E;TACO;So;0;ON;;;;;N;;;;; -1F32F;BURRITO;So;0;ON;;;;;N;;;;; -1F330;CHESTNUT;So;0;ON;;;;;N;;;;; -1F331;SEEDLING;So;0;ON;;;;;N;;;;; -1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; -1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; -1F334;PALM TREE;So;0;ON;;;;;N;;;;; -1F335;CACTUS;So;0;ON;;;;;N;;;;; -1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; -1F337;TULIP;So;0;ON;;;;;N;;;;; -1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; -1F339;ROSE;So;0;ON;;;;;N;;;;; -1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; -1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; -1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; -1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; -1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; -1F33F;HERB;So;0;ON;;;;;N;;;;; -1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; -1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; -1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; -1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; -1F344;MUSHROOM;So;0;ON;;;;;N;;;;; -1F345;TOMATO;So;0;ON;;;;;N;;;;; -1F346;AUBERGINE;So;0;ON;;;;;N;;;;; -1F347;GRAPES;So;0;ON;;;;;N;;;;; -1F348;MELON;So;0;ON;;;;;N;;;;; -1F349;WATERMELON;So;0;ON;;;;;N;;;;; -1F34A;TANGERINE;So;0;ON;;;;;N;;;;; -1F34B;LEMON;So;0;ON;;;;;N;;;;; -1F34C;BANANA;So;0;ON;;;;;N;;;;; -1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; -1F34E;RED APPLE;So;0;ON;;;;;N;;;;; -1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; -1F350;PEAR;So;0;ON;;;;;N;;;;; -1F351;PEACH;So;0;ON;;;;;N;;;;; -1F352;CHERRIES;So;0;ON;;;;;N;;;;; -1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; -1F354;HAMBURGER;So;0;ON;;;;;N;;;;; -1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; -1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; -1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; -1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; -1F359;RICE BALL;So;0;ON;;;;;N;;;;; -1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; -1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; -1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; -1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; -1F35E;BREAD;So;0;ON;;;;;N;;;;; -1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; -1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; -1F361;DANGO;So;0;ON;;;;;N;;;;; -1F362;ODEN;So;0;ON;;;;;N;;;;; -1F363;SUSHI;So;0;ON;;;;;N;;;;; -1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; -1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; -1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; -1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; -1F368;ICE CREAM;So;0;ON;;;;;N;;;;; -1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; -1F36A;COOKIE;So;0;ON;;;;;N;;;;; -1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; -1F36C;CANDY;So;0;ON;;;;;N;;;;; -1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; -1F36E;CUSTARD;So;0;ON;;;;;N;;;;; -1F36F;HONEY POT;So;0;ON;;;;;N;;;;; -1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; -1F371;BENTO BOX;So;0;ON;;;;;N;;;;; -1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; -1F373;COOKING;So;0;ON;;;;;N;;;;; -1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; -1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; -1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; -1F377;WINE GLASS;So;0;ON;;;;;N;;;;; -1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; -1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; -1F37A;BEER MUG;So;0;ON;;;;;N;;;;; -1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; -1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; -1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; -1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; -1F37F;POPCORN;So;0;ON;;;;;N;;;;; -1F380;RIBBON;So;0;ON;;;;;N;;;;; -1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; -1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; -1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; -1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; -1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; -1F386;FIREWORKS;So;0;ON;;;;;N;;;;; -1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; -1F388;BALLOON;So;0;ON;;;;;N;;;;; -1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; -1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; -1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; -1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; -1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; -1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; -1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; -1F390;WIND CHIME;So;0;ON;;;;;N;;;;; -1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; -1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; -1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; -1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; -1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; -1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; -1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; -1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; -1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; -1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; -1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; -1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; -1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; -1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; -1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; -1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; -1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; -1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; -1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; -1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; -1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; -1F3A6;CINEMA;So;0;ON;;;;;N;;;;; -1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; -1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; -1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; -1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; -1F3AB;TICKET;So;0;ON;;;;;N;;;;; -1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; -1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; -1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; -1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; -1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; -1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; -1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; -1F3B3;BOWLING;So;0;ON;;;;;N;;;;; -1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; -1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; -1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; -1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; -1F3B8;GUITAR;So;0;ON;;;;;N;;;;; -1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; -1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; -1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; -1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; -1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; -1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; -1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; -1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; -1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; -1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; -1F3C3;RUNNER;So;0;ON;;;;;N;;;;; -1F3C4;SURFER;So;0;ON;;;;;N;;;;; -1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; -1F3C6;TROPHY;So;0;ON;;;;;N;;;;; -1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; -1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; -1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; -1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; -1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; -1F3CC;GOLFER;So;0;ON;;;;;N;;;;; -1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; -1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; -1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; -1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; -1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; -1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; -1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; -1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; -1F3D5;CAMPING;So;0;ON;;;;;N;;;;; -1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; -1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; -1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; -1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; -1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; -1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; -1F3DC;DESERT;So;0;ON;;;;;N;;;;; -1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; -1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; -1F3DF;STADIUM;So;0;ON;;;;;N;;;;; -1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; -1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; -1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; -1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; -1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; -1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; -1F3E6;BANK;So;0;ON;;;;;N;;;;; -1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; -1F3E8;HOTEL;So;0;ON;;;;;N;;;;; -1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; -1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; -1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; -1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; -1F3ED;FACTORY;So;0;ON;;;;;N;;;;; -1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; -1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; -1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; -1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; -1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; -1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; -1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; -1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; -1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; -1F3F7;LABEL;So;0;ON;;;;;N;;;;; -1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; -1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; -1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; -1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; -1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; -1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; -1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; -1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; -1F400;RAT;So;0;ON;;;;;N;;;;; -1F401;MOUSE;So;0;ON;;;;;N;;;;; -1F402;OX;So;0;ON;;;;;N;;;;; -1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; -1F404;COW;So;0;ON;;;;;N;;;;; -1F405;TIGER;So;0;ON;;;;;N;;;;; -1F406;LEOPARD;So;0;ON;;;;;N;;;;; -1F407;RABBIT;So;0;ON;;;;;N;;;;; -1F408;CAT;So;0;ON;;;;;N;;;;; -1F409;DRAGON;So;0;ON;;;;;N;;;;; -1F40A;CROCODILE;So;0;ON;;;;;N;;;;; -1F40B;WHALE;So;0;ON;;;;;N;;;;; -1F40C;SNAIL;So;0;ON;;;;;N;;;;; -1F40D;SNAKE;So;0;ON;;;;;N;;;;; -1F40E;HORSE;So;0;ON;;;;;N;;;;; -1F40F;RAM;So;0;ON;;;;;N;;;;; -1F410;GOAT;So;0;ON;;;;;N;;;;; -1F411;SHEEP;So;0;ON;;;;;N;;;;; -1F412;MONKEY;So;0;ON;;;;;N;;;;; -1F413;ROOSTER;So;0;ON;;;;;N;;;;; -1F414;CHICKEN;So;0;ON;;;;;N;;;;; -1F415;DOG;So;0;ON;;;;;N;;;;; -1F416;PIG;So;0;ON;;;;;N;;;;; -1F417;BOAR;So;0;ON;;;;;N;;;;; -1F418;ELEPHANT;So;0;ON;;;;;N;;;;; -1F419;OCTOPUS;So;0;ON;;;;;N;;;;; -1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; -1F41B;BUG;So;0;ON;;;;;N;;;;; -1F41C;ANT;So;0;ON;;;;;N;;;;; -1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; -1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; -1F41F;FISH;So;0;ON;;;;;N;;;;; -1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; -1F421;BLOWFISH;So;0;ON;;;;;N;;;;; -1F422;TURTLE;So;0;ON;;;;;N;;;;; -1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; -1F424;BABY CHICK;So;0;ON;;;;;N;;;;; -1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; -1F426;BIRD;So;0;ON;;;;;N;;;;; -1F427;PENGUIN;So;0;ON;;;;;N;;;;; -1F428;KOALA;So;0;ON;;;;;N;;;;; -1F429;POODLE;So;0;ON;;;;;N;;;;; -1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; -1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; -1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; -1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; -1F42E;COW FACE;So;0;ON;;;;;N;;;;; -1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; -1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; -1F431;CAT FACE;So;0;ON;;;;;N;;;;; -1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; -1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; -1F434;HORSE FACE;So;0;ON;;;;;N;;;;; -1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; -1F436;DOG FACE;So;0;ON;;;;;N;;;;; -1F437;PIG FACE;So;0;ON;;;;;N;;;;; -1F438;FROG FACE;So;0;ON;;;;;N;;;;; -1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; -1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; -1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; -1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; -1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; -1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; -1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; -1F440;EYES;So;0;ON;;;;;N;;;;; -1F441;EYE;So;0;ON;;;;;N;;;;; -1F442;EAR;So;0;ON;;;;;N;;;;; -1F443;NOSE;So;0;ON;;;;;N;;;;; -1F444;MOUTH;So;0;ON;;;;;N;;;;; -1F445;TONGUE;So;0;ON;;;;;N;;;;; -1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; -1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; -1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; -1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; -1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; -1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; -1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; -1F451;CROWN;So;0;ON;;;;;N;;;;; -1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; -1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; -1F454;NECKTIE;So;0;ON;;;;;N;;;;; -1F455;T-SHIRT;So;0;ON;;;;;N;;;;; -1F456;JEANS;So;0;ON;;;;;N;;;;; -1F457;DRESS;So;0;ON;;;;;N;;;;; -1F458;KIMONO;So;0;ON;;;;;N;;;;; -1F459;BIKINI;So;0;ON;;;;;N;;;;; -1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; -1F45B;PURSE;So;0;ON;;;;;N;;;;; -1F45C;HANDBAG;So;0;ON;;;;;N;;;;; -1F45D;POUCH;So;0;ON;;;;;N;;;;; -1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; -1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; -1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; -1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; -1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; -1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; -1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; -1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; -1F466;BOY;So;0;ON;;;;;N;;;;; -1F467;GIRL;So;0;ON;;;;;N;;;;; -1F468;MAN;So;0;ON;;;;;N;;;;; -1F469;WOMAN;So;0;ON;;;;;N;;;;; -1F46A;FAMILY;So;0;ON;;;;;N;;;;; -1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; -1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; -1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; -1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; -1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; -1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; -1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; -1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; -1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; -1F474;OLDER MAN;So;0;ON;;;;;N;;;;; -1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; -1F476;BABY;So;0;ON;;;;;N;;;;; -1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; -1F478;PRINCESS;So;0;ON;;;;;N;;;;; -1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; -1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; -1F47B;GHOST;So;0;ON;;;;;N;;;;; -1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; -1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; -1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; -1F47F;IMP;So;0;ON;;;;;N;;;;; -1F480;SKULL;So;0;ON;;;;;N;;;;; -1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; -1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; -1F483;DANCER;So;0;ON;;;;;N;;;;; -1F484;LIPSTICK;So;0;ON;;;;;N;;;;; -1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; -1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; -1F487;HAIRCUT;So;0;ON;;;;;N;;;;; -1F488;BARBER POLE;So;0;ON;;;;;N;;;;; -1F489;SYRINGE;So;0;ON;;;;;N;;;;; -1F48A;PILL;So;0;ON;;;;;N;;;;; -1F48B;KISS MARK;So;0;ON;;;;;N;;;;; -1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; -1F48D;RING;So;0;ON;;;;;N;;;;; -1F48E;GEM STONE;So;0;ON;;;;;N;;;;; -1F48F;KISS;So;0;ON;;;;;N;;;;; -1F490;BOUQUET;So;0;ON;;;;;N;;;;; -1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; -1F492;WEDDING;So;0;ON;;;;;N;;;;; -1F493;BEATING HEART;So;0;ON;;;;;N;;;;; -1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; -1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; -1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; -1F497;GROWING HEART;So;0;ON;;;;;N;;;;; -1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; -1F499;BLUE HEART;So;0;ON;;;;;N;;;;; -1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; -1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; -1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; -1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; -1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; -1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; -1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; -1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; -1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; -1F4A3;BOMB;So;0;ON;;;;;N;;;;; -1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; -1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; -1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; -1F4A7;DROPLET;So;0;ON;;;;;N;;;;; -1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; -1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; -1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; -1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; -1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; -1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; -1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; -1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; -1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; -1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; -1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; -1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; -1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; -1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; -1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; -1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; -1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; -1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; -1F4BA;SEAT;So;0;ON;;;;;N;;;;; -1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; -1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; -1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; -1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; -1F4C0;DVD;So;0;ON;;;;;N;;;;; -1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; -1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; -1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; -1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; -1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; -1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; -1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; -1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; -1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; -1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; -1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; -1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; -1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; -1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; -1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; -1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; -1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; -1F4D2;LEDGER;So;0;ON;;;;;N;;;;; -1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; -1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; -1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; -1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; -1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; -1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; -1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; -1F4DA;BOOKS;So;0;ON;;;;;N;;;;; -1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; -1F4DC;SCROLL;So;0;ON;;;;;N;;;;; -1F4DD;MEMO;So;0;ON;;;;;N;;;;; -1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; -1F4DF;PAGER;So;0;ON;;;;;N;;;;; -1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; -1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; -1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; -1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; -1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; -1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; -1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; -1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; -1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; -1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; -1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; -1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; -1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; -1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; -1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; -1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; -1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; -1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; -1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; -1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; -1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; -1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; -1F4F7;CAMERA;So;0;ON;;;;;N;;;;; -1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; -1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; -1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; -1F4FB;RADIO;So;0;ON;;;;;N;;;;; -1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; -1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; -1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; -1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; -1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; -1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; -1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; -1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; -1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; -1F508;SPEAKER;So;0;ON;;;;;N;;;;; -1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; -1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; -1F50B;BATTERY;So;0;ON;;;;;N;;;;; -1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; -1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; -1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; -1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; -1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; -1F511;KEY;So;0;ON;;;;;N;;;;; -1F512;LOCK;So;0;ON;;;;;N;;;;; -1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; -1F514;BELL;So;0;ON;;;;;N;;;;; -1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; -1F516;BOOKMARK;So;0;ON;;;;;N;;;;; -1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; -1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; -1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; -1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; -1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; -1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; -1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; -1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; -1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; -1F525;FIRE;So;0;ON;;;;;N;;;;; -1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; -1F527;WRENCH;So;0;ON;;;;;N;;;;; -1F528;HAMMER;So;0;ON;;;;;N;;;;; -1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; -1F52A;HOCHO;So;0;ON;;;;;N;;;;; -1F52B;PISTOL;So;0;ON;;;;;N;;;;; -1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; -1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; -1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; -1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; -1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; -1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; -1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; -1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; -1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; -1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; -1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; -1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; -1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; -1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; -1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; -1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; -1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; -1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; -1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; -1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; -1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; -1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; -1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; -1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; -1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; -1F54B;KAABA;So;0;ON;;;;;N;;;;; -1F54C;MOSQUE;So;0;ON;;;;;N;;;;; -1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; -1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; -1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; -1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; -1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; -1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; -1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; -1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; -1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; -1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; -1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; -1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; -1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; -1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; -1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; -1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; -1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; -1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; -1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; -1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; -1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; -1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; -1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; -1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; -1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; -1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; -1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; -1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; -1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; -1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; -1F56B;BULLHORN;So;0;ON;;;;;N;;;;; -1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; -1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; -1F56E;BOOK;So;0;ON;;;;;N;;;;; -1F56F;CANDLE;So;0;ON;;;;;N;;;;; -1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; -1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; -1F572;NO PIRACY;So;0;ON;;;;;N;;;;; -1F573;HOLE;So;0;ON;;;;;N;;;;; -1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; -1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; -1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; -1F577;SPIDER;So;0;ON;;;;;N;;;;; -1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; -1F579;JOYSTICK;So;0;ON;;;;;N;;;;; -1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; -1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; -1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; -1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; -1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; -1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; -1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; -1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; -1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; -1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; -1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; -1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; -1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; -1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; -1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; -1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; -1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; -1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; -1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; -1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; -1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; -1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; -1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; -1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; -1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; -1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; -1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; -1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; -1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; -1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; -1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; -1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; -1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; -1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; -1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; -1F5A8;PRINTER;So;0;ON;;;;;N;;;;; -1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; -1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; -1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; -1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; -1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; -1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; -1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; -1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; -1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; -1F5B5;SCREEN;So;0;ON;;;;;N;;;;; -1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; -1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; -1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; -1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; -1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; -1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; -1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; -1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; -1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; -1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; -1F5C0;FOLDER;So;0;ON;;;;;N;;;;; -1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; -1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; -1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; -1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; -1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; -1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; -1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; -1F5C8;NOTE;So;0;ON;;;;;N;;;;; -1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; -1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; -1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; -1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; -1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; -1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; -1F5CF;PAGE;So;0;ON;;;;;N;;;;; -1F5D0;PAGES;So;0;ON;;;;;N;;;;; -1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; -1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; -1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; -1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; -1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; -1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; -1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; -1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; -1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; -1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; -1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; -1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; -1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; -1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; -1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; -1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; -1F5E2;LIPS;So;0;ON;;;;;N;;;;; -1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; -1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; -1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; -1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; -1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; -1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; -1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; -1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; -1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; -1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; -1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; -1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; -1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; -1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; -1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; -1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; -1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; -1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; -1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; -1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; -1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; -1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; -1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; -1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; -1F5FF;MOYAI;So;0;ON;;;;;N;;;;; -1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; -1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; -1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; -1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; -1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; -1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; -1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; -1F609;WINKING FACE;So;0;ON;;;;;N;;;;; -1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; -1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; -1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; -1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; -1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; -1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; -1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; -1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; -1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; -1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; -1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; -1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; -1F617;KISSING FACE;So;0;ON;;;;;N;;;;; -1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; -1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; -1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; -1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; -1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; -1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; -1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; -1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; -1F621;POUTING FACE;So;0;ON;;;;;N;;;;; -1F622;CRYING FACE;So;0;ON;;;;;N;;;;; -1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; -1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; -1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; -1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; -1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; -1F629;WEARY FACE;So;0;ON;;;;;N;;;;; -1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; -1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; -1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; -1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; -1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; -1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; -1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; -1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; -1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; -1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; -1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; -1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; -1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; -1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; -1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; -1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; -1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; -1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; -1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; -1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; -1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; -1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; -1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; -1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; -1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; -1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; -1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; -1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; -1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; -1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; -1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; -1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; -1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; -1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; -1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; -1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; -1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; -1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; -1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; -1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; -1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; -1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; -1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; -1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; -1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; -1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; -1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; -1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; -1F680;ROCKET;So;0;ON;;;;;N;;;;; -1F681;HELICOPTER;So;0;ON;;;;;N;;;;; -1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; -1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; -1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; -1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; -1F686;TRAIN;So;0;ON;;;;;N;;;;; -1F687;METRO;So;0;ON;;;;;N;;;;; -1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; -1F689;STATION;So;0;ON;;;;;N;;;;; -1F68A;TRAM;So;0;ON;;;;;N;;;;; -1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; -1F68C;BUS;So;0;ON;;;;;N;;;;; -1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; -1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; -1F68F;BUS STOP;So;0;ON;;;;;N;;;;; -1F690;MINIBUS;So;0;ON;;;;;N;;;;; -1F691;AMBULANCE;So;0;ON;;;;;N;;;;; -1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; -1F693;POLICE CAR;So;0;ON;;;;;N;;;;; -1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; -1F695;TAXI;So;0;ON;;;;;N;;;;; -1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; -1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; -1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; -1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; -1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; -1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; -1F69C;TRACTOR;So;0;ON;;;;;N;;;;; -1F69D;MONORAIL;So;0;ON;;;;;N;;;;; -1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; -1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; -1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; -1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; -1F6A2;SHIP;So;0;ON;;;;;N;;;;; -1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; -1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; -1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; -1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; -1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; -1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; -1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; -1F6AA;DOOR;So;0;ON;;;;;N;;;;; -1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; -1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; -1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; -1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; -1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; -1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; -1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; -1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; -1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; -1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; -1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; -1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; -1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; -1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; -1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; -1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; -1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; -1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; -1F6BD;TOILET;So;0;ON;;;;;N;;;;; -1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; -1F6BF;SHOWER;So;0;ON;;;;;N;;;;; -1F6C0;BATH;So;0;ON;;;;;N;;;;; -1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; -1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; -1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; -1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; -1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; -1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; -1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; -1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; -1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; -1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; -1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; -1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; -1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; -1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; -1F6CF;BED;So;0;ON;;;;;N;;;;; -1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; -1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; -1F6E1;SHIELD;So;0;ON;;;;;N;;;;; -1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; -1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; -1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; -1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; -1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; -1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; -1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; -1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; -1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; -1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; -1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; -1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; -1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; -1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; -1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; -1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; -1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; -1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; -1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; -1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; -1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; -1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; -1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; -1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; -1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; -1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; -1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; -1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; -1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; -1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; -1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; -1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; -1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; -1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; -1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; -1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; -1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; -1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; -1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; -1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; -1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; -1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; -1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; -1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; -1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; -1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; -1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; -1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; -1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; -1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; -1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; -1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; -1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; -1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; -1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; -1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; -1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; -1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; -1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; -1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; -1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; -1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; -1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; -1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; -1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; -1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; -1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; -1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; -1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; -1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; -1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; -1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; -1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; -1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; -1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; -1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; -1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; -1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; -1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; -1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; -1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; -1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; -1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; -1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; -1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; -1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; -1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; -1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; -1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; -1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; -1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; -1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; -1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; -1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; -1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; -1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; -1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; -1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; -1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; -1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; -1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; -1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; -1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; -1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; -1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; -1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; -1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; -1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; -1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; -1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; -1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; -1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; -1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; -1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; -1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; -1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; -1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; -1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; -1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; -1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; -1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; -1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; -1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; -1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; -1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; -1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; -1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; -1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; -1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; -1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; -1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; -1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; -1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; -1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; -1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; -1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; -1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; -1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; -1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; -1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; -1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; -1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; -1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; -1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; -1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; -1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; -1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; -1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; -1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; -1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; -1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; -1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; -1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; -1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; -1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; -1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; -1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; -1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; -1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; -1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; -1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; -1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; -1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; -1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; -1F913;NERD FACE;So;0;ON;;;;;N;;;;; -1F914;THINKING FACE;So;0;ON;;;;;N;;;;; -1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; -1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; -1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; -1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; -1F980;CRAB;So;0;ON;;;;;N;;;;; -1F981;LION FACE;So;0;ON;;;;;N;;;;; -1F982;SCORPION;So;0;ON;;;;;N;;;;; -1F983;TURKEY;So;0;ON;;;;;N;;;;; -1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; -1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; -20000;;Lo;0;L;;;;;N;;;;; -2A6D6;;Lo;0;L;;;;;N;;;;; -2A700;;Lo;0;L;;;;;N;;;;; -2B734;;Lo;0;L;;;;;N;;;;; -2B740;;Lo;0;L;;;;;N;;;;; -2B81D;;Lo;0;L;;;;;N;;;;; -2B820;;Lo;0;L;;;;;N;;;;; -2CEA1;;Lo;0;L;;;;;N;;;;; -2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; -2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; -2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; -2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; -2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; -2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; -2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; -2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; -2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; -2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; -2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; -2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; -2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; -2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; -2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; -2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; -2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; -2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; -2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; -2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; -2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; -2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; -2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; -2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; -2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; -2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; -2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; -2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; -2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; -2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; -2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; -2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; -2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; -2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; -2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; -2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; -2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; -2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; -2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; -2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; -2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; -2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; -2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; -2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; -2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; -2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; -2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; -2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; -2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; -2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; -2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; -2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; -2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; -2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; -2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; -2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; -2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; -2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; -2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; -2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; -2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; -2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; -2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; -2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; -2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; -2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; -2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; -2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; -2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; -2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; -2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; -2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; -2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; -2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; -2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; -2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; -2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; -2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; -2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; -2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; -2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; -2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; -2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; -2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; -2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; -2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; -2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; -2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; -2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; -2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; -2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; -2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; -2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; -2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; -2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; -2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; -2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; -2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; -2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; -2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; -2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; -2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; -2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; -2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; -2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; -2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; -2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; -2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; -2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; -2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; -2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; -2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; -2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; -2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; -2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; -2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; -2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; -2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; -2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; -2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; -2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; -2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; -2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; -2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; -2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; -2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; -2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; -2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; -2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; -2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; -2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; -2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; -2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; -2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; -2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; -2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; -2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; -2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; -2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; -2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; -2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; -2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; -2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; -2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; -2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; -2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; -2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; -2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; -2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; -2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; -2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; -2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; -2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; -2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; -2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; -2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; -2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; -2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; -2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; -2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; -2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; -2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; -2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; -2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; -2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; -2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; -2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; -2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; -2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; -2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; -2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; -2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; -2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; -2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; -2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; -2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; -2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; -2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; -2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; -2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; -2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; -2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; -2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; -2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; -2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; -2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; -2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; -2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; -2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; -2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; -2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; -2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; -2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; -2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; -2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; -2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; -2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; -2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; -2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; -2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; -2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; -2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; -2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; -2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; -2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; -2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; -2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; -2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; -2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; -2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; -2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; -2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; -2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; -2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; -2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; -2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; -2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; -2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; -2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; -2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; -2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; -2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; -2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; -2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; -2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; -2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; -2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; -2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; -2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; -2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; -2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; -2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; -2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; -2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; -2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; -2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; -2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; -2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; -2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; -2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; -2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; -2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; -2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; -2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; -2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; -2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; -2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; -2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; -2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; -2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; -2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; -2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; -2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; -2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; -2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; -2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; -2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; -2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; -2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; -2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; -2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; -2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; -2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; -2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; -2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; -2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; -2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; -2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; -2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; -2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; -2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; -2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; -2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; -2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; -2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; -2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; -2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; -2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; -2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; -2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; -2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; -2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; -2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; -2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; -2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; -2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; -2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; -2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; -2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; -2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; -2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; -2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; -2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; -2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; -2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; -2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; -2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; -2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; -2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; -2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; -2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; -2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; -2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; -2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; -2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; -2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; -2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; -2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; -2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; -2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; -2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; -2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; -2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; -2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; -2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; -2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; -2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; -2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; -2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; -2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; -2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; -2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; -2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; -2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; -2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; -2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; -2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; -2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; -2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; -2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; -2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; -2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; -2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; -2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; -2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; -2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; -2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; -2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; -2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; -2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; -2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; -2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; -2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; -2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; -2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; -2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; -2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; -2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; -2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; -2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; -2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; -2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; -2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; -2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; -2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; -2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; -2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; -2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; -2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; -2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; -2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; -2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; -2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; -2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; -2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; -2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; -2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; -2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; -2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; -2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; -2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; -2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; -2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; -2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; -2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; -2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; -2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; -2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; -2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; -2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; -2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; -2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; -2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; -2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; -2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; -2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; -2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; -2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; -2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; -2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; -2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; -2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; -2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; -2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; -2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; -2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; -2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; -2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; -2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; -2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; -2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; -2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; -2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; -2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; -2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; -2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; -2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; -2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; -2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; -2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; -2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; -2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; -2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; -2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; -2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; -2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; -2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; -2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; -2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; -2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; -2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; -2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; -2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; -2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; -2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; -2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; -2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; -2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; -2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; -2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; -2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; -2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; -2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; -2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; -2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; -2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; -2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; -2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; -2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; -2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; -2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; -2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; -2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; -2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; -2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; -2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; -2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; -2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; -2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; -2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; -2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; -2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; -2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; -2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; -2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; -2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; -2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; -2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; -2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; -2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; -2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; -2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; -2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; -2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; -2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; -2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; -2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; -2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; -2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; -2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; -2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; -2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; -2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; -2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; -2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; -2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; -2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; -2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; -2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; -2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; -2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; -2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; -2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; -2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; -2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; -2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; -2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; -2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; -2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; -2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; -2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; -2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; -2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; -2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; -2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; -2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; -2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; -2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; -2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; -2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; -2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; -2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; -2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; -2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; -2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; -2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; -2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; -2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; -2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; -2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; -2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; -2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; -2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; -2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; -2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; -2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; -2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; -2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; -2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; -2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; -2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; -2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; -2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; -2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; -2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; -2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; -2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; -2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; -2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; -2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; -2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; -2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; -2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; -2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; -2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; -2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; -2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; -2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; -2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; -2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; -2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; -2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; -E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; -E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; -E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; -E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; -E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; -E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; -E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; -E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; -E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; -E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; -E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; -E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; -E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; -E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; -E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; -E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; -E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; -E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; -E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; -E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; -E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; -E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; -E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; -E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; -E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; -E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; -E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; -E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; -E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; -E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; -E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; -E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; -E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; -E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; -E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; -E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; -E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; -E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; -E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; -E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; -E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; -E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; -E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; -E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; -E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; -E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; -E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; -E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; -E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; -E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; -E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; -E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; -E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; -E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; -E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; -E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; -E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; -E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; -E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; -E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; -E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; -E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; -E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; -E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; -E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; -E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; -E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; -E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; -E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; -E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; -E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; -E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; -E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; -E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; -E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; -E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; -E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; -E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; -E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; -E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; -E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; -E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; -E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; -E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; -E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; -E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; -E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; -E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; -E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; -E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; -E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; -E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; -E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; -E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; -E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; -E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; -E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; -E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; -E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; -E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; -E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; -E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; -E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; -E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; -E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; -E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; -E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; -E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; -E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; -E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; -E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; -E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; -E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; -E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; -E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; -E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; -E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; -E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; -E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; -E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; -E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; -E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; -E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; -E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; -E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; -E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; -E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; -E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; -E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; -E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; -E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; -E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; -E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; -E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; -E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; -E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; -E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; -E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; -E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; -E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; -E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; -E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; -E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; -E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; -E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; -E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; -E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; -E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; -E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; -E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; -E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; -E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; -E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; -E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; -E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; -E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; -E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; -E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; -E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; -E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; -E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; -E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; -E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; -E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; -E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; -E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; -E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; -E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; -E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; -E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; -E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; -E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; -E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; -E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; -E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; -E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; -E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; -E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; -E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; -E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; -E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; -E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; -E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; -E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; -E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; -E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; -E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; -E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; -E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; -E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; -E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; -E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; -E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; -E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; -E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; -E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; -E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; -E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; -E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; -E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; -E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; -E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; -E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; -E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; -E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; -E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; -E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; -E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; -E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; -E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; -E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; -E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; -E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; -E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; -E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; -E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; -E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; -E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; -E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; -E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; -E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; -E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; -E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; -E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; -E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; -E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; -E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; -E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; -E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; -E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; -E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; -E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; -E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; -E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; -E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; -E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; -E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; -E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; -E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; -E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; -E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; -E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; -E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; -E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; -E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; -E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; -E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; -E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; -E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; -E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; -E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; -E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; -E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; -E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; -E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; -E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; -E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; -E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; -E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; -E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; -E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; -E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; -E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; -E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; -E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; -E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; -E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; -E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; -E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; -E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; -E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; -E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; -E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; -E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; -E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; -E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; -E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; -E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; -E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; -E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; -E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; -E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; -E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; -E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; -E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; -E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; -E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; -E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; -E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; -E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; -E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; -E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; -E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; -E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; -E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; -E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; -E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; -E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; -E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; -E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; -E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; -E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; -E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; -E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; -E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; -E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; -E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; -E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; -E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; -E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; -E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; -E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; -E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; -E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; -E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; -E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; -E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; -E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; -E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; -E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; -E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; -E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; -E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; -E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; -E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; -E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; -E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; -E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; -E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; -E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; -E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; -E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; -E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; -E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; -E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; -E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; -E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; -F0000;;Co;0;L;;;;;N;;;;; -FFFFD;;Co;0;L;;;;;N;;;;; -100000;;Co;0;L;;;;;N;;;;; -10FFFD;;Co;0;L;;;;;N;;;;; diff --git a/unicode/how-to-update.txt b/unicode/how-to-update.txt deleted file mode 100644 index 5014ea151b..0000000000 --- a/unicode/how-to-update.txt +++ /dev/null @@ -1,94 +0,0 @@ -This document contains instructions for updating the Unicode data set used by -the WebEncoders project. - -1) Download the latest UnicodeData.txt and Blocks.txt from the Unicode - Consortium web site. These files are normally found under - http://www.unicode.org/Public/X.Y.Z/ucd/, where X.Y.Z is the version of the - Unicode specification of interest. Replace the UnicodeData.txt and - Blocks.txt files in this folder with the files you downloaded. - -2) Update unicode-copyright.txt in this folder with the following information: - - The exact URLs where you downloaded UnicodeData.txt and Blocks.txt. - - The date on which you downloaded these two files. - - The Unicode copyright and permission notice, if it has changed. The latest - copyright and permission notice can be found at the bottom of - http://www.unicode.org/copyright.html. - -3) Open the Generators solution and run the DefinedCharListGenerator project. - Running this will drop a file unicode-defined-chars.bin into the output - folder. Move this file into the following directory, overwriting the - existing file in that directory: - src\Microsoft.Extensions.WebEncoders.Core\compiler\resources - -4) Open the Generators solution and run the UnicodeTablesGenerator project. - Running this will drop two files UnicodeRanges.generated.txt and - UnicodeRangesTests.generated.txt into the output folder. - -5) Open UnicodeRanges.generated.txt in your favorite text editor. You'll see - that the file contains all of the parsed Unicode block information in - ascending code point order. Manually REMOVE the following blocks from this - text file and re-save it. - - High Surrogates (U+D800..U+DB7F) - - High Private Use Surrogates (U+DB80..U+DBFF) - - Low Surrogates (U+DC00..U+DFFF) - - Private Use Area (U+E000..U+F8FF) - -6) Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.generated.cs in - your IDE. Delete everything within the partial class definition and replace - it with the contents of UnicodeRanges.generated.txt. (Remember to remove - the blocks mentioned in the previous step, otherwise unit tests will fail.) - - Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.cs in your IDE. - Update the doc comment at the top of the class to reflect the appropriate - version of the Unicode specification. - -7) Open UnicodeRangesTests.generated.txt in your favorite text editor. Just - like in the previous .txt file, you'll need to remove the [InlineData] - lines which map to the Unicode blocks which were manually removed. - See step (5) for the list of which blocks must be removed. Then re-save - this file. - -8) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeRangesTests.cs in - your IDE. Delete all of the [InlineData] attributes on the Range_Unicode - test, then paste the contents of UnicodeRangesTests.generated.txt in - to restore the new [InlineData] list. - - IMPORTANT: Don't delete the [Theory] attribute on this method! - -9) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeHelpersTests.cs in - your IDE. Scroll to the bottom of the ReadListOfDefinedCharacters method, - and you'll see a section where the test special-cases CJK Ideographs and - Hangul Syllables. As more characters are added to the Unicode specification - the list of valid CJK Ideographs and Hangul Syllables can grow, so make sure - these match up with the relevant lines in UnicodeData.txt. For instance, at - the time of this writing UnicodeData.txt lists the valid Hangul Syllable - character range as follows: - - AC00;;Lo;0;L;;;;;N;;;;; - D7A3;;Lo;0;L;;;;;N;;;;; - - If necessary, update the logic in the ReadListOfDefinedCharacters method to - account for any changes to these lines in UnicodeData.txt. - -That's it! Run the unit tests and everything should be good to go. If you find -any stray comments throughout the code base that reference a specific version -of the Unicode specification, go ahead and update them so that they correctly -reflect the version you just submitted. - -To recap, the files you should check in are: - -src\Microsoft.Extensions.WebEncoders.Core\compiler\resources\ - unicode-defined-chars.bin - -src\Microsoft.Extensions.WebEncoders.Core\ - UnicodeRanges.cs - UnicodeRanges.generated.cs - -test\Microsoft.Extensions.WebEncoders.Tests\ - UnicodeHelpersTests.cs (if necessary, see step 9) - UnicodeRangesTests.cs - -unicode\ - Blocks.txt - unicode-copyright.txt - UnicodeData.txt diff --git a/unicode/unicode-copyright.txt b/unicode/unicode-copyright.txt deleted file mode 100644 index 9a34a6b8b2..0000000000 --- a/unicode/unicode-copyright.txt +++ /dev/null @@ -1,47 +0,0 @@ -The files Blocks.txt and UnicodeData.txt in this directory were -retrieved from the following URLs on Saturday, September 5, 2015. - -http://www.unicode.org/Public/8.0.0/ucd/Blocks.txt -http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt - -The below copyright notice applies to these files. - -======================================================================== - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 1991-2015 Unicode, Inc. All rights reserved. -Distributed under the Terms of Use in -http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Unicode data files and any associated documentation -(the "Data Files") or Unicode software and any associated documentation -(the "Software") to deal in the Data Files or Software -without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, and/or sell copies of -the Data Files or Software, and to permit persons to whom the Data Files -or Software are furnished to do so, provided that -(a) this copyright and permission notice appear with all copies -of the Data Files or Software, -(b) this copyright and permission notice appear in associated -documentation, and -(c) there is clear notice in each modified Data File or in the Software -as well as in the documentation associated with the Data File(s) or -Software that the data or software has been modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT OF THIRD PARTY RIGHTS. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS -NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THE DATA FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, -use or other dealings in these Data Files or Software without prior -written authorization of the copyright holder. \ No newline at end of file From 7b9e3adcf324908ef18a5c937b153d3c4347e3c5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 30 Oct 2015 10:23:47 -0700 Subject: [PATCH 426/846] Remove deleted WebEncoders.Core package from NuGetPackageVerifier --- NuGetPackageVerifier.json | 1 - 1 file changed, 1 deletion(-) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index d465e3b553..d39dab5e26 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -18,7 +18,6 @@ "Microsoft.AspNet.WebUtilities": { }, "Microsoft.Extensions.BufferedHtmlContent.Sources": { }, "Microsoft.Extensions.WebEncoders": { }, - "Microsoft.Extensions.WebEncoders.Core": { }, "Microsoft.Net.Http.Headers": { } } }, From 99aa148342d0606c6e8c6fc0c1cc05c3efe667e4 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 30 Oct 2015 10:56:00 -0700 Subject: [PATCH 427/846] Remove un-used namespace. --- .../BufferedHtmlContent.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 302692338b..4ca8ba7be8 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -7,7 +7,6 @@ using System.Diagnostics; using System.IO; using System.Text.Encodings.Web; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Extensions.WebEncoders; namespace Microsoft.Extensions.Internal { From c80946260a17f5ad046dc77728f5c291ddc235d4 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 30 Oct 2015 00:13:10 -0700 Subject: [PATCH 428/846] Change the namespace of RequestDelegate - change it to Microsoft.AspNet.Http --- .../Extensions/RunExtensions.cs | 1 + src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs | 1 + src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs | 3 +-- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index 8280b285ce..42c99925ad 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index 342b7b4f30..be0faecbc8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Builder diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs index 87d215ad6f..b34b6ed86d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNet.Http { /// /// A function that can process an HTTP request. diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index 49ed18f3f0..e6164af576 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; From e934f5e4ed0da9053ed5134bcb1cf3012fe9e90a Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Fri, 30 Oct 2015 15:36:55 -0700 Subject: [PATCH 429/846] Strong name everything. --- .../project.json | 3 ++- .../Properties/AssemblyInfo.cs | 2 +- .../project.json | 3 ++- src/Microsoft.AspNet.Http.Extensions/project.json | 3 ++- src/Microsoft.AspNet.Http.Features/project.json | 3 ++- src/Microsoft.AspNet.Http/project.json | 3 ++- src/Microsoft.AspNet.Owin/project.json | 3 ++- src/Microsoft.AspNet.WebUtilities/project.json | 3 ++- .../project.json | 4 ++++ .../Properties/AssemblyInfo.cs | 2 +- .../project.json | 3 ++- src/Microsoft.Extensions.WebEncoders/project.json | 3 ++- src/Microsoft.Net.Http.Headers/project.json | 3 ++- .../project.json | 4 ++++ .../project.json | 4 +++- tools/Key.snk | Bin 0 -> 596 bytes 16 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 tools/Key.snk diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index 9fe9c36612..664782f78f 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index 08ea154ce6..818ea5b97b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -6,5 +6,5 @@ using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 8c0d539da3..3626d4ebaa 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 5cc71ea727..f5cfa5790d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 0a3df94ed9..2b662e541a 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index cc8ecdc60c..d8dd30a2a6 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -7,7 +7,8 @@ }, "compilationOptions": { "warningsAsErrors": true, - "allowUnsafe": true + "allowUnsafe": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 545a5bcb92..f24cc304de 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*" diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 93b5d00c98..75ea152b3e 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json index a60d35fe5c..03c915b86b 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json @@ -1,5 +1,9 @@ { "version": "1.0.0-*", + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "shared": "*.cs", "dependencies": {}, "frameworks": { diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs index b781d6ca97..172583c8b7 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -5,6 +5,6 @@ using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests")] +[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json index 990b9a373b..c418ab88ea 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/project.json +++ b/src/Microsoft.Extensions.WebEncoders.Core/project.json @@ -7,7 +7,8 @@ }, "compilationOptions": { "allowUnsafe": true, - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index ecc7c0a3d1..5a75cd7144 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 853c52324c..07ce4c413b 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "frameworks": { "net451": {}, diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json index 21eb7701ae..f3e064f81e 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json @@ -1,4 +1,8 @@ { + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json index 87d9e98e9c..d64e6f4db7 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -9,7 +9,9 @@ "test": "xunit.runner.aspnet" }, "compilationOptions": { - "allowUnsafe": true + "allowUnsafe": true, + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "frameworks": { "dnx451": { }, diff --git a/tools/Key.snk b/tools/Key.snk new file mode 100644 index 0000000000000000000000000000000000000000..e10e4889c125d3120cd9e81582243d70f7cbb806 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098=Iw=HCsnz~#iVhm& zj%TU(_THUee?3yHBjk$37ysB?i5#7WD$={H zV4B!OxRPrb|8)HPg~A}8P>^=#y<)56#=E&NzcjOtPK~<4n6GHt=K$ro*T(lhby_@U zEk(hLzk1H)0yXj{A_5>fk-TgNoP|q6(tP2xo8zt8i%212CWM#AeCd?`hS|4~L({h~Moo(~vy&3Z z1uI}`fd^*>o=rwbAGymj6RM^pZm(*Kfhs+Y1#`-2JPWZMK8@;ZWCk2+9bX4YP);~fj-BU*R zQPvWv$89!{Rl9wM+zR>_TSkn^voYxA?2G iKnV#iZ6Ah`K>b=@=IjYJXrxL124zR(38)nxe+&q_$QXwJ literal 0 HcmV?d00001 From 037196d5c7eff127d6dc7ef29e6ba029b8c129e6 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Fri, 30 Oct 2015 19:09:08 -0700 Subject: [PATCH 430/846] Restore `null` and `string.Empty` handling from `EncoderExtensions` - prior test encoders were never invoked for `null` or empty `string`s e.g. ``` c# public static void HtmlEncode(this IHtmlEncoder htmlEncoder, string value, TextWriter output) { ... if (!String.IsNullOrEmpty(value)) { htmlEncoder.HtmlEncode(value, 0, value.Length, output); } } ``` - add missing `null` checks and handle `string.Empty` in `TextWriter output, string value, ...` overloads - better match for the underlying `TextEncoder` behaviour - `EncoderExtensions` provided an API like `TextEncoder.Encode(TextWriter output, string value)` - that method calls `Encode(TextWriter output, string value, int startIndex, int characterCount)` --- .../Testing/HtmlTestEncoder.cs | 52 ++++++++++++++++++- .../Testing/JavaScriptTestEncoder.cs | 52 ++++++++++++++++++- .../Testing/UrlTestEncoder.cs | 52 ++++++++++++++++++- .../HtmlTestEncoderTest.cs | 26 ++++++++++ 4 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs index 7768d65bfa..162ce4f6c1 100644 --- a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Text.Encodings.Web; @@ -18,11 +19,36 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override string Encode(string value) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (value.Length == 0) + { + return string.Empty; + } + return $"HtmlEncode[[{value}]]"; } public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("HtmlEncode[["); output.Write(value, startIndex, characterCount); output.Write("]]"); @@ -30,6 +56,21 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override void Encode(TextWriter output, string value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("HtmlEncode[["); output.Write(value.Substring(startIndex, characterCount)); output.Write("]]"); @@ -45,8 +86,17 @@ namespace Microsoft.Extensions.WebEncoders.Testing return -1; } - public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + public override unsafe bool TryEncodeUnicodeScalar( + int unicodeScalar, + char* buffer, + int bufferLength, + out int numberOfCharactersWritten) { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + numberOfCharactersWritten = 0; return false; } diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs index 4207e8a43f..bef4461676 100644 --- a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Text.Encodings.Web; @@ -18,11 +19,36 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override string Encode(string value) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (value.Length == 0) + { + return string.Empty; + } + return $"JavaScriptEncode[[{value}]]"; } public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("JavaScriptEncode[["); output.Write(value, startIndex, characterCount); output.Write("]]"); @@ -30,6 +56,21 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override void Encode(TextWriter output, string value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("JavaScriptEncode[["); output.Write(value.Substring(startIndex, characterCount)); output.Write("]]"); @@ -45,8 +86,17 @@ namespace Microsoft.Extensions.WebEncoders.Testing return -1; } - public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + public override unsafe bool TryEncodeUnicodeScalar( + int unicodeScalar, + char* buffer, + int bufferLength, + out int numberOfCharactersWritten) { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + numberOfCharactersWritten = 0; return false; } diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs index d10ee75594..295bda63e8 100644 --- a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Text.Encodings.Web; @@ -18,11 +19,36 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override string Encode(string value) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (value.Length == 0) + { + return string.Empty; + } + return $"UrlEncode[[{value}]]"; } public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("UrlEncode[["); output.Write(value, startIndex, characterCount); output.Write("]]"); @@ -30,6 +56,21 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override void Encode(TextWriter output, string value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("UrlEncode[["); output.Write(value.Substring(startIndex, characterCount)); output.Write("]]"); @@ -45,8 +86,17 @@ namespace Microsoft.Extensions.WebEncoders.Testing return -1; } - public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + public override unsafe bool TryEncodeUnicodeScalar( + int unicodeScalar, + char* buffer, + int bufferLength, + out int numberOfCharactersWritten) { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + numberOfCharactersWritten = 0; return false; } diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs new file mode 100644 index 0000000000..baafedc4de --- /dev/null +++ b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + public class HtmlTestEncoderTest + { + [Theory] + [InlineData("", "")] + [InlineData("abcd", "HtmlEncode[[abcd]]")] + [InlineData("<<''\"\">>", "HtmlEncode[[<<''\"\">>]]")] + public void StringEncode_EncodesAsExpected(string input, string expectedOutput) + { + // Arrange + var encoder = new HtmlTestEncoder(); + + // Act + var output = encoder.Encode(input); + + // Assert + Assert.Equal(expectedOutput, output); + } + } +} From 3c2e2b9d982a78e9b1d920516625d2c433d7c246 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 22 Oct 2015 14:13:41 +0100 Subject: [PATCH 431/846] #426 Less alloc/wrapping/boxing for Query, Forms, Cookies --- .../FragmentString.cs | 2 +- .../HostString.cs | 10 +- .../HttpRequest.cs | 34 +- .../IFormCollection.cs | 86 +++- .../IFormFile.cs | 3 + .../IFormFileCollection.cs | 3 + .../IQueryCollection.cs | 88 ++++ .../IReadableStringCollection.cs | 39 -- .../IRequestCookieCollection.cs | 87 ++++ .../PathString.cs | 21 +- .../QueryString.cs | 2 +- .../HeaderDictionaryExtensions.cs | 2 +- .../HeaderDictionaryTypeExtensions.cs | 56 ++- .../Internal/HeaderSegment.cs | 7 +- .../Internal/HeaderSegmentCollection.cs | 5 +- .../Internal/ParsingHelpers.cs | 41 +- .../Internal/StringSegment.cs | 146 ------- .../RequestHeaders.cs | 16 +- .../ResponseHeaders.cs | 15 +- .../UriHelper.cs | 4 +- .../IHeaderDictionary.cs | 2 +- .../DefaultHttpRequest.cs | 6 +- .../DefaultHttpResponse.cs | 2 +- .../DefaultWebSocketManager.cs | 2 +- .../Features/FeatureHelpers.cs | 7 +- .../Features/FormFeature.cs | 83 +++- .../Features/FormFile.cs | 4 +- .../Features/HttpRequestLifetimeFeature.cs | 1 - .../Features/IQueryFeature.cs | 2 +- .../Features/IRequestCookiesFeature.cs | 2 +- .../Features/QueryFeature.cs | 35 +- .../Features/RequestCookiesFeature.cs | 37 +- .../Features/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/FormCollection.cs | 233 +++++++++- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 405 +++++++++++++----- src/Microsoft.AspNet.Http/ItemsDictionary.cs | 7 +- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 38 +- src/Microsoft.AspNet.Http/QueryCollection.cs | 227 ++++++++++ .../ReadableStringCollection.cs | 99 ----- .../ReferenceReadStream.cs | 2 +- .../RequestCookieCollection.cs | 235 ++++++++++ .../RequestCookiesCollection.cs | 105 ----- src/Microsoft.AspNet.Http/ResponseCookies.cs | 60 ++- .../BufferedReadStream.cs | 48 ++- .../FormReader.cs | 4 +- .../KeyValueAccumulator.cs | 32 +- .../MultipartReader.cs | 6 +- .../MultipartSection.cs | 6 +- .../QueryHelpers.cs | 38 +- .../DefaultHttpRequestTests.cs | 14 +- 50 files changed, 1635 insertions(+), 776 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs delete mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs create mode 100644 src/Microsoft.AspNet.Http/QueryCollection.cs delete mode 100644 src/Microsoft.AspNet.Http/ReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.Http/RequestCookieCollection.cs delete mode 100644 src/Microsoft.AspNet.Http/RequestCookiesCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 87b22df243..41757d29fb 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -100,7 +100,7 @@ namespace Microsoft.AspNet.Http string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { - fragmentValue = "#" + fragmentValue; + fragmentValue = $"#{fragmentValue}"; } return new FragmentString(fragmentValue); } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index 59fb4f233d..b5debac327 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -70,18 +70,18 @@ namespace Microsoft.AspNet.Http && _value.IndexOf(':', index + 1) >= 0) { // IPv6 without brackets ::1 is the only type of host with 2 or more colons - return "[" + _value + "]"; + return $"[{_value}]"; } else if (index >= 0) { // Has a port string port = _value.Substring(index); - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); return mapping.GetAscii(_value, 0, index) + port; } else { - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); return mapping.GetAscii(_value); } } @@ -115,12 +115,12 @@ namespace Microsoft.AspNet.Http { // Has a port string port = uriComponent.Substring(index); - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); uriComponent = mapping.GetUnicode(uriComponent, 0, index) + port; } else { - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); uriComponent = mapping.GetUnicode(uriComponent); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 283eddf4b8..c0f52fd400 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -24,13 +24,13 @@ namespace Microsoft.AspNet.Http public abstract string Method { get; set; } /// - /// Gets or set the HTTP request scheme from owin.RequestScheme. + /// Gets or set the HTTP request scheme. /// - /// The HTTP request scheme from owin.RequestScheme. + /// The HTTP request scheme. public abstract string Scheme { get; set; } /// - /// Returns true if the owin.RequestScheme is https. + /// Returns true if the RequestScheme is https. /// /// true if this request is using https; otherwise, false. public abstract bool IsHttps { get; set; } @@ -42,33 +42,33 @@ namespace Microsoft.AspNet.Http public abstract HostString Host { get; set; } /// - /// Gets or set the owin.RequestPathBase. + /// Gets or set the RequestPathBase. /// - /// The owin.RequestPathBase. + /// The RequestPathBase. public abstract PathString PathBase { get; set; } /// - /// Gets or set the request path from owin.RequestPath. + /// Gets or set the request path from RequestPath. /// - /// The request path from owin.RequestPath. + /// The request path from RequestPath. public abstract PathString Path { get; set; } /// - /// Gets or set the query string from owin.RequestQueryString. + /// Gets or set the query string. /// - /// The query string from owin.RequestQueryString. + /// The query string. public abstract QueryString QueryString { get; set; } /// - /// Gets the query value collection parsed from owin.RequestQueryString. + /// Gets the query value collection parsed from RequestQueryString. /// - /// The query value collection parsed from owin.RequestQueryString. - public abstract IReadableStringCollection Query { get; set; } + /// The query value collection parsed from RequestQueryString. + public abstract IQueryCollection Query { get; set; } /// - /// Gets or set the owin.RequestProtocol. + /// Gets or set the RequestProtocol. /// - /// The owin.RequestProtocol. + /// The RequestProtocol. public abstract string Protocol { get; set; } /// @@ -81,7 +81,7 @@ namespace Microsoft.AspNet.Http /// Gets the collection of Cookies for this request. /// /// The collection of Cookies for this request. - public abstract IReadableStringCollection Cookies { get; set; } + public abstract IRequestCookieCollection Cookies { get; set; } /// /// Gets or sets the Content-Length header @@ -95,9 +95,9 @@ namespace Microsoft.AspNet.Http public abstract string ContentType { get; set; } /// - /// Gets or set the owin.RequestBody Stream. + /// Gets or set the RequestBody Stream. /// - /// The owin.RequestBody Stream. + /// The RequestBody Stream. public abstract Stream Body { get; set; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 68505962c2..03e8116852 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -1,13 +1,95 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + namespace Microsoft.AspNet.Http { /// - /// Contains the parsed form values. + /// Represents the parsed form values sent with the HttpRequest. /// - public interface IFormCollection : IReadableStringCollection + public interface IFormCollection : IEnumerable> { + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + /// + int Count { get; } + + /// + /// Gets an containing the keys of the + /// . + /// + /// + /// An containing the keys of the object + /// that implements . + /// + ICollection Keys { get; } + + /// + /// Determines whether the contains an element + /// with the specified key. + /// + /// + /// The key to locate in the . + /// + /// + /// true if the contains an element with + /// the key; otherwise, false. + /// + /// + /// key is null. + /// + bool ContainsKey(string key); + + /// + /// Gets the value associated with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The key of the value to get. + /// When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized. + /// + /// + /// true if the object that implements contains + /// an element with the specified key; otherwise, false. + /// + /// + /// key is null. + /// + bool TryGetValue(string key, out StringValues value); + + /// + /// Gets the value with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The element with the specified key, or .Empty if the key is not present. + /// + /// + /// key is null. + /// + /// + /// has a different indexer contract than + /// , as it will return StringValues.Empty for missing entries + /// rather than throwing an Exception. + /// + StringValues this[string key] { get; } + + /// + /// The file collection sent with the request. + /// + /// + /// The files included with the request. IFormFileCollection Files { get; } } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index e85ee75f7f..6f8fdaa2ad 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -5,6 +5,9 @@ using System.IO; namespace Microsoft.AspNet.Http { + /// + /// Represents a file sent with the HttpRequest. + /// public interface IFormFile { string ContentType { get; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs index 4950758b44..229b7bbb8e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs @@ -5,6 +5,9 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http { + /// + /// Represents the collection of files sent with the HttpRequest. + /// public interface IFormFileCollection : IReadOnlyList { IFormFile this[string name] { get; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs new file mode 100644 index 0000000000..4bed287e38 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs @@ -0,0 +1,88 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNet.Http +{ + /// + /// Represents the HttpRequest query string collection + /// + public interface IQueryCollection : IEnumerable> + { + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + /// + int Count { get; } + + /// + /// Gets an containing the keys of the + /// . + /// + /// + /// An containing the keys of the object + /// that implements . + /// + ICollection Keys { get; } + + /// + /// Determines whether the contains an element + /// with the specified key. + /// + /// + /// The key to locate in the . + /// + /// + /// true if the contains an element with + /// the key; otherwise, false. + /// + /// + /// key is null. + /// + bool ContainsKey(string key); + + /// + /// Gets the value associated with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The key of the value to get. + /// When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized. + /// + /// + /// true if the object that implements contains + /// an element with the specified key; otherwise, false. + /// + /// + /// key is null. + /// + bool TryGetValue(string key, out StringValues value); + + /// + /// Gets the value with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The element with the specified key, or .Empty if the key is not present. + /// + /// + /// key is null. + /// + /// + /// has a different indexer contract than + /// , as it will return StringValues.Empty for missing entries + /// rather than throwing an Exception. + /// + StringValues this[string key] { get; } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs deleted file mode 100644 index 81c8408753..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; - -namespace Microsoft.AspNet.Http -{ - /// - /// Accessors for headers, query, forms, etc. - /// - public interface IReadableStringCollection : IEnumerable> - { - /// - /// Get the associated value from the collection. - /// Returns StringValues.Empty if the key is not present. - /// - /// - /// - StringValues this[string key] { get; } - - /// - /// Gets the number of elements contained in the collection. - /// - int Count { get; } - - /// - /// Gets a collection containing the keys. - /// - ICollection Keys { get; } - - /// - /// Determines whether the collection contains an element with the specified key. - /// - /// - /// - bool ContainsKey(string key); - } -} diff --git a/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs new file mode 100644 index 0000000000..5cc028b182 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs @@ -0,0 +1,87 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.Http +{ + /// + /// Represents the HttpRequest cookie collection + /// + public interface IRequestCookieCollection : IEnumerable> + { + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + /// + int Count { get; } + + /// + /// Gets an containing the keys of the + /// . + /// + /// + /// An containing the keys of the object + /// that implements . + /// + ICollection Keys { get; } + + /// + /// Determines whether the contains an element + /// with the specified key. + /// + /// + /// The key to locate in the . + /// + /// + /// true if the contains an element with + /// the key; otherwise, false. + /// + /// + /// key is null. + /// + bool ContainsKey(string key); + + /// + /// Gets the value associated with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The key of the value to get. + /// When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized. + /// + /// + /// true if the object that implements contains + /// an element with the specified key; otherwise, false. + /// + /// + /// key is null. + /// + bool TryGetValue(string key, out string value); + + /// + /// Gets the value with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The element with the specified key, or .Empty if the key is not present. + /// + /// + /// key is null. + /// + /// + /// has a different indexer contract than + /// , as it will return String.Empty for missing entries + /// rather than throwing an Exception. + /// + string this[string key] { get; } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index ebcc9b107e..8a76d8f548 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -12,6 +12,8 @@ namespace Microsoft.AspNet.Http /// public struct PathString : IEquatable { + private static readonly char[] splitChar = { '/' }; + /// /// Represents the empty path. This field is read-only. /// @@ -66,7 +68,24 @@ namespace Microsoft.AspNet.Http public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. - return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.Encode)) : string.Empty; + if (!HasValue) + { + return string.Empty; + } + var values = _value.Split(splitChar); + var changed = false; + for (var i = 0; i < values.Length; i++) + { + var value = values[i]; + values[i] = UrlEncoder.Default.Encode(value); + + if (!changed && value != values[i]) + { + changed = true; + } + } + + return changed ? string.Join("/", values) : _value; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index af2feeedb5..088402b2a7 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -128,7 +128,7 @@ namespace Microsoft.AspNet.Http throw new ArgumentNullException(nameof(value)); } - return new QueryString("?" + UrlEncoder.Default.Encode(name) + '=' + UrlEncoder.Default.Encode(value)); + return new QueryString($"?{UrlEncoder.Default.Encode(name)}={UrlEncoder.Default.Encode(value)}"); } /// diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs index 6a8d909dba..fedf74ab09 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Http /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) { - return ParsingHelpers.GetHeaderSplit(headers, key); + return ParsingHelpers.GetHeaderSplit(headers, key).ToArray(); } /// diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 5b1f70f471..c9ac784d40 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -78,9 +78,49 @@ namespace Microsoft.AspNet.Http { headers.Remove(name); } + else if (values.Count == 1) + { + headers[name] = new StringValues(values[0].ToString()); + } else { - headers[name] = values.Select(value => value.ToString()).ToArray(); + var newValues = new string[values.Count]; + for (var i = 0; i < values.Count; i++) + { + newValues[i] = values[i].ToString(); + } + headers[name] = new StringValues(newValues); + } + } + + public static void AppendList(this IHeaderDictionary Headers, string name, IList values) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (values == null) + { + throw new ArgumentNullException(nameof(values)); + } + + switch (values.Count) + { + case 0: + Headers.Append(name, StringValues.Empty); + break; + case 1: + Headers.Append(name, new StringValues(values[0].ToString())); + break; + default: + var newValues = new string[values.Count]; + for (var i = 0; i < values.Count; i++) + { + newValues[i] = values[i].ToString(); + } + Headers.Append(name, new StringValues(newValues)); + break; } } @@ -139,7 +179,7 @@ namespace Microsoft.AspNet.Http if (KnownParsers.TryGetValue(typeof(T), out temp)) { var func = (Func)temp; - return func(headers[name]); + return func(headers[name].ToString()); } var value = headers[name]; @@ -148,7 +188,7 @@ namespace Microsoft.AspNet.Http return default(T); } - return GetViaReflection(value); + return GetViaReflection(value.ToString()); } internal static IList GetList(this IHeaderDictionary headers, string name) @@ -162,7 +202,7 @@ namespace Microsoft.AspNet.Http if (KnownListParsers.TryGetValue(typeof(T), out temp)) { var func = (Func, IList>)temp; - return func(headers[name]); + return func(headers[name].ToArray()); } var values = headers[name]; @@ -179,7 +219,7 @@ namespace Microsoft.AspNet.Http // TODO: Cache the reflected type for later? Only if success? var type = typeof(T); var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(methodInfo => + .FirstOrDefault(methodInfo => { if (string.Equals("TryParse", methodInfo.Name, StringComparison.Ordinal) && methodInfo.ReturnParameter.ParameterType.Equals(typeof(bool))) @@ -191,7 +231,7 @@ namespace Microsoft.AspNet.Http && methodParams[1].ParameterType.Equals(type.MakeByRefType()); } return false; - }).FirstOrDefault(); + }); if (method == null) { @@ -213,7 +253,7 @@ namespace Microsoft.AspNet.Http // TODO: Cache the reflected type for later? Only if success? var type = typeof(T); var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(methodInfo => + .FirstOrDefault(methodInfo => { if (string.Equals("TryParseList", methodInfo.Name, StringComparison.Ordinal) && methodInfo.ReturnParameter.ParameterType.Equals(typeof(Boolean))) @@ -225,7 +265,7 @@ namespace Microsoft.AspNet.Http && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); } return false; - }).FirstOrDefault(); + }); if (method == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs index 72e94d3ef5..acd3a9ade1 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs @@ -1,4 +1,9 @@ -using System; +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Extensions.Primitives; + namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index 6806dbaab0..693bce0caf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,3 +1,6 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using System; using System.Collections; using System.Collections.Generic; @@ -16,7 +19,7 @@ namespace Microsoft.AspNet.Http.Internal public bool Equals(HeaderSegmentCollection other) { - return Equals(_headers, other._headers); + return StringValues.Equals(_headers, other._headers); } public override bool Equals(object obj) diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index f829eec939..8d1e5f83e3 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -10,13 +10,13 @@ namespace Microsoft.AspNet.Http.Internal { internal static class ParsingHelpers { - public static StringValues GetHeader(IDictionary headers, string key) + public static StringValues GetHeader(IHeaderDictionary headers, string key) { StringValues value; return headers.TryGetValue(key, out value) ? value : StringValues.Empty; } - public static StringValues GetHeaderSplit(IDictionary headers, string key) + public static StringValues GetHeaderSplit(IHeaderDictionary headers, string key) { var values = GetHeaderUnmodified(headers, key); return new StringValues(GetHeaderSplitImplementation(values).ToArray()); @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified(IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key) { if (headers == null) { @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Internal return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeaderJoined(IDictionary headers, string key, StringValues value) + public static void SetHeaderJoined(IHeaderDictionary headers, string key, StringValues value) { if (headers == null) { @@ -61,35 +61,26 @@ namespace Microsoft.AspNet.Http.Internal } else { - headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); + headers[key] = string.Join(",", value.Select((s) => QuoteIfNeeded(s))); } } // Quote items that contain comas and are not already quoted. private static string QuoteIfNeeded(string value) { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore + if (!string.IsNullOrWhiteSpace(value) && + value.Contains(',') && + (value[0] != '"' || value[value.Length - 1] != '"')) + { + return $"\"{value}\""; } - else if (value.Contains(',')) - { - if (value[0] != '"' || value[value.Length - 1] != '"') - { - value = '"' + value + '"'; - } - } - return value; } private static string DeQuote(string value) { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + if (!string.IsNullOrWhiteSpace(value) && + (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"')) { value = value.Substring(1, value.Length - 2); } @@ -97,7 +88,7 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified(IDictionary headers, string key, StringValues? values) + public static void SetHeaderUnmodified(IHeaderDictionary headers, string key, StringValues? values) { if (headers == null) { @@ -118,7 +109,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) + public static void AppendHeaderJoined(IHeaderDictionary headers, string key, params string[] values) { if (headers == null) { @@ -135,7 +126,7 @@ namespace Microsoft.AspNet.Http.Internal return; } - string existing = GetHeader(headers, key); + string existing = GetHeader(headers, key).ToString(); if (existing == null) { SetHeaderJoined(headers, key, values); @@ -146,7 +137,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderUnmodified(IDictionary headers, string key, StringValues values) + public static void AppendHeaderUnmodified(IHeaderDictionary headers, string key, StringValues values) { if (headers == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs deleted file mode 100644 index 83c998421d..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; - -namespace Microsoft.AspNet.Http.Internal -{ - internal struct StringSegment : IEquatable - { - private readonly string _buffer; - private readonly int _offset; - private readonly int _count; - - // - // Initializes a new instance of the class. - // - public StringSegment(string buffer, int offset, int count) - { - _buffer = buffer; - _offset = offset; - _count = count; - } - - public string Buffer - { - get { return _buffer; } - } - - public int Offset - { - get { return _offset; } - } - - public int Count - { - get { return _count; } - } - - public string Value - { - get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } - } - - public bool HasValue - { - get { return _offset != -1 && _count != 0 && _buffer != null; } - } - - public bool Equals(StringSegment other) - { - return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is StringSegment && Equals((StringSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ _offset; - hashCode = (hashCode * 397) ^ _count; - return hashCode; - } - } - - public static bool operator ==(StringSegment left, StringSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(StringSegment left, StringSegment right) - { - return !left.Equals(right); - } - - public bool StartsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public bool EndsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; - } - - public bool Equals(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count != textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public string Substring(int offset, int length) - { - return _buffer.Substring(_offset + offset, length); - } - - public StringSegment Subsegment(int offset, int length) - { - return new StringSegment(_buffer, _offset + offset, length); - } - - public override string ToString() - { - return Value ?? string.Empty; - } - } - -} diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index 4b31e30615..800c0def6d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using System.Linq; +using Microsoft.AspNet.Http.Extensions; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers @@ -170,7 +170,7 @@ namespace Microsoft.AspNet.Http.Headers { get { - return HostString.FromUriComponent(Headers[HeaderNames.Host]); + return HostString.FromUriComponent(Headers[HeaderNames.Host].ToString()); } set { @@ -309,17 +309,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList(string name, IList values) { - if (name == null) - { - throw new ArgumentNullException(nameof(name)); - } - - if (values == null) - { - throw new ArgumentNullException(nameof(values)); - } - - Headers.Append(name, values.Select(value => value.ToString()).ToArray()); + Headers.AppendList(name, values); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index e7cb97ad3f..baad250f75 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using Microsoft.AspNet.Http.Extensions; using Microsoft.Net.Http.Headers; @@ -135,7 +134,7 @@ namespace Microsoft.AspNet.Http.Headers get { Uri uri; - if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) + if (Uri.TryCreate(Headers[HeaderNames.Location].ToString(), UriKind.RelativeOrAbsolute, out uri)) { return uri; } @@ -206,17 +205,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList(string name, IList values) { - if (name == null) - { - throw new ArgumentNullException(nameof(name)); - } - - if (values == null) - { - throw new ArgumentNullException(nameof(values)); - } - - Headers.Append(name, values.Select(value => value.ToString()).ToArray()); + Headers.AppendList(name, values); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 84143af242..e0d07b6a5f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return combinePath + query + fragment; + return $"{combinePath}{query.ToString()}{fragment.ToString()}"; } /// @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return scheme + "://" + host + combinePath + query + fragment; + return $"{scheme}://{host.ToString()}{combinePath}{query.ToString()}{fragment.ToString()}"; } /// diff --git a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs index 0c03c29d90..303ff36bcb 100644 --- a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs @@ -7,7 +7,7 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { /// - /// Represents request and response headers + /// Represents HttpRequest and HttpResponse headers /// public interface IHeaderDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 99f39264ad..c39f01cb07 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -140,11 +140,11 @@ namespace Microsoft.AspNet.Http.Internal public override HostString Host { - get { return HostString.FromUriComponent(Headers["Host"]); } + get { return HostString.FromUriComponent(Headers["Host"].ToString()); } set { Headers["Host"] = value.ToUriComponent(); } } - public override IReadableStringCollection Query + public override IQueryCollection Query { get { return QueryFeature.Query; } set { QueryFeature.Query = value; } @@ -161,7 +161,7 @@ namespace Microsoft.AspNet.Http.Internal get { return HttpRequestFeature.Headers; } } - public override IReadableStringCollection Cookies + public override IRequestCookieCollection Cookies { get { return RequestCookiesFeature.Cookies; } set { RequestCookiesFeature.Cookies = value; } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index f239261b6a..3eade210ce 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return Headers[HeaderNames.ContentType]; + return Headers[HeaderNames.ContentType].ToString(); } set { diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 454b0fa61f..e7394a5384 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols); + return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols).ToArray(); } } diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs index fc59b00e6e..ca6d914ac1 100644 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -5,12 +5,13 @@ using System; namespace Microsoft.AspNet.Http.Features { - internal sealed class FeatureHelpers + internal static class FeatureHelpers { public static T GetAndCache( IFeatureCache cache, IFeatureCollection features, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); @@ -26,6 +27,7 @@ namespace Microsoft.AspNet.Http.Features public static T GetOrCreate( IFeatureCollection features, Func factory) + where T : class { T obj = features.Get(); if (obj == null) @@ -43,6 +45,7 @@ namespace Microsoft.AspNet.Http.Features IFeatureCollection features, Func factory, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); @@ -65,6 +68,7 @@ namespace Microsoft.AspNet.Http.Features IFeatureCollection features, Func factory, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); @@ -88,6 +92,7 @@ namespace Microsoft.AspNet.Http.Features HttpRequest request, Func factory, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index b5e71b8cab..f3ed68e34a 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -2,14 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal @@ -17,6 +15,8 @@ namespace Microsoft.AspNet.Http.Features.Internal public class FormFeature : IFormFeature { private readonly HttpRequest _request; + private Task _parsedFormTask; + private IFormCollection _form; public FormFeature(IFormCollection form) { @@ -63,7 +63,15 @@ namespace Microsoft.AspNet.Http.Features.Internal } } - public IFormCollection Form { get; set; } + public IFormCollection Form + { + get { return _form; } + set + { + _parsedFormTask = null; + _form = value; + } + } public IFormCollection ReadForm() { @@ -77,17 +85,32 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); } + // TODO: Issue #456 Avoid Sync-over-Async http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx // TODO: How do we prevent thread exhaustion? - return ReadFormAsync(CancellationToken.None).GetAwaiter().GetResult(); + return ReadFormAsync().GetAwaiter().GetResult(); } - public async Task ReadFormAsync(CancellationToken cancellationToken) - { - if (Form != null) - { - return Form; - } + public Task ReadFormAsync() => ReadFormAsync(CancellationToken.None); + public Task ReadFormAsync(CancellationToken cancellationToken) + { + // Avoid state machine and task allocation for repeated reads + if (_parsedFormTask == null) + { + if (Form != null) + { + _parsedFormTask = Task.FromResult(Form); + } + else + { + _parsedFormTask = InnerReadFormAsync(cancellationToken); + } + } + return _parsedFormTask; + } + + private async Task InnerReadFormAsync(CancellationToken cancellationToken) + { if (!HasFormContentType) { throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); @@ -97,18 +120,18 @@ namespace Microsoft.AspNet.Http.Features.Internal _request.EnableRewind(); - IDictionary formFields = null; - var files = new FormFileCollection(); + FormCollection formFields = null; + FormFileCollection files = null; // Some of these code paths use StreamReader which does not support cancellation tokens. - using (cancellationToken.Register(_request.HttpContext.Abort)) + using (cancellationToken.Register((state) => ((HttpContext)state).Abort(), _request.HttpContext)) { var contentType = ContentType; // Check the content-type if (HasApplicationFormContentType(contentType)) { var encoding = FilterEncoding(contentType.Encoding); - formFields = await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken); + formFields = new FormCollection(await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken)); } else if (HasMultipartFormContentType(contentType)) { @@ -119,9 +142,8 @@ namespace Microsoft.AspNet.Http.Features.Internal var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { - var headers = new HeaderDictionary(section.Headers); ContentDispositionHeaderValue contentDisposition; - ContentDispositionHeaderValue.TryParse(headers[HeaderNames.ContentDisposition], out contentDisposition); + ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { // Find the end @@ -129,8 +151,12 @@ namespace Microsoft.AspNet.Http.Features.Internal var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length) { - Headers = headers, + Headers = new HeaderDictionary(section.Headers), }; + if (files == null) + { + files = new FormFileCollection(); + } files.Add(file); } else if (HasFormDataContentDisposition(contentDisposition)) @@ -141,7 +167,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); MediaTypeHeaderValue mediaType; - MediaTypeHeaderValue.TryParse(headers[HeaderNames.ContentType], out mediaType); + MediaTypeHeaderValue.TryParse(section.ContentType, out mediaType); var encoding = FilterEncoding(mediaType?.Encoding); using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { @@ -151,20 +177,35 @@ namespace Microsoft.AspNet.Http.Features.Internal } else { - System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers[HeaderNames.ContentDisposition]); + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + section.ContentDisposition); } section = await multipartReader.ReadNextSectionAsync(cancellationToken); } - formFields = formAccumulator.GetResults(); + if (formAccumulator.HasValues) + { + formFields = new FormCollection(formAccumulator.GetResults(), files); + } } } // Rewind so later readers don't have to. _request.Body.Seek(0, SeekOrigin.Begin); - Form = new FormCollection(formFields, files); + if (formFields != null) + { + Form = formFields; + } + else if (files != null) + { + Form = new FormCollection(null, files); + } + else + { + Form = FormCollection.Empty; + } + return Form; } diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index 557dc9d518..d803cd212b 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -21,13 +21,13 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ContentDisposition { - get { return Headers["Content-Disposition"]; } + get { return Headers["Content-Disposition"].ToString(); } set { Headers["Content-Disposition"] = value; } } public string ContentType { - get { return Headers["Content-Type"]; } + get { return Headers["Content-Type"].ToString(); } set { Headers["Content-Type"] = value; } } diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs index 1b773b93f1..8a8e00f260 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs index a814e38501..269e31babd 100644 --- a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IQueryFeature { - IReadableStringCollection Query { get; set; } + IQueryCollection Query { get; set; } } } diff --git a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs index 73f23d032d..b015b2d848 100644 --- a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IRequestCookiesFeature { - IReadableStringCollection Cookies { get; set; } + IRequestCookieCollection Cookies { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index b2f59e00dc..e17e612533 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -2,10 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -17,18 +15,9 @@ namespace Microsoft.AspNet.Http.Features.Internal private IHttpRequestFeature _request; private string _original; - private IReadableStringCollection _parsedValues; + private IQueryCollection _parsedValues; - public QueryFeature(IDictionary query) - : this(new ReadableStringCollection(query)) - { - if (query == null) - { - throw new ArgumentNullException(nameof(query)); - } - } - - public QueryFeature(IReadableStringCollection query) + public QueryFeature(IQueryCollection query) { if (query == null) { @@ -62,20 +51,34 @@ namespace Microsoft.AspNet.Http.Features.Internal get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } - public IReadableStringCollection Query + public IQueryCollection Query { get { if (_features == null) { - return _parsedValues ?? ReadableStringCollection.Empty; + if (_parsedValues == null) + { + _parsedValues = QueryCollection.Empty; + } + return _parsedValues; } var current = HttpRequestFeature.QueryString; if (_parsedValues == null || !string.Equals(_original, current, StringComparison.Ordinal)) { _original = current; - _parsedValues = new ReadableStringCollection(QueryHelpers.ParseQuery(current)); + + var result = QueryHelpers.ParseNullableQuery(current); + + if (result == null) + { + _parsedValues = QueryCollection.Empty; + } + else + { + _parsedValues = new QueryCollection(result); + } } return _parsedValues; } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 9eba2dc96c..e759f1d2c6 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using Microsoft.AspNet.Http.Internal; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; @@ -18,14 +17,9 @@ namespace Microsoft.AspNet.Http.Features.Internal private IHttpRequestFeature _request; private StringValues _original; - private IReadableStringCollection _parsedValues; - - public RequestCookiesFeature(IDictionary cookies) - : this(new ReadableStringCollection(cookies)) - { - } - - public RequestCookiesFeature(IReadableStringCollection cookies) + private IRequestCookieCollection _parsedValues; + + public RequestCookiesFeature(IRequestCookieCollection cookies) { if (cookies == null) { @@ -59,32 +53,30 @@ namespace Microsoft.AspNet.Http.Features.Internal get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } - public IReadableStringCollection Cookies + public IRequestCookieCollection Cookies { get { if (_features == null) { - return _parsedValues ?? ReadableStringCollection.Empty; + if (_parsedValues == null) + { + _parsedValues = RequestCookieCollection.Empty; + } + return _parsedValues; } var headers = HttpRequestFeature.Headers; StringValues current; if (!headers.TryGetValue(HeaderNames.Cookie, out current)) { - current = StringValues.Empty; + current = string.Empty; } - if (_parsedValues == null || !Enumerable.SequenceEqual(_original, current, StringComparer.Ordinal)) + if (_parsedValues == null || _original != current) { _original = current; - var collectionParser = _parsedValues as RequestCookiesCollection; - if (collectionParser == null) - { - collectionParser = new RequestCookiesCollection(); - _parsedValues = collectionParser; - } - collectionParser.Reparse(current); + _parsedValues = RequestCookieCollection.Parse(current.ToArray()); } return _parsedValues; @@ -104,10 +96,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var headers = new List(); foreach (var pair in _parsedValues) { - foreach (var cookieValue in pair.Value) - { - headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); - } + headers.Add(new CookieHeaderValue(pair.Key, pair.Value).ToString()); } _original = headers.ToArray(); HttpRequestFeature.Headers[HeaderNames.Cookie] = _original; diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index d56ba114ef..dd7607a731 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cookiesCollection == null) { var headers = HttpResponseFeature.Headers; - _cookiesCollection = new ResponseCookies(new HeaderDictionary(headers)); + _cookiesCollection = new ResponseCookies(headers); } return _cookiesCollection; } diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index a0e7428567..7a7d67c26d 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; @@ -10,29 +10,226 @@ namespace Microsoft.AspNet.Http.Internal /// /// Contains the parsed form values. /// - public class FormCollection : ReadableStringCollection, IFormCollection + public class FormCollection : IFormCollection { - public FormCollection(IDictionary store) - : this(store, new FormFileCollection()) + public static readonly FormCollection Empty = new FormCollection(); +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); + private static readonly StringValues[] EmptyValues = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; + private static readonly StringValues[] EmptyValues = new StringValues[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + private static IFormFileCollection EmptyFiles = new FormFileCollection(); + + private IFormFileCollection _files; + + private FormCollection() { + // For static Empty } - public FormCollection(IDictionary store, IFormFileCollection files) - : base(store) + public FormCollection(Dictionary fields, IFormFileCollection files = null) { - if (store == null) - { - throw new ArgumentNullException(nameof(store)); - } - - if (files == null) - { - throw new ArgumentNullException(nameof(files)); - } - - Files = files; + // can be null + Store = fields; + _files = files; } - public IFormFileCollection Files { get; } + public IFormFileCollection Files + { + get + { + return _files ?? EmptyFiles; + } + private set { _files = value; } + } + + private Dictionary Store { get; set; } + + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. + public StringValues this[string key] + { + get + { + if (Store == null) + { + return StringValues.Empty; + } + + StringValues value; + if (TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } + } + + /// + /// Gets the number of elements contained in the ;. + /// + /// The number of elements contained in the . + public int Count + { + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + /// + /// Determines whether the contains a specific key. + /// + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out StringValues value) + { + if (Store == null) + { + value = default(StringValues); + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + // Non-boxed Enumerator + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + // Boxed Enumerator + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + // Boxed Enumerator + return Store.GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + return _dictionaryEnumerator.Current; + } + return default(KeyValuePair); + } + } + + public void Dispose() + { + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + void IEnumerator.Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } + } } } diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 2955cddec0..f1fde19a1d 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -9,64 +9,37 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { /// - /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. + /// Represents a wrapper for RequestHeaders and ResponseHeaders. /// public class HeaderDictionary : IHeaderDictionary { - public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); + private static readonly StringValues[] EmptyValues = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; + private static readonly StringValues[] EmptyValues = new StringValues[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + public HeaderDictionary() { } - /// - /// Initializes a new instance of the class. - /// - /// The underlying data store. - public HeaderDictionary(IDictionary store) + public HeaderDictionary(Dictionary store) { - if (store == null) - { - throw new ArgumentNullException(nameof(store)); - } - Store = store; } - private IDictionary Store { get; set; } - - /// - /// Gets an that contains the keys in the ;. - /// - /// An that contains the keys in the . - public ICollection Keys + public HeaderDictionary(int capacity) { - get { return Store.Keys; } + Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); } - /// - /// - /// - public ICollection Values - { - get { return Store.Values; } - } - - /// - /// Gets the number of elements contained in the ;. - /// - /// The number of elements contained in the . - public int Count - { - get { return Store.Count; } - } - - /// - /// Gets a value that indicates whether the is in read-only mode. - /// - /// true if the is in read-only mode; otherwise, false. - public bool IsReadOnly - { - get { return Store.IsReadOnly; } - } + private Dictionary Store { get; set; } /// /// Get or sets the associated value from the collection as a single string. @@ -75,8 +48,47 @@ namespace Microsoft.AspNet.Http.Internal /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. public StringValues this[string key] { - get { return ParsingHelpers.GetHeader(Store, key); } - set { ParsingHelpers.SetHeader(Store, key, value); } + get + { + if (Store == null) + { + return StringValues.Empty; + } + + StringValues value; + if (TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } + + set + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (StringValues.IsNullOrEmpty(value)) + { + if (Store == null) + { + return; + } + + Store.Remove(key); + } + else + { + if (Store == null) + { + Store = new Dictionary(1, StringComparer.OrdinalIgnoreCase); + } + + Store[key] = value; + } + } } /// @@ -87,25 +99,76 @@ namespace Microsoft.AspNet.Http.Internal StringValues IDictionary.this[string key] { get { return Store[key]; } - set { Store[key] = value; } + set { this[key] = value; } } /// - /// Returns an enumerator that iterates through a collection. + /// Gets the number of elements contained in the ;. /// - /// An object that can be used to iterate through the collection. - IEnumerator> IEnumerable>.GetEnumerator() + /// The number of elements contained in the . + public int Count { - return Store.GetEnumerator(); + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } } /// - /// Returns an enumerator that iterates through a collection. + /// Gets a value that indicates whether the is in read-only mode. /// - /// An object that can be used to iterate through the collection. - IEnumerator IEnumerable.GetEnumerator() + /// true if the is in read-only mode; otherwise, false. + public bool IsReadOnly { - return Store.GetEnumerator(); + get + { + return false; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + public ICollection Values + { + get + { + if (Store == null) + { + return EmptyValues; + } + return Store.Values; + } + } + + /// + /// Adds a new list of items to the collection. + /// + /// The item to add. + public void Add(KeyValuePair item) + { + if (item.Key == null) + { + throw new ArgumentNullException("The key is null"); + } + if (Store == null) + { + Store = new Dictionary(1, StringComparer.OrdinalIgnoreCase); + } + Store.Add(item.Key, item.Value); } /// @@ -115,54 +178,27 @@ namespace Microsoft.AspNet.Http.Internal /// The header values. public void Add(string key, StringValues value) { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (Store == null) + { + Store = new Dictionary(1); + } Store.Add(key, value); } - /// - /// Determines whether the contains a specific key. - /// - /// The key. - /// true if the contains a specific key; otherwise, false. - public bool ContainsKey(string key) - { - return Store.ContainsKey(key); - } - - /// - /// Removes the given header from the collection. - /// - /// The header name. - /// true if the specified object was removed from the collection; otherwise, false. - public bool Remove(string key) - { - return Store.Remove(key); - } - - /// - /// Retrieves a value from the dictionary. - /// - /// The header name. - /// The value. - /// true if the contains the key; otherwise, false. - public bool TryGetValue(string key, out StringValues value) - { - return Store.TryGetValue(key, out value); - } - - /// - /// Adds a new list of items to the collection. - /// - /// The item to add. - public void Add(KeyValuePair item) - { - Store.Add(item); - } - /// /// Clears the entire list of objects. /// public void Clear() { + if (Store == null) + { + return; + } Store.Clear(); } @@ -173,17 +209,47 @@ namespace Microsoft.AspNet.Http.Internal /// true if the specified object occurs within this collection; otherwise, false. public bool Contains(KeyValuePair item) { - return Store.Contains(item); + StringValues value; + if (Store == null || + !Store.TryGetValue(item.Key, out value) || + !StringValues.Equals(value, item.Value)) + { + return false; + } + return true; } /// - /// Copies the elements to a one-dimensional Array instance at the specified index. + /// Determines whether the contains a specific key. /// - /// The one-dimensional Array that is the destination of the specified objects copied from the . + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + /// + /// Copies the elements to a one-dimensional Array instance at the specified index. + /// + /// The one-dimensional Array that is the destination of the specified objects copied from the . /// The zero-based index in at which copying begins. public void CopyTo(KeyValuePair[] array, int arrayIndex) { - Store.CopyTo(array, arrayIndex); + if (Store == null) + { + return; + } + + foreach (var item in Store) + { + array[arrayIndex] = item; + arrayIndex++; + } } /// @@ -193,7 +259,144 @@ namespace Microsoft.AspNet.Http.Internal /// true if the specified object was removed from the collection; otherwise, false. public bool Remove(KeyValuePair item) { - return Store.Remove(item); + if (Store == null) + { + return false; + } + + StringValues value; + + if (Store.TryGetValue(item.Key, out value) && StringValues.Equals(item.Value, value)) + { + return Store.Remove(item.Key); + } + return false; + } + + /// + /// Removes the given header from the collection. + /// + /// The header name. + /// true if the specified object was removed from the collection; otherwise, false. + public bool Remove(string key) + { + if (Store == null) + { + return false; + } + return Store.Remove(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out StringValues value) + { + if (Store == null) + { + value = default(StringValues); + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + return Store.GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + return _dictionaryEnumerator.Current; + } + return default(KeyValuePair); + } + } + + public void Dispose() + { + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + void IEnumerator.Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } } } } diff --git a/src/Microsoft.AspNet.Http/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/ItemsDictionary.cs index 90e9cd3138..87a27b8b12 100644 --- a/src/Microsoft.AspNet.Http/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/ItemsDictionary.cs @@ -97,7 +97,12 @@ namespace Microsoft.AspNet.Http.Internal bool ICollection>.Remove(KeyValuePair item) { - return Items.Remove(item); + object value; + if (Items.TryGetValue(item.Key, out value) && Equals(item.Value, value)) + { + return Items.Remove(item.Key); + } + return false; } IEnumerator> IEnumerable>.GetEnumerator() diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 9f6feb3d75..8b575fd659 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Internal public bool Equals(HeaderSegmentCollection other) { - return Equals(_headers, other._headers); + return StringValues.Equals(_headers, other._headers); } public override bool Equals(object obj) @@ -363,13 +363,7 @@ namespace Microsoft.AspNet.Http.Internal internal static class ParsingHelpers { - public static StringValues GetHeader(IDictionary headers, string key) - { - StringValues value; - return headers.TryGetValue(key, out value) ? value : StringValues.Empty; - } - - public static StringValues GetHeaderSplit(IDictionary headers, string key) + public static StringValues GetHeaderSplit(IHeaderDictionary headers, string key) { var values = GetHeaderUnmodified(headers, key); return new StringValues(GetHeaderSplitImplementation(values).ToArray()); @@ -386,7 +380,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified(IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key) { if (headers == null) { @@ -397,32 +391,6 @@ namespace Microsoft.AspNet.Http.Internal return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeader(IDictionary headers, string key, StringValues value) - { - if (headers == null) - { - throw new ArgumentNullException(nameof(headers)); - } - - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (StringValues.IsNullOrEmpty(value)) - { - headers.Remove(key); - } - else - { - headers[key] = value; - } - } - private static string DeQuote(string value) { if (string.IsNullOrWhiteSpace(value)) diff --git a/src/Microsoft.AspNet.Http/QueryCollection.cs b/src/Microsoft.AspNet.Http/QueryCollection.cs new file mode 100644 index 0000000000..2b9168d500 --- /dev/null +++ b/src/Microsoft.AspNet.Http/QueryCollection.cs @@ -0,0 +1,227 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNet.Http.Internal +{ + /// + /// The HttpRequest query string collection + /// + public class QueryCollection : IQueryCollection + { + public static readonly QueryCollection Empty = new QueryCollection(); +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); + private static readonly StringValues[] EmptyValues = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; + private static readonly StringValues[] EmptyValues = new StringValues[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + private Dictionary Store { get; set; } + + public QueryCollection() + { + } + + public QueryCollection(Dictionary store) + { + Store = store; + } + + public QueryCollection(QueryCollection store) + { + Store = store.Store; + } + + public QueryCollection(int capacity) + { + Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); + } + + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. + public StringValues this[string key] + { + get + { + if (Store == null) + { + return StringValues.Empty; + } + + StringValues value; + if (TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } + } + + /// + /// Gets the number of elements contained in the ;. + /// + /// The number of elements contained in the . + public int Count + { + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + /// + /// Determines whether the contains a specific key. + /// + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out StringValues value) + { + if (Store == null) + { + value = default(StringValues); + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + return Store.GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + return _dictionaryEnumerator.Current; + } + return default(KeyValuePair); + } + } + + public void Dispose() + { + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + void IEnumerator.Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs deleted file mode 100644 index 8239699e1b..0000000000 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; - -namespace Microsoft.AspNet.Http.Internal -{ - /// - /// Accessors for query, forms, etc. - /// - public class ReadableStringCollection : IReadableStringCollection - { - public static readonly IReadableStringCollection Empty = new ReadableStringCollection(new Dictionary(0)); - - /// - /// Create a new wrapper - /// - /// - public ReadableStringCollection(IDictionary store) - { - if (store == null) - { - throw new ArgumentNullException(nameof(store)); - } - - Store = store; - } - - private IDictionary Store { get; set; } - - /// - /// Gets the number of elements contained in the collection. - /// - public int Count - { - get { return Store.Count; } - } - - /// - /// Gets a collection containing the keys. - /// - public ICollection Keys - { - get { return Store.Keys; } - } - - - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns StringValues.Empty if the key is not present. - /// - /// - /// - public StringValues this[string key] - { - get - { - StringValues value; - if (Store.TryGetValue(key, out value)) - { - return value; - } - return StringValues.Empty; - } - } - - /// - /// Determines whether the collection contains an element with the specified key. - /// - /// - /// - public bool ContainsKey(string key) - { - return Store.ContainsKey(key); - } - - - /// - /// - /// - /// - public IEnumerator> GetEnumerator() - { - return Store.GetEnumerator(); - } - - /// - /// - /// - /// - IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 1a413d4271..2d6cfdac4e 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Http.Internal ThrowIfDisposed(); if (value < 0 || value > Length) { - throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be within the length of the Stream: " + Length); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be within the length of the Stream: " + Length.ToString()); } VerifyPosition(); _position = value; diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs new file mode 100644 index 0000000000..363b69df80 --- /dev/null +++ b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs @@ -0,0 +1,235 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http.Internal +{ + public class RequestCookieCollection : IRequestCookieCollection + { + public static readonly RequestCookieCollection Empty = new RequestCookieCollection(); +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + private Dictionary Store { get; set; } + + public RequestCookieCollection() + { + } + + public RequestCookieCollection(Dictionary store) + { + Store = store; + } + + public RequestCookieCollection(int capacity) + { + Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); + } + + public string this[string key] + { + get + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (Store == null) + { + return string.Empty; + } + + string value; + if (TryGetValue(key, out value)) + { + return value; + } + return string.Empty; + } + } + + public static RequestCookieCollection Parse(IList values) + { + if (values.Count == 0) + { + return Empty; + } + + IList cookies; + if (CookieHeaderValue.TryParseList(values, out cookies)) + { + if (cookies.Count == 0) + { + return Empty; + } + + var store = new Dictionary(cookies.Count); + for (var i = 0; i < cookies.Count; i++) + { + var cookie = cookies[i]; + var name = Uri.UnescapeDataString(cookie.Name.Replace('+', ' ')); + var value = Uri.UnescapeDataString(cookie.Value.Replace('+', ' ')); + store[name] = value; + } + + return new RequestCookieCollection(store); + } + return Empty; + } + + public int Count + { + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + public bool TryGetValue(string key, out string value) + { + if (Store == null) + { + value = string.Empty; + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an struct enumerator that iterates through a collection without boxing. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + // Non-boxed Enumerator + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + // Boxed Enumerator + return GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + // Boxed Enumerator + return GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + var current = _dictionaryEnumerator.Current; + return new KeyValuePair(current.Key, current.Value); + } + return default(KeyValuePair); + } + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + public void Dispose() + { + } + + public void Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs deleted file mode 100644 index d0001c1a5d..0000000000 --- a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; -using Microsoft.Net.Http.Headers; - -namespace Microsoft.AspNet.Http.Internal -{ - public class RequestCookiesCollection : IReadableStringCollection - { - private readonly IDictionary _dictionary; - - public RequestCookiesCollection() - { - _dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); - } - - public StringValues this[string key] - { - get { return Get(key); } - } - - /// - /// Gets the number of elements contained in the collection. - /// - public int Count - { - get { return _dictionary.Count; } - } - - /// - /// Gets a collection containing the keys. - /// - public ICollection Keys - { - get { return _dictionary.Keys; } - } - - /// - /// Determines whether the collection contains an element with the specified key. - /// - /// - /// - public bool ContainsKey(string key) - { - return _dictionary.ContainsKey(key); - } - - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. - /// - /// - /// - public string Get(string key) - { - string value; - return _dictionary.TryGetValue(key, out value) ? value : null; - } - - /// - /// Get the associated values from the collection in their original format. - /// Returns null if the key is not present. - /// - /// - /// - public IList GetValues(string key) - { - string value; - return _dictionary.TryGetValue(key, out value) ? new[] { value } : null; - } - - public void Reparse(IList values) - { - _dictionary.Clear(); - - IList cookies; - if (CookieHeaderValue.TryParseList(values, out cookies)) - { - foreach (var cookie in cookies) - { - var name = Uri.UnescapeDataString(cookie.Name.Replace('+', ' ')); - var value = Uri.UnescapeDataString(cookie.Value.Replace('+', ' ')); - _dictionary[name] = value; - } - } - } - - public IEnumerator> GetEnumerator() - { - foreach (var pair in _dictionary) - { - yield return new KeyValuePair(pair.Key, pair.Value); - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index 5075efb004..ed76dec862 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -2,8 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Linq; using System.Text.Encodings.Web; +using System.Collections.Generic; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; @@ -80,10 +80,10 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; - Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); + var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; + Func predicate = (value, encKeyPlusEquals) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - StringValues deleteCookies = encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT"; + StringValues deleteCookies = $"{encodedKeyPlusEquals}; expires=Thu, 01-Jan-1970 00:00:00 GMT"; var existingValues = Headers[HeaderNames.SetCookie]; if (StringValues.IsNullOrEmpty(existingValues)) { @@ -91,7 +91,24 @@ namespace Microsoft.AspNet.Http.Internal } else { - Headers[HeaderNames.SetCookie] = existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray(); + var values = existingValues.ToArray(); + var newValues = new List(); + + for (var i = 0; i < values.Length; i++) + { + if (!predicate(values[i], encodedKeyPlusEquals)) + { + newValues.Add(values[i]); + } + } + + values = deleteCookies.ToArray(); + for (var i = 0; i < values.Length; i++) + { + newValues.Add(values[i]); + } + + Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); } } @@ -106,33 +123,44 @@ namespace Microsoft.AspNet.Http.Internal { throw new ArgumentNullException(nameof(options)); } - - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; + + var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); - Func rejectPredicate; + Func rejectPredicate; if (domainHasValue) { - rejectPredicate = value => - value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && - value.IndexOf("domain=" + options.Domain, StringComparison.OrdinalIgnoreCase) != -1; + rejectPredicate = (value, encKeyPlusEquals, opts) => + value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && + value.IndexOf($"domain={opts.Domain}", StringComparison.OrdinalIgnoreCase) != -1; } else if (pathHasValue) { - rejectPredicate = value => - value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && - value.IndexOf("path=" + options.Path, StringComparison.OrdinalIgnoreCase) != -1; + rejectPredicate = (value, encKeyPlusEquals, opts) => + value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && + value.IndexOf($"path={opts.Path}", StringComparison.OrdinalIgnoreCase) != -1; } else { - rejectPredicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); + rejectPredicate = (value, encKeyPlusEquals, opts) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); } var existingValues = Headers[HeaderNames.SetCookie]; if (!StringValues.IsNullOrEmpty(existingValues)) { - Headers[HeaderNames.SetCookie] = existingValues.Where(value => !rejectPredicate(value)).ToArray(); + var values = existingValues.ToArray(); + var newValues = new List(); + + for (var i = 0; i < values.Length; i++) + { + if (!rejectPredicate(values[i], encodedKeyPlusEquals, options)) + { + newValues.Add(values[i]); + } + } + + Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); } Append(key, string.Empty, new CookieOptions diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index d78d3b34ce..ccb58d66bc 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -262,7 +262,7 @@ namespace Microsoft.AspNet.WebUtilities { if (minCount > _buffer.Length) { - throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length.ToString()); } while (_bufferCount < minCount) { @@ -289,7 +289,7 @@ namespace Microsoft.AspNet.WebUtilities { if (minCount > _buffer.Length) { - throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length.ToString()); } while (_bufferCount < minCount) { @@ -315,38 +315,42 @@ namespace Microsoft.AspNet.WebUtilities public string ReadLine(int lengthLimit) { CheckDisposed(); - var builder = new MemoryStream(200); - bool foundCR = false, foundCRLF = false; - - while (!foundCRLF && EnsureBuffered()) + using (var builder = new MemoryStream(200)) { - if (builder.Length > lengthLimit) - { - throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); - } - ProcessLineChar(builder, ref foundCR, ref foundCRLF); - } + bool foundCR = false, foundCRLF = false; - return DecodeLine(builder, foundCRLF); + while (!foundCRLF && EnsureBuffered()) + { + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit.ToString()); + } + ProcessLineChar(builder, ref foundCR, ref foundCRLF); + } + + return DecodeLine(builder, foundCRLF); + } } public async Task ReadLineAsync(int lengthLimit, CancellationToken cancellationToken) { CheckDisposed(); - var builder = new MemoryStream(200); - bool foundCR = false, foundCRLF = false; - - while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) + using (var builder = new MemoryStream(200)) { - if (builder.Length > lengthLimit) + bool foundCR = false, foundCRLF = false; + + while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) { - throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit.ToString()); + } + + ProcessLineChar(builder, ref foundCR, ref foundCRLF); } - ProcessLineChar(builder, ref foundCR, ref foundCRLF); + return DecodeLine(builder, foundCRLF); } - - return DecodeLine(builder, foundCRLF); } private void ProcessLineChar(MemoryStream builder, ref bool foundCR, ref bool foundCRLF) diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index e361bac1c4..554b86e7b6 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -185,7 +185,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) { return ReadFormAsync(stream, Encoding.UTF8, cancellationToken); } @@ -195,7 +195,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) + public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) { var reader = new FormReader(stream, encoding); diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index c0ecc8c45c..9e8f0555ca 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -7,17 +7,16 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { - public class KeyValueAccumulator + public struct KeyValueAccumulator { private Dictionary> _accumulator; - public KeyValueAccumulator() - { - _accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - } - public void Append(string key, string value) { + if (_accumulator == null) + { + _accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + } List values; if (_accumulator.TryGetValue(key, out values)) { @@ -25,18 +24,29 @@ namespace Microsoft.AspNet.WebUtilities } else { - _accumulator[key] = new List(1) { value }; + values = new List(1); + values.Add(value); + _accumulator[key] = values; } } - public IDictionary GetResults() + public bool HasValues => _accumulator != null; + + public Dictionary GetResults() { - var results = new Dictionary(StringComparer.OrdinalIgnoreCase); + if (_accumulator == null) + { + return new Dictionary(StringComparer.OrdinalIgnoreCase); + } + + var results = new Dictionary(_accumulator.Count, StringComparer.OrdinalIgnoreCase); + foreach (var kv in _accumulator) { - results.Add(kv.Key, kv.Value.ToArray()); + results.Add(kv.Key, kv.Value.Count == 1 ? new StringValues(kv.Value[0]) : new StringValues(kv.Value.ToArray())); } + return results; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index ef6f03a92f..e9e0aba912 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.WebUtilities return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; } - private async Task> ReadHeadersAsync(CancellationToken cancellationToken) + private async Task> ReadHeadersAsync(CancellationToken cancellationToken) { int totalSize = 0; var accumulator = new KeyValueAccumulator(); @@ -84,10 +84,10 @@ namespace Microsoft.AspNet.WebUtilities totalSize += line.Length; if (totalSize > TotalHeaderSizeLimit) { - throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit); + throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit.ToString()); } int splitIndex = line.IndexOf(':'); - Debug.Assert(splitIndex > 0, "Invalid header line: " + line); + Debug.Assert(splitIndex > 0, $"Invalid header line: {line.ToString()}"); if (splitIndex >= 0) { var name = line.Substring(0, splitIndex); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index 29dfc49574..f3a6e5cc1c 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Type", out values)) { - return values; + return values.ToString(); } return null; } @@ -29,13 +29,13 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Disposition", out values)) { - return values; + return values.ToString(); } return null; } } - public IDictionary Headers { get; set; } + public Dictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 57ee90bc75..036ed55795 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -107,13 +107,39 @@ namespace Microsoft.AspNet.WebUtilities /// /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. - public static IDictionary ParseQuery(string queryString) + public static Dictionary ParseQuery(string queryString) { + var result = ParseNullableQuery(queryString); + + if (result == null) + { + return new Dictionary(); + } + + return result; + } + + + /// + /// Parse a query string into its component key and value parts. + /// + /// The raw query string value, with or without the leading '?'. + /// A collection of parsed keys and values, null if there are no entries. + public static Dictionary ParseNullableQuery(string queryString) + { + var accumulator = new KeyValueAccumulator(); + + if (string.IsNullOrEmpty(queryString) || queryString == "?") + { + return null; + } + + int scanIndex = 0; if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') { - queryString = queryString.Substring(1); + scanIndex = 1; } - var accumulator = new KeyValueAccumulator(); + int textLength = queryString.Length; int equalIndex = queryString.IndexOf('='); @@ -121,7 +147,6 @@ namespace Microsoft.AspNet.WebUtilities { equalIndex = textLength; } - int scanIndex = 0; while (scanIndex < textLength) { int delimiterIndex = queryString.IndexOf('&', scanIndex); @@ -149,6 +174,11 @@ namespace Microsoft.AspNet.WebUtilities scanIndex = delimiterIndex + 1; } + if (!accumulator.HasValues) + { + return null; + } + return accumulator.GetResults(); } } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index e020da61fa..586b8ca183 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -150,7 +150,7 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal("value0", query1["name0"]); Assert.Equal("value1", query1["name1"]); - var query2 = new ReadableStringCollection(new Dictionary() + var query2 = new QueryCollection( new Dictionary() { { "name2", "value2" } }); @@ -170,19 +170,23 @@ namespace Microsoft.AspNet.Http.Internal var cookies0 = request.Cookies; Assert.Equal(0, cookies0.Count); - request.Headers["Cookie"] = new[] { "name0=value0", "name1=value1" }; + var newCookies = new[] { "name0=value0", "name1=value1" }; + request.Headers["Cookie"] = newCookies; + + cookies0 = RequestCookieCollection.Parse(newCookies); var cookies1 = request.Cookies; - Assert.Same(cookies0, cookies1); + Assert.Equal(cookies0, cookies1); Assert.Equal(2, cookies1.Count); Assert.Equal("value0", cookies1["name0"]); Assert.Equal("value1", cookies1["name1"]); + Assert.Equal(newCookies, request.Headers["Cookie"]); - var cookies2 = new ReadableStringCollection(new Dictionary() + var cookies2 = new RequestCookieCollection(new Dictionary() { { "name2", "value2" } }); request.Cookies = cookies2; - Assert.Same(cookies2, request.Cookies); + Assert.Equal(cookies2, request.Cookies); Assert.Equal("value2", request.Cookies["name2"]); cookieHeaders = request.Headers["Cookie"]; Assert.Equal(new[] { "name2=value2" }, cookieHeaders); From 7e573631f7144dbe0655a8e247cbd553e27045a5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 2 Nov 2015 15:56:06 -0800 Subject: [PATCH 432/846] Make other FormReader.ReadForm return Dictionary. --- src/Microsoft.AspNet.WebUtilities/FormReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 554b86e7b6..fe86ee56aa 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -165,7 +165,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static IDictionary ReadForm(string text) + public static Dictionary ReadForm(string text) { var reader = new FormReader(text); From bacf76098efba66d66afe680d63f9758047dd38f Mon Sep 17 00:00:00 2001 From: Nick Craver Date: Tue, 3 Nov 2015 06:55:13 -0500 Subject: [PATCH 433/846] Performance improvements This adds additional performance improvements (namely string.Concat overloads) on top of #411. --- src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 2 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 4 ++-- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 41757d29fb..87b22df243 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -100,7 +100,7 @@ namespace Microsoft.AspNet.Http string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { - fragmentValue = $"#{fragmentValue}"; + fragmentValue = "#" + fragmentValue; } return new FragmentString(fragmentValue); } diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index e0d07b6a5f..28d89de253 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return $"{combinePath}{query.ToString()}{fragment.ToString()}"; + return combinePath + query.ToString() + fragment.ToString(); } /// diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index ed76dec862..cd6b9c6ee9 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; Func predicate = (value, encKeyPlusEquals) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); StringValues deleteCookies = $"{encodedKeyPlusEquals}; expires=Thu, 01-Jan-1970 00:00:00 GMT"; @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.Http.Internal throw new ArgumentNullException(nameof(options)); } - var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 036ed55795..6b0fd267ac 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// Parse a query string into its component key and value parts. /// - /// The raw query string value, with or without the leading '?'. + /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. public static Dictionary ParseQuery(string queryString) { @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// Parse a query string into its component key and value parts. /// - /// The raw query string value, with or without the leading '?'. + /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values, null if there are no entries. public static Dictionary ParseNullableQuery(string queryString) { @@ -135,7 +135,7 @@ namespace Microsoft.AspNet.WebUtilities } int scanIndex = 0; - if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + if (queryString[0] == '?') { scanIndex = 1; } From f050e09283be468998a7bcb7868beea7a484aff2 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 4 Nov 2015 16:03:36 -0800 Subject: [PATCH 434/846] Revert use of explicit converters that prevent APIs from returning null. --- .../HeaderDictionaryExtensions.cs | 2 +- .../HeaderDictionaryTypeExtensions.cs | 4 +- .../Internal/ParsingHelpers.cs | 2 +- .../RequestHeaders.cs | 2 +- .../ResponseHeaders.cs | 2 +- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 2 +- .../DefaultWebSocketManager.cs | 2 +- .../Features/FormFile.cs | 4 +- .../RequestCookieCollection.cs | 6 +- .../MultipartReader.cs | 2 +- .../MultipartSection.cs | 4 +- .../DefaultHttpRequestTests.cs | 2 + .../DefaultHttpResponseTests.cs | 90 +++++++++++++++++++ 14 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs index fedf74ab09..6a8d909dba 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Http /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) { - return ParsingHelpers.GetHeaderSplit(headers, key).ToArray(); + return ParsingHelpers.GetHeaderSplit(headers, key); } /// diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index c9ac784d40..cd8d26ca25 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -179,7 +179,7 @@ namespace Microsoft.AspNet.Http if (KnownParsers.TryGetValue(typeof(T), out temp)) { var func = (Func)temp; - return func(headers[name].ToString()); + return func(headers[name]); } var value = headers[name]; @@ -202,7 +202,7 @@ namespace Microsoft.AspNet.Http if (KnownListParsers.TryGetValue(typeof(T), out temp)) { var func = (Func, IList>)temp; - return func(headers[name].ToArray()); + return func(headers[name]); } var values = headers[name]; diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index 8d1e5f83e3..78b7fcd769 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.Http.Internal return; } - string existing = GetHeader(headers, key).ToString(); + string existing = GetHeader(headers, key); if (existing == null) { SetHeaderJoined(headers, key, values); diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index 800c0def6d..dbfff55411 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -170,7 +170,7 @@ namespace Microsoft.AspNet.Http.Headers { get { - return HostString.FromUriComponent(Headers[HeaderNames.Host].ToString()); + return HostString.FromUriComponent(Headers[HeaderNames.Host]); } set { diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index baad250f75..931b2d931d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Http.Headers get { Uri uri; - if (Uri.TryCreate(Headers[HeaderNames.Location].ToString(), UriKind.RelativeOrAbsolute, out uri)) + if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) { return uri; } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index c39f01cb07..d11e75bc03 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -140,7 +140,7 @@ namespace Microsoft.AspNet.Http.Internal public override HostString Host { - get { return HostString.FromUriComponent(Headers["Host"].ToString()); } + get { return HostString.FromUriComponent(Headers["Host"]); } set { Headers["Host"] = value.ToUriComponent(); } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 3eade210ce..f239261b6a 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return Headers[HeaderNames.ContentType].ToString(); + return Headers[HeaderNames.ContentType]; } set { diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index e7394a5384..454b0fa61f 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols).ToArray(); + return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols); } } diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index d803cd212b..557dc9d518 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -21,13 +21,13 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ContentDisposition { - get { return Headers["Content-Disposition"].ToString(); } + get { return Headers["Content-Disposition"]; } set { Headers["Content-Disposition"] = value; } } public string ContentType { - get { return Headers["Content-Type"].ToString(); } + get { return Headers["Content-Type"]; } set { Headers["Content-Type"] = value; } } diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs index 363b69df80..8b2a44239c 100644 --- a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Http.Internal if (Store == null) { - return string.Empty; + return null; } string value; @@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Http.Internal { return value; } - return string.Empty; + return null; } } @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.Http.Internal { if (Store == null) { - value = string.Empty; + value = null; return false; } return Store.TryGetValue(key, out value); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index e9e0aba912..2af2a444f1 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.WebUtilities throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit.ToString()); } int splitIndex = line.IndexOf(':'); - Debug.Assert(splitIndex > 0, $"Invalid header line: {line.ToString()}"); + Debug.Assert(splitIndex > 0, $"Invalid header line: {line}"); if (splitIndex >= 0) { var name = line.Substring(0, splitIndex); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index f3a6e5cc1c..196cf424ca 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Type", out values)) { - return values.ToString(); + return values; } return null; } @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Disposition", out values)) { - return values.ToString(); + return values; } return null; } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 586b8ca183..6defe395f4 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -169,6 +169,8 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal(0, cookieHeaders.Count); var cookies0 = request.Cookies; Assert.Equal(0, cookies0.Count); + Assert.Null(cookies0["key0"]); + Assert.False(cookies0.ContainsKey("key0")); var newCookies = new[] { "name0=value0", "name1=value1" }; request.Headers["Cookie"] = newCookies; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs new file mode 100644 index 0000000000..6fcbcedce1 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs @@ -0,0 +1,90 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.AspNet.Http.Features; +using Microsoft.Extensions.Primitives; +using Xunit; + +namespace Microsoft.AspNet.Http.Internal +{ + public class DefaultHttpResponseTests + { + [Theory] + [InlineData(0)] + [InlineData(9001)] + [InlineData(65535)] + public void GetContentLength_ReturnsParsedHeader(long value) + { + // Arrange + var response = GetResponseWithContentLength(value.ToString(CultureInfo.InvariantCulture)); + + // Act and Assert + Assert.Equal(value, response.ContentLength); + } + + [Fact] + public void GetContentLength_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var response = GetResponseWithContentLength(contentLength: null); + + // Act and Assert + Assert.Null(response.ContentLength); + } + + [Theory] + [InlineData("cant-parse-this")] + [InlineData("-1000")] + [InlineData("1000.00")] + [InlineData("100/5")] + public void GetContentLength_ReturnsNullIfHeaderCannotBeParsed(string contentLength) + { + // Arrange + var response = GetResponseWithContentLength(contentLength); + + // Act and Assert + Assert.Null(response.ContentLength); + } + + [Fact] + public void GetContentType_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var response = GetResponseWithContentType(contentType: null); + + // Act and Assert + Assert.Null(response.ContentType); + } + + private static HttpResponse CreateResponse(IHeaderDictionary headers) + { + var context = new DefaultHttpContext(); + context.Features.Get().Headers = headers; + return context.Response; + } + + private static HttpResponse GetResponseWithContentLength(string contentLength = null) + { + return GetResponseWithHeader("Content-Length", contentLength); + } + + private static HttpResponse GetResponseWithContentType(string contentType = null) + { + return GetResponseWithHeader("Content-Type", contentType); + } + + private static HttpResponse GetResponseWithHeader(string headerName, string headerValue) + { + var headers = new HeaderDictionary(); + if (headerValue != null) + { + headers.Add(headerName, headerValue); + } + + return CreateResponse(headers); + } + } +} From 308dd109a0ad077e820d1c137fd37d31d2f43886 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 5 Nov 2015 19:02:59 -0800 Subject: [PATCH 435/846] Reduce allocations on Conneg hotpath --- .../CacheControlHeaderValue.cs | 4 +- .../ContentDispositionHeaderValue.cs | 4 +- .../HeaderUtilities.cs | 4 +- .../MediaTypeHeaderValue.cs | 44 +++++++++---- .../NameValueHeaderValue.cs | 21 ++++--- .../ObjectCollection.cs | 63 +++++++++---------- .../MediaTypeHeaderValueTest.cs | 6 +- 7 files changed, 83 insertions(+), 63 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index b8b6d2726c..94793efbea 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers private ICollection _privateHeaders; private bool _mustRevalidate; private bool _proxyRevalidate; - private ICollection _extensions; + private IList _extensions; public CacheControlHeaderValue() { @@ -158,7 +158,7 @@ namespace Microsoft.Net.Http.Headers set { _proxyRevalidate = value; } } - public ICollection Extensions + public IList Extensions { get { diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index 25fe03cd9a..6a3cb271c9 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Headers = new GenericHeaderParser(false, GetDispositionTypeLength); // Use list instead of dictionary since we may have multiple parameters with the same name. - private ICollection _parameters; + private ObjectCollection _parameters; private string _dispositionType; private ContentDispositionHeaderValue() @@ -48,7 +48,7 @@ namespace Microsoft.Net.Http.Headers } } - public ICollection Parameters + public IList Parameters { get { diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 3885477aa1..eee2ea9c7d 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -13,7 +13,7 @@ namespace Microsoft.Net.Http.Headers private const string QualityName = "q"; internal const string BytesUnit = "bytes"; - internal static void SetQuality(ICollection parameters, double? value) + internal static void SetQuality(IList parameters, double? value) { Contract.Requires(parameters != null); @@ -50,7 +50,7 @@ namespace Microsoft.Net.Http.Headers } } - internal static double? GetQuality(ICollection parameters) + internal static double? GetQuality(IList parameters) { Contract.Requires(parameters != null); diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 23ed8b0cec..b8b7c09e9e 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -59,7 +59,7 @@ namespace Microsoft.Net.Http.Headers // Remove charset parameter if (charsetParameter != null) { - _parameters.Remove(charsetParameter); + Parameters.Remove(charsetParameter); } } else @@ -123,7 +123,7 @@ namespace Microsoft.Net.Http.Headers // Remove charset parameter if (boundaryParameter != null) { - _parameters.Remove(boundaryParameter); + Parameters.Remove(boundaryParameter); } } else @@ -140,7 +140,7 @@ namespace Microsoft.Net.Http.Headers } } - public ICollection Parameters + public IList Parameters { get { @@ -161,8 +161,12 @@ namespace Microsoft.Net.Http.Headers public double? Quality { - get { return HeaderUtilities.GetQuality(Parameters); } - set { HeaderUtilities.SetQuality(Parameters, value); } + get { return HeaderUtilities.GetQuality(_parameters); } + set + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + HeaderUtilities.SetQuality(Parameters, value); + } } public string MediaType @@ -210,7 +214,7 @@ namespace Microsoft.Net.Http.Headers { get { - return SubType.Equals("*", StringComparison.Ordinal); + return string.Compare(_mediaType, _mediaType.IndexOf('/') + 1, "*", 0, 1, StringComparison.Ordinal) == 0; } } @@ -241,15 +245,31 @@ namespace Microsoft.Net.Http.Headers return false; } + // PERF: Avoid doing anything here that allocates a substring, this is a very hot path + // for content-negotiation. + var indexOfSlash = _mediaType.IndexOf('/'); + // "text/plain" is a subset of "text/plain", "text/*" and "*/*". "*/*" is a subset only of "*/*". - if (!Type.Equals(otherMediaType.Type, StringComparison.OrdinalIgnoreCase)) + if (string.Compare( + strA: _mediaType, + indexA: 0, + strB: otherMediaType._mediaType, + indexB: 0, + length: indexOfSlash, + comparisonType: StringComparison.OrdinalIgnoreCase) != 0) { if (!otherMediaType.MatchesAllTypes) { return false; } } - else if (!SubType.Equals(otherMediaType.SubType, StringComparison.OrdinalIgnoreCase)) + else if (string.Compare( + strA: MediaType, + indexA: indexOfSlash + 1, + strB: otherMediaType._mediaType, + indexB: indexOfSlash + 1, // We know the Type is equal, so the index of '/' is the same in both strings. + length: _mediaType.Length - indexOfSlash, + comparisonType: StringComparison.OrdinalIgnoreCase) != 0) { if (!otherMediaType.MatchesAllSubTypes) { @@ -457,17 +477,17 @@ namespace Microsoft.Net.Http.Headers // If there is no whitespace between and in / get the media type using // one Substring call. Otherwise get substrings for and and combine them. - var mediatTypeLength = current + subtypeLength - startIndex; - if (typeLength + subtypeLength + 1 == mediatTypeLength) + var mediaTypeLength = current + subtypeLength - startIndex; + if (typeLength + subtypeLength + 1 == mediaTypeLength) { - mediaType = input.Substring(startIndex, mediatTypeLength); + mediaType = input.Substring(startIndex, mediaTypeLength); } else { mediaType = input.Substring(startIndex, typeLength) + "/" + input.Substring(current, subtypeLength); } - return mediatTypeLength; + return mediaTypeLength; } private static void CheckMediaTypeFormat(string mediaType, string parameterName) diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index 3031d877c0..fed6261a4d 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -173,7 +173,7 @@ namespace Microsoft.Net.Http.Headers } internal static void ToString( - ICollection values, + IList values, char separator, bool leadingSeparator, StringBuilder destination) @@ -185,18 +185,18 @@ namespace Microsoft.Net.Http.Headers return; } - foreach (var value in values) + for (var i = 0; i < values.Count; i++) { if (leadingSeparator || (destination.Length > 0)) { destination.Append(separator); destination.Append(' '); } - destination.Append(value.ToString()); + destination.Append(values[i].ToString()); } } - internal static string ToString(ICollection values, char separator, bool leadingSeparator) + internal static string ToString(IList values, char separator, bool leadingSeparator) { if ((values == null) || (values.Count == 0)) { @@ -210,7 +210,7 @@ namespace Microsoft.Net.Http.Headers return sb.ToString(); } - internal static int GetHashCode(ICollection values) + internal static int GetHashCode(IList values) { if ((values == null) || (values.Count == 0)) { @@ -218,9 +218,9 @@ namespace Microsoft.Net.Http.Headers } var result = 0; - foreach (var value in values) + for (var i = 0; i < values.Count; i++) { - result = result ^ value.GetHashCode(); + result = result ^ values[i].GetHashCode(); } return result; } @@ -282,7 +282,7 @@ namespace Microsoft.Net.Http.Headers string input, int startIndex, char delimiter, - ICollection nameValueCollection) + IList nameValueCollection) { Contract.Requires(nameValueCollection != null); Contract.Requires(startIndex >= 0); @@ -320,7 +320,7 @@ namespace Microsoft.Net.Http.Headers } } - public static NameValueHeaderValue Find(ICollection values, string name) + public static NameValueHeaderValue Find(IList values, string name) { Contract.Requires((name != null) && (name.Length > 0)); @@ -329,8 +329,9 @@ namespace Microsoft.Net.Http.Headers return null; } - foreach (var value in values) + for (var i = 0; i < values.Count; i++) { + var value = values[i]; if (string.Compare(value.Name, name, StringComparison.OrdinalIgnoreCase) == 0) { return value; diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index 24237b6ff1..f6d91e1508 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -12,15 +11,28 @@ namespace Microsoft.Net.Http.Headers // type to throw if 'null' gets added. Collection internally uses List which comes at some cost. In addition // Collection.Add() calls List.InsertItem() which is an O(n) operation (compared to O(1) for List.Add()). // This type is only used for very small collections (1-2 items) to keep the impact of using Collection small. - internal class ObjectCollection : ICollection where T : class + internal class ObjectCollection : Collection where T : class { internal static readonly Action DefaultValidator = CheckNotNull; internal static readonly ObjectCollection EmptyReadOnlyCollection = new ObjectCollection(DefaultValidator, isReadOnly: true); - private readonly Collection _collection = new Collection(); private readonly Action _validator; - private readonly bool _isReadOnly; + + // We need to create a 'read-only' inner list for Collection to do the right + // thing. + private static IList CreateInnerList(bool isReadOnly, IEnumerable other = null) + { + var list = other == null ? new List() : new List(other); + if (isReadOnly) + { + return new ReadOnlyCollection(list); + } + else + { + return list; + } + } public ObjectCollection() : this(DefaultValidator) @@ -28,58 +40,45 @@ namespace Microsoft.Net.Http.Headers } public ObjectCollection(Action validator, bool isReadOnly = false) + : base(CreateInnerList(isReadOnly)) { _validator = validator; - _isReadOnly = isReadOnly; } public ObjectCollection(IEnumerable other, bool isReadOnly = false) + : base(CreateInnerList(isReadOnly, other)) { _validator = DefaultValidator; - foreach (T item in other) + foreach (T item in Items) { - Add(item); + _validator(item); } - _isReadOnly = isReadOnly; } - public int Count + public bool IsReadOnly => ((ICollection)this).IsReadOnly; + + protected override void ClearItems() { - get { return _collection.Count; } + base.ClearItems(); } - public bool IsReadOnly + protected override void InsertItem(int index, T item) { - get { return _isReadOnly; } - } - - public void Add(T item) - { - HeaderUtilities.ThrowIfReadOnly(IsReadOnly); _validator(item); - _collection.Add(item); + base.InsertItem(index, item); } - public bool Remove(T item) + protected override void RemoveItem(int index) { - HeaderUtilities.ThrowIfReadOnly(IsReadOnly); - return _collection.Remove(item); + base.RemoveItem(index); } - public void Clear() + protected override void SetItem(int index, T item) { - HeaderUtilities.ThrowIfReadOnly(IsReadOnly); - _collection.Clear(); + _validator(item); + base.SetItem(index, item); } - public bool Contains(T item) => _collection.Contains(item); - - public void CopyTo(T[] array, int arrayIndex) => _collection.CopyTo(array, arrayIndex); - - public IEnumerator GetEnumerator() => _collection.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() => _collection.GetEnumerator(); - private static void CheckNotNull(T item) { // null values cannot be added to the collection. diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 48a4bfab12..ba3a31b7d2 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -122,9 +122,9 @@ namespace Microsoft.Net.Http.Headers Assert.False(mediaType0.Parameters.IsReadOnly); Assert.True(mediaType1.Parameters.IsReadOnly); Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); - Assert.Throws(() => mediaType1.Parameters.Add(new NameValueHeaderValue("name"))); - Assert.Throws(() => mediaType1.Parameters.Remove(new NameValueHeaderValue("name"))); - Assert.Throws(() => mediaType1.Parameters.Clear()); + Assert.Throws(() => mediaType1.Parameters.Add(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Remove(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Clear()); var pair0 = mediaType0.Parameters.First(); var pair1 = mediaType1.Parameters.First(); From 663c7917d04a3bfdab464896b38a6657956178eb Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 10:26:06 +0100 Subject: [PATCH 436/846] Changed string.Format to StringBuilder --- .../UriHelper.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 28d89de253..02a3356c38 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text; namespace Microsoft.AspNet.Http.Extensions { @@ -10,6 +11,8 @@ namespace Microsoft.AspNet.Http.Extensions /// public static class UriHelper { + private const string SchemeDelimiter = "://"; + /// /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. /// @@ -48,7 +51,15 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return $"{scheme}://{host.ToString()}{combinePath}{query.ToString()}{fragment.ToString()}"; + + return new StringBuilder() + .Append(scheme) + .Append(SchemeDelimiter) + .Append(host.ToString()) + .Append(combinePath) + .Append(query.ToString()) + .Append(fragment.ToString()) + .ToString(); } /// @@ -93,7 +104,14 @@ namespace Microsoft.AspNet.Http.Extensions /// public static string GetDisplayUrl(this HttpRequest request) { - return request.Scheme + "://" + request.Host.Value + request.PathBase.Value + request.Path.Value + request.QueryString.Value; + return new StringBuilder() + .Append(request.Scheme) + .Append(SchemeDelimiter) + .Append(request.Host.Value) + .Append(request.PathBase.Value) + .Append(request.Path.Value) + .Append(request.QueryString.Value) + .ToString(); } } } \ No newline at end of file From 7b35b2e1b98bc750ddd6353890421d0213ef22ab Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 11:03:51 +0100 Subject: [PATCH 437/846] Pass length to StringBuilder --- .../UriHelper.cs | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 02a3356c38..4e1d8f7687 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -50,15 +50,22 @@ namespace Microsoft.AspNet.Http.Extensions QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { - string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; + var combinedPath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return new StringBuilder() + var encodedHost = host.ToString(); + var encodedQuery = query.ToString(); + var encodedFragment = fragment.ToString(); + + var length = scheme.Length + SchemeDelimiter.Length + encodedHost.Length + + combinedPath.Length + encodedQuery.Length + encodedFragment.Length; + + return new StringBuilder(length) .Append(scheme) .Append(SchemeDelimiter) - .Append(host.ToString()) - .Append(combinePath) - .Append(query.ToString()) - .Append(fragment.ToString()) + .Append(encodedHost) + .Append(combinedPath) + .Append(encodedQuery) + .Append(encodedFragment) .ToString(); } @@ -104,13 +111,21 @@ namespace Microsoft.AspNet.Http.Extensions /// public static string GetDisplayUrl(this HttpRequest request) { - return new StringBuilder() + var host = request.Host.Value; + var pathBase = request.PathBase.Value; + var path = request.Path.Value; + var queryString = request.QueryString.Value; + + var length = request.Scheme.Length + SchemeDelimiter.Length + host.Length + + pathBase.Length + path.Length + queryString.Length; + + return new StringBuilder(length) .Append(request.Scheme) .Append(SchemeDelimiter) - .Append(request.Host.Value) - .Append(request.PathBase.Value) - .Append(request.Path.Value) - .Append(request.QueryString.Value) + .Append(host) + .Append(pathBase) + .Append(path) + .Append(queryString) .ToString(); } } From e5a32850900e95f06cc9a50877f5ed175e971af6 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 10 Nov 2015 15:05:29 +0000 Subject: [PATCH 438/846] Lazily initialize DefaultHttpContext Lazily initialize sub objects of DefaultHttpContext Resolves #470 --- .../DefaultHttpContext.cs | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index ffc6acc670..0c95f04dc4 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -18,8 +18,8 @@ namespace Microsoft.AspNet.Http.Internal { private readonly HttpRequest _request; private readonly HttpResponse _response; - private readonly ConnectionInfo _connection; - private readonly AuthenticationManager _authenticationManager; + private ConnectionInfo _connection; + private AuthenticationManager _authenticationManager; private IItemsFeature _items; private IServiceProvidersFeature _serviceProviders; @@ -43,8 +43,6 @@ namespace Microsoft.AspNet.Http.Internal _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _connection = new DefaultConnectionInfo(features); - _authenticationManager = new DefaultAuthenticationManager(features); } void IFeatureCache.CheckFeaturesRevision() @@ -133,9 +131,29 @@ namespace Microsoft.AspNet.Http.Internal public override HttpResponse Response { get { return _response; } } - public override ConnectionInfo Connection { get { return _connection; } } + public override ConnectionInfo Connection + { + get + { + if (_connection == null) + { + _connection = new DefaultConnectionInfo(_features); + } + return _connection; + } + } - public override AuthenticationManager Authentication { get { return _authenticationManager; } } + public override AuthenticationManager Authentication + { + get + { + if (_authenticationManager == null) + { + _authenticationManager = new DefaultAuthenticationManager(_features); + } + return _authenticationManager; + } + } public override ClaimsPrincipal User { From 6874b87f1353c30bb24cd70cf8f7a8ed7968b482 Mon Sep 17 00:00:00 2001 From: Nick Craver Date: Tue, 3 Nov 2015 07:11:43 -0500 Subject: [PATCH 439/846] C#6 Cleanup & Optimizations The main intent is cleanup using C# 6 operators and normalization of type aliases. While there are no intended functional changes here, it does eliminate a few tight race conditions as a bonus (not a real-win since this isn't thread-safe all over, simply noting). --- .../IFormCollection.cs | 1 - .../PathString.cs | 3 +-- .../QueryString.cs | 6 +++--- .../RequestHeaders.cs | 1 - src/Microsoft.AspNet.Http/FormCollection.cs | 6 +----- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 19 +++---------------- .../HttpContextAccessor.cs | 2 +- .../OwinFeatureCollection.cs | 12 ++++-------- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebEncoders.cs | 2 +- .../BaseHeaderParser.cs | 2 +- .../CacheControlHeaderValue.cs | 2 +- .../HttpHeaderParser.cs | 7 +++---- .../StringWithQualityHeaderValueComparer.cs | 6 +++--- .../CookieHeaderValueTest.cs | 2 +- .../SetCookieHeaderValueTest.cs | 2 +- 16 files changed, 25 insertions(+), 50 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 03e8116852..55d4a578bc 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -88,7 +88,6 @@ namespace Microsoft.AspNet.Http /// /// The file collection sent with the request. /// - /// /// The files included with the request. IFormFileCollection Files { get; } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 8a76d8f548..ef6e1bb39e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Linq; using System.Text.Encodings.Web; namespace Microsoft.AspNet.Http @@ -17,7 +16,7 @@ namespace Microsoft.AspNet.Http /// /// Represents the empty path. This field is read-only. /// - public static readonly PathString Empty = new PathString(String.Empty); + public static readonly PathString Empty = new PathString(string.Empty); private readonly string _value; diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 088402b2a7..d400375ea8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Http /// /// Represents the empty query string. This field is read-only. /// - public static readonly QueryString Empty = new QueryString(String.Empty); + public static readonly QueryString Empty = new QueryString(string.Empty); private readonly string _value; @@ -84,7 +84,7 @@ namespace Microsoft.AspNet.Http [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Delimiter characters ? and # must be escaped by this method instead of truncating the value")] public static QueryString FromUriComponent(string uriComponent) { - if (String.IsNullOrEmpty(uriComponent)) + if (string.IsNullOrEmpty(uriComponent)) { return new QueryString(string.Empty); } @@ -231,7 +231,7 @@ namespace Microsoft.AspNet.Http public override int GetHashCode() { - return (_value != null ? _value.GetHashCode() : 0); + return _value?.GetHashCode() ?? 0; } public static bool operator ==(QueryString left, QueryString right) diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index dbfff55411..59265fbf08 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Extensions; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index 7a7d67c26d..fbc3b88a38 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -83,11 +83,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - if (Store == null) - { - return 0; - } - return Store.Count; + return Store?.Count ?? 0; } } diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index f1fde19a1d..530c5f31e0 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -72,12 +72,7 @@ namespace Microsoft.AspNet.Http.Internal if (StringValues.IsNullOrEmpty(value)) { - if (Store == null) - { - return; - } - - Store.Remove(key); + Store?.Remove(key); } else { @@ -110,11 +105,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - if (Store == null) - { - return 0; - } - return Store.Count; + return Store?.Count ?? 0; } } @@ -195,11 +186,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Clear() { - if (Store == null) - { - return; - } - Store.Clear(); + Store?.Clear(); } /// diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs index 83b558161d..04784d714a 100644 --- a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Http.Internal get { var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - return handle != null ? handle.Unwrap() as HttpContext : null; + return handle?.Unwrap() as HttpContext; } set { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 6d955194fa..acf3e2215c 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -17,7 +17,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { @@ -45,14 +44,11 @@ namespace Microsoft.AspNet.Owin SupportsWebSockets = true; var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); - if (register != null) + register?.Invoke(state => { - register(state => - { - var collection = (OwinFeatureCollection)state; - collection._headersSent = true; - }, this); - } + var collection = (OwinFeatureCollection)state; + collection._headersSent = true; + }, this); } T Prop(string key) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index a36e9377f3..87b3cf6ffa 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Owin options = acceptContext.Options; _subProtocol = acceptContext.SubProtocol; } - else if (context != null && context.SubProtocol != null) + else if (context?.SubProtocol != null) { options = new Dictionary(1) { diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index 751ad43c21..4142039f8f 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -121,7 +121,7 @@ namespace Microsoft.AspNet.WebUtilities // Special-case empty input if (count == 0) { - return String.Empty; + return string.Empty; } // We're going to use base64url encoding with no padding characters. diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs index dbd18b82d6..1b4038d21b 100644 --- a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs @@ -44,7 +44,7 @@ namespace Microsoft.Net.Http.Headers return SupportsMultipleValues; } - T result = default(T); + T result; var length = GetParsedValueLength(value, current, out result); if (length == 0) diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index 94793efbea..7ad65ac3bc 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -369,7 +369,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - nameValueList.Add(nameValue as NameValueHeaderValue); + nameValueList.Add(nameValue); } // If we get here, we were able to successfully parse the string as list of name/value pairs. Now analyze diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs index 2c05296a98..a12edbf3e0 100644 --- a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; @@ -37,11 +36,11 @@ namespace Microsoft.Net.Http.Headers // If a parser returns 'null', it means there was no value, but that's valid (e.g. "Accept: "). The caller // can ignore the value. - T result = default(T); + T result; if (!TryParseValue(value, ref index, out result)) { throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid value '{0}'.", - value == null ? "" : value.Substring(index))); + value?.Substring(index) ?? "")); } return result; } @@ -114,7 +113,7 @@ namespace Microsoft.Net.Http.Headers else { throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid values '{0}'.", - values == null ? "" : value.Substring(index))); + value.Substring(index))); } } } diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 6dc3d0758a..0d092ec19d 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -64,13 +64,13 @@ namespace Microsoft.Net.Http.Headers return 1; } - if (!String.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) + if (!string.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) { - if (String.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) + if (string.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) { return -1; } - else if (String.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) + else if (string.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) { return 1; } diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs index f649cce09e..3644ed1df0 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -154,7 +154,7 @@ namespace Microsoft.Net.Http.Headers public void CookieHeaderValue_Value() { var cookie = new CookieHeaderValue("name"); - Assert.Equal(String.Empty, cookie.Value); + Assert.Equal(string.Empty, cookie.Value); cookie.Value = "value1"; Assert.Equal("value1", cookie.Value); diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index e21fb4e089..f98886521d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -184,7 +184,7 @@ namespace Microsoft.Net.Http.Headers public void SetCookieHeaderValue_Value() { var cookie = new SetCookieHeaderValue("name"); - Assert.Equal(String.Empty, cookie.Value); + Assert.Equal(string.Empty, cookie.Value); cookie.Value = "value1"; Assert.Equal("value1", cookie.Value); From f726b7b5913233f525f7aaf7899e31400446df6a Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 19:55:14 +0100 Subject: [PATCH 440/846] Added PERF comment --- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 4e1d8f7687..f121ffa1d6 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -56,6 +56,7 @@ namespace Microsoft.AspNet.Http.Extensions var encodedQuery = query.ToString(); var encodedFragment = fragment.ToString(); + // PERF: Calculate string length to allocate correct buffer size for StringBuilder. var length = scheme.Length + SchemeDelimiter.Length + encodedHost.Length + combinedPath.Length + encodedQuery.Length + encodedFragment.Length; @@ -116,6 +117,7 @@ namespace Microsoft.AspNet.Http.Extensions var path = request.Path.Value; var queryString = request.QueryString.Value; + // PERF: Calculate string length to allocate correct buffer size for StringBuilder. var length = request.Scheme.Length + SchemeDelimiter.Length + host.Length + pathBase.Length + path.Length + queryString.Length; @@ -129,4 +131,4 @@ namespace Microsoft.AspNet.Http.Extensions .ToString(); } } -} \ No newline at end of file +} From bb8141710d5de697bba29fef8facb750b2a88314 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 12 Nov 2015 12:23:07 -0800 Subject: [PATCH 441/846] Remove System beta tag in project.json for coreclr packages. --- .../project.json | 6 ++-- .../project.json | 34 +++++++++---------- .../project.json | 6 ++-- .../project.json | 18 +++++----- src/Microsoft.AspNet.Http/project.json | 8 ++--- src/Microsoft.AspNet.Owin/project.json | 30 ++++++++-------- .../project.json | 16 ++++----- .../project.json | 6 ++-- .../project.json | 4 +-- src/Microsoft.Net.Http.Headers/project.json | 16 ++++----- .../project.json | 2 +- 11 files changed, 73 insertions(+), 73 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index d90e54919e..cc263ffbe0 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -10,7 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -21,8 +21,8 @@ }, "dotnet5.4": { "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*" + "System.Resources.ResourceManager": "4.0.1-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index cd18c2aa74..1316a95118 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -15,7 +15,7 @@ "type": "build", "version": "1.0.0-*" }, - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -26,22 +26,22 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Tools": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.Globalization.Extensions": "4.0.1-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Linq.Expressions": "4.0.11-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Net.WebSockets": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.InteropServices": "4.0.21-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*", - "System.Threading.Tasks": "4.0.11-beta-*" + "System.Collections": "4.0.11-*", + "System.ComponentModel": "4.0.1-*", + "System.Diagnostics.Tools": "4.0.1-*", + "System.Globalization": "4.0.11-*", + "System.Globalization.Extensions": "4.0.1-*", + "System.Linq": "4.0.1-*", + "System.Linq.Expressions": "4.0.11-*", + "System.Net.Primitives": "4.0.11-*", + "System.Net.WebSockets": "4.0.0-*", + "System.Reflection.TypeExtensions": "4.0.1-*", + "System.Runtime": "4.0.21-*", + "System.Runtime.InteropServices": "4.0.21-*", + "System.Security.Claims": "4.0.1-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Principal": "4.0.1-*", + "System.Threading.Tasks": "4.0.11-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index bb136ef733..1dff3fe5c1 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -17,9 +17,9 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Resources.ResourceManager": "4.0.1-beta-*" + "System.IO.FileSystem": "4.0.1-*", + "System.Runtime": "4.0.21-*", + "System.Resources.ResourceManager": "4.0.1-*" } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 2b662e541a..0f9fb1a9f2 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -16,15 +16,15 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Net.WebSockets": "4.0.0-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*" + "System.Collections": "4.0.11-*", + "System.Linq": "4.0.1-*", + "System.Net.Primitives": "4.0.11-*", + "System.Net.WebSockets": "4.0.0-*", + "System.Runtime.Extensions": "4.0.11-*", + "System.Security.Claims": "4.0.1-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Principal": "4.0.1-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3b3b9d6c3a..88f2039436 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -19,10 +19,10 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.Text.Encoding": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*" + "System.Diagnostics.Debug": "4.0.11-*", + "System.Text.Encoding": "4.0.11-*", + "System.Threading": "4.0.11-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index f24cc304de..886ba4d554 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -16,21 +16,21 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Tools": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Runtime.InteropServices": "4.0.21-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*", - "System.Threading.Tasks": "4.0.11-beta-*" + "System.Collections": "4.0.11-*", + "System.ComponentModel": "4.0.1-*", + "System.Diagnostics.Tools": "4.0.1-*", + "System.Globalization": "4.0.11-*", + "System.IO": "4.0.11-*", + "System.Linq": "4.0.1-*", + "System.Net.Primitives": "4.0.11-*", + "System.Runtime": "4.0.21-*", + "System.Runtime.Extensions": "4.0.11-*", + "System.Runtime.InteropServices": "4.0.21-*", + "System.Security.Claims": "4.0.1-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Principal": "4.0.1-*", + "System.Threading.Tasks": "4.0.11-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index c302399a15..41c996a830 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -11,7 +11,7 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -21,13 +21,13 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*" + "System.Collections": "4.0.11-*", + "System.Diagnostics.Debug": "4.0.11-*", + "System.IO": "4.0.11-*", + "System.IO.FileSystem": "4.0.1-*", + "System.Runtime": "4.0.21-*", + "System.Runtime.Extensions": "4.0.11-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json index 03c915b86b..273702a80e 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json @@ -10,9 +10,9 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*" + "System.Resources.ResourceManager": "4.0.1-*", + "System.Runtime": "4.0.21-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index 47ccb1a89e..d020a87412 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -13,7 +13,7 @@ "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Extensions.OptionsModel": "1.0.0-*", - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -24,4 +24,4 @@ }, "dotnet5.4": {} } -} \ No newline at end of file +} diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 07ce4c413b..311e571a11 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -13,14 +13,14 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Contracts": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.Globalization.Extensions": "4.0.1-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Text.Encoding": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*" + "System.Collections": "4.0.11-*", + "System.Diagnostics.Contracts": "4.0.1-*", + "System.Globalization": "4.0.11-*", + "System.Globalization.Extensions": "4.0.1-*", + "System.Linq": "4.0.1-*", + "System.Text.Encoding": "4.0.11-*", + "System.Runtime": "4.0.21-*" } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json index 140e0146d4..4d81779a7c 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -17,7 +17,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Text.Encoding.Extensions": "4.0.11-beta-*" + "System.Text.Encoding.Extensions": "4.0.11-*" } } } From 88c356f645e438ba0518d488182cde6a61fd0e21 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 13 Nov 2015 15:12:11 -0800 Subject: [PATCH 442/846] Add HtmlContentBuilder and HtmlTextWriter Remove BufferedHtmlContent --- HttpAbstractions.sln | 32 +---- .../HtmlContentBuilder.cs} | 117 ++++++++++-------- .../HtmlContentBuilderExtensions.cs | 27 ---- .../HtmlEncodedString.cs | 49 ++++++++ .../HtmlTextWriter.cs | 49 ++++++++ .../Properties/AssemblyInfo.cs | 4 +- .../project.json | 1 + ...tensions.BufferedHtmlContent.Sources.xproj | 19 --- .../Properties/AssemblyInfo.cs | 8 -- .../project.json | 18 --- .../HtmlContentBuilderTest.cs} | 16 +-- .../project.json | 4 + ....Extensions.BufferedHtmlContent.Test.xproj | 21 ---- .../project.json | 21 ---- 14 files changed, 179 insertions(+), 207 deletions(-) rename src/{Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs => Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs} (52%) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs create mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs delete mode 100644 src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj delete mode 100644 src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json rename test/{Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs => Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs} (90%) delete mode 100644 test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj delete mode 100644 test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 289cdf8dcb..b2884f66ab 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.24711.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -46,10 +46,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\Sample EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Sources", "src\Microsoft.Extensions.BufferedHtmlContent.Sources\Microsoft.Extensions.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Test", "test\Microsoft.Extensions.BufferedHtmlContent.Test\Microsoft.Extensions.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -264,30 +260,6 @@ Global {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.ActiveCfg = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.Build.0 = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.Build.0 = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.ActiveCfg = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.Build.0 = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.Build.0 = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.Build.0 = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.ActiveCfg = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -312,7 +284,5 @@ Global {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {B1B2B906-24AE-4C57-AAC5-19B734014504} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs similarity index 52% rename from src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs rename to src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs index 4ca8ba7be8..0f6fbabc4c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs @@ -1,62 +1,95 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Text.Encodings.Web; -using Microsoft.AspNet.Html.Abstractions; -namespace Microsoft.Extensions.Internal +namespace Microsoft.AspNet.Html.Abstractions { /// - /// Enumerable object collection which knows how to write itself. + /// An implementation using an in memory list. /// - [DebuggerDisplay("{DebuggerToString()}")] - internal class BufferedHtmlContent : IHtmlContentBuilder + public class HtmlContentBuilder : IHtmlContentBuilder { - // This is not List because that would lead to wrapping all strings to IHtmlContent - // which is not space performant. - // internal for testing. - internal List Entries { get; } = new List(); - /// - /// Appends the to the collection. + /// Creates a new . /// - /// The string to be appended. - /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder Append(string unencoded) + public HtmlContentBuilder() + : this(new List()) { - Entries.Add(unencoded); - return this; } /// - /// Appends a to the collection. + /// Creates a new with the given initial capacity. /// - /// The to be appended. - /// A reference to this instance after the Append operation has completed. + /// The initial capacity of the backing store. + public HtmlContentBuilder(int capacity) + : this(new List(capacity)) + { + } + + /// + /// Creates a new with the given list of entries. + /// + /// + /// The list of entries. The will use this list without making a copy. + /// + public HtmlContentBuilder(List entries) + { + if (entries == null) + { + throw new ArgumentNullException(nameof(entries)); + } + + Entries = entries; + } + + // This is not List because that would lead to wrapping all strings to IHtmlContent + // which is not space performant. + // + // In general unencoded strings are added here. We're optimizing for that case, and allocating + // a wrapper when encoded strings are used. + // + // internal for testing. + internal List Entries { get; } + + /// + public IHtmlContentBuilder Append(string unencoded) + { + if (!string.IsNullOrEmpty(unencoded)) + { + Entries.Add(unencoded); + } + + return this; + } + + /// public IHtmlContentBuilder Append(IHtmlContent htmlContent) { + if (htmlContent == null) + { + return this; + } + Entries.Add(htmlContent); return this; } - /// - /// Appends the HTML encoded to the collection. - /// - /// The HTML encoded string to be appended. - /// A reference to this instance after the Append operation has completed. + /// public IHtmlContentBuilder AppendHtml(string encoded) { - Entries.Add(new HtmlEncodedString(encoded)); + if (!string.IsNullOrEmpty(encoded)) + { + Entries.Add(new HtmlEncodedString(encoded)); + } + return this; } - /// - /// Removes all the entries from the collection. - /// - /// A reference to this instance after the Clear operation has completed. + + /// public IHtmlContentBuilder Clear() { Entries.Clear(); @@ -78,11 +111,6 @@ namespace Microsoft.Extensions.Internal foreach (var entry in Entries) { - if (entry == null) - { - continue; - } - var entryAsString = entry as string; if (entryAsString != null) { @@ -104,22 +132,5 @@ namespace Microsoft.Extensions.Internal return writer.ToString(); } } - - private class HtmlEncodedString : IHtmlContent - { - public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); - - private readonly string _value; - - public HtmlEncodedString(string value) - { - _value = value; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(_value); - } - } } } diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 5b1164b438..63c311c6e0 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -185,33 +185,6 @@ namespace Microsoft.AspNet.Html.Abstractions return builder; } - [DebuggerDisplay("{DebuggerToString()}")] - private class HtmlEncodedString : IHtmlContent - { - public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); - - private readonly string _value; - - public HtmlEncodedString(string value) - { - _value = value; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(_value); - } - - private string DebuggerToString() - { - using (var writer = new StringWriter()) - { - WriteTo(writer, HtmlEncoder.Default); - return writer.ToString(); - } - } - } - [DebuggerDisplay("{DebuggerToString()}")] private class HtmlFormatString : IHtmlContent { diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs new file mode 100644 index 0000000000..ccf417054e --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// An impelementation that wraps an HTML encoded . + /// + [DebuggerDisplay("{DebuggerToString()}")] + public class HtmlEncodedString : IHtmlContent + { + /// + /// An instance for . + /// + public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); + + private readonly string _value; + + /// + /// Creates a new . + /// + /// The HTML encoded value. + public HtmlEncodedString(string value) + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + _value = value; + } + + /// + public void WriteTo(TextWriter writer, HtmlEncoder encoder) + { + writer.Write(_value); + } + + private string DebuggerToString() + { + return _value; + } + } +} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs new file mode 100644 index 0000000000..143d97f206 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// A which supports special processing of . + /// + public abstract class HtmlTextWriter : TextWriter + { + /// + /// Writes an value. + /// + /// The value. + public abstract void Write(IHtmlContent value); + + /// + public override void Write(object value) + { + var htmlContent = value as IHtmlContent; + if (htmlContent == null) + { + base.Write(value); + } + else + { + Write(htmlContent); + } + } + + /// + public override void WriteLine(object value) + { + var htmlContent = value as IHtmlContent; + if (htmlContent == null) + { + base.Write(value); + } + else + { + Write(htmlContent); + } + + base.WriteLine(); + } + } +} diff --git a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs index b2437d9ad6..d310306c25 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs @@ -3,6 +3,8 @@ using System.Reflection; using System.Resources; +using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Html.Abstractions.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index cc263ffbe0..c654bcde77 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -21,6 +21,7 @@ }, "dotnet5.4": { "dependencies": { + "System.Collections": "4.0.11-*", "System.Resources.ResourceManager": "4.0.1-*" } } diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj deleted file mode 100644 index 6d93971523..0000000000 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - b1b2b906-24ae-4c57-aac5-19b734014504 - Microsoft.Extensions.BufferedHtmlContent.Sources - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs deleted file mode 100644 index b2437d9ad6..0000000000 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json deleted file mode 100644 index 273702a80e..0000000000 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "1.0.0-*", - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "shared": "*.cs", - "dependencies": {}, - "frameworks": { - "net451": {}, - "dotnet5.4": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-*", - "System.Runtime": "4.0.21-*" - } - } - } -} diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs similarity index 90% rename from test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs rename to test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs index f65cb4eaaf..4c2c3177cb 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs @@ -9,13 +9,13 @@ using Xunit; namespace Microsoft.Extensions.Internal { - public class BufferedHtmlContentTest + public class HtmlContentBuilderTest { [Fact] public void AppendString_AppendsAString() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); // Act content.Append("Hello"); @@ -29,7 +29,7 @@ namespace Microsoft.Extensions.Internal public void AppendString_WrittenAsEncoded() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); content.Append("Hello"); var writer = new StringWriter(); @@ -45,7 +45,7 @@ namespace Microsoft.Extensions.Internal public void AppendHtml_DoesNotGetWrittenAsEncoded() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); content.AppendHtml("Hello"); var writer = new StringWriter(); @@ -61,7 +61,7 @@ namespace Microsoft.Extensions.Internal public void AppendIHtmlContent_AppendsAsIs() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); var writer = new StringWriter(); // Act @@ -78,7 +78,7 @@ namespace Microsoft.Extensions.Internal public void CanAppendMultipleItems() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); // Act content.Append(new TestHtmlContent("hello")); @@ -94,7 +94,7 @@ namespace Microsoft.Extensions.Internal public void Clear_DeletesAllItems() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); content.Append(new TestHtmlContent("hello")); content.Append("Test"); @@ -109,7 +109,7 @@ namespace Microsoft.Extensions.Internal public void WriteTo_WritesAllItems() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); var writer = new StringWriter(); content.Append(new TestHtmlContent("Hello")); content.Append("Test"); diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 06a8d06a2c..b8e9656f15 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -1,4 +1,8 @@ { + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj deleted file mode 100644 index f0c4c7f35a..0000000000 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 3e5311e2-a73e-40cc-a58c-5a62cead43ae - Microsoft.Extensions.BufferedHtmlContent.Test - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json deleted file mode 100644 index 8ed950043b..0000000000 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.Extensions.BufferedHtmlContent.Sources": { - "type": "build", - "version": "1.0.0-*" - }, - "Microsoft.Extensions.WebEncoders.Tests" : "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - } -} From d25c25c4b258a8a60f21ea70db5dc566164924e0 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 16 Nov 2015 08:55:10 -0800 Subject: [PATCH 443/846] Remove old package from nuget verifier --- NuGetPackageVerifier.json | 1 - 1 file changed, 1 deletion(-) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index d39dab5e26..f2111a1802 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -16,7 +16,6 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, - "Microsoft.Extensions.BufferedHtmlContent.Sources": { }, "Microsoft.Extensions.WebEncoders": { }, "Microsoft.Net.Http.Headers": { } } From d4d04d2c96d9050742e45ebb7006cd0ea4af3dcc Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 13 Nov 2015 17:32:48 -0800 Subject: [PATCH 444/846] Adding exception message for paths not starting with / #251 --- src/Microsoft.AspNet.Http.Abstractions/PathString.cs | 3 ++- .../Properties/Resources.Designer.cs | 8 ++++++++ src/Microsoft.AspNet.Http.Abstractions/Resources.resx | 3 +++ .../PathStringTests.cs | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index ef6e1bb39e..78c01cdcc1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,6 +3,7 @@ using System; using System.Text.Encodings.Web; +using Microsoft.AspNet.Http.Abstractions; namespace Microsoft.AspNet.Http { @@ -29,7 +30,7 @@ namespace Microsoft.AspNet.Http { if (!string.IsNullOrEmpty(value) && value[0] != '/') { - throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, nameof(value)); + throw new ArgumentException(Resources.FormatException_PathMustStartWithSlash(nameof(value)), nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs index 9fb86a30c6..82505c66e0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs @@ -10,6 +10,14 @@ namespace Microsoft.AspNet.Http.Abstractions private static readonly ResourceManager _resourceManager = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); + /// + /// '{0}' is not available. + /// + internal static string FormatException_PathMustStartWithSlash(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); + } + /// /// '{0}' is not available. /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx index bdd74fd6de..1c947c352b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx @@ -132,4 +132,7 @@ Multiple public '{0}' methods are available. + + The path in '{0}' must start with '/'. + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs index 48d403a9ee..3eb5673d60 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http public void CtorThrows_IfPathDoesNotHaveLeadingSlash() { // Act and Assert - ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", ""); + ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", "The path in 'value' must start with '/'."); } [Theory] From cb3e9b1218c8c946764e3b029944e522c4c4c661 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 16 Nov 2015 10:51:30 -0800 Subject: [PATCH 445/846] Change List to IList --- .../HtmlContentBuilder.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs index 0f6fbabc4c..198cd0fb38 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// The list of entries. The will use this list without making a copy. /// - public HtmlContentBuilder(List entries) + public HtmlContentBuilder(IList entries) { if (entries == null) { @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.Html.Abstractions // a wrapper when encoded strings are used. // // internal for testing. - internal List Entries { get; } + internal IList Entries { get; } /// public IHtmlContentBuilder Append(string unencoded) @@ -109,8 +109,10 @@ namespace Microsoft.AspNet.Html.Abstractions throw new ArgumentNullException(nameof(encoder)); } - foreach (var entry in Entries) + for (var i = 0; i < Entries.Count; i++) { + var entry = Entries[i]; + var entryAsString = entry as string; if (entryAsString != null) { From 690e5a66e54acb76da3ca347dfa6cfcf209063ba Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 13 Nov 2015 10:55:16 -0800 Subject: [PATCH 446/846] Set default path=/ when removing cookie --- src/Microsoft.AspNet.Http/ResponseCookies.cs | 31 +------------ .../ResponseCookiesTest.cs | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index cd6b9c6ee9..185540eb50 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -80,36 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; - Func predicate = (value, encKeyPlusEquals) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - - StringValues deleteCookies = $"{encodedKeyPlusEquals}; expires=Thu, 01-Jan-1970 00:00:00 GMT"; - var existingValues = Headers[HeaderNames.SetCookie]; - if (StringValues.IsNullOrEmpty(existingValues)) - { - Headers[HeaderNames.SetCookie] = deleteCookies; - } - else - { - var values = existingValues.ToArray(); - var newValues = new List(); - - for (var i = 0; i < values.Length; i++) - { - if (!predicate(values[i], encodedKeyPlusEquals)) - { - newValues.Add(values[i]); - } - } - - values = deleteCookies.ToArray(); - for (var i = 0; i < values.Length; i++) - { - newValues.Add(values[i]); - } - - Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); - } + Delete(key, new CookieOptions() { Path = "/" }); } /// diff --git a/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs new file mode 100644 index 0000000000..e22d4f338a --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; +using Microsoft.Net.Http.Headers; +using Microsoft.AspNet.Http.Internal; + +namespace Microsoft.AspNet.Http.Tests +{ + public class ResponseCookiesTest + { + [Fact] + public void DeleteCookieShouldSetDefaultPath() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers); + var testcookie = "TestCookie"; + + cookies.Delete(testcookie); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(testcookie, cookieHeaderValues[0]); + Assert.Contains("path=/", cookieHeaderValues[0]); + Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); + } + + [Fact] + public void NoParamsDeleteRemovesCookieCreatedByAdd() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers); + var testcookie = "TestCookie"; + + cookies.Append(testcookie, testcookie); + cookies.Delete(testcookie); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(testcookie, cookieHeaderValues[0]); + Assert.Contains("path=/", cookieHeaderValues[0]); + Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); + } + + } +} From 9e5ba94804da75816aba9f9a019882474207d8ff Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 17 Nov 2015 11:00:20 -0800 Subject: [PATCH 447/846] Explicitly choose Mono 4.0.5 - avoids future problems related to aspnet/External#48 - e.g. when Travis updates default Mono version in `csharp` bundle --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 947bf868ee..dc44c0f660 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: csharp sudo: false +mono: + - 4.0.5 script: - ./build.sh --quiet verify \ No newline at end of file From fbec068f5c4ca438842dc72508c525b2a8e74830 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 9 Nov 2015 10:07:35 -0800 Subject: [PATCH 448/846] Adding option to configure services when exposing the ASP.NET 5 pipeline via OWIN #398 --- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 21 +++-- .../OwinExtensionTests.cs | 87 +++++++++++++++++++ .../OwinFeatureCollectionTests.cs | 1 - test/Microsoft.AspNet.Owin.Tests/project.json | 1 + 4 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 3f31ce5923..3f6882653f 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -66,22 +66,27 @@ namespace Microsoft.AspNet.Builder } public static IApplicationBuilder UseBuilder(this AddMiddleware app) + { + return app.UseBuilder(serviceProvider: null); + } + + public static IApplicationBuilder UseBuilder(this AddMiddleware app, IServiceProvider serviceProvider) { // Adapt WebSockets by default. app(OwinWebSocketAcceptAdapter.AdaptWebSockets); - var builder = new ApplicationBuilder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: serviceProvider); - CreateMiddleware middleware = CreateMiddlewareFactory(exit => + var middleware = CreateMiddlewareFactory(exit => { builder.Use(ignored => exit); return builder.Build(); - }); + }, builder.ApplicationServices); app(middleware); return builder; } - private static CreateMiddleware CreateMiddlewareFactory(Func middleware) + private static CreateMiddleware CreateMiddlewareFactory(Func middleware, IServiceProvider applicationServices) { return next => { @@ -105,6 +110,7 @@ namespace Microsoft.AspNet.Builder context = new DefaultHttpContext( new FeatureCollection( new OwinFeatureCollection(env))); + context.ApplicationServices = applicationServices; } return app.Invoke(context); @@ -114,7 +120,12 @@ namespace Microsoft.AspNet.Builder public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) { - var builder = app.UseBuilder(); + return app.UseBuilder(pipeline, serviceProvider: null); + } + + public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline, IServiceProvider serviceProvider) + { + var builder = app.UseBuilder(serviceProvider); pipeline(builder); return app; } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs new file mode 100644 index 0000000000..d7d0a398d1 --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs @@ -0,0 +1,87 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + using CreateMiddleware = Func< + Func, Task>, + Func, Task> + >; + using AddMiddleware = Action, Task>, + Func, Task> + >>; + + public class OwinExtensionTests + { + static AppFunc notFound = env => new Task(() => { env["owin.ResponseStatusCode"] = 404; }); + + [Fact] + public void OwinConfigureServiceProviderAddsServices() + { + var list = new List(); + AddMiddleware build = list.Add; + IServiceProvider serviceProvider = null; + FakeService fakeService = null; + + var builder = build.UseBuilder(applicationBuilder => + { + serviceProvider = applicationBuilder.ApplicationServices; + applicationBuilder.Run(async context => + { + fakeService = context.ApplicationServices.GetService(); + }); + }, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider()); + + list.Reverse(); + list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary()); + + Assert.NotNull(fakeService); + Assert.NotNull(serviceProvider.GetService()); + } + + [Fact] + public void OwinDefaultNoServices() + { + var list = new List(); + AddMiddleware build = list.Add; + IServiceProvider serviceProvider = null; + FakeService fakeService = null; + bool builderExecuted = false; + bool applicationExecuted = false; + + var builder = build.UseBuilder(applicationBuilder => + { + builderExecuted = true; + serviceProvider = applicationBuilder.ApplicationServices; + applicationBuilder.Run(async context => + { + applicationExecuted = true; + fakeService = context.ApplicationServices.GetService(); + }); + }); + + list.Reverse(); + list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary()); + + Assert.True(builderExecuted); + Assert.Null(fakeService); + Assert.True(applicationExecuted); + Assert.Null(serviceProvider); + } + + private class FakeService + { + + } + } +} diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index b4958629f7..b945af4734 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using System.Linq; using Microsoft.AspNet.Http.Features; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 05c31c8a00..9fc7f68ba0 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -2,6 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From 4efc40d8b1d328952635f18b873509627cdb7e19 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 17 Nov 2015 12:46:36 -0800 Subject: [PATCH 449/846] Move Travis to supported Linux distribution - use Ubuntu 14.04 (Trusty) - Travis support for Trusty is in Beta and currently requires `sudo` - run `dnu restore` with DNX Core since aspnet/External#49 is not fixed in Mono versions we can use - add required dependencies for DNX Core to `.travis.yml` - addresses part of aspnet/Universe#290 --- .travis.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc44c0f660..2fc624899f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,18 @@ language: csharp -sudo: false +sudo: required +dist: trusty +addons: + apt: + packages: + - gettext + - libcurl4-openssl-dev + - libicu-dev + - libssl-dev + - libunwind8 + - zlib1g +env: + - KOREBUILD_DNU_RESTORE_CORECLR=true mono: - 4.0.5 script: - - ./build.sh --quiet verify \ No newline at end of file + - ./build.sh --quiet verify From 681533e06c5737293747322a48da8c55603031e8 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 11 Nov 2015 11:29:32 -0800 Subject: [PATCH 450/846] Set IHttpContextAccessor only if DI provides it --- src/Microsoft.AspNet.Http/HttpContextFactory.cs | 14 ++++++++++++-- .../HttpContextFactoryTests.cs | 11 +++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNet.Http/HttpContextFactory.cs index 9c98fd1594..0f6546cd36 100644 --- a/src/Microsoft.AspNet.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Http/HttpContextFactory.cs @@ -9,6 +9,10 @@ namespace Microsoft.AspNet.Http.Internal { private IHttpContextAccessor _httpContextAccessor; + public HttpContextFactory() : this(httpContextAccessor: null) + { + } + public HttpContextFactory(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; @@ -17,13 +21,19 @@ namespace Microsoft.AspNet.Http.Internal public HttpContext Create(IFeatureCollection featureCollection) { var httpContext = new DefaultHttpContext(featureCollection); - _httpContextAccessor.HttpContext = httpContext; + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = httpContext; + } return httpContext; } public void Dispose(HttpContext httpContext) { - _httpContextAccessor.HttpContext = null; + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = null; + } } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs index 1fcdcab423..b0d800de38 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs @@ -21,5 +21,16 @@ namespace Microsoft.AspNet.Http.Internal // Assert Assert.True(ReferenceEquals(context, accessor.HttpContext)); } + + [Fact] + public void AllowsCreatingContextWithoutSettingAccessor() + { + // Arrange + var contextFactory = new HttpContextFactory(); + + // Act & Assert + var context = contextFactory.Create(new FeatureCollection()); + contextFactory.Dispose(context); + } } } \ No newline at end of file From 78e90d7f0424361749520f3f60dd643c8733f9d9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 17 Nov 2015 18:59:46 -0800 Subject: [PATCH 451/846] Update ifdefs from DNXCORE50 to DOTNET5_4 Fixes #467 --- src/Microsoft.AspNet.Http/FormCollection.cs | 3 ++- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 2 +- src/Microsoft.AspNet.Http/QueryCollection.cs | 2 +- src/Microsoft.AspNet.Http/RequestCookieCollection.cs | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index fbc3b88a38..b8e13fb315 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; @@ -13,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal public class FormCollection : IFormCollection { public static readonly FormCollection Empty = new FormCollection(); -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 530c5f31e0..181c938ca1 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Internal /// public class HeaderDictionary : IHeaderDictionary { -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNet.Http/QueryCollection.cs b/src/Microsoft.AspNet.Http/QueryCollection.cs index 2b9168d500..6ea9c379ac 100644 --- a/src/Microsoft.AspNet.Http/QueryCollection.cs +++ b/src/Microsoft.AspNet.Http/QueryCollection.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal public class QueryCollection : IQueryCollection { public static readonly QueryCollection Empty = new QueryCollection(); -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs index 8b2a44239c..9751eee486 100644 --- a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Http.Internal public class RequestCookieCollection : IRequestCookieCollection { public static readonly RequestCookieCollection Empty = new RequestCookieCollection(); -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); #else private static readonly string[] EmptyKeys = new string[0]; From 67aa2546a87f0617005e6f5571ed7fed8ab2f088 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 19 Nov 2015 09:34:38 -0800 Subject: [PATCH 452/846] Removing ApplicationServices from HttpContext #466 --- .../Extensions/UseMiddlewareExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs | 5 ----- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 6 ------ .../Features/IServiceProvidersFeature.cs | 1 - .../Features/ServiceProvidersFeature.cs | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 4 ++-- test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs | 4 ++-- 7 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index fe13dab8c8..42dbc1cc5a 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Builder return context => { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + var serviceProvider = context.RequestServices ?? applicationServices; if (serviceProvider == null) { throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 162f3c582d..f639a4dd9d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -55,11 +55,6 @@ namespace Microsoft.AspNet.Http /// public abstract IDictionary Items { get; set; } - /// - /// Gets or sets the that provides access to the application's service container. - /// - public abstract IServiceProvider ApplicationServices { get; set; } - /// /// Gets or sets the that provides access to the request's service container. /// diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 0c95f04dc4..f4c60fb951 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -176,12 +176,6 @@ namespace Microsoft.AspNet.Http.Internal set { ItemsFeature.Items = value; } } - public override IServiceProvider ApplicationServices - { - get { return ServiceProvidersFeature.ApplicationServices; } - set { ServiceProvidersFeature.ApplicationServices = value; } - } - public override IServiceProvider RequestServices { get { return ServiceProvidersFeature.RequestServices; } diff --git a/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs index b5d192c503..30b9b63b96 100644 --- a/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs @@ -7,7 +7,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IServiceProvidersFeature { - IServiceProvider ApplicationServices { get; set; } IServiceProvider RequestServices { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs index d9082df7a2..194c3b3f36 100644 --- a/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs @@ -7,7 +7,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class ServiceProvidersFeature : IServiceProvidersFeature { - public IServiceProvider ApplicationServices { get; set; } public IServiceProvider RequestServices { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 3f6882653f..5ae81a6260 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Builder return builder; } - private static CreateMiddleware CreateMiddlewareFactory(Func middleware, IServiceProvider applicationServices) + private static CreateMiddleware CreateMiddlewareFactory(Func middleware, IServiceProvider services) { return next => { @@ -110,7 +110,7 @@ namespace Microsoft.AspNet.Builder context = new DefaultHttpContext( new FeatureCollection( new OwinFeatureCollection(env))); - context.ApplicationServices = applicationServices; + context.RequestServices = services; } return app.Invoke(context); diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs index d7d0a398d1..8d719f66c0 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Owin serviceProvider = applicationBuilder.ApplicationServices; applicationBuilder.Run(async context => { - fakeService = context.ApplicationServices.GetService(); + fakeService = context.RequestServices.GetService(); }); }, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider()); @@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Owin applicationBuilder.Run(async context => { applicationExecuted = true; - fakeService = context.ApplicationServices.GetService(); + fakeService = context.RequestServices.GetService(); }); }); From a0a1c38e4425df163f1f92b64f4e186d40b7dc7b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 1 Dec 2015 15:40:47 -0800 Subject: [PATCH 453/846] Moving Microsoft.AspNet.Html.Abstractions to a HtmlAbstractions repo Fixes #418 --- HttpAbstractions.sln | 30 -- NuGetPackageVerifier.json | 1 - .../HtmlContentBuilder.cs | 138 ------ .../HtmlContentBuilderExtensions.cs | 324 ------------- .../HtmlEncodedString.cs | 49 -- .../HtmlTextWriter.cs | 49 -- .../IHtmlContent.cs | 22 - .../IHtmlContentBuilder.cs | 40 -- .../Microsoft.AspNet.Html.Abstractions.xproj | 19 - .../Properties/AssemblyInfo.cs | 10 - .../project.json | 29 -- .../HtmlContentBuilderExtensionsTest.cs | 436 ------------------ .../HtmlContentBuilderTest.cs | 145 ------ ...rosoft.AspNet.Html.Abstractions.Test.xproj | 21 - .../project.json | 19 - 15 files changed, 1332 deletions(-) delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/project.json delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index b2884f66ab..9e07d734d8 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -38,14 +38,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEnc EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -224,18 +220,6 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.ActiveCfg = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.Build.0 = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.Build.0 = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.ActiveCfg = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -248,18 +232,6 @@ Global {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.ActiveCfg = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.Build.0 = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.Build.0 = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -281,8 +253,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} - {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index f2111a1802..406f44c6a3 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -9,7 +9,6 @@ "StrictSemanticVersionValidationRule" ], "packages": { - "Microsoft.AspNet.Html.Abstractions": { }, "Microsoft.AspNet.Http": { }, "Microsoft.AspNet.Http.Abstractions": { }, "Microsoft.AspNet.Http.Extensions": { }, diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs deleted file mode 100644 index 198cd0fb38..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// An implementation using an in memory list. - /// - public class HtmlContentBuilder : IHtmlContentBuilder - { - /// - /// Creates a new . - /// - public HtmlContentBuilder() - : this(new List()) - { - } - - /// - /// Creates a new with the given initial capacity. - /// - /// The initial capacity of the backing store. - public HtmlContentBuilder(int capacity) - : this(new List(capacity)) - { - } - - /// - /// Creates a new with the given list of entries. - /// - /// - /// The list of entries. The will use this list without making a copy. - /// - public HtmlContentBuilder(IList entries) - { - if (entries == null) - { - throw new ArgumentNullException(nameof(entries)); - } - - Entries = entries; - } - - // This is not List because that would lead to wrapping all strings to IHtmlContent - // which is not space performant. - // - // In general unencoded strings are added here. We're optimizing for that case, and allocating - // a wrapper when encoded strings are used. - // - // internal for testing. - internal IList Entries { get; } - - /// - public IHtmlContentBuilder Append(string unencoded) - { - if (!string.IsNullOrEmpty(unencoded)) - { - Entries.Add(unencoded); - } - - return this; - } - - /// - public IHtmlContentBuilder Append(IHtmlContent htmlContent) - { - if (htmlContent == null) - { - return this; - } - - Entries.Add(htmlContent); - return this; - } - - /// - public IHtmlContentBuilder AppendHtml(string encoded) - { - if (!string.IsNullOrEmpty(encoded)) - { - Entries.Add(new HtmlEncodedString(encoded)); - } - - return this; - } - - /// - public IHtmlContentBuilder Clear() - { - Entries.Clear(); - return this; - } - - /// - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - if (writer == null) - { - throw new ArgumentNullException(nameof(writer)); - } - - if (encoder == null) - { - throw new ArgumentNullException(nameof(encoder)); - } - - for (var i = 0; i < Entries.Count; i++) - { - var entry = Entries[i]; - - var entryAsString = entry as string; - if (entryAsString != null) - { - encoder.Encode(writer, entryAsString); - } - else - { - // Only string, IHtmlContent values can be added to the buffer. - ((IHtmlContent)entry).WriteTo(writer, encoder); - } - } - } - - private string DebuggerToString() - { - using (var writer = new StringWriter()) - { - WriteTo(writer, HtmlEncoder.Default); - return writer.ToString(); - } - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs deleted file mode 100644 index 63c311c6e0..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// Extension methods for . - /// - public static class HtmlContentBuilderExtensions - { - /// - /// Appends the specified to the existing content after replacing each format - /// item with the HTML encoded representation of the corresponding item in the - /// array. - /// - /// The . - /// - /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). - /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. - /// - /// - /// The object array to format. Each element in the array will be formatted and then HTML encoded. - /// - /// A reference to this instance after the append operation has completed. - public static IHtmlContentBuilder AppendFormat( - this IHtmlContentBuilder builder, - string format, - params object[] args) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - if (format == null) - { - throw new ArgumentNullException(nameof(format)); - } - - if (args == null) - { - throw new ArgumentNullException(nameof(args)); - } - - builder.Append(new HtmlFormatString(format, args)); - return builder; - } - - /// - /// Appends the specified to the existing content with information from the - /// after replacing each format item with the HTML encoded - /// representation of the corresponding item in the array. - /// - /// The . - /// An object that supplies culture-specific formatting information. - /// - /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). - /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. - /// - /// - /// The object array to format. Each element in the array will be formatted and then HTML encoded. - /// - /// A reference to this instance after the append operation has completed. - public static IHtmlContentBuilder AppendFormat( - this IHtmlContentBuilder builder, - IFormatProvider formatProvider, - string format, - params object[] args) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - if (format == null) - { - throw new ArgumentNullException(nameof(format)); - } - - if (args == null) - { - throw new ArgumentNullException(nameof(args)); - } - - builder.Append(new HtmlFormatString(formatProvider, format, args)); - return builder; - } - - /// - /// Appends an . - /// - /// The . - /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder) - { - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Appends an after appending the value. - /// The value is treated as unencoded as-provided, and will be HTML encoded before writing to output. - /// - /// The . - /// The to append. - /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, string unencoded) - { - builder.Append(unencoded); - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Appends an after appending the value. - /// - /// The . - /// The to append. - /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent content) - { - builder.Append(content); - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Appends an after appending the value. - /// The value is treated as HTML encoded as-provided, and no further encoding will be performed. - /// - /// The . - /// The HTML encoded to append. - /// The . - public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) - { - builder.AppendHtml(encoded); - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Sets the content to the value. The value is treated as unencoded as-provided, - /// and will be HTML encoded before writing to output. - /// - /// The . - /// The value that replaces the content. - /// The . - public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, string unencoded) - { - builder.Clear(); - builder.Append(unencoded); - return builder; - } - - /// - /// Sets the content to the value. - /// - /// The . - /// The value that replaces the content. - /// The . - public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, IHtmlContent content) - { - builder.Clear(); - builder.Append(content); - return builder; - } - - /// - /// Sets the content to the value. The value is treated as HTML encoded as-provided, and - /// no further encoding will be performed. - /// - /// The . - /// The HTML encoded that replaces the content. - /// The . - public static IHtmlContentBuilder SetHtmlContent(this IHtmlContentBuilder builder, string encoded) - { - builder.Clear(); - builder.AppendHtml(encoded); - return builder; - } - - [DebuggerDisplay("{DebuggerToString()}")] - private class HtmlFormatString : IHtmlContent - { - private readonly IFormatProvider _formatProvider; - private readonly string _format; - private readonly object[] _args; - - public HtmlFormatString(string format, object[] args) - : this(null, format, args) - { - } - - public HtmlFormatString(IFormatProvider formatProvider, string format, object[] args) - { - Debug.Assert(format != null); - Debug.Assert(args != null); - - _formatProvider = formatProvider ?? CultureInfo.CurrentCulture; - _format = format; - _args = args; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - if (writer == null) - { - throw new ArgumentNullException(nameof(writer)); - } - - if (encoder == null) - { - throw new ArgumentNullException(nameof(encoder)); - } - - var formatProvider = new EncodingFormatProvider(_formatProvider, encoder); - writer.Write(string.Format(formatProvider, _format, _args)); - } - - private string DebuggerToString() - { - using (var writer = new StringWriter()) - { - WriteTo(writer, HtmlEncoder.Default); - return writer.ToString(); - } - } - } - - // This class implements Html encoding via an ICustomFormatter. Passing an instance of this - // class into a string.Format method or anything similar will evaluate arguments implementing - // IHtmlContent without HTML encoding them, and will give other arguments the standard - // composite format string treatment, and then HTML encode the result. - // - // Plenty of examples of ICustomFormatter and the interactions with string.Format here: - // https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format6_Example - private class EncodingFormatProvider : IFormatProvider, ICustomFormatter - { - private readonly HtmlEncoder _encoder; - private readonly IFormatProvider _formatProvider; - - public EncodingFormatProvider(IFormatProvider formatProvider, HtmlEncoder encoder) - { - Debug.Assert(formatProvider != null); - Debug.Assert(encoder != null); - - _formatProvider = formatProvider; - _encoder = encoder; - } - - public string Format(string format, object arg, IFormatProvider formatProvider) - { - // This is the case we need to special case. We trust the IHtmlContent instance to do the - // right thing with encoding. - var htmlContent = arg as IHtmlContent; - if (htmlContent != null) - { - using (var writer = new StringWriter()) - { - htmlContent.WriteTo(writer, _encoder); - return writer.ToString(); - } - } - - // If we get here then 'arg' is not an IHtmlContent, and we want to handle it the way a normal - // string.Format would work, but then HTML encode the result. - // - // First check for an ICustomFormatter - if the IFormatProvider is a CultureInfo, then it's likely - // that ICustomFormatter will be null. - var customFormatter = (ICustomFormatter)_formatProvider.GetFormat(typeof(ICustomFormatter)); - if (customFormatter != null) - { - var result = customFormatter.Format(format, arg, _formatProvider); - if (result != null) - { - return _encoder.Encode(result); - } - } - - // Next check if 'arg' is an IFormattable (DateTime is an example). - // - // An IFormattable will likely call back into the IFormatterProvider and ask for more information - // about how to format itself. This is the typical case when IFormatterProvider is a CultureInfo. - var formattable = arg as IFormattable; - if (formattable != null) - { - var result = formattable.ToString(format, _formatProvider); - if (result != null) - { - return _encoder.Encode(result); - } - } - - // If we get here then there's nothing really smart left to try. - if (arg != null) - { - var result = arg.ToString(); - if (result != null) - { - return _encoder.Encode(result); - } - } - - return string.Empty; - } - - public object GetFormat(Type formatType) - { - if (formatType == typeof(ICustomFormatter)) - { - return this; - } - - return null; - } - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs deleted file mode 100644 index ccf417054e..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// An impelementation that wraps an HTML encoded . - /// - [DebuggerDisplay("{DebuggerToString()}")] - public class HtmlEncodedString : IHtmlContent - { - /// - /// An instance for . - /// - public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); - - private readonly string _value; - - /// - /// Creates a new . - /// - /// The HTML encoded value. - public HtmlEncodedString(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _value = value; - } - - /// - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(_value); - } - - private string DebuggerToString() - { - return _value; - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs deleted file mode 100644 index 143d97f206..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// A which supports special processing of . - /// - public abstract class HtmlTextWriter : TextWriter - { - /// - /// Writes an value. - /// - /// The value. - public abstract void Write(IHtmlContent value); - - /// - public override void Write(object value) - { - var htmlContent = value as IHtmlContent; - if (htmlContent == null) - { - base.Write(value); - } - else - { - Write(htmlContent); - } - } - - /// - public override void WriteLine(object value) - { - var htmlContent = value as IHtmlContent; - if (htmlContent == null) - { - base.Write(value); - } - else - { - Write(htmlContent); - } - - base.WriteLine(); - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs deleted file mode 100644 index d9b7099710..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// HTML content which can be written to a TextWriter. - /// - public interface IHtmlContent - { - /// - /// Writes the content by encoding it with the specified - /// to the specified . - /// - /// The to which the content is written. - /// The which encodes the content to be written. - void WriteTo(TextWriter writer, HtmlEncoder encoder); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs deleted file mode 100644 index e55cec3530..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// A builder for HTML content. - /// - public interface IHtmlContentBuilder : IHtmlContent - { - /// - /// Appends an instance. - /// - /// The to append. - /// The . - IHtmlContentBuilder Append(IHtmlContent content); - - /// - /// Appends a value. The value is treated as unencoded as-provided, and will be HTML - /// encoded before writing to output. - /// - /// The to append. - /// The . - IHtmlContentBuilder Append(string unencoded); - - /// - /// Appends an HTML encoded value. The value is treated as HTML encoded as-provided, and - /// no further encoding will be performed. - /// - /// The HTML encoded to append. - /// The . - IHtmlContentBuilder AppendHtml(string encoded); - - /// - /// Clears the content. - /// - /// The . - IHtmlContentBuilder Clear(); - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj b/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj deleted file mode 100644 index 564c800504..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 68a28e4a-3ade-4187-9625-4ff185887cb3 - Microsoft.AspNet.Html.Abstractions - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs deleted file mode 100644 index d310306c25..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Html.Abstractions.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json deleted file mode 100644 index c654bcde77..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTML content interface.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "System.Text.Encodings.Web": "4.0.0-*" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.IO": "", - "System.Runtime": "" - } - }, - "dotnet5.4": { - "dependencies": { - "System.Collections": "4.0.11-*", - "System.Resources.ResourceManager": "4.0.1-*" - } - } - } -} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs deleted file mode 100644 index 1641f92caf..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ /dev/null @@ -1,436 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text.Encodings.Web; -using Microsoft.AspNet.Testing; -using Microsoft.Extensions.WebEncoders.Testing; -using Xunit; - -namespace Microsoft.AspNet.Html.Abstractions.Test -{ - public class HtmlContentBuilderExtensionsTest - { - [Fact] - public void Builder_AppendLine_Empty() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendLine(); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_AppendLine_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendLine("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value), - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_AppendLine_IHtmlContent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - var content = new OtherHtmlContent("Hi"); - - // Act - builder.AppendLine(content); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Same(content, entry), - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_AppendHtmlLine_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendHtmlLine("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value), - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_SetContent_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - builder.Append("Existing Content. Will be Cleared."); - - // Act - builder.SetContent("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); - } - - [Fact] - public void Builder_SetContent_IHtmlContent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - builder.Append("Existing Content. Will be Cleared."); - - var content = new OtherHtmlContent("Hi"); - - // Act - builder.SetContent(content); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Same(content, entry)); - } - - [Fact] - public void Builder_SetHtmlContent_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - builder.Append("Existing Content. Will be Cleared."); - - // Act - builder.SetHtmlContent("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); - } - - [Fact] - public void Builder_AppendFormat() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth"); - - // Assert - Assert.Equal( - "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_HtmlContent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("{0}!", new EncodedString("First")); - - // Assert - Assert.Equal( - "First!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormatContent_With1Argument() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X} - hex equivalent for 50.", 50); - - // Assert - Assert.Equal( - "0xHtmlEncode[[32]] - hex equivalent for 50.", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormatContent_With2Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X} - hex equivalent for {1}.", 50, 50); - - // Assert - Assert.Equal( - "0xHtmlEncode[[32]] - hex equivalent for HtmlEncode[[50]].", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormatContent_With3Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50); - - // Assert - Assert.Equal( - "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithAlignmentComponent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("{0, -25} World!", "Hello"); - - // Assert - Assert.Equal( - "HtmlEncode[[Hello]] World!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithFormatStringComponent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X}", 50); - - // Assert - Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!", - 1.1, - 2.98, - 145.82, - 32.86); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + - "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture_1Argument() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0:N}!", - 1.1); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture_2Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0:N} {1}!", - 1.1, - 2.98); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture_3Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0:N} {1} {2}!", - 1.1, - 2.98, - 3.12); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] HtmlEncode[[3.12]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithDifferentCulture() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - var culture = new CultureInfo("fr-FR"); - - // Act - builder.AppendFormat(culture, "{0} in french!", 1.21); - - // Assert - Assert.Equal( - "HtmlEncode[[1,21]] in french!", - HtmlContentToString(builder)); - } - - [Fact] - [ReplaceCulture("de-DE", "de-DE")] - public void Builder_AppendFormat_WithDifferentCurrentCulture() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat(CultureInfo.CurrentCulture, "{0:D}", DateTime.Parse("01/02/2015")); - - // Assert - Assert.Equal( - "HtmlEncode[[Sonntag, 1. Februar 2015]]", - HtmlContentToString(builder)); - } - - private static string HtmlContentToString(IHtmlContent content) - { - using (var writer = new StringWriter()) - { - content.WriteTo(writer, new HtmlTestEncoder()); - return writer.ToString(); - } - } - - private class TestHtmlContentBuilder : IHtmlContentBuilder - { - public List Entries { get; } = new List(); - - public IHtmlContentBuilder Append(string unencoded) - { - Entries.Add(new UnencodedString(unencoded)); - return this; - } - - public IHtmlContentBuilder Append(IHtmlContent content) - { - Entries.Add(content); - return this; - } - - public IHtmlContentBuilder AppendHtml(string encoded) - { - Entries.Add(new EncodedString(encoded)); - return this; - } - - public IHtmlContentBuilder Clear() - { - Entries.Clear(); - return this; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - foreach (var entry in Entries) - { - entry.WriteTo(writer, encoder); - } - } - } - - private class EncodedString : IHtmlContent - { - public EncodedString(string value) - { - Value = value; - } - - public string Value { get; } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(Value); - } - } - - private class UnencodedString : IHtmlContent - { - public UnencodedString(string value) - { - Value = value; - } - - public string Value { get; } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - encoder.Encode(writer, Value); - } - } - - private class OtherHtmlContent : IHtmlContent - { - public OtherHtmlContent(string value) - { - Value = value; - } - - public string Value { get; } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - throw new NotImplementedException(); - } - } - } -} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs deleted file mode 100644 index 4c2c3177cb..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; -using System.Text.Encodings.Web; -using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Extensions.WebEncoders.Testing; -using Xunit; - -namespace Microsoft.Extensions.Internal -{ - public class HtmlContentBuilderTest - { - [Fact] - public void AppendString_AppendsAString() - { - // Arrange - var content = new HtmlContentBuilder(); - - // Act - content.Append("Hello"); - - // Assert - var result = Assert.Single(content.Entries); - Assert.IsType(result); - } - - [Fact] - public void AppendString_WrittenAsEncoded() - { - // Arrange - var content = new HtmlContentBuilder(); - content.Append("Hello"); - - var writer = new StringWriter(); - - // Act - content.WriteTo(writer, new HtmlTestEncoder()); - - // Assert - Assert.Equal("HtmlEncode[[Hello]]", writer.ToString()); - } - - [Fact] - public void AppendHtml_DoesNotGetWrittenAsEncoded() - { - // Arrange - var content = new HtmlContentBuilder(); - content.AppendHtml("Hello"); - - var writer = new StringWriter(); - - // Act - content.WriteTo(writer, new HtmlTestEncoder()); - - // Assert - Assert.Equal("Hello", writer.ToString()); - } - - [Fact] - public void AppendIHtmlContent_AppendsAsIs() - { - // Arrange - var content = new HtmlContentBuilder(); - var writer = new StringWriter(); - - // Act - content.Append(new TestHtmlContent("Hello")); - - // Assert - var result = Assert.Single(content.Entries); - var testHtmlContent = Assert.IsType(result); - testHtmlContent.WriteTo(writer, new HtmlTestEncoder()); - Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString()); - } - - [Fact] - public void CanAppendMultipleItems() - { - // Arrange - var content = new HtmlContentBuilder(); - - // Act - content.Append(new TestHtmlContent("hello")); - content.Append("Test"); - - // Assert - Assert.Equal(2, content.Entries.Count); - Assert.Equal("Written from TestHtmlContent: hello", content.Entries[0].ToString()); - Assert.Equal("Test", content.Entries[1]); - } - - [Fact] - public void Clear_DeletesAllItems() - { - // Arrange - var content = new HtmlContentBuilder(); - content.Append(new TestHtmlContent("hello")); - content.Append("Test"); - - // Act - content.Clear(); - - // Assert - Assert.Equal(0, content.Entries.Count); - } - - [Fact] - public void WriteTo_WritesAllItems() - { - // Arrange - var content = new HtmlContentBuilder(); - var writer = new StringWriter(); - content.Append(new TestHtmlContent("Hello")); - content.Append("Test"); - - // Act - content.WriteTo(writer, new HtmlTestEncoder()); - - // Assert - Assert.Equal(2, content.Entries.Count); - Assert.Equal("Written from TestHtmlContent: HelloHtmlEncode[[Test]]", writer.ToString()); - } - - private class TestHtmlContent : IHtmlContent - { - private string _content; - - public TestHtmlContent(string content) - { - _content = content; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(ToString()); - } - - public override string ToString() - { - return "Written from TestHtmlContent: " + _content; - } - } - } -} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj b/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj deleted file mode 100644 index 4a03567677..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 2d187b88-94bd-4a39-ac97-f8f8b9363301 - Microsoft.AspNet.Html.Abstractions.Test - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json deleted file mode 100644 index b8e9656f15..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Extensions.WebEncoders": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - } -} From 5b175beea877cb6896e50db12060580bfe7e7940 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 2 Dec 2015 21:29:38 -0800 Subject: [PATCH 454/846] Change SendFileAsync to use a fallback implementation instead of throwing - If the user wants to use the SendFile API directly then they can access the feature explicitly. - Removed SupportsSendFile - Don't check for existence, let FileStream throw - Updated Doc comments - Pass the buffer into StreamCopyOperation - Using a real using instead of try finally. --- .../project.json | 1 + .../Properties/Resources.Designer.cs | 46 ------- .../Resources.resx | 123 ------------------ .../SendFileResponseExtensions.cs | 61 ++++++--- .../StreamCopyOperation.cs | 57 ++++++++ .../SendFileResponseExtensionsTests.cs | 15 +-- 6 files changed, 103 insertions(+), 200 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs delete mode 100644 src/Microsoft.AspNet.Http.Extensions/Resources.resx create mode 100644 src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 1316a95118..d76ed1ff90 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -36,6 +36,7 @@ "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", "System.Reflection.TypeExtensions": "4.0.1-*", + "System.IO": "4.0.11-*", "System.Runtime": "4.0.21-*", "System.Runtime.InteropServices": "4.0.21-*", "System.Security.Claims": "4.0.1-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs deleted file mode 100644 index a0d5a215a3..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs +++ /dev/null @@ -1,46 +0,0 @@ -// -namespace Microsoft.AspNet.Http.Extensions -{ - using System.Globalization; - using System.Reflection; - using System.Resources; - - internal static class Resources - { - private static readonly ResourceManager _resourceManager - = new ResourceManager("Microsoft.AspNet.Http.Extensions.Resources", typeof(Resources).GetTypeInfo().Assembly); - - /// - /// This server does not support the sendfile.SendAsync extension. - /// - internal static string Exception_SendFileNotSupported - { - get { return GetString("Exception_SendFileNotSupported"); } - } - - /// - /// This server does not support the sendfile.SendAsync extension. - /// - internal static string FormatException_SendFileNotSupported() - { - return GetString("Exception_SendFileNotSupported"); - } - - private static string GetString(string name, params string[] formatterNames) - { - var value = _resourceManager.GetString(name); - - System.Diagnostics.Debug.Assert(value != null); - - if (formatterNames != null) - { - for (var i = 0; i < formatterNames.Length; i++) - { - value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}"); - } - } - - return value; - } - } -} diff --git a/src/Microsoft.AspNet.Http.Extensions/Resources.resx b/src/Microsoft.AspNet.Http.Extensions/Resources.resx deleted file mode 100644 index 2059135d60..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/Resources.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - This server does not support the sendfile.SendAsync extension. - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 680c77e62c..7218adde73 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Extensions; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http @@ -14,26 +14,11 @@ namespace Microsoft.AspNet.Http /// public static class SendFileResponseExtensions { - /// - /// Checks if the SendFile extension is supported. - /// - /// - /// True if sendfile feature exists in the response. - public static bool SupportsSendFile(this HttpResponse response) - { - if (response == null) - { - throw new ArgumentNullException(nameof(response)); - } - - return response.HttpContext.Features.Get() != null; - } - /// /// Sends the given file using the SendFile extension. /// /// - /// + /// The full to the file. /// public static Task SendFileAsync(this HttpResponse response, string fileName) { @@ -54,7 +39,7 @@ namespace Microsoft.AspNet.Http /// Sends the given file using the SendFile extension. /// /// - /// The full or relative path to the file. + /// The full to the file. /// The offset in the file. /// The number of types to send, or null to send the remainder of the file. /// @@ -74,10 +59,48 @@ namespace Microsoft.AspNet.Http var sendFile = response.HttpContext.Features.Get(); if (sendFile == null) { - throw new NotSupportedException(Resources.Exception_SendFileNotSupported); + return SendFileAsync(response.Body, fileName, offset, count, cancellationToken); } return sendFile.SendFileAsync(fileName, offset, count, cancellationToken); } + + // Not safe for overlapped writes. + private static async Task SendFileAsync(Stream outputStream, string fileName, long offset, long? length, CancellationToken cancel) + { + cancel.ThrowIfCancellationRequested(); + + var fileInfo = new FileInfo(fileName); + if (offset < 0 || offset > fileInfo.Length) + { + throw new ArgumentOutOfRangeException(nameof(offset), offset, string.Empty); + } + + if (length.HasValue && + (length.Value < 0 || length.Value > fileInfo.Length - offset)) + { + throw new ArgumentOutOfRangeException(nameof(length), length, string.Empty); + } + + int bufferSize = 1024 * 16; + + var fileStream = new FileStream( + fileName, + FileMode.Open, + FileAccess.Read, + FileShare.ReadWrite, + bufferSize: bufferSize, + options: FileOptions.Asynchronous | FileOptions.SequentialScan); + + using (fileStream) + { + fileStream.Seek(offset, SeekOrigin.Begin); + + // TODO: Use buffer pool + var buffer = new byte[bufferSize]; + + await StreamCopyOperation.CopyToAsync(fileStream, buffer, outputStream, length, cancel); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs new file mode 100644 index 0000000000..f7e6734c9c --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs @@ -0,0 +1,57 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + // FYI: In most cases the source will be a FileStream and the destination will be to the network. + internal static class StreamCopyOperation + { + internal static async Task CopyToAsync(Stream source, byte[] buffer, Stream destination, long? length, CancellationToken cancel) + { + long? bytesRemaining = length; + Debug.Assert(source != null); + Debug.Assert(destination != null); + Debug.Assert(!bytesRemaining.HasValue || bytesRemaining.Value >= 0); + Debug.Assert(buffer != null); + + while (true) + { + // The natural end of the range. + if (bytesRemaining.HasValue && bytesRemaining.Value <= 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + int readLength = buffer.Length; + if (bytesRemaining.HasValue) + { + readLength = (int)Math.Min(bytesRemaining.Value, (long)readLength); + } + int count = await source.ReadAsync(buffer, 0, readLength, cancel); + + if (bytesRemaining.HasValue) + { + bytesRemaining -= count; + } + + // End of the source stream. + if (count == 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + await destination.WriteAsync(buffer, 0, count, cancel); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index cd16acb06d..53c8051774 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. See License.txt in the project root for license information. using System; +using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; @@ -12,20 +13,10 @@ namespace Microsoft.AspNet.Http.Extensions.Tests public class SendFileResponseExtensionsTests { [Fact] - public void SendFileSupport() - { - var context = new DefaultHttpContext(); - var response = context.Response; - Assert.False(response.SupportsSendFile()); - context.Features.Set(new FakeSendFileFeature()); - Assert.True(response.SupportsSendFile()); - } - - [Fact] - public Task SendFileWhenNotSupported() + public Task SendFileWhenFileNotFoundThrows() { var response = new DefaultHttpContext().Response; - return Assert.ThrowsAsync(() => response.SendFileAsync("foo")); + return Assert.ThrowsAsync(() => response.SendFileAsync("foo")); } [Fact] From 6055e25d19d1f7c21cccb6a5029915b06aa0569b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 2 Dec 2015 22:51:48 -0800 Subject: [PATCH 455/846] Fixed typo in doc comment --- .../SendFileResponseExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 7218adde73..bb236b7dd0 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Http /// Sends the given file using the SendFile extension. /// /// - /// The full to the file. + /// The full path to the file. /// public static Task SendFileAsync(this HttpResponse response, string fileName) { @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Http /// Sends the given file using the SendFile extension. /// /// - /// The full to the file. + /// The full path to the file. /// The offset in the file. /// The number of types to send, or null to send the remainder of the file. /// From 9887fe0dee49bd0b15aad907c235abe33c98ba6b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 2 Dec 2015 23:58:16 -0800 Subject: [PATCH 456/846] Move the header extensions to Http.Abstractions --- .../Extensions}/HeaderDictionaryExtensions.cs | 0 .../Internal/HeaderSegment.cs | 0 .../Internal/HeaderSegmentCollection.cs | 0 .../Internal/ParsingHelpers.cs | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions/Extensions}/HeaderDictionaryExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions}/Internal/HeaderSegment.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions}/Internal/HeaderSegmentCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions}/Internal/ParsingHelpers.cs (100%) diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs b/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs rename to src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs From c2e7618d9a7448493b96f5a301b3a7ccf1dc7fe7 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Fri, 4 Dec 2015 12:20:15 +0100 Subject: [PATCH 457/846] Added Name and FileName to IFormFile This commits also gets rid of the name closure in FormFileCollection by interating over the files in the collection instead of using Find and FindAll. Closes #352 and #499 --- .../IFormFile.cs | 4 +++ .../Features/FormFeature.cs | 5 ++- .../Features/FormFile.cs | 22 ++++++------ .../FormFileCollection.cs | 35 +++++++++++-------- .../FormFeatureTests.cs | 2 ++ 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index 6f8fdaa2ad..b5e44904b4 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -18,6 +18,10 @@ namespace Microsoft.AspNet.Http long Length { get; } + string Name { get; } + + string FileName { get; } + Stream OpenReadStream(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index f3ed68e34a..198924ba06 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -149,7 +149,10 @@ namespace Microsoft.AspNet.Http.Features.Internal // Find the end await section.Body.DrainAsync(cancellationToken); - var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length) + var name = HeaderUtilities.RemoveQuotes(contentDisposition.Name) ?? string.Empty; + var fileName = HeaderUtilities.RemoveQuotes(contentDisposition.FileName) ?? string.Empty; + + var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length, name, fileName) { Headers = new HeaderDictionary(section.Headers), }; diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index 557dc9d518..3fc5113633 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -8,15 +8,16 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class FormFile : IFormFile { - private Stream _baseStream; - private long _baseStreamOffset; - private long _length; + private readonly Stream _baseStream; + private readonly long _baseStreamOffset; - public FormFile(Stream baseStream, long baseStreamOffset, long length) + public FormFile(Stream baseStream, long baseStreamOffset, long length, string name, string fileName) { _baseStream = baseStream; _baseStreamOffset = baseStreamOffset; - _length = length; + Length = length; + Name = name; + FileName = fileName; } public string ContentDisposition @@ -33,14 +34,15 @@ namespace Microsoft.AspNet.Http.Features.Internal public IHeaderDictionary Headers { get; set; } - public long Length - { - get { return _length; } - } + public long Length { get; } + + public string Name { get; } + + public string FileName { get; } public Stream OpenReadStream() { - return new ReferenceReadStream(_baseStream, _baseStreamOffset, _length); + return new ReferenceReadStream(_baseStream, _baseStreamOffset, Length); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/FormFileCollection.cs b/src/Microsoft.AspNet.Http/FormFileCollection.cs index 43dbf0cb12..b7b3ee8ebd 100644 --- a/src/Microsoft.AspNet.Http/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/FormFileCollection.cs @@ -1,34 +1,41 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; -using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { public class FormFileCollection : List, IFormFileCollection { - public IFormFile this[string name] - { - get { return GetFile(name); } - } + public IFormFile this[string name] => GetFile(name); public IFormFile GetFile(string name) { - return Find(file => string.Equals(name, GetName(file.ContentDisposition))); + foreach (var file in this) + { + if (string.Equals(name, file.Name, StringComparison.OrdinalIgnoreCase)) + { + return file; + } + } + + return null; } public IReadOnlyList GetFiles(string name) { - return FindAll(file => string.Equals(name, GetName(file.ContentDisposition))); - } + var files = new List(); - private static string GetName(string contentDisposition) - { - // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" - ContentDispositionHeaderValue cd; - ContentDispositionHeaderValue.TryParse(contentDisposition, out cd); - return HeaderUtilities.RemoveQuotes(cd?.Name); + foreach (var file in this) + { + if (string.Equals(name, file.Name, StringComparison.OrdinalIgnoreCase)) + { + files.Add(file); + } + } + + return files; } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 4580ac9e97..7d7cafc542 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -215,6 +215,8 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.Equal(1, formCollection.Files.Count); var file = formCollection.Files["myfile1"]; + Assert.Equal("myfile1", file.Name); + Assert.Equal("temp.html", file.FileName); Assert.Equal("text/html", file.ContentType); Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""", file.ContentDisposition); var body = file.OpenReadStream(); From 5231683aae4d771908205adc4c24040733dd9ace Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 7 Dec 2015 19:22:53 -0800 Subject: [PATCH 458/846] * Removing unused dependencies from code * Cleaning up usage of CodeAnalysis. --- .../AuthenticationProperties.cs | 2 -- .../HostString.cs | 3 --- .../PathString.cs | 4 ---- .../QueryString.cs | 2 -- .../project.json | 14 ++------------ .../project.json | 4 +--- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 1 - src/Microsoft.AspNet.Http/project.json | 2 -- src/Microsoft.AspNet.Owin/project.json | 19 +------------------ .../project.json | 5 +---- 10 files changed, 5 insertions(+), 51 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs index 5c815ba37b..b4d327914f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Globalization; namespace Microsoft.AspNet.Http.Authentication @@ -70,7 +69,6 @@ namespace Microsoft.AspNet.Http.Authentication /// /// Gets or sets the full path or absolute URI to be used as an http redirect response value. /// - [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] public string RedirectUri { get diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index b5debac327..75b56092fc 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics.CodeAnalysis; using System.Globalization; namespace Microsoft.AspNet.Http @@ -52,7 +51,6 @@ namespace Microsoft.AspNet.Http /// Any Unicode is converted to punycode. IPv6 addresses will have brackets added if they are missing. /// /// - [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a URI is returned.")] public string ToUriComponent() { int index; @@ -92,7 +90,6 @@ namespace Microsoft.AspNet.Http /// /// /// - [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a URI is provided.")] public static HostString FromUriComponent(string uriComponent) { if (!string.IsNullOrEmpty(uriComponent)) diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 78c01cdcc1..123fba4f48 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -64,7 +64,6 @@ namespace Microsoft.AspNet.Http /// Provides the path string escaped in a way which is correct for combining into the URI representation. /// /// The escaped path value - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. @@ -94,7 +93,6 @@ namespace Microsoft.AspNet.Http /// /// The escaped path as it appears in the URI format. /// The resulting PathString - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with URI processing")] public static PathString FromUriComponent(string uriComponent) { // REVIEW: what is the exactly correct thing to do? @@ -152,7 +150,6 @@ namespace Microsoft.AspNet.Http /// The to compare. /// The remaining segments after the match. /// true if value matches the beginning of this string; otherwise, false. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] public bool StartsWithSegments(PathString other, out PathString remaining) { return StartsWithSegments(other, StringComparison.OrdinalIgnoreCase, out remaining); @@ -166,7 +163,6 @@ namespace Microsoft.AspNet.Http /// One of the enumeration values that determines how this and value are compared. /// The remaining segments after the match. /// true if value matches the beginning of this string; otherwise, false. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] public bool StartsWithSegments(PathString other, StringComparison comparisonType, out PathString remaining) { var value1 = Value ?? string.Empty; diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index d400375ea8..336266e5aa 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -68,7 +68,6 @@ namespace Microsoft.AspNet.Http /// dangerous are escaped. /// /// The query string value - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] public string ToUriComponent() { // Escape things properly so System.Uri doesn't mis-interpret the data. @@ -81,7 +80,6 @@ namespace Microsoft.AspNet.Http /// /// The escaped query as it appears in the URI format. /// The resulting QueryString - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Delimiter characters ? and # must be escaped by this method instead of truncating the value")] public static QueryString FromUriComponent(string uriComponent) { if (string.IsNullOrEmpty(uriComponent)) diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index d76ed1ff90..cf571cfed3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -26,23 +26,13 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-*", "System.ComponentModel": "4.0.1-*", - "System.Diagnostics.Tools": "4.0.1-*", - "System.Globalization": "4.0.11-*", "System.Globalization.Extensions": "4.0.1-*", - "System.Linq": "4.0.1-*", "System.Linq.Expressions": "4.0.11-*", - "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", - "System.Reflection.TypeExtensions": "4.0.1-*", - "System.IO": "4.0.11-*", - "System.Runtime": "4.0.21-*", + "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.0.21-*", - "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*", - "System.Security.Principal": "4.0.1-*", - "System.Threading.Tasks": "4.0.11-*" + "System.Security.Cryptography.X509Certificates": "4.0.0-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1dff3fe5c1..747d08ca80 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -17,9 +17,7 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.IO.FileSystem": "4.0.1-*", - "System.Runtime": "4.0.21-*", - "System.Resources.ResourceManager": "4.0.1-*" + "System.IO.FileSystem": "4.0.1-*" } } } diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 8b575fd659..e2da6489a3 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -73,7 +73,6 @@ namespace Microsoft.AspNet.Http.Internal #endregion } - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] internal struct HeaderSegmentCollection : IEnumerable, IEquatable { private readonly StringValues _headers; diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 88f2039436..530c34e71e 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -19,8 +19,6 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Diagnostics.Debug": "4.0.11-*", - "System.Text.Encoding": "4.0.11-*", "System.Threading": "4.0.11-*" } } diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 886ba4d554..a168017154 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -14,23 +14,6 @@ }, "frameworks": { "net451": {}, - "dotnet5.4": { - "dependencies": { - "System.Collections": "4.0.11-*", - "System.ComponentModel": "4.0.1-*", - "System.Diagnostics.Tools": "4.0.1-*", - "System.Globalization": "4.0.11-*", - "System.IO": "4.0.11-*", - "System.Linq": "4.0.1-*", - "System.Net.Primitives": "4.0.11-*", - "System.Runtime": "4.0.21-*", - "System.Runtime.Extensions": "4.0.11-*", - "System.Runtime.InteropServices": "4.0.21-*", - "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*", - "System.Security.Principal": "4.0.1-*", - "System.Threading.Tasks": "4.0.11-*" - } - } + "dotnet5.4": {} } } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 41c996a830..82efa6d0d5 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -22,11 +22,8 @@ "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-*", - "System.Diagnostics.Debug": "4.0.11-*", "System.IO": "4.0.11-*", - "System.IO.FileSystem": "4.0.1-*", - "System.Runtime": "4.0.21-*", - "System.Runtime.Extensions": "4.0.11-*" + "System.IO.FileSystem": "4.0.1-*" } } } From 5e42d26fd536ea7fbca7e3b30eb593fe876e462b Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 8 Dec 2015 10:27:08 -0800 Subject: [PATCH 459/846] Implement GetHashCode --- src/Microsoft.AspNet.Http.Features/FeatureCollection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index eacad01a72..246af4d183 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -102,7 +102,7 @@ namespace Microsoft.AspNet.Http.Features public int GetHashCode(KeyValuePair obj) { - throw new NotImplementedException(); + return obj.Key.GetHashCode(); } } } From e3b7db6bb7425414aee69d93e371cb34fe880a6c Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Wed, 9 Dec 2015 13:43:06 +0100 Subject: [PATCH 460/846] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8ed5ec4edc..c05401f3ce 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ HttpAbstractions ================ -AppVeyor: [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) -Travis: [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) +| AppVeyor | Travis | +| ---- | ---- +| [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) | [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) | -Contains HTTP abstractions for ASP.NET 5 such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. +Contains HTTP abstractions for ASP.NET 5 such as `HttpContext`, `HttpRequest`, `HttpResponse` and `RequestDelegate`. + +It also contains `IApplicationBuilder` and extensions to create and compose your application's pipeline. This project is part of ASP.NET 5. You can find samples, documentation and getting started instructions for ASP.NET 5 at the [Home](https://github.com/aspnet/home) repo. From 5a8f1281e8e4137cf4befe4032747af8a3ccc767 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 11 Dec 2015 12:22:33 -0800 Subject: [PATCH 461/846] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From 59b32934e322660983322ceccf37dfc48da56a7f Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 14 Dec 2015 08:27:59 -0800 Subject: [PATCH 462/846] Change Expires to DateTimeOffset --- src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs index d2785db947..5cf29be6a2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http /// Gets or sets the expiration date and time for the cookie. /// /// The expiration date and time for the cookie. - public DateTime? Expires { get; set; } + public DateTimeOffset? Expires { get; set; } /// /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)�that is, over HTTPS only. From c41be75796d9c81d9dde079c45958a2d54c31a63 Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 14 Dec 2015 13:22:42 -0800 Subject: [PATCH 463/846] Wrap Branch in try finally --- .../Extensions/MapMiddleware.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index 2b2c80b06f..1c66aea8e0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -57,10 +57,15 @@ namespace Microsoft.AspNet.Builder.Extensions context.Request.PathBase = pathBase + _options.PathMatch; context.Request.Path = remainingPath; - await _options.Branch(context); - - context.Request.PathBase = pathBase; - context.Request.Path = path; + try + { + await _options.Branch(context); + } + finally + { + context.Request.PathBase = pathBase; + context.Request.Path = path; + } } else { From 67c5ec29b3d31779cbebdbd1e9501b3b3d1db9c4 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sun, 6 Dec 2015 23:18:41 +0000 Subject: [PATCH 464/846] Allow feature cache to be updated+invalidated --- .../DefaultAuthenticationManager.cs | 31 ++-- .../DefaultConnectionInfo.cs | 26 ++- .../DefaultHttpContext.cs | 49 ++++-- .../DefaultHttpRequest.cs | 30 +++- .../DefaultHttpResponse.cs | 26 ++- .../DefaultWebSocketManager.cs | 24 ++- .../Features/FeatureHelpers.cs | 15 +- .../Features/IFeatureCache.cs | 1 + .../Features/QueryFeature.cs | 8 +- .../Features/RequestCookiesFeature.cs | 8 +- .../Features/ResponseCookiesFeature.cs | 8 +- .../DefaultHttpContextTests.cs | 151 ++++++++++++++++++ 12 files changed, 330 insertions(+), 47 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 545f3d03d5..ba239a6c47 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -14,27 +14,43 @@ namespace Microsoft.AspNet.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache { - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpAuthenticationFeature _authentication; - private IHttpResponseFeature _response; public DefaultAuthenticationManager(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _authentication = null; - _response = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _authentication = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpAuthenticationFeature HttpAuthenticationFeature { get @@ -47,11 +63,6 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - private IHttpResponseFeature HttpResponseFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } - } - public override IEnumerable GetAuthenticationSchemes() { var handler = HttpAuthenticationFeature.Handler; diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index c0fd423478..66fdbbe9b1 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache { - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpConnectionFeature _connection; @@ -21,18 +21,36 @@ namespace Microsoft.AspNet.Http.Internal public DefaultConnectionInfo(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _connection = null; - _tlsConnection = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _connection = null; + _tlsConnection = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpConnectionFeature HttpConnectionFeature { get diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index f4c60fb951..9fcfd9685d 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -16,17 +16,18 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContext : HttpContext, IFeatureCache { - private readonly HttpRequest _request; - private readonly HttpResponse _response; - private ConnectionInfo _connection; - private AuthenticationManager _authenticationManager; + private readonly DefaultHttpRequest _request; + private readonly DefaultHttpResponse _response; + + private DefaultAuthenticationManager _authenticationManager; + private DefaultConnectionInfo _connection; + private DefaultWebSocketManager _websockets; private IItemsFeature _items; private IServiceProvidersFeature _serviceProviders; private IHttpAuthenticationFeature _authentication; private IHttpRequestLifetimeFeature _lifetime; private ISessionFeature _session; - private WebSocketManager _websockets; private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; @@ -36,6 +37,7 @@ namespace Microsoft.AspNet.Http.Internal { _features.Set(new HttpRequestFeature()); _features.Set(new HttpResponseFeature()); + ((IFeatureCache)this).SetFeaturesRevision(); } public DefaultHttpContext(IFeatureCollection features) @@ -43,21 +45,46 @@ namespace Microsoft.AspNet.Http.Internal _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision !=_features.Revision) { - _items = null; - _serviceProviders = null; - _authentication = null; - _lifetime = null; - _session = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + + _request.UpdateFeatures(features); + _response.UpdateFeatures(features); + + _authenticationManager?.UpdateFeatures(features); + _connection?.UpdateFeatures(features); + _websockets?.UpdateFeatures(features); + } + + private void ResetFeatures() + { + _items = null; + _serviceProviders = null; + _authentication = null; + _lifetime = null; + _session = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + IItemsFeature ItemsFeature { get diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index d11e75bc03..caa34099e4 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal public class DefaultHttpRequest : HttpRequest, IFeatureCache { private readonly DefaultHttpContext _context; - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpRequestFeature _request; @@ -26,20 +26,38 @@ namespace Microsoft.AspNet.Http.Internal { _context = context; _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _request = null; - _query = null; - _form = null; - _cookies = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _request = null; + _query = null; + _form = null; + _cookies = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index f239261b6a..99783ce77d 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Internal public class DefaultHttpResponse : HttpResponse, IFeatureCache { private readonly DefaultHttpContext _context; - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpResponseFeature _response; @@ -23,18 +23,36 @@ namespace Microsoft.AspNet.Http.Internal { _context = context; _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _response = null; - _cookies = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _response = null; + _cookies = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpResponseFeature HttpResponseFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 454b0fa61f..d7b388fb62 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -21,18 +21,36 @@ namespace Microsoft.AspNet.Http.Internal public DefaultWebSocketManager(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _request = null; - _webSockets = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _request = null; + _webSockets = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs index ca6d914ac1..86b033fd6b 100644 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -56,9 +56,10 @@ namespace Microsoft.AspNet.Http.Features if (obj == null) { obj = factory(); - cachedObject = obj; - features.Set(obj); } + cachedObject = obj; + features.Set(obj); + cache.SetFeaturesRevision(); } return obj; } @@ -79,9 +80,10 @@ namespace Microsoft.AspNet.Http.Features if (obj == null) { obj = factory(features); - cachedObject = obj; - features.Set(obj); } + cachedObject = obj; + features.Set(obj); + cache.SetFeaturesRevision(); } return obj; } @@ -103,9 +105,10 @@ namespace Microsoft.AspNet.Http.Features if (obj == null) { obj = factory(request); - cachedObject = obj; - features.Set(obj); } + cachedObject = obj; + features.Set(obj); + cache.SetFeaturesRevision(); } return obj; } diff --git a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs index 80db1ee3c8..14a220d8d5 100644 --- a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs +++ b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs @@ -6,5 +6,6 @@ namespace Microsoft.AspNet.Http.Features internal interface IFeatureCache { void CheckFeaturesRevision(); + void SetFeaturesRevision(); } } diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index e17e612533..6d404a54ae 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -35,6 +35,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() @@ -42,10 +43,15 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cachedFeaturesRevision != _features.Revision) { _request = null; - _cachedFeaturesRevision = _features.Revision; + ((IFeatureCache)this).SetFeaturesRevision(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index e759f1d2c6..811b3e836c 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -37,6 +37,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() @@ -44,10 +45,15 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cachedFeaturesRevision != _features.Revision) { _request = null; - _cachedFeaturesRevision = _features.Revision; + ((IFeatureCache)this).SetFeaturesRevision(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index dd7607a731..caea7e4ec0 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -16,6 +16,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public ResponseCookiesFeature(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() @@ -23,10 +24,15 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cachedFeaturesRevision != _features.Revision) { _response = null; - _cachedFeaturesRevision = _features.Revision; + ((IFeatureCache)this).SetFeaturesRevision(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + private IHttpResponseFeature HttpResponseFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 3d7305b89d..01fbd73d67 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -4,8 +4,11 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; +using System.Reflection; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Authentication.Internal; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Xunit; @@ -146,6 +149,138 @@ namespace Microsoft.AspNet.Http.Internal items["foo"] = item; Assert.Same(item, context.Items["foo"]); } + + [Fact] + public void UpdateFeatures_ClearsCachedFeatures() + { + var features = new FeatureCollection(); + + var context = new DefaultHttpContext(features); + + var request = (DefaultHttpRequest)context.Request; + var response = (DefaultHttpResponse)context.Response; + + var authentication = (DefaultAuthenticationManager)context.Authentication; + var connection = (DefaultConnectionInfo)context.Connection; + var websockets = (DefaultWebSocketManager)context.WebSockets; + + Assert.Equal(0, features.Count()); + + TestCachedFeaturesAreNull(context.GetType(), context, features); + TestCachedFeaturesAreNull(request.GetType(), request, features); + TestCachedFeaturesAreNull(response.GetType(), response, features); + TestCachedFeaturesAreNull(authentication.GetType(), authentication, features); + TestCachedFeaturesAreNull(connection.GetType(), connection, features); + TestCachedFeaturesAreNull(websockets.GetType(), websockets, features); + + context.Session = new TestSession(); + features.Set(new HttpRequestFeature()); + features.Set(new HttpResponseFeature()); + features.Set(new TestHttpWebSocketFeature()); + + TestCachedFeaturesAreSet(context.GetType(), context, features); + TestCachedFeaturesAreSet(request.GetType(), request, features); + TestCachedFeaturesAreSet(response.GetType(), response, features); + TestCachedFeaturesAreSet(authentication.GetType(), authentication, features); + TestCachedFeaturesAreSet(connection.GetType(), connection, features); + TestCachedFeaturesAreSet(websockets.GetType(), websockets, features); + + Assert.NotEqual(0, features.Count()); + + var newFeatures = new FeatureCollection(); + context.UpdateFeatures(newFeatures); + + Assert.Equal(0, newFeatures.Count()); + + TestCachedFeaturesAreNull(context.GetType(), context, newFeatures); + TestCachedFeaturesAreNull(request.GetType(), request, newFeatures); + TestCachedFeaturesAreNull(response.GetType(), response, newFeatures); + TestCachedFeaturesAreNull(authentication.GetType(), authentication, newFeatures); + TestCachedFeaturesAreNull(connection.GetType(), connection, newFeatures); + TestCachedFeaturesAreNull(websockets.GetType(), websockets, newFeatures); + + context.Session = new TestSession(); + newFeatures.Set(new HttpRequestFeature()); + newFeatures.Set(new HttpResponseFeature()); + newFeatures.Set(new TestHttpWebSocketFeature()); + + TestCachedFeaturesAreSet(context.GetType(), context, newFeatures); + TestCachedFeaturesAreSet(request.GetType(), request, newFeatures); + TestCachedFeaturesAreSet(response.GetType(), response, newFeatures); + TestCachedFeaturesAreSet(authentication.GetType(), authentication, newFeatures); + TestCachedFeaturesAreSet(connection.GetType(), connection, newFeatures); + TestCachedFeaturesAreSet(websockets.GetType(), websockets, newFeatures); + + Assert.NotEqual(0, newFeatures.Count()); + } + + void TestCachedFeaturesAreNull(Type type, object value, IFeatureCollection features) + { + + var fields = type + .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) + .Where(f => f.FieldType.GetTypeInfo().IsInterface); + + foreach (var field in fields) + { + if (field.FieldType == typeof(IFeatureCollection)) + { + Assert.Same(features, field.GetValue(value)); + } + else + { + Assert.Null(field.GetValue(value)); + } + } + } + + void TestCachedFeaturesAreSet(Type type, object value, IFeatureCollection features) + { + var properties = type + .GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance) + .Where(p => p.PropertyType.GetTypeInfo().IsInterface); + + TestFeatureProperties(value, features, properties); + + var fields = type + .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) + .Where(f => f.FieldType.GetTypeInfo().IsInterface); + + foreach (var field in fields) + { + if (field.FieldType == typeof(IFeatureCollection)) + { + Assert.Same(features, field.GetValue(value)); + } + else + { + var v = field.GetValue(value); + Assert.Same(features[field.FieldType], v); + Assert.NotNull(v); + } + } + + } + + private static void TestFeatureProperties(object value, IFeatureCollection features, IEnumerable properties) + { + foreach (var property in properties) + { + if (property.PropertyType == typeof(IFeatureCollection)) + { + Assert.Same(features, property.GetValue(value)); + } + else + { + if (property.Name.Contains("Feature")) + { + var v = property.GetValue(value); + Assert.Same(features[property.PropertyType], v); + Assert.NotNull(v); + } + } + } + } private HttpContext CreateContext() { @@ -195,5 +330,21 @@ namespace Microsoft.AspNet.Http.Internal { public ISession Session { get; set; } } + + private class TestHttpWebSocketFeature : IHttpWebSocketFeature + { + public bool IsWebSocketRequest + { + get + { + throw new NotImplementedException(); + } + } + + public Task AcceptAsync(WebSocketAcceptContext context) + { + throw new NotImplementedException(); + } + } } } \ No newline at end of file From 0e3fe7493e098f2940630fd24adf4157e461efd4 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 20:01:55 -0800 Subject: [PATCH 465/846] Streamlining feature cache and object re-initialiation code paths Shouldn't increase object size, but does improve maintainability --- .../FeatureReferences.cs | 57 ++++ .../DefaultAuthenticationManager.cs | 47 +--- .../DefaultConnectionInfo.cs | 68 ++--- .../DefaultHttpContext.cs | 248 +++++++----------- .../DefaultHttpRequest.cs | 105 ++------ .../DefaultHttpResponse.cs | 71 ++--- .../DefaultWebSocketManager.cs | 54 ++-- .../Features/FeatureHelpers.cs | 116 -------- .../Features/IFeatureCache.cs | 11 - .../Features/QueryFeature.cs | 34 +-- .../Features/RequestCookiesFeature.cs | 35 +-- .../Features/ResponseCookiesFeature.cs | 30 +-- .../DefaultHttpContextTests.cs | 94 ++++--- 13 files changed, 309 insertions(+), 661 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Features/FeatureReferences.cs delete mode 100644 src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs delete mode 100644 src/Microsoft.AspNet.Http/Features/IFeatureCache.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs new file mode 100644 index 0000000000..75fcacc0db --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs @@ -0,0 +1,57 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http.Features +{ + public struct FeatureReferences + { + public FeatureReferences(IFeatureCollection collection) + { + Collection = collection; + Cache = default(TCache); + Revision = collection.Revision; + } + + public readonly IFeatureCollection Collection; + public int Revision; + public TCache Cache; + + public TFeature Fetch( + ref TFeature cached, + TState state, + Func factory) + { + var cleared = false; + if (Revision != Collection.Revision) + { + cleared = true; + Cache = default(TCache); + Revision = Collection.Revision; + } + + var feature = cached; + if (feature == null) + { + feature = Collection.Get(); + if (feature == null) + { + feature = factory(state); + + Collection.Set(feature); + if (!cleared) + { + Cache = default(TCache); + } + Revision = Collection.Revision; + } + cached = feature; + } + return feature; + } + + public TFeature Fetch(ref TFeature cached, Func factory) => + Fetch(ref cached, Collection, factory); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index ba239a6c47..0c8db87453 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -12,56 +12,27 @@ using Microsoft.AspNet.Http.Features.Authentication.Internal; namespace Microsoft.AspNet.Http.Authentication.Internal { - public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache + public class DefaultAuthenticationManager : AuthenticationManager { - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpAuthenticationFeature _authentication; + private FeatureReferences _features; public DefaultAuthenticationManager(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize(IFeatureCollection features) { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _features = new FeatureReferences(features); } - void IFeatureCache.SetFeaturesRevision() + public virtual void Uninitialize() { - _cachedFeaturesRevision = _features.Revision; + _features = default(FeatureReferences); } - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } - - private void ResetFeatures() - { - _authentication = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpAuthenticationFeature HttpAuthenticationFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpAuthenticationFeature(), - ref _authentication); - } - } + private IHttpAuthenticationFeature HttpAuthenticationFeature => + _features.Fetch(ref _features.Cache, f => new HttpAuthenticationFeature()); public override IEnumerable GetAuthenticationSchemes() { diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 66fdbbe9b1..dd19f7d286 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -10,70 +10,30 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache + public class DefaultConnectionInfo : ConnectionInfo { - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpConnectionFeature _connection; - private ITlsConnectionFeature _tlsConnection; + private FeatureReferences _features; public DefaultConnectionInfo(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize( IFeatureCollection features) { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _features = new FeatureReferences(features); } - void IFeatureCache.SetFeaturesRevision() + public virtual void Uninitialize() { - _cachedFeaturesRevision = _features.Revision; + _features = default(FeatureReferences); } - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } + private IHttpConnectionFeature HttpConnectionFeature => + _features.Fetch(ref _features.Cache.Connection, f => new HttpConnectionFeature()); - private void ResetFeatures() - { - _connection = null; - _tlsConnection = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpConnectionFeature HttpConnectionFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpConnectionFeature(), - ref _connection); - } - } - - private ITlsConnectionFeature TlsConnectionFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new TlsConnectionFeature(), - ref _tlsConnection); - } - } + private ITlsConnectionFeature TlsConnectionFeature=> + _features.Fetch(ref _features.Cache.TlsConnection, f => new TlsConnectionFeature()); public override IPAddress RemoteIpAddress { @@ -115,5 +75,11 @@ namespace Microsoft.AspNet.Http.Internal { return TlsConnectionFeature.GetClientCertificateAsync(cancellationToken); } + + struct FeatureInterfaces + { + public IHttpConnectionFeature Connection; + public ITlsConnectionFeature TlsConnection; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 9fcfd9685d..9cc4211c9f 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -14,173 +14,99 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpContext : HttpContext, IFeatureCache + public class DefaultHttpContext : HttpContext { - private readonly DefaultHttpRequest _request; - private readonly DefaultHttpResponse _response; + private FeatureReferences _features; - private DefaultAuthenticationManager _authenticationManager; - private DefaultConnectionInfo _connection; - private DefaultWebSocketManager _websockets; - - private IItemsFeature _items; - private IServiceProvidersFeature _serviceProviders; - private IHttpAuthenticationFeature _authentication; - private IHttpRequestLifetimeFeature _lifetime; - private ISessionFeature _session; - - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; + private HttpRequest _request; + private HttpResponse _response; + private AuthenticationManager _authenticationManager; + private ConnectionInfo _connection; + private WebSocketManager _websockets; public DefaultHttpContext() : this(new FeatureCollection()) { - _features.Set(new HttpRequestFeature()); - _features.Set(new HttpResponseFeature()); - ((IFeatureCache)this).SetFeaturesRevision(); + Features.Set(new HttpRequestFeature()); + Features.Set(new HttpResponseFeature()); } public DefaultHttpContext(IFeatureCollection features) { - _features = features; - _request = new DefaultHttpRequest(this, features); - _response = new DefaultHttpResponse(this, features); - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize(IFeatureCollection features) { - if (_cachedFeaturesRevision !=_features.Revision) + _features = new FeatureReferences(features); + _request = InitializeHttpRequest(); + _response = InitializeHttpResponse(); + } + + public virtual void Uninitialize() + { + _features = default(FeatureReferences); + if (_request != null) { - ResetFeatures(); + UninitializeHttpRequest(_request); + _request = null; } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - - _request.UpdateFeatures(features); - _response.UpdateFeatures(features); - - _authenticationManager?.UpdateFeatures(features); - _connection?.UpdateFeatures(features); - _websockets?.UpdateFeatures(features); - } - - private void ResetFeatures() - { - _items = null; - _serviceProviders = null; - _authentication = null; - _lifetime = null; - _session = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - IItemsFeature ItemsFeature - { - get + if (_response != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new ItemsFeature(), - ref _items); + UninitializeHttpResponse(_response); + _response = null; } - } - - IServiceProvidersFeature ServiceProvidersFeature - { - get + if (_authenticationManager != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new ServiceProvidersFeature(), - ref _serviceProviders); + UninitializeAuthenticationManager(_authenticationManager); + _authenticationManager = null; } - } - - private IHttpAuthenticationFeature HttpAuthenticationFeature - { - get + if (_connection != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpAuthenticationFeature(), - ref _authentication); + UninitializeConnectionInfo(_connection); + _connection = null; } - } - - private IHttpRequestLifetimeFeature LifetimeFeature - { - get + if (_websockets != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpRequestLifetimeFeature(), - ref _lifetime); + UninitializeWebSocketManager(_websockets); + _websockets = null; } } + + private IItemsFeature ItemsFeature => + _features.Fetch(ref _features.Cache.Items, f => new ItemsFeature()); - private ISessionFeature SessionFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _session); } - set - { - _features.Set(value); - _session = value; - } - } + private IServiceProvidersFeature ServiceProvidersFeature => + _features.Fetch(ref _features.Cache.ServiceProviders, f => new ServiceProvidersFeature()); - private IHttpRequestIdentifierFeature RequestIdentifierFeature - { - get { - return FeatureHelpers.GetOrCreate( - _features, - () => new HttpRequestIdentifierFeature()); - } - } + private IHttpAuthenticationFeature HttpAuthenticationFeature => + _features.Fetch(ref _features.Cache.Authentication, f => new HttpAuthenticationFeature()); - public override IFeatureCollection Features { get { return _features; } } + private IHttpRequestLifetimeFeature LifetimeFeature => + _features.Fetch(ref _features.Cache.Lifetime, f => new HttpRequestLifetimeFeature()); - public override HttpRequest Request { get { return _request; } } + private ISessionFeature SessionFeature => + _features.Fetch(ref _features.Cache.Session, f => new DefaultSessionFeature()); - public override HttpResponse Response { get { return _response; } } + private ISessionFeature SessionFeatureOrNull => + _features.Fetch(ref _features.Cache.Session, f => null); - public override ConnectionInfo Connection - { - get - { - if (_connection == null) - { - _connection = new DefaultConnectionInfo(_features); - } - return _connection; - } - } - public override AuthenticationManager Authentication - { - get - { - if (_authenticationManager == null) - { - _authenticationManager = new DefaultAuthenticationManager(_features); - } - return _authenticationManager; - } - } + private IHttpRequestIdentifierFeature RequestIdentifierFeature => + _features.Fetch(ref _features.Cache.RequestIdentifier, f => new HttpRequestIdentifierFeature()); + + public override IFeatureCollection Features => _features.Collection; + + public override HttpRequest Request => _request; + + public override HttpResponse Response => _response; + + public override ConnectionInfo Connection => _connection ?? (_connection = InitializeConnectionInfo()); + + public override AuthenticationManager Authentication => _authenticationManager ?? (_authenticationManager = InitializeAuthenticationManager()); + + public override WebSocketManager WebSockets => _websockets ?? (_websockets = InitializeWebSocketManager()); + public override ClaimsPrincipal User { @@ -225,7 +151,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - var feature = SessionFeature; + var feature = SessionFeatureOrNull; if (feature == null) { throw new InvalidOperationException("Session has not been configured for this application " + @@ -235,31 +161,41 @@ namespace Microsoft.AspNet.Http.Internal } set { - var feature = SessionFeature; - if (feature == null) - { - feature = new DefaultSessionFeature(); - SessionFeature = feature; - } - feature.Session = value; + SessionFeature.Session = value; } } - public override WebSocketManager WebSockets - { - get - { - if (_websockets == null) - { - _websockets = new DefaultWebSocketManager(_features); - } - return _websockets; - } - } + public override void Abort() { LifetimeFeature.Abort(); } + + + protected virtual HttpRequest InitializeHttpRequest() => new DefaultHttpRequest(this, Features); + protected virtual void UninitializeHttpRequest(HttpRequest instance) { } + + protected virtual HttpResponse InitializeHttpResponse() => new DefaultHttpResponse(this, Features); + protected virtual void UninitializeHttpResponse(HttpResponse instance) { } + + protected virtual ConnectionInfo InitializeConnectionInfo() => new DefaultConnectionInfo(Features); + protected virtual void UninitializeConnectionInfo(ConnectionInfo instance) { } + + protected virtual AuthenticationManager InitializeAuthenticationManager() => new DefaultAuthenticationManager(Features); + protected virtual void UninitializeAuthenticationManager(AuthenticationManager instance) { } + + protected virtual WebSocketManager InitializeWebSocketManager() => new DefaultWebSocketManager(Features); + protected virtual void UninitializeWebSocketManager(WebSocketManager instance) { } + + struct FeatureInterfaces + { + public IItemsFeature Items; + public IServiceProvidersFeature ServiceProviders; + public IHttpAuthenticationFeature Authentication; + public IHttpRequestLifetimeFeature Lifetime; + public ISessionFeature Session; + public IHttpRequestIdentifierFeature RequestIdentifier; + } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index caa34099e4..e03f93c83c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -11,96 +11,41 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpRequest : HttpRequest, IFeatureCache + public class DefaultHttpRequest : HttpRequest { - private readonly DefaultHttpContext _context; - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; - private IQueryFeature _query; - private IFormFeature _form; - private IRequestCookiesFeature _cookies; + private HttpContext _context; + private FeatureReferences _features; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) + { + Initialize(context, features); + } + + public virtual void Initialize(HttpContext context, IFeatureCollection features) { _context = context; - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Uninitialize() { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _context = null; + _features = default(FeatureReferences); } - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } + public override HttpContext HttpContext => _context; - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache.Request, f => null); - private void ResetFeatures() - { - _request = null; - _query = null; - _form = null; - _cookies = null; + private IQueryFeature QueryFeature => + _features.Fetch(ref _features.Cache.Query, f => new QueryFeature(f)); - ((IFeatureCache)this).SetFeaturesRevision(); - } + private IFormFeature FormFeature => + _features.Fetch(ref _features.Cache.Form, this, self => new FormFeature(self)); - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } - - private IQueryFeature QueryFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - (f) => new QueryFeature(f), - ref _query); - } - } - - private IFormFeature FormFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - this, - (r) => new FormFeature(r), - ref _form); - } - } - - private IRequestCookiesFeature RequestCookiesFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - (f) => new RequestCookiesFeature(f), - ref _cookies); - } - } - - public override HttpContext HttpContext { get { return _context; } } + private IRequestCookiesFeature RequestCookiesFeature => + _features.Fetch(ref _features.Cache.Cookies, f => new RequestCookiesFeature(f)); public override PathString PathBase { @@ -206,5 +151,13 @@ namespace Microsoft.AspNet.Http.Internal { return FormFeature.ReadFormAsync(cancellationToken); } + + struct FeatureInterfaces + { + public IHttpRequestFeature Request; + public IQueryFeature Query; + public IFormFeature Form; + public IRequestCookiesFeature Cookies; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 99783ce77d..901e17cbfe 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -10,65 +10,34 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpResponse : HttpResponse, IFeatureCache + public class DefaultHttpResponse : HttpResponse { - private readonly DefaultHttpContext _context; - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpResponseFeature _response; - private IResponseCookiesFeature _cookies; + private HttpContext _context; + private FeatureReferences _features; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) + { + Initialize(context, features); + } + + public virtual void Initialize(HttpContext context, IFeatureCollection features) { _context = context; - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Uninitialize() { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _context = null; + _features = default(FeatureReferences); } - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } + private IHttpResponseFeature HttpResponseFeature => + _features.Fetch(ref _features.Cache.Response, f => null); - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } - - private void ResetFeatures() - { - _response = null; - _cookies = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpResponseFeature HttpResponseFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } - } - - private IResponseCookiesFeature ResponseCookiesFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - (f) => new ResponseCookiesFeature(f), - ref _cookies); - } - } + private IResponseCookiesFeature ResponseCookiesFeature => + _features.Fetch(ref _features.Cache.Cookies, f => new ResponseCookiesFeature(f)); + public override HttpContext HttpContext { get { return _context; } } @@ -163,5 +132,11 @@ namespace Microsoft.AspNet.Http.Internal Headers[HeaderNames.Location] = location; } + + struct FeatureInterfaces + { + public IHttpResponseFeature Response; + public IResponseCookiesFeature Cookies; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index d7b388fb62..8beff4db9a 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -10,56 +10,30 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultWebSocketManager : WebSocketManager, IFeatureCache + public class DefaultWebSocketManager : WebSocketManager { - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; - private IHttpWebSocketFeature _webSockets; + private FeatureReferences _features; public DefaultWebSocketManager(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize(IFeatureCollection features) { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _features = new FeatureReferences(features); } - void IFeatureCache.SetFeaturesRevision() + public virtual void Uninitialize() { - _cachedFeaturesRevision = _features.Revision; + _features = default(FeatureReferences); } - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache.Request, f => null); - private void ResetFeatures() - { - _request = null; - _webSockets = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } - - private IHttpWebSocketFeature WebSocketFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _webSockets); } - } + private IHttpWebSocketFeature WebSocketFeature => + _features.Fetch(ref _features.Cache.WebSockets, f => null); public override bool IsWebSocketRequest { @@ -85,5 +59,11 @@ namespace Microsoft.AspNet.Http.Internal } return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol }); } + + struct FeatureInterfaces + { + public IHttpRequestFeature Request; + public IHttpWebSocketFeature WebSockets; + } } } diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs deleted file mode 100644 index 86b033fd6b..0000000000 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http.Features -{ - internal static class FeatureHelpers - { - public static T GetAndCache( - IFeatureCache cache, - IFeatureCollection features, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - cachedObject = obj; - } - return obj; - } - - public static T GetOrCreate( - IFeatureCollection features, - Func factory) - where T : class - { - T obj = features.Get(); - if (obj == null) - { - obj = factory(); - features.Set(obj); - } - - return obj; - } - - - public static T GetOrCreateAndCache( - IFeatureCache cache, - IFeatureCollection features, - Func factory, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - if (obj == null) - { - obj = factory(); - } - cachedObject = obj; - features.Set(obj); - cache.SetFeaturesRevision(); - } - return obj; - } - - public static T GetOrCreateAndCache( - IFeatureCache cache, - IFeatureCollection features, - Func factory, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - if (obj == null) - { - obj = factory(features); - } - cachedObject = obj; - features.Set(obj); - cache.SetFeaturesRevision(); - } - return obj; - } - - public static T GetOrCreateAndCache( - IFeatureCache cache, - IFeatureCollection features, - HttpRequest request, - Func factory, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - if (obj == null) - { - obj = factory(request); - } - cachedObject = obj; - features.Set(obj); - cache.SetFeaturesRevision(); - } - return obj; - } - } -} diff --git a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs deleted file mode 100644 index 14a220d8d5..0000000000 --- a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http.Features -{ - internal interface IFeatureCache - { - void CheckFeaturesRevision(); - void SetFeaturesRevision(); - } -} diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 6d404a54ae..73450ad58f 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -7,12 +7,9 @@ using Microsoft.AspNet.WebUtilities; namespace Microsoft.AspNet.Http.Features.Internal { - public class QueryFeature : IQueryFeature, IFeatureCache + public class QueryFeature : IQueryFeature { - private readonly IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; + private FeatureReferences _features; private string _original; private IQueryCollection _parsedValues; @@ -34,34 +31,17 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new ArgumentNullException(nameof(features)); } - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() - { - if (_cachedFeaturesRevision != _features.Revision) - { - _request = null; - ((IFeatureCache)this).SetFeaturesRevision(); - } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache, f => null); public IQueryCollection Query { get { - if (_features == null) + if (_features.Collection == null) { if (_parsedValues == null) { @@ -91,7 +71,7 @@ namespace Microsoft.AspNet.Http.Features.Internal set { _parsedValues = value; - if (_features != null) + if (_features.Collection != null) { if (value == null) { diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 811b3e836c..4fb087e9ab 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -9,13 +9,9 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal { - public class RequestCookiesFeature : IRequestCookiesFeature, IFeatureCache + public class RequestCookiesFeature : IRequestCookiesFeature { - private readonly IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; - + private FeatureReferences _features; private StringValues _original; private IRequestCookieCollection _parsedValues; @@ -36,34 +32,17 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new ArgumentNullException(nameof(features)); } - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() - { - if (_cachedFeaturesRevision != _features.Revision) - { - _request = null; - ((IFeatureCache)this).SetFeaturesRevision(); - } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache, f => null); public IRequestCookieCollection Cookies { get { - if (_features == null) + if (_features.Collection == null) { if (_parsedValues == null) { @@ -91,7 +70,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { _parsedValues = value; _original = StringValues.Empty; - if (_features != null) + if (_features.Collection != null) { if (_parsedValues == null || _parsedValues.Count == 0) { diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index caea7e4ec0..0c87dc2833 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -5,38 +5,18 @@ using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { - public class ResponseCookiesFeature : IResponseCookiesFeature, IFeatureCache + public class ResponseCookiesFeature : IResponseCookiesFeature { - private readonly IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpResponseFeature _response; + private FeatureReferences _features; private IResponseCookies _cookiesCollection; public ResponseCookiesFeature(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() - { - if (_cachedFeaturesRevision != _features.Revision) - { - _response = null; - ((IFeatureCache)this).SetFeaturesRevision(); - } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - private IHttpResponseFeature HttpResponseFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } - } + private IHttpResponseFeature HttpResponseFeature => + _features.Fetch(ref _features.Cache, f => null); public IResponseCookies Cookies { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 01fbd73d67..a3239619a2 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -154,68 +154,63 @@ namespace Microsoft.AspNet.Http.Internal public void UpdateFeatures_ClearsCachedFeatures() { var features = new FeatureCollection(); - - var context = new DefaultHttpContext(features); - - var request = (DefaultHttpRequest)context.Request; - var response = (DefaultHttpResponse)context.Response; - - var authentication = (DefaultAuthenticationManager)context.Authentication; - var connection = (DefaultConnectionInfo)context.Connection; - var websockets = (DefaultWebSocketManager)context.WebSockets; - - Assert.Equal(0, features.Count()); - - TestCachedFeaturesAreNull(context.GetType(), context, features); - TestCachedFeaturesAreNull(request.GetType(), request, features); - TestCachedFeaturesAreNull(response.GetType(), response, features); - TestCachedFeaturesAreNull(authentication.GetType(), authentication, features); - TestCachedFeaturesAreNull(connection.GetType(), connection, features); - TestCachedFeaturesAreNull(websockets.GetType(), websockets, features); - - context.Session = new TestSession(); features.Set(new HttpRequestFeature()); features.Set(new HttpResponseFeature()); features.Set(new TestHttpWebSocketFeature()); - TestCachedFeaturesAreSet(context.GetType(), context, features); - TestCachedFeaturesAreSet(request.GetType(), request, features); - TestCachedFeaturesAreSet(response.GetType(), response, features); - TestCachedFeaturesAreSet(authentication.GetType(), authentication, features); - TestCachedFeaturesAreSet(connection.GetType(), connection, features); - TestCachedFeaturesAreSet(websockets.GetType(), websockets, features); + var context = new DefaultHttpContext(features); - Assert.NotEqual(0, features.Count()); - - var newFeatures = new FeatureCollection(); - context.UpdateFeatures(newFeatures); - - Assert.Equal(0, newFeatures.Count()); - - TestCachedFeaturesAreNull(context.GetType(), context, newFeatures); - TestCachedFeaturesAreNull(request.GetType(), request, newFeatures); - TestCachedFeaturesAreNull(response.GetType(), response, newFeatures); - TestCachedFeaturesAreNull(authentication.GetType(), authentication, newFeatures); - TestCachedFeaturesAreNull(connection.GetType(), connection, newFeatures); - TestCachedFeaturesAreNull(websockets.GetType(), websockets, newFeatures); + Assert.Equal(3, features.Count()); + TestCachedFeaturesAreNull(context, features); + TestCachedFeaturesAreNull(context.Request, features); + TestCachedFeaturesAreNull(context.Response, features); + TestCachedFeaturesAreNull(context.Authentication, features); + TestCachedFeaturesAreNull(context.Connection, features); + TestCachedFeaturesAreNull(context.WebSockets, features); + context.Session = new TestSession(); + + TestCachedFeaturesAreSet(context, features); + TestCachedFeaturesAreSet(context.Request, features); + TestCachedFeaturesAreSet(context.Response, features); + TestCachedFeaturesAreSet(context.Authentication, features); + TestCachedFeaturesAreSet(context.Connection, features); + TestCachedFeaturesAreSet(context.WebSockets, features); + + Assert.NotEqual(3, features.Count()); + + context.Uninitialize(); + var newFeatures = new FeatureCollection(); newFeatures.Set(new HttpRequestFeature()); newFeatures.Set(new HttpResponseFeature()); newFeatures.Set(new TestHttpWebSocketFeature()); + context.Initialize(newFeatures); - TestCachedFeaturesAreSet(context.GetType(), context, newFeatures); - TestCachedFeaturesAreSet(request.GetType(), request, newFeatures); - TestCachedFeaturesAreSet(response.GetType(), response, newFeatures); - TestCachedFeaturesAreSet(authentication.GetType(), authentication, newFeatures); - TestCachedFeaturesAreSet(connection.GetType(), connection, newFeatures); - TestCachedFeaturesAreSet(websockets.GetType(), websockets, newFeatures); + Assert.Equal(3, newFeatures.Count()); - Assert.NotEqual(0, newFeatures.Count()); + TestCachedFeaturesAreNull(context, newFeatures); + TestCachedFeaturesAreNull(context.Request, newFeatures); + TestCachedFeaturesAreNull(context.Response, newFeatures); + TestCachedFeaturesAreNull(context.Authentication, newFeatures); + TestCachedFeaturesAreNull(context.Connection, newFeatures); + TestCachedFeaturesAreNull(context.WebSockets, newFeatures); + + context.Session = new TestSession(); + + TestCachedFeaturesAreSet(context, newFeatures); + TestCachedFeaturesAreSet(context.Request, newFeatures); + TestCachedFeaturesAreSet(context.Response, newFeatures); + TestCachedFeaturesAreSet(context.Authentication, newFeatures); + TestCachedFeaturesAreSet(context.Connection, newFeatures); + TestCachedFeaturesAreSet(context.WebSockets, newFeatures); + + Assert.NotEqual(3, newFeatures.Count()); } - void TestCachedFeaturesAreNull(Type type, object value, IFeatureCollection features) + void TestCachedFeaturesAreNull(object value, IFeatureCollection features) { + var type = value.GetType(); var fields = type .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) @@ -234,8 +229,10 @@ namespace Microsoft.AspNet.Http.Internal } } - void TestCachedFeaturesAreSet(Type type, object value, IFeatureCollection features) + void TestCachedFeaturesAreSet(object value, IFeatureCollection features) { + var type = value.GetType(); + var properties = type .GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance) .Where(p => p.PropertyType.GetTypeInfo().IsInterface); @@ -274,6 +271,7 @@ namespace Microsoft.AspNet.Http.Internal { if (property.Name.Contains("Feature")) { + Console.WriteLine($"{value.GetType().Name} {property.Name}"); var v = property.GetValue(value); Assert.Same(features[property.PropertyType], v); Assert.NotNull(v); From c05c203c289ebc38dfbb7496199b6baad7d1bb75 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:02:05 -0800 Subject: [PATCH 466/846] Adding example of what http context pooling might look like --- samples/SampleApp/PooledHttpContext.cs | 54 +++++++++++++++ samples/SampleApp/PooledHttpContextFactory.cs | 65 +++++++++++++++++++ .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 2 +- 4 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 samples/SampleApp/PooledHttpContext.cs create mode 100644 samples/SampleApp/PooledHttpContextFactory.cs diff --git a/samples/SampleApp/PooledHttpContext.cs b/samples/SampleApp/PooledHttpContext.cs new file mode 100644 index 0000000000..7736085eac --- /dev/null +++ b/samples/SampleApp/PooledHttpContext.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; + +namespace SampleApp +{ + public class PooledHttpContext : DefaultHttpContext + { + DefaultHttpRequest _pooledHttpRequest; + DefaultHttpResponse _pooledHttpResponse; + + public PooledHttpContext(IFeatureCollection featureCollection) : + base(featureCollection) + { + } + + protected override HttpRequest InitializeHttpRequest() + { + if (_pooledHttpRequest != null) + { + _pooledHttpRequest.Initialize(this, Features); + return _pooledHttpRequest; + } + + return new DefaultHttpRequest(this, Features); + } + + protected override void UninitializeHttpRequest(HttpRequest instance) + { + _pooledHttpRequest = instance as DefaultHttpRequest; + _pooledHttpRequest?.Uninitialize(); + } + + protected override HttpResponse InitializeHttpResponse() + { + if (_pooledHttpResponse != null) + { + _pooledHttpResponse.Initialize(this, Features); + return _pooledHttpResponse; + } + + return new DefaultHttpResponse(this, Features); + } + + protected override void UninitializeHttpResponse(HttpResponse instance) + { + _pooledHttpResponse = instance as DefaultHttpResponse; + _pooledHttpResponse?.Uninitialize(); + } + } +} \ No newline at end of file diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/samples/SampleApp/PooledHttpContextFactory.cs new file mode 100644 index 0000000000..62955d90f8 --- /dev/null +++ b/samples/SampleApp/PooledHttpContextFactory.cs @@ -0,0 +1,65 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; + +namespace SampleApp +{ + public class PooledHttpContextFactory : IHttpContextFactory + { + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly Stack _pool = new Stack(); + + public PooledHttpContextFactory(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public HttpContext Create(IFeatureCollection featureCollection) + { + PooledHttpContext httpContext = null; + lock (_pool) + { + if (_pool.Count != 0) + { + httpContext = _pool.Pop(); + } + } + + if (httpContext == null) + { + httpContext = new PooledHttpContext(featureCollection); + } + else + { + httpContext.Initialize(featureCollection); + } + + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = httpContext; + } + return httpContext; + } + + public void Dispose(HttpContext httpContext) + { + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = null; + } + + var pooled = httpContext as PooledHttpContext; + if (pooled != null) + { + pooled.Uninitialize(); + lock (_pool) + { + _pool.Push(pooled); + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index e03f93c83c..f8890e7345 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Http.Internal private HttpContext _context; private FeatureReferences _features; - public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) + public DefaultHttpRequest(HttpContext context, IFeatureCollection features) { Initialize(context, features); } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 901e17cbfe..a9cb49cbdf 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http.Internal private HttpContext _context; private FeatureReferences _features; - public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) + public DefaultHttpResponse(HttpContext context, IFeatureCollection features) { Initialize(context, features); } From 4265855652a365f6e350f080a985cf3544441a55 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:35:41 -0800 Subject: [PATCH 467/846] PR feedback Adding comment about reason for public field --- .../FeatureReferences.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs index 75fcacc0db..30d7c3638f 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs @@ -14,9 +14,14 @@ namespace Microsoft.AspNet.Http.Features Revision = collection.Revision; } - public readonly IFeatureCollection Collection; - public int Revision; - public TCache Cache; + public IFeatureCollection Collection { get; private set; } + public int Revision { get; private set; } + + // cache is a public field because the code calling Fetch must + // be able to pass ref values that "dot through" the TCache struct memory, + // if it was a Property then that getter would return a copy of the memory + // preventing the use of "ref" + public TCache Cache; public TFeature Fetch( ref TFeature cached, From 290ff2a26829bf33750eb111e4558539de9077a8 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:37:07 -0800 Subject: [PATCH 468/846] PR feedback --- src/Microsoft.AspNet.Http/DefaultHttpRequest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index f8890e7345..5d3a2875f5 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Http.Internal _features.Fetch(ref _features.Cache.Query, f => new QueryFeature(f)); private IFormFeature FormFeature => - _features.Fetch(ref _features.Cache.Form, this, self => new FormFeature(self)); + _features.Fetch(ref _features.Cache.Form, this, f => new FormFeature(f)); private IRequestCookiesFeature RequestCookiesFeature => _features.Fetch(ref _features.Cache.Cookies, f => new RequestCookiesFeature(f)); From 35d71068d4e08edd5b13303f29ba6d98e62a9871 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:46:20 -0800 Subject: [PATCH 469/846] PR feedback --- test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index a3239619a2..a529c7fb08 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -271,7 +271,6 @@ namespace Microsoft.AspNet.Http.Internal { if (property.Name.Contains("Feature")) { - Console.WriteLine($"{value.GetType().Name} {property.Name}"); var v = property.GetValue(value); Assert.Same(features[property.PropertyType], v); Assert.NotNull(v); From c95d816c1dca5ad8e4db8da17fa0ea4ad148822c Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 17 Dec 2015 11:18:44 -0800 Subject: [PATCH 470/846] Updating unit test to probe _features cache field state --- .../DefaultHttpContextTests.cs | 104 +++++++++--------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index a529c7fb08..74bda1a613 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Http.Internal items["foo"] = item; Assert.Same(item, context.Items["foo"]); } - + [Fact] public void UpdateFeatures_ClearsCachedFeatures() { @@ -158,75 +158,73 @@ namespace Microsoft.AspNet.Http.Internal features.Set(new HttpResponseFeature()); features.Set(new TestHttpWebSocketFeature()); + // featurecollection is set. all cached interfaces are null. var context = new DefaultHttpContext(features); - + TestAllCachedFeaturesAreNull(context, features); Assert.Equal(3, features.Count()); + // getting feature properties populates feature collection with defaults + TestAllCachedFeaturesAreSet(context, features); + Assert.NotEqual(3, features.Count()); + + // featurecollection is null. and all cached interfaces are null. + // only top level is tested because child objects are inaccessible. + context.Uninitialize(); + TestCachedFeaturesAreNull(context, null); + + + var newFeatures = new FeatureCollection(); + newFeatures.Set(new HttpRequestFeature()); + newFeatures.Set(new HttpResponseFeature()); + newFeatures.Set(new TestHttpWebSocketFeature()); + + // featurecollection is set to newFeatures. all cached interfaces are null. + context.Initialize(newFeatures); + TestAllCachedFeaturesAreNull(context, newFeatures); + Assert.Equal(3, newFeatures.Count()); + + // getting feature properties populates new feature collection with defaults + TestAllCachedFeaturesAreSet(context, newFeatures); + Assert.NotEqual(3, newFeatures.Count()); + } + + void TestAllCachedFeaturesAreNull(HttpContext context, IFeatureCollection features) + { TestCachedFeaturesAreNull(context, features); TestCachedFeaturesAreNull(context.Request, features); TestCachedFeaturesAreNull(context.Response, features); TestCachedFeaturesAreNull(context.Authentication, features); TestCachedFeaturesAreNull(context.Connection, features); TestCachedFeaturesAreNull(context.WebSockets, features); - - context.Session = new TestSession(); - - TestCachedFeaturesAreSet(context, features); - TestCachedFeaturesAreSet(context.Request, features); - TestCachedFeaturesAreSet(context.Response, features); - TestCachedFeaturesAreSet(context.Authentication, features); - TestCachedFeaturesAreSet(context.Connection, features); - TestCachedFeaturesAreSet(context.WebSockets, features); - - Assert.NotEqual(3, features.Count()); - - context.Uninitialize(); - var newFeatures = new FeatureCollection(); - newFeatures.Set(new HttpRequestFeature()); - newFeatures.Set(new HttpResponseFeature()); - newFeatures.Set(new TestHttpWebSocketFeature()); - context.Initialize(newFeatures); - - Assert.Equal(3, newFeatures.Count()); - - TestCachedFeaturesAreNull(context, newFeatures); - TestCachedFeaturesAreNull(context.Request, newFeatures); - TestCachedFeaturesAreNull(context.Response, newFeatures); - TestCachedFeaturesAreNull(context.Authentication, newFeatures); - TestCachedFeaturesAreNull(context.Connection, newFeatures); - TestCachedFeaturesAreNull(context.WebSockets, newFeatures); - - context.Session = new TestSession(); - - TestCachedFeaturesAreSet(context, newFeatures); - TestCachedFeaturesAreSet(context.Request, newFeatures); - TestCachedFeaturesAreSet(context.Response, newFeatures); - TestCachedFeaturesAreSet(context.Authentication, newFeatures); - TestCachedFeaturesAreSet(context.Connection, newFeatures); - TestCachedFeaturesAreSet(context.WebSockets, newFeatures); - - Assert.NotEqual(3, newFeatures.Count()); } void TestCachedFeaturesAreNull(object value, IFeatureCollection features) { var type = value.GetType(); - var fields = type + var field = type .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) - .Where(f => f.FieldType.GetTypeInfo().IsInterface); + .Single(f => + f.FieldType.GetTypeInfo().IsGenericType && + f.FieldType.GetGenericTypeDefinition() == typeof(FeatureReferences<>)); - foreach (var field in fields) - { - if (field.FieldType == typeof(IFeatureCollection)) - { - Assert.Same(features, field.GetValue(value)); - } - else - { - Assert.Null(field.GetValue(value)); - } - } + var boxedExpectedStruct = features == null ? + Activator.CreateInstance(field.FieldType) : + Activator.CreateInstance(field.FieldType, features); + + var boxedActualStruct = field.GetValue(value); + + Assert.Equal(boxedExpectedStruct, boxedActualStruct); + } + + void TestAllCachedFeaturesAreSet(HttpContext context, IFeatureCollection features) + { + TestCachedFeaturesAreSet(context, features); + TestCachedFeaturesAreSet(context.Request, features); + TestCachedFeaturesAreSet(context.Response, features); + TestCachedFeaturesAreSet(context.Authentication, features); + TestCachedFeaturesAreSet(context.Connection, features); + TestCachedFeaturesAreSet(context.WebSockets, features); } void TestCachedFeaturesAreSet(object value, IFeatureCollection features) From 1a485fadb0941ed71393f30a105789208e6ee811 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 21 Dec 2015 15:04:10 -0800 Subject: [PATCH 471/846] OptionsModel => Options --- .../EncoderServiceCollectionExtensions.cs | 2 +- src/Microsoft.Extensions.WebEncoders/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs index c2327d330d..7ef6fe8fe9 100644 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ using System; using System.Text.Encodings.Web; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.Options; using Microsoft.Extensions.WebEncoders; namespace Microsoft.Extensions.DependencyInjection diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index d020a87412..0facfeeb8c 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -12,7 +12,7 @@ }, "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Extensions.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.Options": "1.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { From ee804e58412278c9d34dc114957ca17c1b248111 Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 22 Dec 2015 16:01:31 -0800 Subject: [PATCH 472/846] Register FileBufferingReadStream for disposal --- src/Microsoft.AspNet.Http/BufferingHelper.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index e56d73e5cf..03c3db188f 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -48,9 +48,9 @@ namespace Microsoft.AspNet.Http.Internal var body = request.Body; if (!body.CanSeek) { - // TODO: Register this buffer for disposal at the end of the request to ensure the temp file is deleted. - // Otherwise it won't get deleted until GC closes the stream. - request.Body = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); + var fileStream = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); + request.Body = fileStream; + request.HttpContext.Response.RegisterForDispose(fileStream); } return request; } From 161d6ca5c0a70abf50b6ebbc0bca7a04b1d56b6d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 22 Dec 2015 15:25:45 -0800 Subject: [PATCH 473/846] Move Microsoft.Extensions.WebEncoders to HtmlAbstractions Fixes #512 --- HttpAbstractions.sln | 30 ----- NuGetPackageVerifier.json | 1 - .../EncoderServiceCollectionExtensions.cs | 63 ----------- .../EncoderServiceProviderExtensions.cs | 50 --------- .../Microsoft.Extensions.WebEncoders.xproj | 17 --- .../Properties/AssemblyInfo.cs | 8 -- .../Testing/HtmlTestEncoder.cs | 104 ------------------ .../Testing/JavaScriptTestEncoder.cs | 104 ------------------ .../Testing/UrlTestEncoder.cs | 104 ------------------ .../WebEncoderOptions.cs | 21 ---- .../project.json | 27 ----- .../project.json | 29 +++-- ...EncoderServiceCollectionExtensionsTests.cs | 90 --------------- .../EncoderServiceProviderExtensionsTests.cs | 103 ----------------- .../HtmlTestEncoderTest.cs | 26 ----- ...crosoft.Extensions.WebEncoders.Tests.xproj | 20 ---- .../project.json | 24 ---- 17 files changed, 17 insertions(+), 804 deletions(-) delete mode 100644 src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj delete mode 100644 src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/project.json delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 9e07d734d8..e510c8c96e 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -34,10 +34,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.xproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders", "src\Microsoft.Extensions.WebEncoders\Microsoft.Extensions.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" @@ -196,30 +192,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.ActiveCfg = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.Build.0 = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.Build.0 = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.Build.0 = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.ActiveCfg = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.Build.0 = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.ActiveCfg = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.Build.0 = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.Build.0 = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -251,8 +223,6 @@ Global {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} EndGlobalSection EndGlobal diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 406f44c6a3..adea61d7de 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -15,7 +15,6 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, - "Microsoft.Extensions.WebEncoders": { }, "Microsoft.Net.Http.Headers": { } } }, diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs deleted file mode 100644 index 7ef6fe8fe9..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text.Encodings.Web; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Options; -using Microsoft.Extensions.WebEncoders; - -namespace Microsoft.Extensions.DependencyInjection -{ - public static class EncoderServiceCollectionExtensions - { - public static IServiceCollection AddWebEncoders(this IServiceCollection services) - { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } - - return AddWebEncoders(services, configureOptions: null); - } - - public static IServiceCollection AddWebEncoders(this IServiceCollection services, Action configureOptions) - { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } - - services.AddOptions(); - - // Register the default encoders - // We want to call the 'Default' property getters lazily since they perform static caching - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => HtmlEncoder.Default, settings => HtmlEncoder.Create(settings)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => JavaScriptEncoder.Default, settings => JavaScriptEncoder.Create(settings)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => UrlEncoder.Default, settings => UrlEncoder.Create(settings)))); - - if (configureOptions != null) - { - services.Configure(configureOptions); - } - - return services; - } - - private static Func CreateFactory( - Func defaultFactory, - Func customSettingsFactory) - { - return serviceProvider => - { - var settings = serviceProvider?.GetService>()? - .Value? - .TextEncoderSettings; - return (settings != null) ? customSettingsFactory(settings) : defaultFactory(); - }; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs deleted file mode 100644 index 8d9d2da4e8..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains extension methods for fetching encoders from an . - /// - public static class EncoderServiceProviderExtensions - { - /// - /// Retrieves an from an . - /// - /// - /// This method is guaranteed never to return null. - /// It will return a default encoder instance if does not contain one or is null. - /// - public static HtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) - { - return (HtmlEncoder)serviceProvider?.GetService(typeof(HtmlEncoder)) ?? HtmlEncoder.Default; - } - - /// - /// Retrieves an from an . - /// - /// - /// This method is guaranteed never to return null. - /// It will return a default encoder instance if does not contain one or is null. - /// - public static JavaScriptEncoder GetJavaScriptEncoder(this IServiceProvider serviceProvider) - { - return (JavaScriptEncoder)serviceProvider?.GetService(typeof(JavaScriptEncoder)) ?? JavaScriptEncoder.Default; - } - - /// - /// Retrieves an from an . - /// - /// - /// This method is guaranteed never to return null. - /// It will return a default encoder instance if does not contain one or is null. - /// - public static UrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) - { - return (UrlEncoder)serviceProvider?.GetService(typeof(UrlEncoder)) ?? UrlEncoder.Default; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj b/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj deleted file mode 100644 index 084e7901ea..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - dd2ce416-765e-4000-a03e-c2ff165da1b6 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs deleted file mode 100644 index b2437d9ad6..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs deleted file mode 100644 index 162ce4f6c1..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - /// - /// Encoder used for unit testing. - /// - public sealed class HtmlTestEncoder : HtmlEncoder - { - public override int MaxOutputCharactersPerInputCharacter - { - get { return 1; } - } - - public override string Encode(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (value.Length == 0) - { - return string.Empty; - } - - return $"HtmlEncode[[{value}]]"; - } - - public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("HtmlEncode[["); - output.Write(value, startIndex, characterCount); - output.Write("]]"); - } - - public override void Encode(TextWriter output, string value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("HtmlEncode[["); - output.Write(value.Substring(startIndex, characterCount)); - output.Write("]]"); - } - - public override bool WillEncode(int unicodeScalar) - { - return false; - } - - public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) - { - return -1; - } - - public override unsafe bool TryEncodeUnicodeScalar( - int unicodeScalar, - char* buffer, - int bufferLength, - out int numberOfCharactersWritten) - { - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - - numberOfCharactersWritten = 0; - return false; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs deleted file mode 100644 index bef4461676..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - /// - /// Encoder used for unit testing. - /// - public class JavaScriptTestEncoder : JavaScriptEncoder - { - public override int MaxOutputCharactersPerInputCharacter - { - get { return 1; } - } - - public override string Encode(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (value.Length == 0) - { - return string.Empty; - } - - return $"JavaScriptEncode[[{value}]]"; - } - - public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("JavaScriptEncode[["); - output.Write(value, startIndex, characterCount); - output.Write("]]"); - } - - public override void Encode(TextWriter output, string value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("JavaScriptEncode[["); - output.Write(value.Substring(startIndex, characterCount)); - output.Write("]]"); - } - - public override bool WillEncode(int unicodeScalar) - { - return false; - } - - public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) - { - return -1; - } - - public override unsafe bool TryEncodeUnicodeScalar( - int unicodeScalar, - char* buffer, - int bufferLength, - out int numberOfCharactersWritten) - { - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - - numberOfCharactersWritten = 0; - return false; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs deleted file mode 100644 index 295bda63e8..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - /// - /// Encoder used for unit testing. - /// - public class UrlTestEncoder : UrlEncoder - { - public override int MaxOutputCharactersPerInputCharacter - { - get { return 1; } - } - - public override string Encode(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (value.Length == 0) - { - return string.Empty; - } - - return $"UrlEncode[[{value}]]"; - } - - public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("UrlEncode[["); - output.Write(value, startIndex, characterCount); - output.Write("]]"); - } - - public override void Encode(TextWriter output, string value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("UrlEncode[["); - output.Write(value.Substring(startIndex, characterCount)); - output.Write("]]"); - } - - public override bool WillEncode(int unicodeScalar) - { - return false; - } - - public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) - { - return -1; - } - - public override unsafe bool TryEncodeUnicodeScalar( - int unicodeScalar, - char* buffer, - int bufferLength, - out int numberOfCharactersWritten) - { - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - - numberOfCharactersWritten = 0; - return false; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs deleted file mode 100644 index 2f5e770a0c..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Specifies options common to all three encoders (HtmlEncode, JavaScriptEncode, UrlEncode). - /// - public sealed class WebEncoderOptions - { - /// - /// Specifies which code points are allowed to be represented unescaped by the encoders. - /// - /// - /// If this property is null, then the encoders will use their default allow lists. - /// - public TextEncoderSettings TextEncoderSettings { get; set; } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json deleted file mode 100644 index 0facfeeb8c..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "Contains registration and configuration APIs for the core framework encoders.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true, - "allowUnsafe": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Extensions.Options": "1.0.0-*", - "System.Text.Encodings.Web": "4.0.0-*" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.IO": "", - "System.Runtime": "" - } - }, - "dotnet5.4": {} - } -} diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 29994be207..b56d4034ca 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,15 +1,20 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dependencies": { + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Text.Encoding.Extensions": "4.0.11-*" + } } + } } diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs deleted file mode 100644 index 8e060102bb..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Text.Encodings.Web; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.WebEncoders.Testing; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderServiceCollectionExtensionsTests - { - [Fact] - public void AddWebEncoders_WithoutOptions_RegistersDefaultEncoders() - { - // Arrange - var serviceCollection = new ServiceCollection(); - - // Act - serviceCollection.AddWebEncoders(); - - // Assert - var serviceProvider = serviceCollection.BuildServiceProvider(); - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - } - - [Fact] - public void AddWebEncoders_WithOptions_RegistersEncodersWithCustomCodeFilter() - { - // Arrange - var serviceCollection = new ServiceCollection(); - - // Act - serviceCollection.AddWebEncoders(options => - { - options.TextEncoderSettings = new TextEncoderSettings(); - options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed - }); - - // Assert - var serviceProvider = serviceCollection.BuildServiceProvider(); - - var htmlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("abcde", htmlEncoder.Encode("abcde")); - Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance - - var javaScriptEncoder = serviceProvider.GetRequiredService(); - Assert.Equal(@"a\u0062c\u0064e", javaScriptEncoder.Encode("abcde")); - Assert.Same(javaScriptEncoder, serviceProvider.GetRequiredService()); // as singleton instance - - var urlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); - Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance - } - - [Fact] - public void AddWebEncoders_DoesNotOverrideExistingRegisteredEncoders() - { - // Arrange - var serviceCollection = new ServiceCollection(); - - // Act - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - // we don't register an existing URL encoder - serviceCollection.AddWebEncoders(options => - { - options.TextEncoderSettings = new TextEncoderSettings(); - options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed - }); - - // Assert - var serviceProvider = serviceCollection.BuildServiceProvider(); - - var htmlEncoder = serviceProvider.GetHtmlEncoder(); - Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.Encode("abcde")); - - var javaScriptEncoder = serviceProvider.GetJavaScriptEncoder(); - Assert.Equal("JavaScriptEncode[[abcde]]", javaScriptEncoder.Encode("abcde")); - - var urlEncoder = serviceProvider.GetUrlEncoder(); - Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs deleted file mode 100644 index 01492e759e..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text.Encodings.Web; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderServiceProviderExtensionsTests - { - [Fact] - public void GetHtmlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() - { - // Arrange - var serviceProvider = new TestServiceProvider(); - - // Act - var retVal = serviceProvider.GetHtmlEncoder(); - - // Assert - Assert.Same(HtmlEncoder.Default, retVal); - } - - [Fact] - public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() - { - // Arrange - var expectedEncoder = HtmlEncoder.Default; - var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; - - // Act - var retVal = serviceProvider.GetHtmlEncoder(); - - // Assert - Assert.Same(expectedEncoder, retVal); - } - - [Fact] - public void GetJavaScriptEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() - { - // Arrange - var serviceProvider = new TestServiceProvider(); - - // Act - var retVal = serviceProvider.GetJavaScriptEncoder(); - - // Assert - Assert.Same(JavaScriptEncoder.Default, retVal); - } - - [Fact] - public void GetJavaScriptEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() - { - // Arrange - var expectedEncoder = JavaScriptEncoder.Default; - var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; - - // Act - var retVal = serviceProvider.GetJavaScriptEncoder(); - - // Assert - Assert.Same(expectedEncoder, retVal); - } - - [Fact] - public void GetUrlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() - { - // Arrange - var serviceProvider = new TestServiceProvider(); - - // Act - var retVal = serviceProvider.GetUrlEncoder(); - - // Assert - Assert.Same(UrlEncoder.Default, retVal); - } - - [Fact] - public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() - { - // Arrange - var expectedEncoder = UrlEncoder.Default; - var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; - - // Act - var retVal = serviceProvider.GetUrlEncoder(); - - // Assert - Assert.Same(expectedEncoder, retVal); - } - - private class TestServiceProvider : IServiceProvider - { - public object Service { get; set; } - - public object GetService(Type serviceType) - { - return Service; - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs deleted file mode 100644 index baafedc4de..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Xunit; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - public class HtmlTestEncoderTest - { - [Theory] - [InlineData("", "")] - [InlineData("abcd", "HtmlEncode[[abcd]]")] - [InlineData("<<''\"\">>", "HtmlEncode[[<<''\"\">>]]")] - public void StringEncode_EncodesAsExpected(string input, string expectedOutput) - { - // Arrange - var encoder = new HtmlTestEncoder(); - - // Act - var output = encoder.Encode(input); - - // Assert - Assert.Equal(expectedOutput, output); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj b/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj deleted file mode 100644 index 9b0698e3cc..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 7ae2731d-43cd-4cf8-850a-4914de2ce930 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json deleted file mode 100644 index 4d81779a7c..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "Microsoft.Extensions.WebEncoders": "1.0.0-*", - "Newtonsoft.Json": "6.0.6", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "compilationOptions": { - "allowUnsafe": true, - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Text.Encoding.Extensions": "4.0.11-*" - } - } - } -} From 62ec29b6af32e229c64f2f1410215109d8d2b8a0 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 31 Dec 2015 20:18:24 +0000 Subject: [PATCH 474/846] Move generic Get/Set into Interface --- .../FeatureCollection.cs | 10 +++++++ .../FeatureCollectionExtensions.cs | 30 ------------------- .../IFeatureCollection.cs | 14 +++++++++ .../OwinFeatureCollection.cs | 10 +++++++ 4 files changed, 34 insertions(+), 30 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 246af4d183..79e6916752 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -93,6 +93,16 @@ namespace Microsoft.AspNet.Http.Features } } + public TFeature Get() + { + return (TFeature)this[typeof(TFeature)]; + } + + public void Set(TFeature instance) + { + this[typeof(TFeature)] = instance; + } + private class KeyComparer : IEqualityComparer> { public bool Equals(KeyValuePair x, KeyValuePair y) diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs deleted file mode 100644 index 86681fde3f..0000000000 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http.Features -{ - public static class FeatureCollectionExtensions - { - /// - /// Retrieves the requested feature from the collection. - /// - /// The feature key. - /// The collection. - /// The requested feature, or null if it is not present. - public static TFeature Get(this IFeatureCollection features) - { - return (TFeature)features[typeof(TFeature)]; - } - - /// - /// Sets the given feature in the collection. - /// - /// The feature key. - /// The collection. - /// The feature value. - public static void Set(this IFeatureCollection features, TFeature instance) - { - features[typeof(TFeature)] = instance; - } - } -} diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index c7ad165c66..454cafa3dc 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -27,5 +27,19 @@ namespace Microsoft.AspNet.Http.Features /// /// The requested feature, or null if it is not present. object this[Type key] { get; set; } + + /// + /// Retrieves the requested feature from the collection. + /// + /// The feature key. + /// The requested feature, or null if it is not present. + TFeature Get(); + + /// + /// Sets the given feature in the collection. + /// + /// The feature key. + /// The feature value. + void Set(TFeature instance); } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index acf3e2215c..1a1b5b183d 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -358,6 +358,16 @@ namespace Microsoft.AspNet.Owin throw new NotSupportedException(); } + public TFeature Get() + { + return (TFeature)this[typeof(TFeature)]; + } + + public void Set(TFeature instance) + { + this[typeof(TFeature)] = instance; + } + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); From e7bf0e71bb2ee6e08dca82d8d7485fc89e98d0b7 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 6 Jan 2016 15:41:21 -0800 Subject: [PATCH 475/846] Build with dotnet --- .gitattributes | 2 + .gitignore | 2 + .travis.yml | 8 ++- build.cmd | 68 +++++++++---------- build.sh | 47 +++++++------ .../project.json | 25 +++++-- .../project.json | 25 +++++-- .../project.json | 25 +++++-- test/Microsoft.AspNet.Http.Tests/project.json | 25 +++++-- test/Microsoft.AspNet.Owin.Tests/project.json | 25 +++++-- .../project.json | 16 ++++- .../project.json | 33 ++++++--- 12 files changed, 200 insertions(+), 101 deletions(-) diff --git a/.gitattributes b/.gitattributes index bdaa5ba982..c2f0f84273 100644 --- a/.gitattributes +++ b/.gitattributes @@ -48,3 +48,5 @@ *.fsproj text=auto *.dbproj text=auto *.sln text=auto eol=crlf + +*.sh eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore index ac82da7568..a2eb01c895 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ nuget.exe *.ipch *.sln.ide project.lock.json +.build/ +.testPublish/ diff --git a/.travis.yml b/.travis.yml index 2fc624899f..e8f77f0f14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,9 +10,11 @@ addons: - libssl-dev - libunwind8 - zlib1g -env: - - KOREBUILD_DNU_RESTORE_CORECLR=true mono: - 4.0.5 +os: + - linux + - osx +osx_image: xcode7.1 script: - - ./build.sh --quiet verify + - ./build.sh --quiet verify \ No newline at end of file diff --git a/build.cmd b/build.cmd index 553e3929a0..65fb3e3353 100644 --- a/build.cmd +++ b/build.cmd @@ -1,40 +1,40 @@ -@echo off -cd %~dp0 - +@ECHO off SETLOCAL + +SET REPO_FOLDER=%~dp0 +CD "%REPO_FOLDER%" + +SET BUILD_FOLDER=.build +SET KOREBUILD_FOLDER=%BUILD_FOLDER%\KoreBuild-dotnet +SET KOREBUILD_VERSION= + +SET NUGET_PATH=%BUILD_FOLDER%\NuGet.exe SET NUGET_VERSION=latest SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe -SET BUILDCMD_KOREBUILD_VERSION= -SET BUILDCMD_DNX_VERSION= -IF EXIST %CACHED_NUGET% goto copynuget -echo Downloading latest version of NuGet.exe... -IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" - -:copynuget -IF EXIST .nuget\nuget.exe goto restore -md .nuget -copy %CACHED_NUGET% .nuget\nuget.exe > nul - -:restore -IF EXIST packages\Sake goto getdnx -IF "%BUILDCMD_KOREBUILD_VERSION%"=="" ( - .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre -) ELSE ( - .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre -) -.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages - -:getdnx -IF "%BUILDCMD_DNX_VERSION%"=="" ( - SET BUILDCMD_DNX_VERSION=latest -) -IF "%SKIP_DNX_INSTALL%"=="" ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default - CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default -) ELSE ( - CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 +IF NOT EXIST %BUILD_FOLDER% ( + md %BUILD_FOLDER% ) -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* +IF NOT EXIST %NUGET_PATH% ( + IF NOT EXIST %CACHED_NUGET% ( + echo Downloading latest version of NuGet.exe... + IF NOT EXIST %LocalAppData%\NuGet ( + md %LocalAppData%\NuGet + ) + @powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" + ) + + copy %CACHED_NUGET% %NUGET_PATH% > nul +) + +IF NOT EXIST %KOREBUILD_FOLDER% ( + SET KOREBUILD_DOWNLOAD_ARGS= + IF NOT "%KOREBUILD_VERSION%"=="" ( + SET KOREBUILD_DOWNLOAD_ARGS=-version %KOREBUILD_VERSION% + ) + + %BUILD_FOLDER%\nuget.exe install KoreBuild-dotnet -ExcludeVersion -o %BUILD_FOLDER% -nocache -pre %KOREBUILD_DOWNLOAD_ARGS% +) + +"%KOREBUILD_FOLDER%\build\KoreBuild.cmd" %* diff --git a/build.sh b/build.sh index da4e3fcd1c..7b5e25e3a8 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,18 @@ #!/usr/bin/env bash +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +repoFolder="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +buildFolder=.build +koreBuildFolder=$buildFolder/KoreBuild-dotnet + +nugetPath=$buildFolder/nuget.exe + if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else @@ -11,33 +24,25 @@ else fi mkdir -p $cachedir nugetVersion=latest -cachePath=$cachedir/nuget.$nugetVersion.exe +cacheNuget=$cachedir/nuget.$nugetVersion.exe -url=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe +nugetUrl=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe -if test ! -f $cachePath; then - wget -O $cachePath $url 2>/dev/null || curl -o $cachePath --location $url /dev/null +if test ! -d $buildFolder; then + mkdir $buildFolder fi -if test ! -e .nuget; then - mkdir .nuget - cp $cachePath .nuget/nuget.exe +if test ! -f $nugetPath; then + if test ! -f $cacheNuget; then + wget -O $cacheNuget $nugetUrl 2>/dev/null || curl -o $cacheNuget --location $nugetUrl /dev/null + fi + + cp $cacheNuget $nugetPath fi -if test ! -d packages/Sake; then - mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages +if test ! -d $koreBuildFolder; then + mono $nugetPath install KoreBuild-dotnet -ExcludeVersion -o $buildFolder -nocache -pre fi -if ! type dnvm > /dev/null 2>&1; then - source packages/KoreBuild/build/dnvm.sh -fi +source $koreBuildFolder/build/KoreBuild.sh -if ! type dnx > /dev/null 2>&1 || [ -z "$SKIP_DNX_INSTALL" ]; then - dnvm install latest -runtime coreclr -alias default - dnvm install default -runtime mono -alias default -else - dnvm use default -runtime mono -fi - -mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json index f3e064f81e..59a67065bd 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json @@ -6,13 +6,26 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 2b7a5ed450..0cd3b99df0 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -3,13 +3,26 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Http.Features.Tests/project.json b/test/Microsoft.AspNet.Http.Features.Tests/project.json index 12e00145bc..64e3c2dc66 100644 --- a/test/Microsoft.AspNet.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Features.Tests/project.json @@ -1,13 +1,26 @@ { "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index cde6b4f819..e67bbdfc3a 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,13 +1,26 @@ { "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 9fc7f68ba0..4132c72275 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -3,13 +3,26 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index b56d4034ca..7fe1a5eec4 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,19 +1,29 @@ { "dependencies": { "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" + "xunit": "2.1.0" }, "compilationOptions": { "warningsAsErrors": true }, + "testRunner": "xunit", "commands": { "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { }, + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, "dnxcore50": { "dependencies": { - "System.Text.Encoding.Extensions": "4.0.11-*" + "System.Text.Encoding.Extensions": "4.0.11-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 4859085a96..59cea6aca6 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,14 +1,27 @@ { - "version": "1.0.0-*", - "dependencies": { - "Microsoft.Net.Http.Headers": "1.0.0-*", + "version": "1.0.0-*", + "dependencies": { + "Microsoft.Net.Http.Headers": "1.0.0-*", + "xunit": "2.1.0" + }, + "frameworks": { + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } + } } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" + } } From ca8136b73c1d2c840a56708616a9b377d35e6580 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 7 Jan 2016 10:27:36 -0800 Subject: [PATCH 476/846] Compile middleware invoke method when extra args are provided - Improves the performance when accessing scoped services in middleware --- .../Extensions/UseMiddlewareExtensions.cs | 117 +++++++++++++++--- .../Properties/Resources.Designer.cs | 56 +++++++-- .../Resources.resx | 6 + .../UseMiddlewareTest.cs | 79 +++++++++++- 4 files changed, 231 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 42dbc1cc5a..6cb4c1b004 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Http; @@ -16,7 +17,9 @@ namespace Microsoft.AspNet.Builder /// public static class UseMiddlewareExtensions { - const string InvokeMethodName = "Invoke"; + private const string InvokeMethodName = "Invoke"; + + private static readonly MethodInfo GetServiceInfo = typeof(UseMiddlewareExtensions).GetMethod(nameof(GetService), BindingFlags.NonPublic | BindingFlags.Static); /// /// Adds a middleware type to the application's request pipeline. @@ -49,7 +52,7 @@ namespace Microsoft.AspNet.Builder throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName)); } - if (invokeMethods.Length == 0) + if (invokeMethods.Length == 0) { throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName)); } @@ -63,15 +66,20 @@ namespace Microsoft.AspNet.Builder var parameters = methodinfo.GetParameters(); if (parameters.Length == 0 || parameters[0].ParameterType != typeof(HttpContext)) { - throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName,nameof(HttpContext))); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName, nameof(HttpContext))); } - var instance = ActivatorUtilities.CreateInstance(app.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var ctorArgs = new object[args.Length + 1]; + ctorArgs[0] = next; + Array.Copy(args, 0, ctorArgs, 1, args.Length); + var instance = ActivatorUtilities.CreateInstance(app.ApplicationServices, middleware, ctorArgs); if (parameters.Length == 1) { return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); } + var factory = Compile(methodinfo, parameters); + return context => { var serviceProvider = context.RequestServices ?? applicationServices; @@ -80,20 +88,97 @@ namespace Microsoft.AspNet.Builder throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); } - var arguments = new object[parameters.Length]; - arguments[0] = context; - for(var index = 1; index != parameters.Length; ++index) - { - var serviceType = parameters[index].ParameterType; - arguments[index] = serviceProvider.GetService(serviceType); - if (arguments[index] == null) - { - throw new Exception(string.Format("No service for type '{0}' has been registered.", serviceType)); - } - } - return (Task)methodinfo.Invoke(instance, arguments); + return factory(instance, context, serviceProvider); }; }); } + + private static Func Compile(MethodInfo methodinfo, ParameterInfo[] parameters) + { + + // If we call something like + // + // public class Middleware + // { + // public Task Invoke(HttpContext context, ILoggerFactory loggeryFactory) + // { + // + // } + // } + // + + // We'll end up with something like this: + // Generic version: + // + // Task Invoke(Middleware instance, HttpContext httpContext, IServiceprovider provider) + // { + // return instance.Invoke(httpContext, (ILoggerFactory)UseMiddlewareExtensions.GetService(provider, typeof(ILoggerFactory)); + // } + + // Non generic version: + // + // Task Invoke(object instance, HttpContext httpContext, IServiceprovider provider) + // { + // return ((Middleware)instance).Invoke(httpContext, (ILoggerFactory)UseMiddlewareExtensions.GetService(provider, typeof(ILoggerFactory)); + // } + + // context => + // { + // var serviceProvider = context.RequestServices ?? applicationServices; + // if (serviceProvider == null) + // { + // throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); + // } + // + // return Invoke(httpContext, serviceProvider); + // } + + var middleware = typeof(T); + + var httpContextArg = Expression.Parameter(typeof(HttpContext), "httpContext"); + var providerArg = Expression.Parameter(typeof(IServiceProvider), "serviceProvider"); + var instanceArg = Expression.Parameter(middleware, "middleware"); + + var methodArguments = new Expression[parameters.Length]; + methodArguments[0] = httpContextArg; + for (int i = 1; i < parameters.Length; i++) + { + var parameterType = parameters[i].ParameterType; + if (parameterType.IsByRef) + { + throw new NotSupportedException(Resources.FormatException_InvokeDoesNotSupportRefOrOutParams(InvokeMethodName)); + } + + var parameterTypeExpression = new Expression[] { + providerArg, + Expression.Constant(parameterType, typeof(Type)), + Expression.Constant(methodinfo.DeclaringType, typeof(Type)) + }; + methodArguments[i] = Expression.Convert(Expression.Call(GetServiceInfo, parameterTypeExpression), parameterType); + } + + Expression middlewareInstanceArg = instanceArg; + if (methodinfo.DeclaringType != typeof(T)) + { + middlewareInstanceArg = Expression.Convert(middlewareInstanceArg, methodinfo.DeclaringType); + } + + var body = Expression.Call(middlewareInstanceArg, methodinfo, methodArguments); + + var lambda = Expression.Lambda>(body, instanceArg, httpContextArg, providerArg); + + return lambda.Compile(); + } + + private static object GetService(IServiceProvider sp, Type type, Type middleware) + { + var service = sp.GetService(type); + if (service == null) + { + throw new InvalidOperationException(Resources.FormatException_InvokeMiddlewareNoService(type, middleware)); + } + + return service; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs index 82505c66e0..99f5b6bea3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs @@ -10,14 +10,6 @@ namespace Microsoft.AspNet.Http.Abstractions private static readonly ResourceManager _resourceManager = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); - /// - /// '{0}' is not available. - /// - internal static string FormatException_PathMustStartWithSlash(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); - } - /// /// '{0}' is not available. /// @@ -98,6 +90,54 @@ namespace Microsoft.AspNet.Http.Abstractions return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0); } + /// + /// The path in '{0}' must start with '/'. + /// + internal static string Exception_PathMustStartWithSlash + { + get { return GetString("Exception_PathMustStartWithSlash"); } + } + + /// + /// The path in '{0}' must start with '/'. + /// + internal static string FormatException_PathMustStartWithSlash(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); + } + + /// + /// Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. + /// + internal static string Exception_InvokeMiddlewareNoService + { + get { return GetString("Exception_InvokeMiddlewareNoService"); } + } + + /// + /// Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. + /// + internal static string FormatException_InvokeMiddlewareNoService(object p0, object p1) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeMiddlewareNoService"), p0, p1); + } + + /// + /// The '{0}' method must not have ref or out parameters. + /// + internal static string Exception_InvokeDoesNotSupportRefOrOutParams + { + get { return GetString("Exception_InvokeDoesNotSupportRefOrOutParams"); } + } + + /// + /// The '{0}' method must not have ref or out parameters. + /// + internal static string FormatException_InvokeDoesNotSupportRefOrOutParams(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeDoesNotSupportRefOrOutParams"), p0); + } + private static string GetString(string name, params string[] formatterNames) { var value = _resourceManager.GetString(name); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx index 1c947c352b..414bad847d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx @@ -135,4 +135,10 @@ The path in '{0}' must start with '/'. + + Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. + + + The '{0}' method must not have ref or out parameters. + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs index 1839631d61..ee407d35f8 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http.Abstractions; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Http @@ -20,7 +21,7 @@ namespace Microsoft.AspNet.Http builder.UseMiddleware(typeof(MiddlewareNoParametersStub)); var exception = Assert.Throws(() => builder.Build()); - Assert.Equal(Resources.FormatException_UseMiddlewareNoParameters("Invoke",nameof(HttpContext)), exception.Message); + Assert.Equal(Resources.FormatException_UseMiddlewareNoParameters("Invoke", nameof(HttpContext)), exception.Message); } [Fact] @@ -35,7 +36,7 @@ namespace Microsoft.AspNet.Http [Fact] public void UseMiddleware_NoInvokeMethod_ThrowsException() - { + { var mockServiceProvider = new DummyServiceProvider(); var builder = new ApplicationBuilder(mockServiceProvider); builder.UseMiddleware(typeof(MiddlewareNoInvokeStub)); @@ -53,14 +54,86 @@ namespace Microsoft.AspNet.Http Assert.Equal(Resources.FormatException_UseMiddleMutlipleInvokes("Invoke"), exception.Message); } + [Fact] + public async Task UseMiddleware_ThrowsIfArgCantBeResolvedFromContainer() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareInjectInvokeNoService)); + var app = builder.Build(); + var exception = await Assert.ThrowsAsync(() => app(new DefaultHttpContext())); + Assert.Equal(Resources.FormatException_InvokeMiddlewareNoService(typeof(object), typeof(MiddlewareInjectInvokeNoService)), exception.Message); + } + + [Fact] + public void UseMiddlewareWithInvokeArg() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareInjectInvoke)); + var app = builder.Build(); + app(new DefaultHttpContext()); + } + + [Fact] + public void UseMiddlewareWithIvokeWithOutAndRefThrows() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareInjectWithOutAndRefParams)); + var exception = Assert.Throws(() => builder.Build()); + } + private class DummyServiceProvider : IServiceProvider { public object GetService(Type serviceType) { + if (serviceType == typeof(IServiceProvider)) + { + return this; + } return null; } } + public class MiddlewareInjectWithOutAndRefParams + { + public MiddlewareInjectWithOutAndRefParams(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context, ref IServiceProvider sp1, out IServiceProvider sp2) + { + sp1 = null; + sp2 = null; + return Task.FromResult(0); + } + } + + private class MiddlewareInjectInvokeNoService + { + public MiddlewareInjectInvokeNoService(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context, object value) + { + return Task.FromResult(0); + } + } + + private class MiddlewareInjectInvoke + { + public MiddlewareInjectInvoke(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context, IServiceProvider provider) + { + return Task.FromResult(0); + } + } + private class MiddlewareNoParametersStub { public MiddlewareNoParametersStub(RequestDelegate next) @@ -84,7 +157,7 @@ namespace Microsoft.AspNet.Http return 0; } } - + private class MiddlewareNoInvokeStub { public MiddlewareNoInvokeStub(RequestDelegate next) From 6bc8384ea95a2bf8b1a6a42a2b35306f17fefb00 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 7 Jan 2016 20:52:54 -0800 Subject: [PATCH 477/846] Small style cleanup --- .../Extensions/UseMiddlewareExtensions.cs | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 6cb4c1b004..628b0365e6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -95,7 +95,6 @@ namespace Microsoft.AspNet.Builder private static Func Compile(MethodInfo methodinfo, ParameterInfo[] parameters) { - // If we call something like // // public class Middleware @@ -122,17 +121,6 @@ namespace Microsoft.AspNet.Builder // return ((Middleware)instance).Invoke(httpContext, (ILoggerFactory)UseMiddlewareExtensions.GetService(provider, typeof(ILoggerFactory)); // } - // context => - // { - // var serviceProvider = context.RequestServices ?? applicationServices; - // if (serviceProvider == null) - // { - // throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); - // } - // - // return Invoke(httpContext, serviceProvider); - // } - var middleware = typeof(T); var httpContextArg = Expression.Parameter(typeof(HttpContext), "httpContext"); @@ -149,12 +137,15 @@ namespace Microsoft.AspNet.Builder throw new NotSupportedException(Resources.FormatException_InvokeDoesNotSupportRefOrOutParams(InvokeMethodName)); } - var parameterTypeExpression = new Expression[] { - providerArg, - Expression.Constant(parameterType, typeof(Type)), - Expression.Constant(methodinfo.DeclaringType, typeof(Type)) - }; - methodArguments[i] = Expression.Convert(Expression.Call(GetServiceInfo, parameterTypeExpression), parameterType); + var parameterTypeExpression = new Expression[] + { + providerArg, + Expression.Constant(parameterType, typeof(Type)), + Expression.Constant(methodinfo.DeclaringType, typeof(Type)) + }; + + var getServiceCall = Expression.Call(GetServiceInfo, parameterTypeExpression); + methodArguments[i] = Expression.Convert(getServiceCall, parameterType); } Expression middlewareInstanceArg = instanceArg; From fa8c5cbb3a8eca81223c34eb90fa3a81107b093e Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 8 Jan 2016 19:28:34 -0800 Subject: [PATCH 478/846] Updating QueryString doc comment --- src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index c0f52fd400..a13a78e600 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -54,15 +54,15 @@ namespace Microsoft.AspNet.Http public abstract PathString Path { get; set; } /// - /// Gets or set the query string. + /// Gets or set the raw query string used to create the query collection in Request.Query. /// - /// The query string. + /// The raw query string. public abstract QueryString QueryString { get; set; } /// - /// Gets the query value collection parsed from RequestQueryString. + /// Gets the query value collection parsed from Request.QueryString. /// - /// The query value collection parsed from RequestQueryString. + /// The query value collection parsed from Request.QueryString. public abstract IQueryCollection Query { get; set; } /// From 4b64d187c2d9ba5f57cbb7935a24091edf0d0014 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Wed, 13 Jan 2016 12:34:00 +0100 Subject: [PATCH 479/846] Promote IFormFile extension methods to IFormFile --- .../IFormFile.cs | 38 +++++++++++- .../FormFileExtensions.cs | 60 ------------------- .../Features/FormFile.cs | 55 ++++++++++++++++- 3 files changed, 91 insertions(+), 62 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index b5e44904b4..eca4d6a20b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Threading; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http { @@ -10,18 +12,52 @@ namespace Microsoft.AspNet.Http /// public interface IFormFile { + /// + /// Gets the raw Content-Type header of the uploaded file. + /// string ContentType { get; } + /// + /// Gets the raw Content-Disposition header of the uploaded file. + /// string ContentDisposition { get; } + /// + /// Gets the header dictionary of the uploaded file. + /// IHeaderDictionary Headers { get; } + /// + /// Gets the file length in bytes. + /// long Length { get; } + /// + /// Gets the name from the Content-Disposition header. + /// string Name { get; } + /// + /// Gets the file name from the Content-Disposition header. + /// string FileName { get; } + /// + /// Opens the request stream for reading the uploaded file. + /// Stream OpenReadStream(); + + /// + /// Saves the contents of the uploaded file. + /// + /// The path of the file to create. + void SaveAs(string path); + + /// + /// Asynchronously saves the contents of the uploaded file. + /// + /// The path of the file to create. + /// + Task SaveAsAsync(string path, CancellationToken cancellationToken = default(CancellationToken)); } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs deleted file mode 100644 index fa68ae340a..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNet.Http -{ - /// - /// Extension methods for . - /// - public static class FormFileExtensions - { - // Stream.CopyTo method uses 80KB as the default buffer size. - private static int DefaultBufferSize = 80 * 1024; - - /// - /// Saves the contents of an uploaded file. - /// - /// The . - /// The name of the file to create. - public static void SaveAs(this IFormFile formFile, string filename) - { - if (formFile == null) - { - throw new ArgumentNullException(nameof(formFile)); - } - - using (var fileStream = new FileStream(filename, FileMode.Create)) - { - var inputStream = formFile.OpenReadStream(); - inputStream.CopyTo(fileStream); - } - } - - /// - /// Asynchronously saves the contents of an uploaded file. - /// - /// The . - /// The name of the file to create. - public async static Task SaveAsAsync( - this IFormFile formFile, - string filename, - CancellationToken cancellationToken = default(CancellationToken)) - { - if (formFile == null) - { - throw new ArgumentNullException(nameof(formFile)); - } - - using (var fileStream = new FileStream(filename, FileMode.Create)) - { - var inputStream = formFile.OpenReadStream(); - await inputStream.CopyToAsync(fileStream, DefaultBufferSize, cancellationToken); - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index 3fc5113633..f9e4bfc539 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -2,12 +2,17 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Threading; +using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { public class FormFile : IFormFile { + // Stream.CopyTo method uses 80KB as the default buffer size. + private const int DefaultBufferSize = 80 * 1024; + private readonly Stream _baseStream; private readonly long _baseStreamOffset; @@ -20,29 +25,77 @@ namespace Microsoft.AspNet.Http.Features.Internal FileName = fileName; } + /// + /// Gets the raw Content-Disposition header of the uploaded file. + /// public string ContentDisposition { get { return Headers["Content-Disposition"]; } set { Headers["Content-Disposition"] = value; } } + /// + /// Gets the raw Content-Type header of the uploaded file. + /// public string ContentType { get { return Headers["Content-Type"]; } set { Headers["Content-Type"] = value; } } + /// + /// Gets the header dictionary of the uploaded file. + /// public IHeaderDictionary Headers { get; set; } + /// + /// Gets the file length in bytes. + /// public long Length { get; } + /// + /// Gets the name from the Content-Disposition header. + /// public string Name { get; } + /// + /// Gets the file name from the Content-Disposition header. + /// public string FileName { get; } + /// + /// Opens the request stream for reading the uploaded file. + /// public Stream OpenReadStream() { return new ReferenceReadStream(_baseStream, _baseStreamOffset, Length); } + + /// + /// Saves the contents of the uploaded file. + /// + /// The path of the file to create. + public void SaveAs(string path) + { + using (var fileStream = File.Create(path, DefaultBufferSize)) + { + var inputStream = OpenReadStream(); + inputStream.CopyTo(fileStream, DefaultBufferSize); + } + } + + /// + /// Asynchronously saves the contents of the uploaded file. + /// + /// The path of the file to create. + /// + public async Task SaveAsAsync(string path, CancellationToken cancellationToken = default(CancellationToken)) + { + using (var fileStream = File.Create(path, DefaultBufferSize, FileOptions.Asynchronous)) + { + var inputStream = OpenReadStream(); + await inputStream.CopyToAsync(fileStream, DefaultBufferSize, cancellationToken); + } + } } -} \ No newline at end of file +} From 8349419c7f360843599efd04d90e9401f60ba901 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 14 Jan 2016 16:41:14 -0800 Subject: [PATCH 480/846] Updating build script --- build.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/build.sh b/build.sh index 7b5e25e3a8..263fb667a8 100755 --- a/build.sh +++ b/build.sh @@ -1,13 +1,5 @@ #!/usr/bin/env bash -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -repoFolder="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - buildFolder=.build koreBuildFolder=$buildFolder/KoreBuild-dotnet @@ -42,7 +34,12 @@ fi if test ! -d $koreBuildFolder; then mono $nugetPath install KoreBuild-dotnet -ExcludeVersion -o $buildFolder -nocache -pre + chmod +x $koreBuildFolder/build/KoreBuild.sh fi -source $koreBuildFolder/build/KoreBuild.sh +makeFile=makefile.shade +if [ ! -e $makeFile ]; then + makeFile=$koreBuildFolder/build/makefile.shade +fi +./$koreBuildFolder/build/KoreBuild.sh -n $nugetPath -m $makeFile "$@" From 1f21540fd53a839dcfe7004788abe1e9a1d820a4 Mon Sep 17 00:00:00 2001 From: Brennan Date: Fri, 15 Jan 2016 12:43:40 -0800 Subject: [PATCH 481/846] Remove IsLocal --- src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs | 2 -- .../IHttpConnectionFeature.cs | 1 - src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 6 ------ src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs | 2 -- src/Microsoft.AspNet.Owin/OwinConstants.cs | 1 - src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 -- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 6 ------ 7 files changed, 20 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs index 2d14071ebc..fdb908a6c6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs @@ -18,8 +18,6 @@ namespace Microsoft.AspNet.Http public abstract int LocalPort { get; set; } - public abstract bool IsLocal { get; set; } - public abstract X509Certificate2 ClientCertificate { get; set; } public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs index ef76d69815..5eca86f433 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs @@ -11,6 +11,5 @@ namespace Microsoft.AspNet.Http.Features IPAddress LocalIpAddress { get; set; } int RemotePort { get; set; } int LocalPort { get; set; } - bool IsLocal { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index dd19f7d286..693755aeda 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -59,12 +59,6 @@ namespace Microsoft.AspNet.Http.Internal set { HttpConnectionFeature.LocalPort = value; } } - public override bool IsLocal - { - get { return HttpConnectionFeature.IsLocal; } - set { HttpConnectionFeature.IsLocal = value; } - } - public override X509Certificate2 ClientCertificate { get { return TlsConnectionFeature.ClientCertificate; } diff --git a/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs index 9f826d18c0..1988301e33 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs @@ -11,8 +11,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { } - public bool IsLocal { get; set; } - public IPAddress LocalIpAddress { get; set; } public int LocalPort { get; set; } diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 039209c098..beae948df8 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -73,7 +73,6 @@ namespace Microsoft.AspNet.Owin public const string RemotePort = "server.RemotePort"; public const string LocalIpAddress = "server.LocalIpAddress"; public const string LocalPort = "server.LocalPort"; - public const string IsLocal = "server.IsLocal"; public const string TraceOutput = "host.TraceOutput"; public const string Addresses = "host.Addresses"; public const string AppName = "host.AppName"; diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5e4db89d1a..3a66fa7749 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -84,8 +84,6 @@ namespace Microsoft.AspNet.Owin { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), (feature, value) => feature.RemoteIpAddress = IPAddress.Parse(Convert.ToString(value))) }, - { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, - { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, { OwinConstants.Security.User, new FeatureMap(feature => feature.User, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 1a1b5b183d..a8c7560819 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -190,12 +190,6 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } } - bool IHttpConnectionFeature.IsLocal - { - get { return Prop(OwinConstants.CommonKeys.IsLocal); } - set { Prop(OwinConstants.CommonKeys.LocalPort, value); } - } - private bool SupportsSendFile { get From 3f84e992f48f52d86404732915ebe86bfdd2a610 Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 14 Jan 2016 14:38:42 -0800 Subject: [PATCH 482/846] Make StreamCopyOperation public and update it to same as StaticFiles --- .../SendFileResponseExtensions.cs | 6 +- .../StreamCopyOperation.cs | 82 +++++++++++-------- .../project.json | 3 +- 3 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index bb236b7dd0..747e91096e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Extensions; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http @@ -96,10 +97,7 @@ namespace Microsoft.AspNet.Http { fileStream.Seek(offset, SeekOrigin.Begin); - // TODO: Use buffer pool - var buffer = new byte[bufferSize]; - - await StreamCopyOperation.CopyToAsync(fileStream, buffer, outputStream, length, cancel); + await StreamCopyOperation.CopyToAsync(fileStream, outputStream, length, cancel); } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs index f7e6734c9c..a59aed1f0a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs +++ b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs @@ -2,55 +2,67 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Extensions { // FYI: In most cases the source will be a FileStream and the destination will be to the network. - internal static class StreamCopyOperation + public static class StreamCopyOperation { - internal static async Task CopyToAsync(Stream source, byte[] buffer, Stream destination, long? length, CancellationToken cancel) + private const int DefaultBufferSize = 4096; + + public static async Task CopyToAsync(Stream source, Stream destination, long? length, CancellationToken cancel) { long? bytesRemaining = length; - Debug.Assert(source != null); - Debug.Assert(destination != null); - Debug.Assert(!bytesRemaining.HasValue || bytesRemaining.Value >= 0); - Debug.Assert(buffer != null); - while (true) + var buffer = ArrayPool.Shared.Rent(DefaultBufferSize); + try { - // The natural end of the range. - if (bytesRemaining.HasValue && bytesRemaining.Value <= 0) + Debug.Assert(source != null); + Debug.Assert(destination != null); + Debug.Assert(!bytesRemaining.HasValue || bytesRemaining.Value >= 0); + Debug.Assert(buffer != null); + + while (true) { - return; + // The natural end of the range. + if (bytesRemaining.HasValue && bytesRemaining.Value <= 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + int readLength = buffer.Length; + if (bytesRemaining.HasValue) + { + readLength = (int)Math.Min(bytesRemaining.Value, (long)readLength); + } + int count = await source.ReadAsync(buffer, 0, readLength, cancel); + + if (bytesRemaining.HasValue) + { + bytesRemaining -= count; + } + + // End of the source stream. + if (count == 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + await destination.WriteAsync(buffer, 0, count, cancel); } - - cancel.ThrowIfCancellationRequested(); - - int readLength = buffer.Length; - if (bytesRemaining.HasValue) - { - readLength = (int)Math.Min(bytesRemaining.Value, (long)readLength); - } - int count = await source.ReadAsync(buffer, 0, readLength, cancel); - - if (bytesRemaining.HasValue) - { - bytesRemaining -= count; - } - - // End of the source stream. - if (count == 0) - { - return; - } - - cancel.ThrowIfCancellationRequested(); - - await destination.WriteAsync(buffer, 0, count, cancel); + } + finally + { + ArrayPool.Shared.Return(buffer); } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 747d08ca80..8aa5deacf7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -11,7 +11,8 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" + "Microsoft.Net.Http.Headers": "1.0.0-*", + "System.Buffers": "4.0.0-*" }, "frameworks": { "net451": {}, From 38feebc0d658d2eaa3b945bdddd004f44c9f6f7d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 20 Jan 2016 20:53:25 -0800 Subject: [PATCH 483/846] Reacting to CoreCLR package version change --- src/Microsoft.AspNet.Http.Features/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 0f9fb1a9f2..0ccf00e18b 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -20,7 +20,7 @@ "System.Linq": "4.0.1-*", "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", - "System.Runtime.Extensions": "4.0.11-*", + "System.Runtime.Extensions": "4.1.0-*", "System.Security.Claims": "4.0.1-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*", "System.Security.Principal": "4.0.1-*" diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 82efa6d0d5..35a6eda9ab 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -22,7 +22,7 @@ "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-*", - "System.IO": "4.0.11-*", + "System.IO": "4.1.0-*", "System.IO.FileSystem": "4.0.1-*" } } From da478b02ed378c8b8ff67723f70162444df0885e Mon Sep 17 00:00:00 2001 From: ryanbrandenburg Date: Tue, 12 Jan 2016 16:57:57 -0800 Subject: [PATCH 484/846] * Move HttpResponseStreamWriter from Mvc --- .../HttpRequestStreamReader.cs | 437 +++++++++++++++++ .../HttpResponseStreamWriter.cs | 395 +++++++++++++++ .../Resources.Designer.cs | 80 +++ .../Resources.resx | 126 +++++ .../project.json | 1 + .../HttpRequestStreamReaderTest.cs | 225 +++++++++ .../HttpResponseStreamWriterTest.cs | 461 ++++++++++++++++++ 7 files changed, 1725 insertions(+) create mode 100644 src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Resources.resx create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs diff --git a/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs new file mode 100644 index 0000000000..fedeb9315b --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs @@ -0,0 +1,437 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Buffers; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + public class HttpRequestStreamReader : TextReader + { + private const int DefaultBufferSize = 1024; + private const int MinBufferSize = 128; + private const int MaxSharedBuilderCapacity = 360; // also the max capacity used in StringBuilderCache + + private Stream _stream; + private readonly Encoding _encoding; + private readonly Decoder _decoder; + + private readonly ArrayPool _bytePool; + private readonly ArrayPool _charPool; + + private readonly int _byteBufferSize; + private byte[] _byteBuffer; + private char[] _charBuffer; + + private int _charBufferIndex; + private int _charsRead; + private int _bytesRead; + + private bool _isBlocked; + + public HttpRequestStreamReader(Stream stream, Encoding encoding) + : this(stream, encoding, DefaultBufferSize) + { + } + + public HttpRequestStreamReader(Stream stream, Encoding encoding, int bufferSize) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanRead) + { + throw new ArgumentException(Resources.HttpRequestStreamReader_StreamNotReadable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + _stream = stream; + _encoding = encoding; + _decoder = encoding.GetDecoder(); + + if (bufferSize < MinBufferSize) + { + bufferSize = MinBufferSize; + } + + _byteBufferSize = bufferSize; + _byteBuffer = new byte[bufferSize]; + var maxCharsPerBuffer = encoding.GetMaxCharCount(bufferSize); + _charBuffer = new char[maxCharsPerBuffer]; + } + + public HttpRequestStreamReader( + Stream stream, + Encoding encoding, + int bufferSize, + ArrayPool bytePool, + ArrayPool charPool) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanRead) + { + throw new ArgumentException(Resources.HttpRequestStreamReader_StreamNotReadable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + if (bytePool == null) + { + throw new ArgumentNullException(nameof(bytePool)); + } + + if (charPool == null) + { + throw new ArgumentNullException(nameof(charPool)); + } + + if (bufferSize <= 0) + { + throw new ArgumentOutOfRangeException(nameof(bufferSize)); + } + + _stream = stream; + _encoding = encoding; + _byteBufferSize = bufferSize; + _bytePool = bytePool; + _charPool = charPool; + + _decoder = encoding.GetDecoder(); + + _byteBuffer = _bytePool.Rent(bufferSize); + + try + { + var requiredLength = encoding.GetMaxCharCount(bufferSize); + _charBuffer = _charPool.Rent(requiredLength); + } + catch + { + _bytePool.Return(_byteBuffer); + _byteBuffer = null; + + if (_charBuffer != null) + { + _charPool.Return(_charBuffer); + _charBuffer = null; + } + } + } + +#if NET451 + public override void Close() + { + Dispose(true); + } +#endif + + protected override void Dispose(bool disposing) + { + if (disposing && _stream != null) + { + _stream = null; + + if (_bytePool != null) + { + _bytePool.Return(_byteBuffer); + _byteBuffer = null; + } + + if (_charPool != null) + { + _charPool.Return(_charBuffer); + _charBuffer = null; + } + } + + base.Dispose(disposing); + } + + public override int Peek() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferIndex == _charsRead) + { + if (_isBlocked || ReadIntoBuffer() == 0) + { + return -1; + } + } + + return _charBuffer[_charBufferIndex]; + } + + public override int Read() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferIndex == _charsRead) + { + if (ReadIntoBuffer() == 0) + { + return -1; + } + } + + return _charBuffer[_charBufferIndex++]; + } + + public override int Read(char[] buffer, int index, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (index < 0) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (count < 0 || index + count > buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + var charsRead = 0; + while (count > 0) + { + var charsRemaining = _charsRead - _charBufferIndex; + if (charsRemaining == 0) + { + charsRemaining = ReadIntoBuffer(); + } + + if (charsRemaining == 0) + { + break; // We're at EOF + } + + if (charsRemaining > count) + { + charsRemaining = count; + } + + Buffer.BlockCopy( + _charBuffer, + _charBufferIndex * 2, + buffer, + (index + charsRead) * 2, + charsRemaining * 2); + _charBufferIndex += charsRemaining; + + charsRead += charsRemaining; + count -= charsRemaining; + + // If we got back fewer chars than we asked for, then it's likely the underlying stream is blocked. + // Send the data back to the caller so they can process it. + if (_isBlocked) + { + break; + } + } + + return charsRead; + } + + public override async Task ReadAsync(char[] buffer, int index, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (index < 0) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (count < 0 || index + count > buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferIndex == _charsRead && await ReadIntoBufferAsync() == 0) + { + return 0; + } + + var charsRead = 0; + while (count > 0) + { + // n is the characters available in _charBuffer + var n = _charsRead - _charBufferIndex; + + // charBuffer is empty, let's read from the stream + if (n == 0) + { + _charsRead = 0; + _charBufferIndex = 0; + _bytesRead = 0; + + // We loop here so that we read in enough bytes to yield at least 1 char. + // We break out of the loop if the stream is blocked (EOF is reached). + do + { + Debug.Assert(n == 0); + _bytesRead = await _stream.ReadAsync( + _byteBuffer, + 0, + _byteBufferSize); + if (_bytesRead == 0) // EOF + { + _isBlocked = true; + break; + } + + // _isBlocked == whether we read fewer bytes than we asked for. + _isBlocked = (_bytesRead < _byteBufferSize); + + Debug.Assert(n == 0); + + _charBufferIndex = 0; + n = _decoder.GetChars( + _byteBuffer, + 0, + _bytesRead, + _charBuffer, + 0); + + Debug.Assert(n > 0); + + _charsRead += n; // Number of chars in StreamReader's buffer. + } + while (n == 0); + + if (n == 0) + { + break; // We're at EOF + } + } + + // Got more chars in charBuffer than the user requested + if (n > count) + { + n = count; + } + + Buffer.BlockCopy( + _charBuffer, + _charBufferIndex * 2, + buffer, + (index + charsRead) * 2, + n * 2); + + _charBufferIndex += n; + + charsRead += n; + count -= n; + + // This function shouldn't block for an indefinite amount of time, + // or reading from a network stream won't work right. If we got + // fewer bytes than we requested, then we want to break right here. + if (_isBlocked) + { + break; + } + } + + return charsRead; + } + + private int ReadIntoBuffer() + { + _charsRead = 0; + _charBufferIndex = 0; + _bytesRead = 0; + + do + { + _bytesRead = _stream.Read(_byteBuffer, 0, _byteBufferSize); + if (_bytesRead == 0) // We're at EOF + { + return _charsRead; + } + + _isBlocked = (_bytesRead < _byteBufferSize); + _charsRead += _decoder.GetChars( + _byteBuffer, + 0, + _bytesRead, + _charBuffer, + _charsRead); + } + while (_charsRead == 0); + + return _charsRead; + } + + private async Task ReadIntoBufferAsync() + { + _charsRead = 0; + _charBufferIndex = 0; + _bytesRead = 0; + + do + { + + _bytesRead = await _stream.ReadAsync( + _byteBuffer, + 0, + _byteBufferSize).ConfigureAwait(false); + if (_bytesRead == 0) + { + // We're at EOF + return _charsRead; + } + + // _isBlocked == whether we read fewer bytes than we asked for. + _isBlocked = (_bytesRead < _byteBufferSize); + + _charsRead += _decoder.GetChars( + _byteBuffer, + 0, + _bytesRead, + _charBuffer, + _charsRead); + } + while (_charsRead == 0); + + return _charsRead; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs new file mode 100644 index 0000000000..e875364647 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs @@ -0,0 +1,395 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Buffers; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// Writes to the using the supplied . + /// It does not write the BOM and also does not close the stream. + /// + public class HttpResponseStreamWriter : TextWriter + { + private const int MinBufferSize = 128; + + /// + /// Default buffer size. + /// + public const int DefaultBufferSize = 1024; + + private Stream _stream; + private readonly Encoder _encoder; + private readonly ArrayPool _bytePool; + private readonly ArrayPool _charPool; + private readonly int _charBufferSize; + + private byte[] _byteBuffer; + private char[] _charBuffer; + + private int _charBufferCount; + + public HttpResponseStreamWriter(Stream stream, Encoding encoding) + : this(stream, encoding, DefaultBufferSize) + { + } + + public HttpResponseStreamWriter(Stream stream, Encoding encoding, int bufferSize) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanWrite) + { + throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + _stream = stream; + Encoding = encoding; + _charBufferSize = bufferSize; + + if (bufferSize < MinBufferSize) + { + bufferSize = MinBufferSize; + } + + _encoder = encoding.GetEncoder(); + _byteBuffer = new byte[encoding.GetMaxByteCount(bufferSize)]; + _charBuffer = new char[bufferSize]; + } + + public HttpResponseStreamWriter( + Stream stream, + Encoding encoding, + int bufferSize, + ArrayPool bytePool, + ArrayPool charPool) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanWrite) + { + throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + if (bytePool == null) + { + throw new ArgumentNullException(nameof(bytePool)); + } + + if (charPool == null) + { + throw new ArgumentNullException(nameof(charPool)); + } + + _stream = stream; + Encoding = encoding; + _charBufferSize = bufferSize; + + _encoder = encoding.GetEncoder(); + _bytePool = bytePool; + _charPool = charPool; + + _charBuffer = charPool.Rent(bufferSize); + + try + { + var requiredLength = encoding.GetMaxByteCount(bufferSize); + _byteBuffer = bytePool.Rent(requiredLength); + } + catch + { + charPool.Return(_charBuffer); + _charBuffer = null; + + if (_byteBuffer != null) + { + bytePool.Return(_byteBuffer); + _byteBuffer = null; + } + + throw; + } + } + + public override Encoding Encoding { get; } + + public override void Write(char value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferCount == _charBufferSize) + { + FlushInternal(flushEncoder: false); + } + + _charBuffer[_charBufferCount] = value; + _charBufferCount++; + } + + public override void Write(char[] values, int index, int count) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (values == null) + { + return; + } + + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + FlushInternal(flushEncoder: false); + } + + CopyToCharBuffer(values, ref index, ref count); + } + } + + public override void Write(string value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (value == null) + { + return; + } + + var count = value.Length; + var index = 0; + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + FlushInternal(flushEncoder: false); + } + + CopyToCharBuffer(value, ref index, ref count); + } + } + + public override async Task WriteAsync(char value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferCount == _charBufferSize) + { + await FlushInternalAsync(flushEncoder: false); + } + + _charBuffer[_charBufferCount] = value; + _charBufferCount++; + } + + public override async Task WriteAsync(char[] values, int index, int count) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (values == null) + { + return; + } + + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + await FlushInternalAsync(flushEncoder: false); + } + + CopyToCharBuffer(values, ref index, ref count); + } + } + + public override async Task WriteAsync(string value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (value == null) + { + return; + } + + var count = value.Length; + var index = 0; + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + await FlushInternalAsync(flushEncoder: false); + } + + CopyToCharBuffer(value, ref index, ref count); + } + } + + // We want to flush the stream when Flush/FlushAsync is explicitly + // called by the user (example: from a Razor view). + + public override void Flush() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + FlushInternal(flushEncoder: true); + } + + public override Task FlushAsync() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + return FlushInternalAsync(flushEncoder: true); + } + + protected override void Dispose(bool disposing) + { + if (disposing && _stream != null) + { + try + { + FlushInternal(flushEncoder: true); + } + finally + { + _stream = null; + + if (_bytePool != null) + { + _bytePool.Return(_byteBuffer); + _byteBuffer = null; + } + + if (_charPool != null) + { + _charPool.Return(_charBuffer); + _charBuffer = null; + } + } + } + } + + // Note: our FlushInternal method does NOT flush the underlying stream. This would result in + // chunking. + private void FlushInternal(bool flushEncoder) + { + if (_charBufferCount == 0) + { + return; + } + + var count = _encoder.GetBytes( + _charBuffer, + 0, + _charBufferCount, + _byteBuffer, + 0, + flush: flushEncoder); + + if (count > 0) + { + _stream.Write(_byteBuffer, 0, count); + } + + _charBufferCount = 0; + } + + // Note: our FlushInternalAsync method does NOT flush the underlying stream. This would result in + // chunking. + private async Task FlushInternalAsync(bool flushEncoder) + { + if (_charBufferCount == 0) + { + return; + } + + var count = _encoder.GetBytes( + _charBuffer, + 0, + _charBufferCount, + _byteBuffer, + 0, + flush: flushEncoder); + + if (count > 0) + { + await _stream.WriteAsync(_byteBuffer, 0, count); + } + + _charBufferCount = 0; + } + + private void CopyToCharBuffer(string value, ref int index, ref int count) + { + var remaining = Math.Min(_charBufferSize - _charBufferCount, count); + + value.CopyTo( + sourceIndex: index, + destination: _charBuffer, + destinationIndex: _charBufferCount, + count: remaining); + + _charBufferCount += remaining; + index += remaining; + count -= remaining; + } + + private void CopyToCharBuffer(char[] values, ref int index, ref int count) + { + var remaining = Math.Min(_charBufferSize - _charBufferCount, count); + + Buffer.BlockCopy( + src: values, + srcOffset: index * sizeof(char), + dst: _charBuffer, + dstOffset: _charBufferCount * sizeof(char), + count: remaining * sizeof(char)); + + _charBufferCount += remaining; + index += remaining; + count -= remaining; + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs b/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs new file mode 100644 index 0000000000..5b186b2d3f --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs @@ -0,0 +1,80 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Microsoft.AspNet.WebUtilities { + 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.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + internal Resources() { + } + + /// + /// 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("Microsoft.AspNet.WebUtilities.Resources", typeof(Resources).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 The stream must support reading.. + /// + internal static string HttpRequestStreamReader_StreamNotReadable { + get { + return ResourceManager.GetString("HttpRequestStreamReader_StreamNotReadable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The stream must support writing.. + /// + internal static string HttpResponseStreamWriter_StreamNotWritable { + get { + return ResourceManager.GetString("HttpResponseStreamWriter_StreamNotWritable", resourceCulture); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.resx b/src/Microsoft.AspNet.WebUtilities/Resources.resx new file mode 100644 index 0000000000..9873865894 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Resources.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + The stream must support reading. + + + The stream must support writing. + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 35a6eda9ab..9ff39f4337 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -11,6 +11,7 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", + "System.Buffers": "4.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs new file mode 100644 index 0000000000..a8b90c9bcd --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs @@ -0,0 +1,225 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities.Test +{ + public class HttpResponseStreamReaderTest + { + private static readonly char[] CharData = new char[] + { + char.MinValue, + char.MaxValue, + '\t', + ' ', + '$', + '@', + '#', + '\0', + '\v', + '\'', + '\u3190', + '\uC3A0', + 'A', + '5', + '\r', + '\uFE70', + '-', + ';', + '\r', + '\n', + 'T', + '3', + '\n', + 'K', + '\u00E6', + }; + + [Fact] + public static async Task ReadToEndAsync() + { + // Arrange + var reader = new HttpRequestStreamReader(GetLargeStream(), Encoding.UTF8); + + var result = await reader.ReadToEndAsync(); + + Assert.Equal(5000, result.Length); + } + + [Fact] + public static void TestRead() + { + // Arrange + var reader = CreateReader(); + + // Act & Assert + for (var i = 0; i < CharData.Length; i++) + { + var tmp = reader.Read(); + Assert.Equal((int)CharData[i], tmp); + } + } + + [Fact] + public static void TestPeek() + { + // Arrange + var reader = CreateReader(); + + // Act & Assert + for (var i = 0; i < CharData.Length; i++) + { + var peek = reader.Peek(); + Assert.Equal((int)CharData[i], peek); + + reader.Read(); + } + } + + [Fact] + public static void EmptyStream() + { + // Arrange + var reader = new HttpRequestStreamReader(new MemoryStream(), Encoding.UTF8); + var buffer = new char[10]; + + // Act + var read = reader.Read(buffer, 0, 1); + + // Assert + Assert.Equal(0, read); + } + + [Fact] + public static void Read_ReadAllCharactersAtOnce() + { + // Arrange + var reader = CreateReader(); + var chars = new char[CharData.Length]; + + // Act + var read = reader.Read(chars, 0, chars.Length); + + // Assert + Assert.Equal(chars.Length, read); + for (var i = 0; i < CharData.Length; i++) + { + Assert.Equal(CharData[i], chars[i]); + } + } + + [Fact] + public static async Task Read_ReadInTwoChunks() + { + // Arrange + var reader = CreateReader(); + var chars = new char[CharData.Length]; + + // Act + var read = await reader.ReadAsync(chars, 4, 3); + + // Assert + Assert.Equal(read, 3); + for (var i = 0; i < 3; i++) + { + Assert.Equal(CharData[i], chars[i + 4]); + } + } + + [Fact] + public static void ReadLine_ReadMultipleLines() + { + // Arrange + var reader = CreateReader(); + var valueString = new string(CharData); + + // Act & Assert + var data = reader.ReadLine(); + Assert.Equal(valueString.Substring(0, valueString.IndexOf('\r')), data); + + data = reader.ReadLine(); + Assert.Equal(valueString.Substring(valueString.IndexOf('\r') + 1, 3), data); + + data = reader.ReadLine(); + Assert.Equal(valueString.Substring(valueString.IndexOf('\n') + 1, 2), data); + + data = reader.ReadLine(); + Assert.Equal((valueString.Substring(valueString.LastIndexOf('\n') + 1)), data); + } + + [Fact] + public static void ReadLine_ReadWithNoNewlines() + { + // Arrange + var reader = CreateReader(); + var valueString = new string(CharData); + var temp = new char[10]; + + // Act + reader.Read(temp, 0, 1); + var data = reader.ReadLine(); + + // Assert + Assert.Equal(valueString.Substring(1, valueString.IndexOf('\r') - 1), data); + } + + [Fact] + public static async Task ReadLineAsync_MultipleContinuousLines() + { + // Arrange + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write("\n\n\r\r\n"); + writer.Flush(); + stream.Position = 0; + + var reader = new HttpRequestStreamReader(stream, Encoding.UTF8); + + // Act & Assert + for (var i = 0; i < 4; i++) + { + var data = await reader.ReadLineAsync(); + Assert.Equal(string.Empty, data); + } + + var eol = await reader.ReadLineAsync(); + Assert.Null(eol); + } + + private static HttpRequestStreamReader CreateReader() + { + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(CharData); + writer.Flush(); + stream.Position = 0; + + return new HttpRequestStreamReader(stream, Encoding.UTF8); + } + + private static MemoryStream GetSmallStream() + { + var testData = new byte[] { 72, 69, 76, 76, 79 }; + return new MemoryStream(testData); + } + + private static MemoryStream GetLargeStream() + { + var testData = new byte[] { 72, 69, 76, 76, 79 }; + // System.Collections.Generic. + + var data = new List(); + for (var i = 0; i < 1000; i++) + { + data.AddRange(testData); + } + + return new MemoryStream(data.ToArray()); + } + } +} diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs new file mode 100644 index 0000000000..a357853020 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -0,0 +1,461 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Buffers; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities.Test +{ + public class HttpResponseStreamWriterTest + { + [Fact] + public async Task DoesNotWriteBOM() + { + // Arrange + var memoryStream = new MemoryStream(); + var encodingWithBOM = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true); + var writer = new HttpResponseStreamWriter(memoryStream, encodingWithBOM); + var expectedData = new byte[] { 97, 98, 99, 100 }; // without BOM + + // Act + using (writer) + { + await writer.WriteAsync("abcd"); + } + + // Assert + Assert.Equal(expectedData, memoryStream.ToArray()); + } + +#if NET451 + [Fact] + public async Task DoesNotFlush_UnderlyingStream_OnClosingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello"); + writer.Close(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + } +#endif + + [Fact] + public async Task DoesNotFlush_UnderlyingStream_OnDisposingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello"); + writer.Dispose(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + } + +#if NET451 + [Fact] + public async Task DoesNotClose_UnderlyingStream_OnDisposingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello"); + writer.Close(); + + // Assert + Assert.Equal(0, stream.CloseCallCount); + } +#endif + + [Fact] + public async Task DoesNotDispose_UnderlyingStream_OnDisposingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello world"); + writer.Dispose(); + + // Assert + Assert.Equal(0, stream.DisposeCallCount); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task FlushesBuffer_OnClose(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + await writer.WriteAsync(new string('a', byteLength)); + + // Act +#if NET451 + writer.Close(); +#else + writer.Dispose(); +#endif + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task FlushesBuffer_OnDispose(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + await writer.WriteAsync(new string('a', byteLength)); + + // Act + writer.Dispose(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Fact] + public void NoDataWritten_Flush_DoesNotFlushUnderlyingStream() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + writer.Flush(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public void FlushesBuffer_ButNotStream_OnFlush(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + writer.Write(new string('a', byteLength)); + + var expectedWriteCount = Math.Ceiling((double)byteLength / HttpResponseStreamWriter.DefaultBufferSize); + + // Act + writer.Flush(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(expectedWriteCount, stream.WriteCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Fact] + public async Task NoDataWritten_FlushAsync_DoesNotFlushUnderlyingStream() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.FlushAsync(); + + // Assert + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(0, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task FlushesBuffer_ButNotStream_OnFlushAsync(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + await writer.WriteAsync(new string('a', byteLength)); + + var expectedWriteCount = Math.Ceiling((double)byteLength / HttpResponseStreamWriter.DefaultBufferSize); + + // Act + await writer.FlushAsync(); + + // Assert + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(expectedWriteCount, stream.WriteAsyncCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public void WriteChar_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + for (var i = 0; i < byteLength; i++) + { + writer.Write('a'); + } + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public void WriteCharArray_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + writer.Write((new string('a', byteLength)).ToCharArray()); + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task WriteCharAsync_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + for (var i = 0; i < byteLength; i++) + { + await writer.WriteAsync('a'); + } + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task WriteCharArrayAsync_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + await writer.WriteAsync((new string('a', byteLength)).ToCharArray()); + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData("你好世界", "utf-16")] +#if !DNXCORE50 + // CoreCLR does not like shift_jis as an encoding. + [InlineData("こんにちは世界", "shift_jis")] +#endif + [InlineData("హలో ప్రపంచ", "iso-8859-1")] + [InlineData("வணக்கம் உலக", "utf-32")] + public async Task WritesData_InExpectedEncoding(string data, string encodingName) + { + // Arrange + var encoding = Encoding.GetEncoding(encodingName); + var expectedBytes = encoding.GetBytes(data); + var stream = new MemoryStream(); + var writer = new HttpResponseStreamWriter(stream, encoding); + + // Act + using (writer) + { + await writer.WriteAsync(data); + } + + // Assert + Assert.Equal(expectedBytes, stream.ToArray()); + } + + [Theory] + [InlineData('ん', 1023, "utf-8")] + [InlineData('ん', 1024, "utf-8")] + [InlineData('ん', 1050, "utf-8")] + [InlineData('你', 1023, "utf-16")] + [InlineData('你', 1024, "utf-16")] + [InlineData('你', 1050, "utf-16")] +#if !DNXCORE50 + // CoreCLR does not like shift_jis as an encoding. + [InlineData('こ', 1023, "shift_jis")] + [InlineData('こ', 1024, "shift_jis")] + [InlineData('こ', 1050, "shift_jis")] +#endif + [InlineData('హ', 1023, "iso-8859-1")] + [InlineData('హ', 1024, "iso-8859-1")] + [InlineData('హ', 1050, "iso-8859-1")] + [InlineData('வ', 1023, "utf-32")] + [InlineData('வ', 1024, "utf-32")] + [InlineData('வ', 1050, "utf-32")] + public async Task WritesData_OfDifferentLength_InExpectedEncoding( + char character, + int charCount, + string encodingName) + { + // Arrange + var encoding = Encoding.GetEncoding(encodingName); + string data = new string(character, charCount); + var expectedBytes = encoding.GetBytes(data); + var stream = new MemoryStream(); + var writer = new HttpResponseStreamWriter(stream, encoding); + + // Act + using (writer) + { + await writer.WriteAsync(data); + } + + // Assert + Assert.Equal(expectedBytes, stream.ToArray()); + } + + // None of the code in HttpResponseStreamWriter differs significantly when using pooled buffers. + // + // This test effectively verifies that things are correctly constructed and disposed. Pooled buffers + // throw on the finalizer thread if not disposed, so that's why it's complicated. + [Fact] + public void HttpResponseStreamWriter_UsingPooledBuffers() + { + // Arrange + var encoding = Encoding.UTF8; + var stream = new MemoryStream(); + + var expectedBytes = encoding.GetBytes("Hello, World!"); + + using (var writer = new HttpResponseStreamWriter( + stream, + encoding, + 1024, + ArrayPool.Shared, + ArrayPool.Shared)) + { + // Act + writer.Write("Hello, World!"); + } + + // Assert + Assert.Equal(expectedBytes, stream.ToArray()); + } + + private class TestMemoryStream : MemoryStream + { + public int FlushCallCount { get; private set; } + + public int FlushAsyncCallCount { get; private set; } + + public int CloseCallCount { get; private set; } + + public int DisposeCallCount { get; private set; } + + public int WriteCallCount { get; private set; } + + public int WriteAsyncCallCount { get; private set; } + + public override void Flush() + { + FlushCallCount++; + base.Flush(); + } + + public override Task FlushAsync(CancellationToken cancellationToken) + { + FlushAsyncCallCount++; + return base.FlushAsync(cancellationToken); + } + + public override void Write(byte[] buffer, int offset, int count) + { + WriteCallCount++; + base.Write(buffer, offset, count); + } + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + WriteAsyncCallCount++; + return base.WriteAsync(buffer, offset, count, cancellationToken); + } + +#if NET451 + public override void Close() + { + CloseCallCount++; + base.Close(); + } +#endif + + protected override void Dispose(bool disposing) + { + DisposeCallCount++; + base.Dispose(disposing); + } + } + } +} From b2c154b576df876657f33200b8e9b6f4fcdad2ce Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 22 Jan 2016 12:20:30 -0800 Subject: [PATCH 485/846] Rename AspNet 5 folders and files. See https://github.com/aspnet/Announcements/issues/144 for more information. --- .../Authentication/AuthenticationDescription.cs | 0 .../Authentication/AuthenticationManager.cs | 0 .../Authentication/AuthenticationProperties.cs | 0 .../ConnectionInfo.cs | 0 .../CookieOptions.cs | 0 .../Extensions/HeaderDictionaryExtensions.cs | 0 .../Extensions/HttpResponseWritingExtensions.cs | 0 .../Extensions/MapExtensions.cs | 0 .../Extensions/MapMiddleware.cs | 0 .../Extensions/MapOptions.cs | 0 .../Extensions/MapWhenExtensions.cs | 0 .../Extensions/MapWhenMiddleware.cs | 0 .../Extensions/MapWhenOptions.cs | 0 .../Extensions/RunExtensions.cs | 0 .../Extensions/UseExtensions.cs | 0 .../Extensions/UseMiddlewareExtensions.cs | 0 .../FragmentString.cs | 0 .../HostString.cs | 0 .../HttpContext.cs | 0 .../HttpRequest.cs | 0 .../HttpResponse.cs | 0 .../IApplicationBuilder.cs | 0 .../IFormCollection.cs | 0 .../IFormFile.cs | 0 .../IFormFileCollection.cs | 0 .../IHttpContextAccessor.cs | 0 .../IHttpContextFactory.cs | 0 .../IQueryCollection.cs | 0 .../IRequestCookieCollection.cs | 0 .../IResponseCookies.cs | 0 .../Internal/HeaderSegment.cs | 0 .../Internal/HeaderSegmentCollection.cs | 0 .../Internal/ParsingHelpers.cs | 0 .../Microsoft.AspNetCore.Http.Abstractions.xproj} | 0 .../PathString.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 0 .../QueryString.cs | 0 .../RequestDelegate.cs | 0 .../Resources.resx | 0 .../StatusCodes.cs | 0 .../WebSocketManager.cs | 0 .../project.json | 0 .../HeaderDictionaryTypeExtensions.cs | 0 .../Microsoft.AspNetCore.Http.Extensions.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryBuilder.cs | 0 .../RequestHeaders.cs | 0 .../ResponseExtensions.cs | 0 .../ResponseHeaders.cs | 0 .../SendFileResponseExtensions.cs | 0 .../SessionExtensions.cs | 0 .../StreamCopyOperation.cs | 0 .../UriHelper.cs | 0 .../project.json | 0 .../Authentication/AuthenticateContext.cs | 0 .../Authentication/ChallengeBehavior.cs | 0 .../Authentication/ChallengeContext.cs | 0 .../Authentication/DescribeSchemesContext.cs | 0 .../Authentication/IAuthenticationHandler.cs | 0 .../Authentication/IHttpAuthenticationFeature.cs | 0 .../Authentication/SignInContext.cs | 0 .../Authentication/SignOutContext.cs | 0 .../FeatureCollection.cs | 0 .../FeatureReference.cs | 0 .../FeatureReferences.cs | 0 .../IFeatureCollection.cs | 0 .../IHeaderDictionary.cs | 0 .../IHttpBufferingFeature.cs | 0 .../IHttpConnectionFeature.cs | 0 .../IHttpRequestFeature.cs | 0 .../IHttpRequestIdentifierFeature.cs | 0 .../IHttpRequestLifetimeFeature.cs | 0 .../IHttpResponseFeature.cs | 0 .../IHttpSendFileFeature.cs | 0 .../IHttpUpgradeFeature.cs | 0 .../IHttpWebSocketFeature.cs | 0 .../ISession.cs | 0 .../ISessionFeature.cs | 0 .../ITlsConnectionFeature.cs | 0 .../ITlsTokenBindingFeature.cs | 0 .../Microsoft.AspNetCore.Http.Features.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../WebSocketAcceptContext.cs | 0 .../project.json | 0 .../ApplicationBuilder.cs | 0 .../Authentication/DefaultAuthenticationManager.cs | 0 .../BufferingHelper.cs | 0 .../Constants.cs | 0 .../DefaultConnectionInfo.cs | 0 .../DefaultHttpContext.cs | 0 .../DefaultHttpRequest.cs | 0 .../DefaultHttpResponse.cs | 0 .../DefaultWebSocketManager.cs | 0 .../Features/Authentication/HttpAuthenticationFeature.cs | 0 .../Features/DefaultSessionFeature.cs | 0 .../Features/FormFeature.cs | 0 .../Features/FormFile.cs | 0 .../Features/HttpConnectionFeature.cs | 0 .../Features/HttpRequestFeature.cs | 0 .../Features/HttpRequestIdentifierFeature.cs | 0 .../Features/HttpRequestLifetimeFeature.cs | 0 .../Features/HttpResponseFeature.cs | 0 .../Features/IFormFeature.cs | 0 .../Features/IItemsFeature.cs | 0 .../Features/IQueryFeature.cs | 0 .../Features/IRequestCookiesFeature.cs | 0 .../Features/IResponseCookiesFeature.cs | 0 .../Features/IServiceProvidersFeature.cs | 0 .../Features/ItemsFeature.cs | 0 .../Features/QueryFeature.cs | 0 .../Features/RequestCookiesFeature.cs | 0 .../Features/ResponseCookiesFeature.cs | 0 .../Features/ServiceProvidersFeature.cs | 0 .../Features/TlsConnectionFeature.cs | 0 .../FormCollection.cs | 0 .../FormFileCollection.cs | 0 .../HeaderDictionary.cs | 0 .../HttpContextAccessor.cs | 0 .../HttpContextFactory.cs | 0 .../ItemsDictionary.cs | 0 .../Microsoft.AspNetCore.Http.xproj} | 0 .../ParsingHelpers.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryCollection.cs | 0 .../ReferenceReadStream.cs | 0 .../RequestCookieCollection.cs | 0 .../ResponseCookies.cs | 0 .../project.json | 0 .../DictionaryStringArrayWrapper.cs | 0 .../DictionaryStringValuesWrapper.cs | 0 .../IOwinEnvironmentFeature.cs | 0 .../Microsoft.AspNetCore.Owin.xproj} | 0 .../OwinConstants.cs | 0 .../OwinEnvironment.cs | 0 .../OwinEnvironmentFeature.cs | 0 .../OwinExtensions.cs | 0 .../OwinFeatureCollection.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Utilities.cs | 0 .../WebSockets/OwinWebSocketAcceptAdapter.cs | 0 .../WebSockets/OwinWebSocketAcceptContext.cs | 0 .../WebSockets/OwinWebSocketAdapter.cs | 0 .../WebSockets/WebSocketAcceptAdapter.cs | 0 .../WebSockets/WebSocketAdapter.cs | 0 .../project.json | 0 .../BufferedReadStream.cs | 0 .../FileBufferingReadStream.cs | 0 .../FormReader.cs | 0 .../HttpRequestStreamReader.cs | 0 .../HttpResponseStreamWriter.cs | 0 .../KeyValueAccumulator.cs | 0 .../Microsoft.AspNetCore.WebUtilities.xproj} | 0 .../MultipartReader.cs | 0 .../MultipartReaderStream.cs | 0 .../MultipartSection.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryHelpers.cs | 0 .../ReasonPhrases.cs | 0 .../Resources.Designer.cs | 0 .../Resources.resx | 0 .../StreamHelperExtensions.cs | 0 .../WebEncoders.cs | 0 .../project.json | 0 .../HttpResponseWritingExtensionsTests.cs | 0 .../MapPathMiddlewareTests.cs | 0 .../MapPredicateMiddlewareTests.cs | 0 .../Microsoft.AspNetCore.Http.Abstractions.Tests.xproj} | 0 .../PathStringTests.cs | 0 .../QueryStringTests.cs | 0 .../UseMiddlewareTest.cs | 0 .../project.json | 0 .../HeaderDictionaryTypeExtensionsTest.cs | 0 .../Microsoft.AspNetCore.Http.Extensions.Tests.xproj} | 0 .../QueryBuilderTests.cs | 0 .../ResponseExtensionTests.cs | 0 .../SendFileResponseExtensionsTests.cs | 0 .../UriHelperTests.cs | 0 .../project.json | 0 .../FeatureCollectionTests.cs | 0 .../IThing.cs | 0 .../Microsoft.AspNetCore.Http.Features.Tests.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../Thing.cs | 0 .../project.json | 0 .../ApplicationBuilderTests.cs | 0 .../Authentication/DefaultAuthenticationManagerTests.cs | 0 .../BufferingHelperTests.cs | 0 .../DefaultHttpContextTests.cs | 0 .../DefaultHttpRequestTests.cs | 0 .../DefaultHttpResponseTests.cs | 0 .../FormFeatureTests.cs | 0 .../HeaderDictionaryTests.cs | 0 .../HttpContextFactoryTests.cs | 0 .../HttpRequestIdentifierFeatureTests.cs | 0 .../Microsoft.AspNetCore.Http.Tests.xproj} | 0 .../QueryFeatureTests.cs | 0 .../ResponseCookiesTest.cs | 0 .../project.json | 0 .../Microsoft.AspNetCore.Owin.Tests.xproj} | 0 .../OwinEnvironmentTests.cs | 0 .../OwinExtensionTests.cs | 0 .../OwinFeatureCollectionTests.cs | 0 .../project.json | 0 .../HttpRequestStreamReaderTest.cs | 0 .../HttpResponseStreamWriterTest.cs | 0 .../Microsoft.AspNetCore.WebUtilities.Tests.xproj} | 0 .../MultipartReaderTests.cs | 0 .../QueryHelpersTests.cs | 0 .../WebEncodersTests.cs | 0 .../project.json | 0 211 files changed, 0 insertions(+), 0 deletions(-) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Authentication/AuthenticationDescription.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Authentication/AuthenticationManager.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Authentication/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/ConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/CookieOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/HeaderDictionaryExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/HttpResponseWritingExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapWhenExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapWhenMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapWhenOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/RunExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/UseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/UseMiddlewareExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/FragmentString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HostString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HttpContext.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IFormCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IFormFile.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IHttpContextAccessor.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IHttpContextFactory.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IQueryCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IRequestCookieCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Internal/HeaderSegment.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Internal/HeaderSegmentCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Internal/ParsingHelpers.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj => Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/PathString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Properties/Resources.Designer.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/QueryString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/RequestDelegate.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Resources.resx (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/StatusCodes.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/WebSocketManager.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/project.json (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/HeaderDictionaryTypeExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj => Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj} (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/QueryBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/RequestHeaders.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/ResponseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/ResponseHeaders.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/SendFileResponseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/SessionExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/StreamCopyOperation.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/UriHelper.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/project.json (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/AuthenticateContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/ChallengeBehavior.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/ChallengeContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/DescribeSchemesContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/IAuthenticationHandler.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/IHttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/SignInContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/SignOutContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/FeatureCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/FeatureReference.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/FeatureReferences.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IFeatureCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpBufferingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpSendFileFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpUpgradeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpWebSocketFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ISession.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ISessionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ITlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ITlsTokenBindingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj => Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj} (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/WebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/project.json (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Authentication/DefaultAuthenticationManager.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/BufferingHelper.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Constants.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultHttpContext.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultHttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultHttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultWebSocketManager.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/Authentication/HttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/DefaultSessionFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/FormFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/FormFile.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IFormFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IItemsFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IQueryFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IRequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/ItemsFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/QueryFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/RequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/ResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/ServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/TlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/FormCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/FormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/HeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/HttpContextAccessor.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/HttpContextFactory.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ItemsDictionary.cs (100%) rename src/{Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj => Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj} (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ParsingHelpers.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/QueryCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ReferenceReadStream.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/RequestCookieCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/project.json (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/DictionaryStringArrayWrapper.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/DictionaryStringValuesWrapper.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/IOwinEnvironmentFeature.cs (100%) rename src/{Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj => Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj} (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinConstants.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinEnvironment.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinEnvironmentFeature.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinExtensions.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinFeatureCollection.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/Utilities.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/OwinWebSocketAcceptAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/OwinWebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/OwinWebSocketAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/WebSocketAcceptAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/WebSocketAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/project.json (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/BufferedReadStream.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/FileBufferingReadStream.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/FormReader.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/HttpRequestStreamReader.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/HttpResponseStreamWriter.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/KeyValueAccumulator.cs (100%) rename src/{Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj => Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj} (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/MultipartReader.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/MultipartReaderStream.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/MultipartSection.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/QueryHelpers.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/ReasonPhrases.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/Resources.Designer.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/Resources.resx (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/StreamHelperExtensions.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/WebEncoders.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/project.json (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/HttpResponseWritingExtensionsTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/MapPathMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/MapPredicateMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj => Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/PathStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/QueryStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/UseMiddlewareTest.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/HeaderDictionaryTypeExtensionsTest.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj => Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/QueryBuilderTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/ResponseExtensionTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/SendFileResponseExtensionsTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/UriHelperTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/FeatureCollectionTests.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/IThing.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj => Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/Properties/AssemblyInfo.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/Thing.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/ApplicationBuilderTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/Authentication/DefaultAuthenticationManagerTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/BufferingHelperTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/DefaultHttpContextTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/DefaultHttpRequestTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/DefaultHttpResponseTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/FormFeatureTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/HeaderDictionaryTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/HttpContextFactoryTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/HttpRequestIdentifierFeatureTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj => Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/QueryFeatureTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/ResponseCookiesTest.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj => Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/OwinEnvironmentTests.cs (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/OwinExtensionTests.cs (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/OwinFeatureCollectionTests.cs (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/project.json (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/HttpRequestStreamReaderTest.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/HttpResponseStreamWriterTest.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj => Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj} (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/MultipartReaderTests.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/QueryHelpersTests.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/WebEncodersTests.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/project.json (100%) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HostString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj rename to src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/PathString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/QueryString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Resources.resx rename to src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx diff --git a/src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/project.json rename to src/Microsoft.AspNetCore.Http.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj rename to src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs rename to src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs rename to src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs rename to src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs rename to src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/UriHelper.cs rename to src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/project.json rename to src/Microsoft.AspNetCore.Http.Extensions/project.json diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/FeatureCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReference.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/FeatureReference.cs rename to src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/FeatureReferences.cs rename to src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs rename to src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ISession.cs rename to src/Microsoft.AspNetCore.Http.Features/ISession.cs diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ISessionFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj rename to src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj diff --git a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs rename to src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Features/project.json rename to src/Microsoft.AspNetCore.Http.Features/project.json diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ApplicationBuilder.cs rename to src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs rename to src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs similarity index 100% rename from src/Microsoft.AspNet.Http/BufferingHelper.cs rename to src/Microsoft.AspNetCore.Http/BufferingHelper.cs diff --git a/src/Microsoft.AspNet.Http/Constants.cs b/src/Microsoft.AspNetCore.Http/Constants.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Constants.cs rename to src/Microsoft.AspNetCore.Http/Constants.cs diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs rename to src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultHttpContext.cs rename to src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultHttpRequest.cs rename to src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultHttpResponse.cs rename to src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs rename to src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/FormFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/FormFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/FormFile.cs rename to src/Microsoft.AspNetCore.Http/Features/FormFile.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IFormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IFormFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IItemsFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IQueryFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/ItemsFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/QueryFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNetCore.Http/FormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/FormCollection.cs rename to src/Microsoft.AspNetCore.Http/FormCollection.cs diff --git a/src/Microsoft.AspNet.Http/FormFileCollection.cs b/src/Microsoft.AspNetCore.Http/FormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/FormFileCollection.cs rename to src/Microsoft.AspNetCore.Http/FormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HeaderDictionary.cs rename to src/Microsoft.AspNetCore.Http/HeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpContextAccessor.cs rename to src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpContextFactory.cs rename to src/Microsoft.AspNetCore.Http/HttpContextFactory.cs diff --git a/src/Microsoft.AspNet.Http/ItemsDictionary.cs b/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ItemsDictionary.cs rename to src/Microsoft.AspNetCore.Http/ItemsDictionary.cs diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj similarity index 100% rename from src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj rename to src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ParsingHelpers.cs rename to src/Microsoft.AspNetCore.Http/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/QueryCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/QueryCollection.cs rename to src/Microsoft.AspNetCore.Http/QueryCollection.cs diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ReferenceReadStream.cs rename to src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/RequestCookieCollection.cs rename to src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ResponseCookies.cs rename to src/Microsoft.AspNetCore.Http/ResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json similarity index 100% rename from src/Microsoft.AspNet.Http/project.json rename to src/Microsoft.AspNetCore.Http/project.json diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs rename to src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs rename to src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs diff --git a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs rename to src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj similarity index 100% rename from src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj rename to src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinConstants.cs rename to src/Microsoft.AspNetCore.Owin/OwinConstants.cs diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinEnvironment.cs rename to src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs rename to src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinExtensions.cs rename to src/Microsoft.AspNetCore.Owin/OwinExtensions.cs diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs rename to src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNetCore.Owin/Utilities.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/Utilities.cs rename to src/Microsoft.AspNetCore.Owin/Utilities.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json similarity index 100% rename from src/Microsoft.AspNet.Owin/project.json rename to src/Microsoft.AspNetCore.Owin/project.json diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs rename to src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs rename to src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/FormReader.cs rename to src/Microsoft.AspNetCore.WebUtilities/FormReader.cs diff --git a/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs rename to src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs diff --git a/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs rename to src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs rename to src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj rename to src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/MultipartReader.cs rename to src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs rename to src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/MultipartSection.cs rename to src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs rename to src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs diff --git a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs rename to src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs rename to src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.resx b/src/Microsoft.AspNetCore.WebUtilities/Resources.resx similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Resources.resx rename to src/Microsoft.AspNetCore.WebUtilities/Resources.resx diff --git a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs rename to src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/WebEncoders.cs rename to src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/project.json rename to src/Microsoft.AspNetCore.WebUtilities/project.json diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/IThing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/IThing.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/Thing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/Thing.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Features.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs rename to test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Tests/project.json diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj rename to test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs rename to test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs rename to test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs rename to test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/project.json rename to test/Microsoft.AspNetCore.Owin.Tests/project.json diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj rename to test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/project.json rename to test/Microsoft.AspNetCore.WebUtilities.Tests/project.json From 02363da94eee7311e457e136dc45edf9c5ac3494 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 22 Jan 2016 12:20:40 -0800 Subject: [PATCH 486/846] Rename AspNet 5 file contents. See https://github.com/aspnet/Announcements/issues/144 for more information. --- HttpAbstractions.sln | 24 +++++++++---------- NuGetPackageVerifier.json | 12 +++++----- samples/SampleApp/PooledHttpContext.cs | 8 +++---- samples/SampleApp/PooledHttpContextFactory.cs | 6 ++--- samples/SampleApp/project.json | 4 ++-- .../AuthenticationDescription.cs | 2 +- .../Authentication/AuthenticationManager.cs | 4 ++-- .../AuthenticationProperties.cs | 2 +- .../ConnectionInfo.cs | 2 +- .../CookieOptions.cs | 2 +- .../Extensions/HeaderDictionaryExtensions.cs | 4 ++-- .../HttpResponseWritingExtensions.cs | 2 +- .../Extensions/MapExtensions.cs | 6 ++--- .../Extensions/MapMiddleware.cs | 4 ++-- .../Extensions/MapOptions.cs | 4 ++-- .../Extensions/MapWhenExtensions.cs | 6 ++--- .../Extensions/MapWhenMiddleware.cs | 4 ++-- .../Extensions/MapWhenOptions.cs | 4 ++-- .../Extensions/RunExtensions.cs | 4 ++-- .../Extensions/UseExtensions.cs | 4 ++-- .../Extensions/UseMiddlewareExtensions.cs | 6 ++--- .../FragmentString.cs | 2 +- .../HostString.cs | 2 +- .../HttpContext.cs | 6 ++--- .../HttpRequest.cs | 2 +- .../HttpResponse.cs | 2 +- .../IApplicationBuilder.cs | 6 ++--- .../IFormCollection.cs | 20 ++++++++-------- .../IFormFile.cs | 2 +- .../IFormFileCollection.cs | 2 +- .../IHttpContextAccessor.cs | 2 +- .../IHttpContextFactory.cs | 6 ++--- .../IQueryCollection.cs | 20 ++++++++-------- .../IRequestCookieCollection.cs | 20 ++++++++-------- .../IResponseCookies.cs | 2 +- .../Internal/HeaderSegment.cs | 4 ++-- .../Internal/HeaderSegmentCollection.cs | 2 +- .../Internal/ParsingHelpers.cs | 2 +- .../PathString.cs | 4 ++-- .../Properties/AssemblyInfo.cs | 2 +- .../Properties/Resources.Designer.cs | 4 ++-- .../QueryString.cs | 2 +- .../RequestDelegate.cs | 2 +- .../StatusCodes.cs | 2 +- .../WebSocketManager.cs | 2 +- .../project.json | 2 +- .../HeaderDictionaryTypeExtensions.cs | 4 ++-- .../QueryBuilder.cs | 2 +- .../RequestHeaders.cs | 2 +- .../ResponseExtensions.cs | 6 ++--- .../ResponseHeaders.cs | 4 ++-- .../SendFileResponseExtensions.cs | 6 ++--- .../SessionExtensions.cs | 4 ++-- .../StreamCopyOperation.cs | 2 +- .../UriHelper.cs | 2 +- .../project.json | 2 +- .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeBehavior.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/IAuthenticationHandler.cs | 2 +- .../IHttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- .../FeatureCollection.cs | 2 +- .../FeatureReference.cs | 2 +- .../FeatureReferences.cs | 2 +- .../IFeatureCollection.cs | 2 +- .../IHeaderDictionary.cs | 2 +- .../IHttpBufferingFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpRequestIdentifierFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- .../IHttpSendFileFeature.cs | 2 +- .../IHttpUpgradeFeature.cs | 2 +- .../IHttpWebSocketFeature.cs | 2 +- .../ISession.cs | 2 +- .../ISessionFeature.cs | 2 +- .../ITlsConnectionFeature.cs | 2 +- .../ITlsTokenBindingFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 4 ++-- .../ApplicationBuilder.cs | 8 +++---- .../DefaultAuthenticationManager.cs | 8 +++---- .../BufferingHelper.cs | 4 ++-- src/Microsoft.AspNetCore.Http/Constants.cs | 2 +- .../DefaultConnectionInfo.cs | 6 ++--- .../DefaultHttpContext.cs | 14 +++++------ .../DefaultHttpRequest.cs | 6 ++--- .../DefaultHttpResponse.cs | 6 ++--- .../DefaultWebSocketManager.cs | 4 ++-- .../HttpAuthenticationFeature.cs | 2 +- .../Features/DefaultSessionFeature.cs | 4 ++-- .../Features/FormFeature.cs | 6 ++--- .../Features/FormFile.cs | 4 ++-- .../Features/HttpConnectionFeature.cs | 2 +- .../Features/HttpRequestFeature.cs | 4 ++-- .../Features/HttpRequestIdentifierFeature.cs | 4 ++-- .../Features/HttpRequestLifetimeFeature.cs | 4 ++-- .../Features/HttpResponseFeature.cs | 4 ++-- .../Features/IFormFeature.cs | 2 +- .../Features/IItemsFeature.cs | 2 +- .../Features/IQueryFeature.cs | 2 +- .../Features/IRequestCookiesFeature.cs | 2 +- .../Features/IResponseCookiesFeature.cs | 2 +- .../Features/IServiceProvidersFeature.cs | 2 +- .../Features/ItemsFeature.cs | 4 ++-- .../Features/QueryFeature.cs | 6 ++--- .../Features/RequestCookiesFeature.cs | 4 ++-- .../Features/ResponseCookiesFeature.cs | 4 ++-- .../Features/ServiceProvidersFeature.cs | 2 +- .../Features/TlsConnectionFeature.cs | 2 +- .../FormCollection.cs | 16 ++++++------- .../FormFileCollection.cs | 2 +- .../HeaderDictionary.cs | 20 ++++++++-------- .../HttpContextAccessor.cs | 2 +- .../HttpContextFactory.cs | 6 ++--- .../ItemsDictionary.cs | 2 +- .../ParsingHelpers.cs | 2 +- .../QueryCollection.cs | 12 +++++----- .../ReferenceReadStream.cs | 2 +- .../RequestCookieCollection.cs | 4 ++-- .../ResponseCookies.cs | 2 +- src/Microsoft.AspNetCore.Http/project.json | 4 ++-- .../DictionaryStringArrayWrapper.cs | 4 ++-- .../DictionaryStringValuesWrapper.cs | 4 ++-- .../IOwinEnvironmentFeature.cs | 2 +- .../OwinConstants.cs | 2 +- .../OwinEnvironment.cs | 12 +++++----- .../OwinEnvironmentFeature.cs | 2 +- .../OwinExtensions.cs | 12 +++++----- .../OwinFeatureCollection.cs | 8 +++---- src/Microsoft.AspNetCore.Owin/Utilities.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptContext.cs | 4 ++-- .../WebSockets/OwinWebSocketAdapter.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 4 ++-- .../WebSockets/WebSocketAdapter.cs | 2 +- src/Microsoft.AspNetCore.Owin/project.json | 2 +- .../BufferedReadStream.cs | 2 +- .../FileBufferingReadStream.cs | 2 +- .../FormReader.cs | 2 +- .../HttpRequestStreamReader.cs | 4 ++-- .../HttpResponseStreamWriter.cs | 4 ++-- .../KeyValueAccumulator.cs | 2 +- .../MultipartReader.cs | 2 +- .../MultipartReaderStream.cs | 2 +- .../MultipartSection.cs | 2 +- .../QueryHelpers.cs | 2 +- .../ReasonPhrases.cs | 2 +- .../Resources.Designer.cs | 6 ++--- .../StreamHelperExtensions.cs | 2 +- .../WebEncoders.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 4 ++-- .../MapPathMiddlewareTests.cs | 8 +++---- .../MapPredicateMiddlewareTests.cs | 8 +++---- .../PathStringTests.cs | 4 ++-- .../QueryStringTests.cs | 6 ++--- .../UseMiddlewareTest.cs | 10 ++++---- .../project.json | 4 ++-- .../HeaderDictionaryTypeExtensionsTest.cs | 4 ++-- .../QueryBuilderTests.cs | 2 +- .../ResponseExtensionTests.cs | 6 ++--- .../SendFileResponseExtensionsTests.cs | 6 ++--- .../UriHelperTests.cs | 6 ++--- .../project.json | 4 ++-- .../FeatureCollectionTests.cs | 2 +- .../IThing.cs | 2 +- .../Properties/AssemblyInfo.cs | 4 ++-- .../Thing.cs | 2 +- .../project.json | 2 +- .../ApplicationBuilderTests.cs | 4 ++-- .../DefaultAuthenticationManagerTests.cs | 12 +++++----- .../BufferingHelperTests.cs | 2 +- .../DefaultHttpContextTests.cs | 8 +++---- .../DefaultHttpRequestTests.cs | 4 ++-- .../DefaultHttpResponseTests.cs | 4 ++-- .../FormFeatureTests.cs | 6 ++--- .../HeaderDictionaryTests.cs | 2 +- .../HttpContextFactoryTests.cs | 6 ++--- .../HttpRequestIdentifierFeatureTests.cs | 6 ++--- .../QueryFeatureTests.cs | 2 +- .../ResponseCookiesTest.cs | 6 ++--- .../project.json | 2 +- .../OwinEnvironmentTests.cs | 6 ++--- .../OwinExtensionTests.cs | 6 ++--- .../OwinFeatureCollectionTests.cs | 4 ++-- .../project.json | 4 ++-- .../HttpRequestStreamReaderTest.cs | 4 ++-- .../HttpResponseStreamWriterTest.cs | 4 ++-- .../MultipartReaderTests.cs | 2 +- .../QueryHelpersTests.cs | 2 +- .../WebEncodersTests.cs | 2 +- .../project.json | 2 +- 195 files changed, 407 insertions(+), 407 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index e510c8c96e..49ac64ba4f 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -6,29 +6,29 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http", "src\Microsoft.AspNetCore.Http\Microsoft.AspNetCore.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions", "src\Microsoft.AspNet.Http.Abstractions\Microsoft.AspNet.Http.Abstractions.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Abstractions", "src\Microsoft.AspNetCore.Http.Abstractions\Microsoft.AspNetCore.Http.Abstractions.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features", "src\Microsoft.AspNet.Http.Features\Microsoft.AspNet.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Features", "src\Microsoft.AspNetCore.Http.Features\Microsoft.AspNetCore.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Tests", "test\Microsoft.AspNetCore.Http.Tests\Microsoft.AspNetCore.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features.Tests", "test\Microsoft.AspNet.Http.Features.Tests\Microsoft.AspNet.Http.Features.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Features.Tests", "test\Microsoft.AspNetCore.Http.Features.Tests\Microsoft.AspNetCore.Http.Features.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions.Tests", "test\Microsoft.AspNet.Http.Abstractions.Tests\Microsoft.AspNet.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Abstractions.Tests", "test\Microsoft.AspNetCore.Http.Abstractions.Tests\Microsoft.AspNetCore.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Owin", "src\Microsoft.AspNetCore.Owin\Microsoft.AspNetCore.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.xproj", "{16219571-3268-4D12-8689-12B7163DBA13}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Owin.Tests", "test\Microsoft.AspNetCore.Owin.Tests\Microsoft.AspNetCore.Owin.Tests.xproj", "{16219571-3268-4D12-8689-12B7163DBA13}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.xproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Extensions", "src\Microsoft.AspNetCore.Http.Extensions\Microsoft.AspNetCore.Http.Extensions.xproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.xproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Extensions.Tests", "test\Microsoft.AspNetCore.Http.Extensions.Tests\Microsoft.AspNetCore.Http.Extensions.Tests.xproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.xproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebUtilities", "src\Microsoft.AspNetCore.WebUtilities\Microsoft.AspNetCore.WebUtilities.xproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.xproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebUtilities.Tests", "test\Microsoft.AspNetCore.WebUtilities.Tests\Microsoft.AspNetCore.WebUtilities.Tests.xproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.xproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" EndProject diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index adea61d7de..647f42bb4f 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -9,12 +9,12 @@ "StrictSemanticVersionValidationRule" ], "packages": { - "Microsoft.AspNet.Http": { }, - "Microsoft.AspNet.Http.Abstractions": { }, - "Microsoft.AspNet.Http.Extensions": { }, - "Microsoft.AspNet.Http.Features": { }, - "Microsoft.AspNet.Owin": { }, - "Microsoft.AspNet.WebUtilities": { }, + "Microsoft.AspNetCore.Http": { }, + "Microsoft.AspNetCore.Http.Abstractions": { }, + "Microsoft.AspNetCore.Http.Extensions": { }, + "Microsoft.AspNetCore.Http.Features": { }, + "Microsoft.AspNetCore.Owin": { }, + "Microsoft.AspNetCore.WebUtilities": { }, "Microsoft.Net.Http.Headers": { } } }, diff --git a/samples/SampleApp/PooledHttpContext.cs b/samples/SampleApp/PooledHttpContext.cs index 7736085eac..57b5f0e52b 100644 --- a/samples/SampleApp/PooledHttpContext.cs +++ b/samples/SampleApp/PooledHttpContext.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; namespace SampleApp { diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/samples/SampleApp/PooledHttpContextFactory.cs index 62955d90f8..6128e4ff49 100644 --- a/samples/SampleApp/PooledHttpContextFactory.cs +++ b/samples/SampleApp/PooledHttpContextFactory.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; namespace SampleApp { diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index b3b5f51ed7..94e788f9ad 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,8 +1,8 @@ -{ +{ "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" + "Microsoft.AspNetCore.Http": "1.0.0-*" }, "commands": { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs index d1f39811ea..fb0a073f0b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNetCore.Http.Authentication { /// /// Contains information describing an authentication provider. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs index 687e1c7474..b787a1ed28 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNetCore.Http.Authentication { public abstract class AuthenticationManager { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs index b4d327914f..6e883efb7e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNetCore.Http.Authentication { /// /// Dictionary used to store state values about the authentication session. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs index fdb908a6c6..08c4108609 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs @@ -6,7 +6,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public abstract class ConnectionInfo { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs index 5cf29be6a2..50604ae8a7 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Options used to create a new cookie. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs index 6a8d909dba..79da20b342 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class HeaderDictionaryExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs index fd0553b3c0..0b24a7d4f4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Convenience methods for writing to the response. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs index c06c37563a..448e2c6f6d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Builder.Extensions; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for the . diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs index 1c66aea8e0..9d286d39d4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs @@ -3,9 +3,9 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Respresents a middleware that maps a request path to a sub-request pipeline. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs index dc16d15482..60adc74379 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Options for the . diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs index 7bd658460e..946379df26 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Builder.Extensions; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { using Predicate = Func; diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs index 26ba9f0d81..b012626ba9 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -3,9 +3,9 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Respresents a middleware that runs a sub-request pipeline when a given predicate is matched. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs index 9b430b2d4d..d18eb7f257 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Options for the . diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs index 42c99925ad..328c490c9e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for adding terminal middleware. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs index 163dcfd19f..d8791b8675 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs @@ -3,9 +3,9 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for adding middleware. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 628b0365e6..75f61ce5d4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -6,11 +6,11 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Abstractions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Abstractions; using Microsoft.Extensions.Internal; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for adding typed middlware. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs index 87b22df243..3131191a1e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides correct handling for FragmentString value when needed to generate a URI string diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs index 75b56092fc..f767255b1f 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs @@ -4,7 +4,7 @@ using System; using System.Globalization; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the host portion of a URI can be used to construct URI's properly formatted and encoded for use in diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs index f639a4dd9d..4aeac2be9c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs @@ -5,10 +5,10 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Authentication; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Encapsulates all HTTP-specific information about an individual HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs index a13a78e600..7dd22d19f2 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the incoming side of an individual HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs index 1e3344459c..0276fb626c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs @@ -5,7 +5,7 @@ using System; using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the outgoing side of an individual HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs index be0faecbc8..ece1f75d8b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Defines a class that provides the mechanisms to configure an application's request pipeline. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs index 55d4a578bc..668afa61a8 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the parsed form values sent with the HttpRequest. @@ -12,32 +12,32 @@ namespace Microsoft.AspNet.Http public interface IFormCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// /// Gets an containing the keys of the - /// . + /// . /// /// /// An containing the keys of the object - /// that implements . + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// /// @@ -58,7 +58,7 @@ namespace Microsoft.AspNet.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// /// @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs index eca4d6a20b..871ca0efe4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents a file sent with the HttpRequest. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs index 229b7bbb8e..e66c96e05d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the collection of files sent with the HttpRequest. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs index 8f4046da2b..dc8ec34a7c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public interface IHttpContextAccessor { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs index cdeb2ce223..7d049626c3 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public interface IHttpContextFactory { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs index 4bed287e38..48d8448b58 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the HttpRequest query string collection @@ -12,32 +12,32 @@ namespace Microsoft.AspNet.Http public interface IQueryCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// /// Gets an containing the keys of the - /// . + /// . /// /// /// An containing the keys of the object - /// that implements . + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// /// @@ -58,7 +58,7 @@ namespace Microsoft.AspNet.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// /// @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs index 5cc028b182..7fffe314fe 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the HttpRequest cookie collection @@ -11,32 +11,32 @@ namespace Microsoft.AspNet.Http public interface IRequestCookieCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// /// Gets an containing the keys of the - /// . + /// . /// /// /// An containing the keys of the object - /// that implements . + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// /// @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// /// @@ -78,7 +78,7 @@ namespace Microsoft.AspNet.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return String.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs index fb2528dc36..dd8696f358 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs index acd3a9ade1..a1234ff61a 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs @@ -1,11 +1,11 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs index 693bce0caf..4ef781990a 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal struct HeaderSegmentCollection : IEnumerable, IEquatable { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs index 78b7fcd769..7cac98cf3d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal static class ParsingHelpers { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 123fba4f48..9565c361ab 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -3,9 +3,9 @@ using System; using System.Text.Encodings.Web; -using Microsoft.AspNet.Http.Abstractions; +using Microsoft.AspNetCore.Http.Abstractions; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs index 818ea5b97b..6f39c4b2d6 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs @@ -6,5 +6,5 @@ using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs index 99f5b6bea3..438644852a 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs @@ -1,5 +1,5 @@ // -namespace Microsoft.AspNet.Http.Abstractions +namespace Microsoft.AspNetCore.Http.Abstractions { using System.Globalization; using System.Reflection; @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Http.Abstractions internal static class Resources { private static readonly ResourceManager _resourceManager - = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); + = new ResourceManager("Microsoft.AspNetCore.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); /// /// '{0}' is not available. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs index 336266e5aa..9b2fe702d0 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs @@ -7,7 +7,7 @@ using System.Text; using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides correct handling for QueryString value when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs index b34b6ed86d..aecf353b29 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// A function that can process an HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index ca0d903d87..9c0f4999ce 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class StatusCodes { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs index e569e549b9..79afefa5c0 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Manages the establishment of WebSocket connections for a specific HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index cf571cfed3..95ff47a821 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -10,7 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.AspNetCore.Http.Features": "1.0.0-*", "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs index cd8d26ca25..2f9c570d67 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -5,11 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; -using Microsoft.AspNet.Http.Headers; +using Microsoft.AspNetCore.Http.Headers; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class HeaderDictionaryTypeExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs index ec4ae68fec..e9feb391b1 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Text; using System.Text.Encodings.Web; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { // The IEnumerable interface is required for the collection initialization syntax: new QueryBuilder() { { "key", "value" } }; public class QueryBuilder : IEnumerable> diff --git a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs index 59265fbf08..2830e6147d 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Headers +namespace Microsoft.AspNetCore.Http.Headers { public class RequestHeaders { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs index ea00f14d5c..6c5d92a7af 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class ResponseExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs index 931b2d931d..acdd662d2f 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Headers +namespace Microsoft.AspNetCore.Http.Headers { public class ResponseHeaders { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs index 747e91096e..6058eb9a18 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs @@ -5,10 +5,10 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Extensions; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides extensions for HttpResponse exposing the SendFile extension. diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs index b2908aed80..859e6c3715 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Text; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class SessionExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs index a59aed1f0a..c42661a167 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs @@ -8,7 +8,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { // FYI: In most cases the source will be a FileStream and the destination will be to the network. public static class StreamCopyOperation diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index f121ffa1d6..e7a7eb20a5 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -4,7 +4,7 @@ using System; using System.Text; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { /// /// A helper class for constructing encoded Uris for use in headers and other Uris. diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 8aa5deacf7..f38f4a0f48 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -10,7 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*", "System.Buffers": "4.0.0-*" }, diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs index 187c372fad..21aaf5b428 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class AuthenticateContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs index 1be42f700b..549d51132a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public enum ChallengeBehavior { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs index 5989ab4245..c0fe470806 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class ChallengeContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs index 251d9dfb8c..b25c2c979a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class DescribeSchemesContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs index 155cd87380..3b72364182 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public interface IAuthenticationHandler { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs index 0c76210a26..080ce40574 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs index 08591ffa82..f04dade51b 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class SignInContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs index ea89cf9f31..c752f057df 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class SignOutContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs index 79e6916752..e79ecfee22 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class FeatureCollection : IFeatureCollection { diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs index 538297a3a0..5016602123 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public struct FeatureReference { diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs index 30d7c3638f..f69094c252 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public struct FeatureReferences { diff --git a/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs index 454cafa3dc..f7b23ed16f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { /// /// Represents a collection of HTTP features. diff --git a/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs index 303ff36bcb..674e2bda94 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents HttpRequest and HttpResponse headers diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs index 947e77782b..fae7f3d0ff 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpBufferingFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs index 5eca86f433..ac30742af8 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs index 988f2b6194..4b52060177 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpRequestFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs index 163988d832..9b0b5201d7 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { /// /// Feature to identify a request. diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs index e007c4a818..3a93c3d1e5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs index 67cfa28333..8ea43d61fd 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpResponseFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs index 328d901903..0776034e43 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpSendFileFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs index 77d4ffa501..e98065bc4d 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs @@ -4,7 +4,7 @@ using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpUpgradeFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs index 674161abc1..49b28bc38f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs @@ -4,7 +4,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpWebSocketFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index 058853ffc9..fc729b5bff 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface ISession { diff --git a/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs index 4406b8809f..2365299415 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface ISessionFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs index f5d786f8b4..c34a3339d5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface ITlsConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs index 7b8535eb72..d63333dd0a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { /// /// Provides information regarding TLS token binding parameters. diff --git a/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs index 1bc7c2e470..b2627f5575 100644 --- a/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class WebSocketAcceptContext { diff --git a/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs index e6164af576..a0315ee539 100644 --- a/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs @@ -5,11 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Builder.Internal +namespace Microsoft.AspNetCore.Builder.Internal { public class ApplicationBuilder : IApplicationBuilder { diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index 0c8db87453..5933db0497 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -6,11 +6,11 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; -namespace Microsoft.AspNet.Http.Authentication.Internal +namespace Microsoft.AspNetCore.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager { diff --git a/src/Microsoft.AspNetCore.Http/BufferingHelper.cs b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs index 03c3db188f..80f95ecbf1 100644 --- a/src/Microsoft.AspNetCore.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs @@ -3,9 +3,9 @@ using System; using System.IO; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.WebUtilities; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public static class BufferingHelper { diff --git a/src/Microsoft.AspNetCore.Http/Constants.cs b/src/Microsoft.AspNetCore.Http/Constants.cs index 9ae305ddf4..0d52a692d3 100644 --- a/src/Microsoft.AspNetCore.Http/Constants.cs +++ b/src/Microsoft.AspNetCore.Http/Constants.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal static class Constants { diff --git a/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs index 693755aeda..35c8c584a7 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs @@ -5,10 +5,10 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultConnectionInfo : ConnectionInfo { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs index 9cc4211c9f..5d0424cf7c 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs @@ -5,14 +5,14 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication.Internal; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Authentication; +using Microsoft.AspNetCore.Http.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features.Internal; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpContext : HttpContext { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs index 5d3a2875f5..f133c993a0 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs @@ -5,11 +5,11 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs index a9cb49cbdf..0676913d62 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs @@ -4,11 +4,11 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs index 8beff4db9a..fe5f859dc4 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs @@ -5,10 +5,10 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { diff --git a/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs index 92713e1c87..f3fd228853 100644 --- a/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication.Internal +namespace Microsoft.AspNetCore.Http.Features.Authentication.Internal { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs index 041794c7b5..374e4dcd68 100644 --- a/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs @@ -1,7 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { /// /// This type exists only for the purpose of unit testing where the user can directly set the diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index 198924ba06..004e2892ce 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -6,11 +6,11 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.WebUtilities; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs index f9e4bfc539..72335cdb62 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs @@ -4,9 +4,9 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs index 1988301e33..05fc485c03 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpConnectionFeature : IHttpConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs index de48b71b8a..b85484b879 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpRequestFeature : IHttpRequestFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs index ba7cac52d9..289ecbdc85 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs index 8a8e00f260..17e6ec31d2 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpRequestLifetimeFeature : IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs index adb411ee3a..c40074b92b 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs @@ -4,9 +4,9 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpResponseFeature : IHttpResponseFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs index 095c14a9e4..4ed8ba238c 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IFormFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs index a30c3ac6fb..68f411b5c5 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IItemsFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs index 269e31babd..3f89bd2b4c 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IQueryFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs index b015b2d848..58cf459a04 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs index 2d47300b79..9277637217 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs index 30b9b63b96..9816f2fe33 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs index c80abe6d65..e434666762 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs index 73450ad58f..015fba5669 100644 --- a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.WebUtilities; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs index 4fb087e9ab..0102ab7f68 100644 --- a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs @@ -3,11 +3,11 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs index 0c87dc2833..136ecd2a8e 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs index 194c3b3f36..3cd172a0d0 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs index 9c7d75f483..081cf97b75 100644 --- a/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class TlsConnectionFeature : ITlsConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http/FormCollection.cs b/src/Microsoft.AspNetCore.Http/FormCollection.cs index b8e13fb315..33c36d558d 100644 --- a/src/Microsoft.AspNetCore.Http/FormCollection.cs +++ b/src/Microsoft.AspNetCore.Http/FormCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// Contains the parsed form values. @@ -77,9 +77,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -101,10 +101,10 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) @@ -131,9 +131,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. + /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) diff --git a/src/Microsoft.AspNetCore.Http/FormFileCollection.cs b/src/Microsoft.AspNetCore.Http/FormFileCollection.cs index b7b3ee8ebd..806e756a8e 100644 --- a/src/Microsoft.AspNetCore.Http/FormFileCollection.cs +++ b/src/Microsoft.AspNetCore.Http/FormFileCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 181c938ca1..a885ccad8c 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// Represents a wrapper for RequestHeaders and ResponseHeaders. @@ -98,9 +98,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -110,9 +110,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets a value that indicates whether the is in read-only mode. + /// Gets a value that indicates whether the is in read-only mode. /// - /// true if the is in read-only mode; otherwise, false. + /// true if the is in read-only mode; otherwise, false. public bool IsReadOnly { get @@ -207,10 +207,10 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -221,9 +221,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Copies the elements to a one-dimensional Array instance at the specified index. + /// Copies the elements to a one-dimensional Array instance at the specified index. /// - /// The one-dimensional Array that is the destination of the specified objects copied from the . + /// The one-dimensional Array that is the destination of the specified objects copied from the . /// The zero-based index in at which copying begins. public void CopyTo(KeyValuePair[] array, int arrayIndex) { @@ -279,7 +279,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs index 04784d714a..e009bf1cb1 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs @@ -9,7 +9,7 @@ using System.Runtime.Remoting; using System.Threading; #endif -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HttpContextAccessor : IHttpContextAccessor { diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs index 0f6546cd36..2f6717641f 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HttpContextFactory : IHttpContextFactory { diff --git a/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs b/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs index 87a27b8b12..4821912240 100644 --- a/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs index e2da6489a3..7a018ebd1a 100644 --- a/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNetCore.Http/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/QueryCollection.cs index 6ea9c379ac..fb0a260ceb 100644 --- a/src/Microsoft.AspNetCore.Http/QueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http/QueryCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// The HttpRequest query string collection @@ -71,9 +71,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -99,10 +99,10 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -117,7 +117,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) diff --git a/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs index 2d6cfdac4e..be51a2f487 100644 --- a/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs @@ -6,7 +6,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs index 9751eee486..b8e4f2d7b1 100644 --- a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class RequestCookieCollection : IRequestCookieCollection { @@ -135,7 +135,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// Returns an struct enumerator that iterates through a collection without boxing. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) diff --git a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs index 185540eb50..b8236d918e 100644 --- a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 530c34e71e..728e38ebcc 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -11,8 +11,8 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs index 5fe22814d4..c4bb38f386 100644 --- a/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs +++ b/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs @@ -4,10 +4,10 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal class DictionaryStringArrayWrapper : IDictionary { diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs index aec1a0d921..2517f556c6 100644 --- a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs @@ -4,10 +4,10 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal class DictionaryStringValuesWrapper : IHeaderDictionary { diff --git a/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs index f5eabc9992..8a476b9f38 100644 --- a/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public interface IOwinEnvironmentFeature { diff --git a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs index beae948df8..028866bae2 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal static class OwinConstants { diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index 3a66fa7749..11f3e2fab9 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -14,13 +14,13 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using SendFileFunc = Func; using WebSocketAcceptAlt = diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs index 9fae247f6b..14eb312608 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinEnvironmentFeature : IOwinEnvironmentFeature { diff --git a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs index 5ae81a6260..7d6d160113 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs @@ -4,13 +4,13 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.Owin; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.Owin; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { using AppFunc = Func, Task>; using CreateMiddleware = Func< diff --git a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs index a8c7560819..e2b7a8f83d 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs @@ -14,11 +14,11 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using SendFileFunc = Func; diff --git a/src/Microsoft.AspNetCore.Owin/Utilities.cs b/src/Microsoft.AspNetCore.Owin/Utilities.cs index 00789a86c2..b65cae78a9 100644 --- a/src/Microsoft.AspNetCore.Owin/Utilities.cs +++ b/src/Microsoft.AspNetCore.Owin/Utilities.cs @@ -5,10 +5,10 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Security.Principal; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal static class Utilities { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 87b3cf6ffa..3cee220f46 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using AppFunc = Func, Task>; using WebSocketAccept = diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 9bdaa91588..a891c9611f 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinWebSocketAcceptContext : WebSocketAcceptContext { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs index 4a7a056463..17bd2ede40 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -7,7 +7,7 @@ using System.Threading; using System.Threading.Tasks; using System.Net.WebSockets; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { // http://owin.org/extensions/owin-WebSocket-Extension-v0.4.0.htm using WebSocketCloseAsync = diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs index 2da6ea7774..41b1960cb2 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using AppFunc = Func, Task>; using WebSocketAccept = diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs index 1ddc83a499..be5020c47e 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs @@ -8,7 +8,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using WebSocketCloseAsync = Func /// A Stream that wraps another stream and enables rewinding by buffering the content as it is read. diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs index fe86ee56aa..a78e56c7d3 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { /// /// Used to read an 'application/x-www-form-urlencoded' form. diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs index fedeb9315b..15e98d7eaa 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -8,7 +8,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class HttpRequestStreamReader : TextReader { diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs index e875364647..30f6423fef 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -7,7 +7,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { /// /// Writes to the using the supplied . diff --git a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs index 9e8f0555ca..25032bfcd0 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public struct KeyValueAccumulator { diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs index 2af2a444f1..32dbdbcb9d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { // https://www.ietf.org/rfc/rfc2046.txt public class MultipartReader diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index d87fae944f..22836ee320 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -8,7 +8,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { internal class MultipartReaderStream : Stream { diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs index 196cf424ca..96138c630a 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class MultipartSection { diff --git a/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs index 6b0fd267ac..c3a56ba71d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs @@ -7,7 +7,7 @@ using System.Text; using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public static class QueryHelpers { diff --git a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs index 93270c5fb2..07d5b4212f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public static class ReasonPhrases { diff --git a/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs index 5b186b2d3f..d8071d1a4f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace Microsoft.AspNet.WebUtilities { +namespace Microsoft.AspNetCore.WebUtilities { using System; using System.Reflection; @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.WebUtilities { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.AspNet.WebUtilities.Resources", typeof(Resources).GetTypeInfo().Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.AspNetCore.WebUtilities.Resources", typeof(Resources).GetTypeInfo().Assembly); resourceMan = temp; } return resourceMan; diff --git a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs index a865976274..ac5d4c43a3 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public static class StreamHelperExtensions { diff --git a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs index 4142039f8f..dc462135d1 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs @@ -4,7 +4,7 @@ using System; using System.Diagnostics; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { /// /// Contains utility APIs to assist with common encoding and decoding operations. diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs index 330b2867ea..42ca2a227f 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,10 +3,10 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public class HttpResponseWritingExtensionsTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index 03d885f7bc..a7966947be 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -3,12 +3,12 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { public class MapPathMiddlewareTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 4ddf45220d..b970ee8d34 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -4,12 +4,12 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { using Predicate = Func; diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index 3eb5673d60..e1be9d988d 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Testing; +using Microsoft.AspNetCore.Testing; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public class PathStringTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs index 3084aec482..6caa872e00 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs @@ -1,14 +1,14 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Testing; +using Microsoft.AspNetCore.Testing; using Xunit; -namespace Microsoft.AspNet.Http.Abstractions +namespace Microsoft.AspNetCore.Http.Abstractions { public class QueryStringTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index ee407d35f8..f1b6e327b6 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -3,13 +3,13 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http.Abstractions; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http.Abstractions; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public class UseMiddlewareTest { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 59a67065bd..3814325f09 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -4,8 +4,8 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Testing": "1.0.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index fb2ef452f1..4161625ea6 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,11 +4,11 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Net.Http.Headers; using Xunit; -namespace Microsoft.AspNet.Http.Headers +namespace Microsoft.AspNetCore.Http.Headers { public class HeaderDictionaryTypeExtensionsTest { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs index 4ff9cb103f..7d15dd87bf 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { public class QueryBuilderTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs index efa5f370ee..d63f2b8429 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -5,12 +5,12 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { public class ResponseExtensionTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index 53c8051774..c1e145c34d 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -4,11 +4,11 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Extensions.Tests +namespace Microsoft.AspNetCore.Http.Extensions.Tests { public class SendFileResponseExtensionsTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index 0846dd7172..7bd7159b3c 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { public class UriHelperTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 0cd3b99df0..6d81867330 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs index 2cc0ed6448..36ad77f678 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs @@ -3,7 +3,7 @@ using Xunit; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class FeatureCollectionTests { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs index 7210b9821a..f5b0a1e122 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IThing { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs index 86561ba516..60667e0f6e 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs @@ -8,11 +8,11 @@ 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: AssemblyTitle("Microsoft.AspNet.Http.Features.Tests")] +[assembly: AssemblyTitle("Microsoft.AspNetCore.Http.Features.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Http.Features.Tests")] +[assembly: AssemblyProduct("Microsoft.AspNetCore.Http.Features.Tests")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs index 7f39f86a71..27a2c0e285 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class Thing : IThing { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 64e3c2dc66..f3e96787e7 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.AspNetCore.Http.Features": "1.0.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs index 52d0fadfe2..280e51bf41 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Builder.Internal +namespace Microsoft.AspNetCore.Builder.Internal { public class ApplicationBuilderTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 2b3f666740..3d547ea05a 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -1,16 +1,16 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Authentication.Internal +namespace Microsoft.AspNetCore.Http.Authentication.Internal { public class DefaultAuthenticationManagerTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs index 0728d65d80..9ad48986f5 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs @@ -4,7 +4,7 @@ using System.IO; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class BufferingHelperTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index 74bda1a613..5716ed3347 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -8,12 +8,12 @@ using System.Net.WebSockets; using System.Reflection; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Authentication.Internal; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs index 6defe395f4..e1e86c79aa 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs @@ -4,11 +4,11 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs index 6fcbcedce1..4764c44a63 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs @@ -4,11 +4,11 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpResponseTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs index 7d7cafc542..0ea7fe9681 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs @@ -5,11 +5,11 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.WebUtilities; using Xunit; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class FormFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index d69dd0a129..3d82b07a38 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index b0d800de38..f44a567b24 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HttpContextFactoryTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs index c117a48d66..95c3f39f06 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Tests +namespace Microsoft.AspNetCore.Http.Tests { public class HttpRequestIdentifierFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs index 9c5a84a9f5..c56b4962c9 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs @@ -3,7 +3,7 @@ using Xunit; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class QueryFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index e22d4f338a..a4aac09e4a 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -1,11 +1,11 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Xunit; using Microsoft.Net.Http.Headers; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Tests +namespace Microsoft.AspNetCore.Http.Tests { public class ResponseCookiesTest { diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index e67bbdfc3a..de0767bedd 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs index 6cd3e7a844..5c076b61fc 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs @@ -6,11 +6,11 @@ using System.IO; using System.Linq; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinEnvironmentTests { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs index 8d719f66c0..d894565968 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs @@ -1,15 +1,15 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Xunit; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using AppFunc = Func, Task>; using CreateMiddleware = Func< diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs index b945af4734..4203337366 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Xunit; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinHttpEnvironmentTests { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 4132c72275..9a11ccaec8 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs index a8b90c9bcd..d163f2b526 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; @@ -7,7 +7,7 @@ using System.Text; using System.Threading.Tasks; using Xunit; -namespace Microsoft.AspNet.WebUtilities.Test +namespace Microsoft.AspNetCore.WebUtilities.Test { public class HttpResponseStreamReaderTest { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index a357853020..4f7a6d378f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Xunit; -namespace Microsoft.AspNet.WebUtilities.Test +namespace Microsoft.AspNetCore.WebUtilities.Test { public class HttpResponseStreamWriterTest { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs index 397d279b5e..295241f2c3 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class MultipartReaderTests { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs index 35a68f1a0b..fde7ece69b 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Linq; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class QueryHelperTests { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs index efc17118fc..8804644e12 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs @@ -5,7 +5,7 @@ using System; using System.Linq; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class WebEncodersTests { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 7fe1a5eec4..72e7a43c73 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "xunit": "2.1.0" }, "compilationOptions": { From 765a52007a78fe1af68d58a10ebe008a9249df23 Mon Sep 17 00:00:00 2001 From: Brennan Date: Fri, 29 Jan 2016 11:40:59 -0800 Subject: [PATCH 487/846] Use EscapeDataString for encoding Cookies --- src/Microsoft.AspNetCore.Http/ResponseCookies.cs | 10 +++++----- .../DefaultHttpRequestTests.cs | 6 +++--- .../ResponseCookiesTest.cs | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs index b8236d918e..16832c7dbc 100644 --- a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs @@ -38,8 +38,8 @@ namespace Microsoft.AspNetCore.Http.Internal public void Append(string key, string value) { var setCookieHeaderValue = new SetCookieHeaderValue( - UrlEncoder.Default.Encode(key), - UrlEncoder.Default.Encode(value)) + Uri.EscapeDataString(key), + Uri.EscapeDataString(value)) { Path = "/" }; @@ -61,8 +61,8 @@ namespace Microsoft.AspNetCore.Http.Internal } var setCookieHeaderValue = new SetCookieHeaderValue( - UrlEncoder.Default.Encode(key), - UrlEncoder.Default.Encode(value)) + Uri.EscapeDataString(key), + Uri.EscapeDataString(value)) { Domain = options.Domain, Path = options.Path, @@ -95,7 +95,7 @@ namespace Microsoft.AspNetCore.Http.Internal throw new ArgumentNullException(nameof(options)); } - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; + var encodedKeyPlusEquals = Uri.EscapeDataString(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs index e1e86c79aa..4afc7bd04d 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs @@ -172,15 +172,15 @@ namespace Microsoft.AspNetCore.Http.Internal Assert.Null(cookies0["key0"]); Assert.False(cookies0.ContainsKey("key0")); - var newCookies = new[] { "name0=value0", "name1=value1" }; + var newCookies = new[] { "name0=value0%2C", "%5Ename1=value1" }; request.Headers["Cookie"] = newCookies; cookies0 = RequestCookieCollection.Parse(newCookies); var cookies1 = request.Cookies; Assert.Equal(cookies0, cookies1); Assert.Equal(2, cookies1.Count); - Assert.Equal("value0", cookies1["name0"]); - Assert.Equal("value1", cookies1["name1"]); + Assert.Equal("value0,", cookies1["name0"]); + Assert.Equal("value1", cookies1["^name1"]); Assert.Equal(newCookies, request.Headers["Cookie"]); var cookies2 = new RequestCookieCollection(new Dictionary() diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index a4aac09e4a..cc26d657c7 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -42,5 +42,20 @@ namespace Microsoft.AspNetCore.Http.Tests Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); } + [Theory] + [InlineData("key", "value", "key=value")] + [InlineData("key,", "!value", "key%2C=%21value")] + [InlineData("ke#y,", "val^ue", "ke%23y%2C=val%5Eue")] + public void EscapesKeyValuesBeforeSettingCookie(string key, string value, string expected) + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers); + + cookies.Append(key, value); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(expected, cookieHeaderValues[0]); + } } } From 93079ea3a61c74ec851d8b4b89331aae664d3245 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 1 Feb 2016 16:37:16 -0800 Subject: [PATCH 488/846] Updating to new CLI --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 4 +++- src/Microsoft.AspNetCore.Http.Extensions/project.json | 4 +++- src/Microsoft.AspNetCore.Http.Features/project.json | 6 ++++-- src/Microsoft.AspNetCore.Http/project.json | 6 ++++-- src/Microsoft.AspNetCore.Owin/project.json | 7 +++++-- src/Microsoft.AspNetCore.WebUtilities/project.json | 4 +++- src/Microsoft.Net.Http.Headers/project.json | 6 +++++- .../project.json | 3 ++- .../project.json | 3 ++- test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 3 ++- test/Microsoft.AspNetCore.Http.Tests/project.json | 3 ++- test/Microsoft.AspNetCore.Owin.Tests/project.json | 3 ++- test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 5 +++-- test/Microsoft.Net.Http.Headers.Tests/project.json | 3 ++- 14 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 95ff47a821..bfef7f3f63 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -15,6 +15,7 @@ "type": "build", "version": "1.0.0-*" }, + "Microsoft.NETCore.Platforms": "1.0.1-*", "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { @@ -33,7 +34,8 @@ "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.0.21-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*" - } + }, + "imports": "portable-net451+win8" } } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index f38f4a0f48..628312a5dc 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -12,6 +12,7 @@ "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "System.Buffers": "4.0.0-*" }, "frameworks": { @@ -19,7 +20,8 @@ "dotnet5.4": { "dependencies": { "System.IO.FileSystem": "4.0.1-*" - } + }, + "imports": "portable-net451+win8" } } } diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 0ccf00e18b..e1da5dee1d 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -10,7 +10,8 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*" + "Microsoft.Extensions.Primitives": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*" }, "frameworks": { "net451": {}, @@ -24,7 +25,8 @@ "System.Security.Claims": "4.0.1-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*", "System.Security.Principal": "4.0.1-*" - } + }, + "imports": "portable-net451+win8" } } } diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 728e38ebcc..ca15e09a6a 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -13,14 +13,16 @@ "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" + "Microsoft.Net.Http.Headers": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*" }, "frameworks": { "net451": {}, "dotnet5.4": { "dependencies": { "System.Threading": "4.0.11-*" - } + }, + "imports": "portable-net451+win8" } } } diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 4a02e2515c..a9b4137b4a 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -10,10 +10,13 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNetCore.Http": "1.0.0-*" + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*" }, "frameworks": { "net451": {}, - "dotnet5.4": {} + "dotnet5.4": { + "imports": "portable-net451+win8" + } } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 9ff39f4337..67191b79c7 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -11,6 +11,7 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "System.Buffers": "4.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, @@ -25,7 +26,8 @@ "System.Collections": "4.0.11-*", "System.IO": "4.1.0-*", "System.IO.FileSystem": "4.0.1-*" - } + }, + "imports": "portable-net451+win8" } } } diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 311e571a11..a8287db73f 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -9,6 +9,9 @@ "warningsAsErrors": true, "keyFile": "../../tools/Key.snk" }, + "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*" + }, "frameworks": { "net451": {}, "dotnet5.4": { @@ -20,7 +23,8 @@ "System.Linq": "4.0.1-*", "System.Text.Encoding": "4.0.11-*", "System.Runtime": "4.0.21-*" - } + }, + "imports": "portable-net451+win8" } } } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 3814325f09..4960e47a3a 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -21,7 +21,8 @@ "dnxcore50": { "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - } + }, + "imports": "portable-net451+win8" } }, "testRunner": "xunit", diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 6d81867330..8943eb081f 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -18,7 +18,8 @@ "dnxcore50": { "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - } + }, + "imports": "portable-net451+win8" } }, "testRunner": "xunit", diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index f3e96787e7..4ee107eb4e 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -16,7 +16,8 @@ "dnxcore50": { "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - } + }, + "imports": "portable-net451+win8" } }, "testRunner": "xunit", diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index de0767bedd..79b3bee8e3 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -16,7 +16,8 @@ "dnxcore50": { "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - } + }, + "imports": "portable-net451+win8" } }, "testRunner": "xunit", diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 9a11ccaec8..c701ea94f7 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -18,7 +18,8 @@ "dnxcore50": { "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - } + }, + "imports": "portable-net451+win8" } }, "testRunner": "xunit", diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 72e7a43c73..e6c1af340f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -18,13 +18,14 @@ }, "dependencies": { "xunit.runner.console": "2.1.0" - } + } }, "dnxcore50": { "dependencies": { "System.Text.Encoding.Extensions": "4.0.11-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" - } + }, + "imports": "portable-net451+win8" } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 59cea6aca6..18b4161575 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -17,7 +17,8 @@ "dnxcore50": { "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - } + }, + "imports": "portable-net451+win8" } }, "testRunner": "xunit", From 8aa7a0993db0516848631e010ca27cf00af2a66c Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 1 Feb 2016 18:26:36 -0800 Subject: [PATCH 489/846] Relocating dependencies --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 4 +--- src/Microsoft.AspNetCore.Http.Extensions/project.json | 4 +--- src/Microsoft.AspNetCore.Http.Features/project.json | 6 ++---- src/Microsoft.AspNetCore.Http/project.json | 6 ++---- src/Microsoft.AspNetCore.Owin/project.json | 7 ++----- src/Microsoft.AspNetCore.WebUtilities/project.json | 4 +--- src/Microsoft.Net.Http.Headers/project.json | 7 ++----- .../project.json | 1 + .../project.json | 1 + test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 1 + test/Microsoft.AspNetCore.Http.Tests/project.json | 1 + test/Microsoft.AspNetCore.Owin.Tests/project.json | 1 + test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 1 + test/Microsoft.Net.Http.Headers.Tests/project.json | 1 + 14 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index bfef7f3f63..95ff47a821 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -15,7 +15,6 @@ "type": "build", "version": "1.0.0-*" }, - "Microsoft.NETCore.Platforms": "1.0.1-*", "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { @@ -34,8 +33,7 @@ "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.0.21-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*" - }, - "imports": "portable-net451+win8" + } } } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 628312a5dc..f38f4a0f48 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -12,7 +12,6 @@ "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "System.Buffers": "4.0.0-*" }, "frameworks": { @@ -20,8 +19,7 @@ "dotnet5.4": { "dependencies": { "System.IO.FileSystem": "4.0.1-*" - }, - "imports": "portable-net451+win8" + } } } } diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index e1da5dee1d..0ccf00e18b 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -10,8 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*" + "Microsoft.Extensions.Primitives": "1.0.0-*" }, "frameworks": { "net451": {}, @@ -25,8 +24,7 @@ "System.Security.Claims": "4.0.1-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*", "System.Security.Principal": "4.0.1-*" - }, - "imports": "portable-net451+win8" + } } } } diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index ca15e09a6a..728e38ebcc 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -13,16 +13,14 @@ "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*" + "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { "net451": {}, "dotnet5.4": { "dependencies": { "System.Threading": "4.0.11-*" - }, - "imports": "portable-net451+win8" + } } } } diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index a9b4137b4a..4a02e2515c 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -10,13 +10,10 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNetCore.Http": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*" + "Microsoft.AspNetCore.Http": "1.0.0-*" }, "frameworks": { "net451": {}, - "dotnet5.4": { - "imports": "portable-net451+win8" - } + "dotnet5.4": {} } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 67191b79c7..9ff39f4337 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -11,7 +11,6 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "System.Buffers": "4.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, @@ -26,8 +25,7 @@ "System.Collections": "4.0.11-*", "System.IO": "4.1.0-*", "System.IO.FileSystem": "4.0.1-*" - }, - "imports": "portable-net451+win8" + } } } } diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index a8287db73f..4dddd21e94 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -9,9 +9,7 @@ "warningsAsErrors": true, "keyFile": "../../tools/Key.snk" }, - "dependencies": { - "Microsoft.NETCore.Platforms": "1.0.1-*" - }, + "dependencies": {}, "frameworks": { "net451": {}, "dotnet5.4": { @@ -23,8 +21,7 @@ "System.Linq": "4.0.1-*", "System.Text.Encoding": "4.0.11-*", "System.Runtime": "4.0.21-*" - }, - "imports": "portable-net451+win8" + } } } } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 4960e47a3a..d10bac70ad 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -6,6 +6,7 @@ "dependencies": { "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Testing": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 8943eb081f..a4eb37611b 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -3,6 +3,7 @@ "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 4ee107eb4e..f869ca29fc 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,6 +1,7 @@ { "dependencies": { "Microsoft.AspNetCore.Http.Features": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 79b3bee8e3..aac8b65b40 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,6 +1,7 @@ { "dependencies": { "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index c701ea94f7..73df7a8724 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -3,6 +3,7 @@ "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index e6c1af340f..7320aa0841 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,6 +1,7 @@ { "dependencies": { "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "compilationOptions": { diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 18b4161575..77979fd57c 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.Net.Http.Headers": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { From faf8a73953d85bb4ed9c8aa0f840f6ef90a32ac8 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 5 Feb 2016 17:21:54 -0800 Subject: [PATCH 490/846] Update project.json to remove redundant System.Runtime dependency. - This package is pulled in transitively. --- src/Microsoft.Net.Http.Headers/project.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 4dddd21e94..ed06223354 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -20,7 +20,6 @@ "System.Globalization.Extensions": "4.0.1-*", "System.Linq": "4.0.1-*", "System.Text.Encoding": "4.0.11-*", - "System.Runtime": "4.0.21-*" } } } From 77c137fc0aa1859f6dfc333e25c49e2c7a989668 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 8 Feb 2016 09:33:46 -0800 Subject: [PATCH 491/846] Reacting to CoreCLR package version changes --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 2 +- src/Microsoft.AspNetCore.Http.Features/project.json | 2 +- src/Microsoft.Net.Http.Headers/project.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 95ff47a821..1779b5ee28 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -31,7 +31,7 @@ "System.Linq.Expressions": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", "System.Reflection.TypeExtensions": "4.1.0-*", - "System.Runtime.InteropServices": "4.0.21-*", + "System.Runtime.InteropServices": "4.1.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*" } } diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 0ccf00e18b..9b2a35ebb8 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -17,7 +17,7 @@ "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-*", - "System.Linq": "4.0.1-*", + "System.Linq": "4.0.2-*", "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", "System.Runtime.Extensions": "4.1.0-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index ed06223354..07931164c9 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -18,7 +18,7 @@ "System.Diagnostics.Contracts": "4.0.1-*", "System.Globalization": "4.0.11-*", "System.Globalization.Extensions": "4.0.1-*", - "System.Linq": "4.0.1-*", + "System.Linq": "4.0.2-*", "System.Text.Encoding": "4.0.11-*", } } From 3e6c7171be5e2a6a1b7eb2eabf2ed73df6c7536c Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 3 Feb 2016 11:03:16 -0800 Subject: [PATCH 492/846] #515 Make forgiving vs strict header list parsers. --- .../CookieHeaderParser.cs | 11 +- .../CookieHeaderValue.cs | 59 ++++--- .../EntityTagHeaderValue.cs | 10 ++ .../HttpHeaderParser.cs | 42 ++++- .../MediaTypeHeaderValue.cs | 10 ++ .../NameValueHeaderValue.cs | 10 ++ .../SetCookieHeaderValue.cs | 15 +- .../StringWithQualityHeaderValue.cs | 10 ++ .../CookieHeaderValueTest.cs | 106 +++++++++++- .../EntityTagHeaderValueTest.cs | 135 ++++++++++++++- .../MediaTypeHeaderValueTest.cs | 93 +++++++++- .../NameValueHeaderValueTest.cs | 148 +++++++++++++++- .../SetCookieHeaderValueTest.cs | 125 +++++++++++++- .../StringWithQualityHeaderValueTest.cs | 160 +++++++++++++++++- 14 files changed, 868 insertions(+), 66 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs index 2143f299b0..9253e881e5 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -7,11 +7,6 @@ namespace Microsoft.Net.Http.Headers { internal class CookieHeaderParser : HttpHeaderParser { - // The Cache-Control header is special: It is a header supporting a list of values, but we represent the list - // as _one_ instance of CacheControlHeaderValue. I.e we set 'SupportsMultipleValues' to 'true' since it is - // OK to have multiple Cache-Control headers in a request/response message. However, after parsing all - // Cache-Control headers, only one instance of CacheControlHeaderValue is created (if all headers contain valid - // values, otherwise we may have multiple strings containing the invalid values). internal CookieHeaderParser(bool supportsMultipleValues) : base(supportsMultipleValues) { @@ -49,14 +44,11 @@ namespace Microsoft.Net.Http.Headers } CookieHeaderValue result = null; - int length = CookieHeaderValue.GetCookieLength(value, current, out result); - - if (length == 0) + if (!CookieHeaderValue.TryGetCookieLength(value, ref current, out result)) { return false; } - current = current + length; current = GetNextNonEmptyOrWhitespaceIndex(value, current, SupportsMultipleValues, out separatorFound); // If we support multiple values and we've not reached the end of the string, then we must have a separator. @@ -91,6 +83,7 @@ namespace Microsoft.Net.Http.Headers if (skipEmptyValues) { + // Most headers only split on ',', but cookies primarily split on ';' while ((current < input.Length) && ((input[current] == ',') || (input[current] == ';'))) { current++; // skip delimiter. diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index e7e72d3ce5..77adcf5441 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -107,22 +107,31 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.ParseValues(inputs); } + public static IList ParseStrictList(IList inputs) + { + return MultipleValueParser.ParseStrictValues(inputs); + } + public static bool TryParseList(IList inputs, out IList parsedValues) { return MultipleValueParser.TryParseValues(inputs, out parsedValues); } - // name=value; name="value" - internal static int GetCookieLength(string input, int startIndex, out CookieHeaderValue parsedValue) + public static bool TryParseStrictList(IList inputs, out IList parsedValues) { - Contract.Requires(startIndex >= 0); - var offset = startIndex; + return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); + } + + // name=value; name="value" + internal static bool TryGetCookieLength(string input, ref int offset, out CookieHeaderValue parsedValue) + { + Contract.Requires(offset >= 0); parsedValue = null; if (string.IsNullOrEmpty(input) || (offset >= input.Length)) { - return 0; + return false; } var result = new CookieHeaderValue(); @@ -135,7 +144,7 @@ namespace Microsoft.Net.Http.Headers var itemLength = HttpRuleParser.GetTokenLength(input, offset); if (itemLength == 0) { - return 0; + return false; } result._name = input.Substring(offset, itemLength); offset += itemLength; @@ -143,36 +152,33 @@ namespace Microsoft.Net.Http.Headers // = (no spaces) if (!ReadEqualsSign(input, ref offset)) { - return 0; + return false; } - string value; // value or "quoted value" - itemLength = GetCookieValueLength(input, offset, out value); // The value may be empty - result._value = input.Substring(offset, itemLength); - offset += itemLength; + result._value = GetCookieValue(input, ref offset); parsedValue = result; - return offset - startIndex; + return true; } // cookie-value = *cookie-octet / ( DQUOTE* cookie-octet DQUOTE ) // cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E // ; US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash - internal static int GetCookieValueLength(string input, int startIndex, out string value) + internal static string GetCookieValue(string input, ref int offset) { Contract.Requires(input != null); - Contract.Requires(startIndex >= 0); - Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + Contract.Requires(offset >= 0); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - offset))); - value = null; - if (startIndex >= input.Length) + var startIndex = offset; + + if (offset >= input.Length) { - return 0; + return string.Empty; } var inQuotes = false; - var offset = startIndex; if (input[offset] == '"') { @@ -195,19 +201,19 @@ namespace Microsoft.Net.Http.Headers { if (offset == input.Length || input[offset] != '"') { - return 0; // Missing final quote + // Missing final quote + return string.Empty; } offset++; } int length = offset - startIndex; - if (length == 0) + if (offset > startIndex) { - return 0; + return input.Substring(startIndex, length); } - value = input.Substring(startIndex, length); - return length; + return string.Empty; } private static bool ReadEqualsSign(string input, ref int offset) @@ -252,8 +258,9 @@ namespace Microsoft.Net.Http.Headers throw new ArgumentNullException(nameof(value)); } - string temp; - if (GetCookieValueLength(value, 0, out temp) != value.Length) + var offset = 0; + var result = GetCookieValue(value, ref offset); + if (result.Length != value.Length) { throw new ArgumentException("Invalid cookie value: " + value, parameterName); } diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs index 216fa942a8..7f89a3e113 100644 --- a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -129,11 +129,21 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.ParseValues(inputs); } + public static IList ParseStrictList(IList inputs) + { + return MultipleValueParser.ParseStrictValues(inputs); + } + public static bool TryParseList(IList inputs, out IList parsedValues) { return MultipleValueParser.TryParseValues(inputs, out parsedValues); } + public static bool TryParseStrictList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); + } + internal static int GetEntityTagLength(string input, int startIndex, out EntityTagHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs index a12edbf3e0..4fe977ff19 100644 --- a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -39,13 +39,23 @@ namespace Microsoft.Net.Http.Headers T result; if (!TryParseValue(value, ref index, out result)) { - throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid value '{0}'.", - value?.Substring(index) ?? "")); + throw new FormatException(string.Format(CultureInfo.InvariantCulture, + "The header contains invalid values at index {0}: '{1}'", index, value ?? "")); } return result; } public virtual bool TryParseValues(IList values, out IList parsedValues) + { + return TryParseValues(values, strict: false, parsedValues: out parsedValues); + } + + public virtual bool TryParseStrictValues(IList values, out IList parsedValues) + { + return TryParseValues(values, strict: true, parsedValues: out parsedValues); + } + + protected virtual bool TryParseValues(IList values, bool strict, out IList parsedValues) { Contract.Assert(_supportsMultipleValues); // If a parser returns an empty list, it means there was no value, but that's valid (e.g. "Accept: "). The caller @@ -71,10 +81,15 @@ namespace Microsoft.Net.Http.Headers results.Add(output); } } - else + else if (strict) { return false; } + else + { + // Skip the invalid values and keep trying. + index++; + } } } if (results.Count > 0) @@ -85,7 +100,17 @@ namespace Microsoft.Net.Http.Headers return false; } - public IList ParseValues(IList values) + public virtual IList ParseValues(IList values) + { + return ParseValues(values, strict: false); + } + + public virtual IList ParseStrictValues(IList values) + { + return ParseValues(values, strict: true); + } + + protected virtual IList ParseValues(IList values, bool strict) { Contract.Assert(_supportsMultipleValues); // If a parser returns an empty list, it means there was no value, but that's valid (e.g. "Accept: "). The caller @@ -110,10 +135,15 @@ namespace Microsoft.Net.Http.Headers parsedValues.Add(output); } } + else if (strict) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, + "The header contains invalid values at index {0}: '{1}'", index, value)); + } else { - throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid values '{0}'.", - value.Substring(index))); + // Skip the invalid values and keep trying. + index++; } } } diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index b8b7c09e9e..0ec7666402 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -391,11 +391,21 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.ParseValues(inputs); } + public static IList ParseStrictList(IList inputs) + { + return MultipleValueParser.ParseStrictValues(inputs); + } + public static bool TryParseList(IList inputs, out IList parsedValues) { return MultipleValueParser.TryParseValues(inputs, out parsedValues); } + public static bool TryParseStrictList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); + } + private static int GetMediaTypeLength(string input, int startIndex, out MediaTypeHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index fed6261a4d..a04b8d7164 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -158,11 +158,21 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.ParseValues(input); } + public static IList ParseStrictList(IList input) + { + return MultipleValueParser.ParseStrictValues(input); + } + public static bool TryParseList(IList input, out IList parsedValues) { return MultipleValueParser.TryParseValues(input, out parsedValues); } + public static bool TryParseStrictList(IList input, out IList parsedValues) + { + return MultipleValueParser.TryParseStrictValues(input, out parsedValues); + } + public override string ToString() { if (!string.IsNullOrEmpty(_value)) diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 92cf35a41f..37372e013c 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -156,11 +156,21 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.ParseValues(inputs); } + public static IList ParseStrictList(IList inputs) + { + return MultipleValueParser.ParseStrictValues(inputs); + } + public static bool TryParseList(IList inputs, out IList parsedValues) { return MultipleValueParser.TryParseValues(inputs, out parsedValues); } + public static bool TryParseStrictList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); + } + // name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly private static int GetSetCookieLength(string input, int startIndex, out SetCookieHeaderValue parsedValue) { @@ -195,12 +205,9 @@ namespace Microsoft.Net.Http.Headers return 0; } - string value; // value or "quoted value" - itemLength = CookieHeaderValue.GetCookieValueLength(input, offset, out value); // The value may be empty - result._value = input.Substring(offset, itemLength); - offset += itemLength; + result._value = CookieHeaderValue.GetCookieValue(input, ref offset); // *(';' SP cookie-av) while (offset < input.Length) diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index 36e9a3fd58..0521c1a000 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -119,11 +119,21 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.ParseValues(input); } + public static IList ParseStrictList(IList input) + { + return MultipleValueParser.ParseStrictValues(input); + } + public static bool TryParseList(IList input, out IList parsedValues) { return MultipleValueParser.TryParseValues(input, out parsedValues); } + public static bool TryParseStrictList(IList input, out IList parsedValues) + { + return MultipleValueParser.TryParseStrictValues(input, out parsedValues); + } + private static int GetStringWithQualityLength(string input, int startIndex, out StringWithQualityHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs index 3644ed1df0..4b320c0e06 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -79,6 +79,7 @@ namespace Microsoft.Net.Http.Headers }; } } + public static TheoryData, string[]> ListOfCookieHeaderDataSet { get @@ -111,7 +112,48 @@ namespace Microsoft.Net.Http.Headers } } - // TODO: [Fact] + public static TheoryData, string[]> ListWithInvalidCookieHeaderDataSet + { + get + { + var dataset = new TheoryData, string[]>(); + var header1 = new CookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3"); + var validString1 = "name1=n1=v1&n2=v2&n3=v3"; + + var header2 = new CookieHeaderValue("name2", "value2"); + var validString2 = "name2=value2"; + + var header3 = new CookieHeaderValue("name3", "value3"); + var validString3 = "name3=value3"; + + var invalidString1 = "ipt={\"v\":{\"L\":3},\"pt\":{\"d\":3},ct\":{},\"_t\":44,\"_v\":\"2\"}"; + + dataset.Add(null, new[] { invalidString1 }); + dataset.Add(new[] { header1 }.ToList(), new[] { validString1, invalidString1 }); + dataset.Add(new[] { header1 }.ToList(), new[] { validString1, null, "", " ", ";", " , ", invalidString1 }); + dataset.Add(new[] { header1 }.ToList(), new[] { invalidString1, null, "", " ", ";", " , ", validString1 }); + dataset.Add(new[] { header1 }.ToList(), new[] { validString1 + ", " + invalidString1 }); + dataset.Add(new[] { header2 }.ToList(), new[] { invalidString1 + ", " + validString2 }); + dataset.Add(new[] { header1 }.ToList(), new[] { invalidString1 + "; " + validString1 }); + dataset.Add(new[] { header2 }.ToList(), new[] { validString2 + "; " + invalidString1 }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { invalidString1, validString1, validString2, validString3 }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { validString1, invalidString1, validString2, validString3 }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { validString1, validString2, invalidString1, validString3 }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { validString1, validString2, validString3, invalidString1 }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(",", invalidString1, validString1, validString2, validString3) }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(",", validString1, invalidString1, validString2, validString3) }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(",", validString1, validString2, invalidString1, validString3) }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(",", validString1, validString2, validString3, invalidString1) }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(";", invalidString1, validString1, validString2, validString3) }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(";", validString1, invalidString1, validString2, validString3) }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(";", validString1, validString2, invalidString1, validString3) }); + dataset.Add(new[] { header1, header2, header3 }.ToList(), new[] { string.Join(";", validString1, validString2, validString3, invalidString1) }); + + return dataset; + } + } + + [Fact] public void CookieHeaderValue_CtorThrowsOnNullName() { Assert.Throws(() => new CookieHeaderValue(null, "value")); @@ -182,7 +224,7 @@ namespace Microsoft.Net.Http.Headers public void CookieHeaderValue_TryParse_AcceptsValidValues(CookieHeaderValue cookie, string expectedValue) { CookieHeaderValue header; - bool result = CookieHeaderValue.TryParse(expectedValue, out header); + var result = CookieHeaderValue.TryParse(expectedValue, out header); Assert.True(result); Assert.Equal(cookie, header); @@ -201,7 +243,7 @@ namespace Microsoft.Net.Http.Headers public void CookieHeaderValue_TryParse_RejectsInvalidValues(string value) { CookieHeaderValue header; - bool result = CookieHeaderValue.TryParse(value, out header); + var result = CookieHeaderValue.TryParse(value, out header); Assert.False(result); } @@ -215,15 +257,71 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(cookies, results); } + [Theory] + [MemberData(nameof(ListOfCookieHeaderDataSet))] + public void CookieHeaderValue_ParseStrictList_AcceptsValidValues(IList cookies, string[] input) + { + var results = CookieHeaderValue.ParseStrictList(input); + + Assert.Equal(cookies, results); + } + [Theory] [MemberData(nameof(ListOfCookieHeaderDataSet))] public void CookieHeaderValue_TryParseList_AcceptsValidValues(IList cookies, string[] input) { IList results; - bool result = CookieHeaderValue.TryParseList(input, out results); + var result = CookieHeaderValue.TryParseList(input, out results); Assert.True(result); Assert.Equal(cookies, results); } + + [Theory] + [MemberData(nameof(ListOfCookieHeaderDataSet))] + public void CookieHeaderValue_TryParseStrictList_AcceptsValidValues(IList cookies, string[] input) + { + IList results; + var result = CookieHeaderValue.TryParseStrictList(input, out results); + Assert.True(result); + + Assert.Equal(cookies, results); + } + + [Theory] + [MemberData(nameof(ListWithInvalidCookieHeaderDataSet))] + public void CookieHeaderValue_ParseList_ExcludesInvalidValues(IList cookies, string[] input) + { + var results = CookieHeaderValue.ParseList(input); + // ParseList aways returns a list, even if empty. TryParseList may return null (via out). + Assert.Equal(cookies ?? new List(), results); + } + + [Theory] + [MemberData(nameof(ListWithInvalidCookieHeaderDataSet))] + public void CookieHeaderValue_TryParseList_ExcludesInvalidValues(IList cookies, string[] input) + { + IList results; + var result = CookieHeaderValue.TryParseList(input, out results); + Assert.Equal(cookies, results); + Assert.Equal(cookies?.Count > 0, result); + } + + [Theory] + [MemberData(nameof(ListWithInvalidCookieHeaderDataSet))] + public void CookieHeaderValue_ParseStrictList_ThrowsForAnyInvalidValues(IList cookies, string[] input) + { + Assert.Throws(() => CookieHeaderValue.ParseStrictList(input)); + } + + [Theory] + [MemberData(nameof(ListWithInvalidCookieHeaderDataSet))] + public void CookieHeaderValue_TryParseStrictList_FailsForAnyInvalidValues(IList cookies, string[] input) + { + IList results; + var result = CookieHeaderValue.TryParseStrictList(input, out results); + Assert.Null(results); + Assert.False(result); + } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs index 303b910fcb..c17c9baa06 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs @@ -212,6 +212,39 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(expectedResults, results); } + [Fact] + public void ParseStrictList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "\"tag\"", + "", + " \"tag\" ", + "\r\n \"tag\"\r\n ", + "\"tag会\"", + "\"tag\",\"tag\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results = EntityTagHeaderValue.ParseStrictList(inputs); + + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + [Fact] public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() { @@ -246,7 +279,40 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void ParseList_WithSomeInvlaidValues_Throws() + public void TryParseStrictList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "\"tag\"", + "", + " \"tag\" ", + "\r\n \"tag\"\r\n ", + "\"tag会\"", + "\"tag\",\"tag\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results; + Assert.True(EntityTagHeaderValue.TryParseStrictList(inputs, out results)); + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_ExcludesInvalidValues() { var inputs = new[] { @@ -260,11 +326,41 @@ namespace Microsoft.Net.Http.Headers "\"tag\", \"tag\"", "W/\"tag\"", }; - Assert.Throws(() => EntityTagHeaderValue.ParseList(inputs)); + var results = EntityTagHeaderValue.ParseList(inputs); + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); } [Fact] - public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + public void ParseStrictList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "\"tag\", tag, \"tag\"", + "tag, \"tag\"", + "", + " \"tag ", + "\r\n tag\"\r\n ", + "\"tag会\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + Assert.Throws(() => EntityTagHeaderValue.ParseStrictList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ExcludesInvalidValues() { var inputs = new[] { @@ -279,7 +375,38 @@ namespace Microsoft.Net.Http.Headers "W/\"tag\"", }; IList results; - Assert.False(EntityTagHeaderValue.TryParseList(inputs, out results)); + Assert.True(EntityTagHeaderValue.TryParseList(inputs, out results)); + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseStrictList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "\"tag\", tag, \"tag\"", + "tag, \"tag\"", + "", + " \"tag ", + "\r\n tag\"\r\n ", + "\"tag会\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results; + Assert.False(EntityTagHeaderValue.TryParseStrictList(inputs, out results)); } private void CheckValidParse(string input, EntityTagHeaderValue expectedResult) diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index ba3a31b7d2..0a72951240 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -497,6 +497,24 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(expectedResults, results); } + [Fact] + public void ParseStrictList_SetOfValidValueStrings_ReturnsValues() + { + var inputs = new[] { "text/html,application/xhtml+xml,", "application/xml;q=0.9,image/webp,*/*;q=0.8" }; + var results = MediaTypeHeaderValue.ParseStrictList(inputs); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + [Fact] public void TryParseList_SetOfValidValueStrings_ReturnsTrue() { @@ -517,18 +535,60 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void ParseList_WithSomeInvlaidValues_Throws() + public void TryParseStrictList_SetOfValidValueStrings_ReturnsTrue() + { + var inputs = new[] { "text/html,application/xhtml+xml,", "application/xml;q=0.9,image/webp,*/*;q=0.8" }; + IList results; + Assert.True(MediaTypeHeaderValue.TryParseStrictList(inputs, out results)); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_IgnoresInvalidValues() { var inputs = new[] { "text/html,application/xhtml+xml, ignore-this, ignore/this", "application/xml;q=0.9,image/webp,*/*;q=0.8" }; - Assert.Throws(() => MediaTypeHeaderValue.ParseList(inputs)); + var results = MediaTypeHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("ignore/this"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); } [Fact] - public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + public void ParseStrictList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "text/html,application/xhtml+xml, ignore-this, ignore/this", + "application/xml;q=0.9,image/webp,*/*;q=0.8" + }; + Assert.Throws(() => MediaTypeHeaderValue.ParseStrictList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_IgnoresInvalidValues() { var inputs = new[] { @@ -537,7 +597,32 @@ namespace Microsoft.Net.Http.Headers "application/xml;q=0 4" }; IList results; - Assert.False(MediaTypeHeaderValue.TryParseList(inputs, out results)); + Assert.True(MediaTypeHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("ignore/this"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseStrictList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "text/html,application/xhtml+xml, ignore-this, ignore/this", + "application/xml;q=0.9,image/webp,*/*;q=0.8", + "application/xml;q=0 4" + }; + IList results; + Assert.False(MediaTypeHeaderValue.TryParseStrictList(inputs, out results)); } [Theory] diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index 46d1d30d75..c90a922574 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -364,6 +364,39 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(expectedResults, results); } + [Fact] + public void ParseStrictList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "name=value1", + "", + " name = value2 ", + "\r\n name =value3\r\n ", + "name=\"value 4\"", + "name=\"value会5\"", + "name=value6,name=value7", + "name=\"value 8\", name= \"value 9\"", + }; + var results = NameValueHeaderValue.ParseStrictList(inputs); + + var expectedResults = new[] + { + new NameValueHeaderValue("name", "value1"), + new NameValueHeaderValue("name", "value2"), + new NameValueHeaderValue("name", "value3"), + new NameValueHeaderValue("name", "\"value 4\""), + new NameValueHeaderValue("name", "\"value会5\""), + new NameValueHeaderValue("name", "value6"), + new NameValueHeaderValue("name", "value7"), + new NameValueHeaderValue("name", "\"value 8\""), + new NameValueHeaderValue("name", "\"value 9\""), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + [Fact] public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() { @@ -399,7 +432,41 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void ParseList_WithSomeInvlaidValues_Throws() + public void TryParseStrictList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "name=value1", + "", + " name = value2 ", + "\r\n name =value3\r\n ", + "name=\"value 4\"", + "name=\"value会5\"", + "name=value6,name=value7", + "name=\"value 8\", name= \"value 9\"", + }; + IList results; + Assert.True(NameValueHeaderValue.TryParseStrictList(inputs, out results)); + + var expectedResults = new[] + { + new NameValueHeaderValue("name", "value1"), + new NameValueHeaderValue("name", "value2"), + new NameValueHeaderValue("name", "value3"), + new NameValueHeaderValue("name", "\"value 4\""), + new NameValueHeaderValue("name", "\"value会5\""), + new NameValueHeaderValue("name", "value6"), + new NameValueHeaderValue("name", "value7"), + new NameValueHeaderValue("name", "\"value 8\""), + new NameValueHeaderValue("name", "\"value 9\""), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_ExcludesInvalidValues() { var inputs = new[] { @@ -413,11 +480,47 @@ namespace Microsoft.Net.Http.Headers "name8=value8,name9=value9", "name10=\"value 10\", name11= \"value 11\"", }; - Assert.Throws(() => NameValueHeaderValue.ParseList(inputs)); + var results = NameValueHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new NameValueHeaderValue("name1", "value1"), + new NameValueHeaderValue("name2"), + new NameValueHeaderValue("name3", "3"), + new NameValueHeaderValue("a"), + new NameValueHeaderValue("name4", "value4"), + new NameValueHeaderValue("b"), + new NameValueHeaderValue("6"), + new NameValueHeaderValue("name7", "\"value会7\""), + new NameValueHeaderValue("name8", "value8"), + new NameValueHeaderValue("name9", "value9"), + new NameValueHeaderValue("name10", "\"value 10\""), + new NameValueHeaderValue("name11", "\"value 11\""), + }.ToList(); + + Assert.Equal(expectedResults, results); } [Fact] - public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + public void ParseStrictList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "name1=value1", + "name2", + " name3 = 3, value a", + "name4 =value4, name5 = value5 b", + "name6=\"value 6", + "name7=\"value会7\"", + "name8=value8,name9=value9", + "name10=\"value 10\", name11= \"value 11\"", + }; + Assert.Throws(() => NameValueHeaderValue.ParseStrictList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ExcludesInvalidValues() { var inputs = new[] { @@ -432,7 +535,44 @@ namespace Microsoft.Net.Http.Headers "name10=\"value 10\", name11= \"value 11\"", }; IList results; - Assert.False(NameValueHeaderValue.TryParseList(inputs, out results)); + Assert.True(NameValueHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new NameValueHeaderValue("name1", "value1"), + new NameValueHeaderValue("name2"), + new NameValueHeaderValue("name3", "3"), + new NameValueHeaderValue("a"), + new NameValueHeaderValue("name4", "value4"), + new NameValueHeaderValue("b"), + new NameValueHeaderValue("6"), + new NameValueHeaderValue("name7", "\"value会7\""), + new NameValueHeaderValue("name8", "value8"), + new NameValueHeaderValue("name9", "value9"), + new NameValueHeaderValue("name10", "\"value 10\""), + new NameValueHeaderValue("name11", "\"value 11\""), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseStrictList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "name1=value1", + "name2", + " name3 = 3, value a", + "name4 =value4, name5 = value5 b", + "name6=\"value 6", + "name7=\"value会7\"", + "name8=value8,name9=value9", + "name10=\"value 10\", name11= \"value 11\"", + }; + IList results; + Assert.False(NameValueHeaderValue.TryParseStrictList(inputs, out results)); } #region Helper methods diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index f98886521d..5d2c138558 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -95,6 +95,7 @@ namespace Microsoft.Net.Http.Headers }; } } + public static TheoryData, string[]> ListOfSetCookieHeaderDataSet { get @@ -141,7 +142,73 @@ namespace Microsoft.Net.Http.Headers } } - // TODO: [Fact] + public static TheoryData, string[]> ListWithInvalidSetCookieHeaderDataSet + { + get + { + var dataset = new TheoryData, string[]>(); + var header1 = new SetCookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + HttpOnly = true, + MaxAge = TimeSpan.FromDays(1), + Path = "path1", + Secure = true + }; + var string1 = "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"; + + var header2 = new SetCookieHeaderValue("name2", "value2"); + var string2 = "name2=value2"; + + var header3 = new SetCookieHeaderValue("name3", "value3") + { + MaxAge = TimeSpan.FromDays(1), + }; + var string3 = "name3=value3; max-age=86400"; + + var header4 = new SetCookieHeaderValue("name4", "value4") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + }; + var string4 = "name4=value4; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1;"; + + var invalidString1 = "ipt={\"v\":{\"L\":3},\"pt:{\"d\":3},\"ct\":{},\"_t\":44,\"_v\":\"2\"}"; + + var invalidHeader2a = new SetCookieHeaderValue("expires", "Sun"); + var invalidHeader2b = new SetCookieHeaderValue("domain", "domain1"); + var invalidString2 = "ipt={\"v\":{\"L\":3},\"pt\":{d\":3},\"ct\":{},\"_t\":44,\"_v\":\"2\"}; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1"; + + var invalidHeader3 = new SetCookieHeaderValue("domain", "domain1") + { + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + }; + var invalidString3 = "ipt={\"v\":{\"L\":3},\"pt\":{\"d:3},\"ct\":{},\"_t\":44,\"_v\":\"2\"}; domain=domain1; expires=Sun, 06 Nov 1994 08:49:37 GMT"; + + dataset.Add(null, new[] { invalidString1 }); + dataset.Add(new[] { invalidHeader2a, invalidHeader2b }.ToList(), new[] { invalidString2 }); + dataset.Add(new[] { invalidHeader3 }.ToList(), new[] { invalidString3 }); + dataset.Add(new[] { header1 }.ToList(), new[] { string1, invalidString1 }); + dataset.Add(new[] { header1 }.ToList(), new[] { invalidString1, null, "", " ", ",", " , ", string1 }); + dataset.Add(new[] { header1 }.ToList(), new[] { string1 + ", " + invalidString1 }); + dataset.Add(new[] { header1 }.ToList(), new[] { invalidString1 + ", " + string1 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { invalidString1, string1, string2, string3, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, invalidString1, string2, string3, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, invalidString1, string3, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, string3, invalidString1, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, string3, string4, invalidString1 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", invalidString1, string1, string2, string3, string4) }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, invalidString1, string2, string3, string4) }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, invalidString1, string3, string4) }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, string3, invalidString1, string4) }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, string3, string4, invalidString1) }); + + return dataset; + } + } + + [Fact] public void SetCookieHeaderValue_CtorThrowsOnNullName() { Assert.Throws(() => new SetCookieHeaderValue(null, "value")); @@ -255,5 +322,61 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(cookies, results); } + + [Theory] + [MemberData(nameof(ListOfSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_ParseStrictList_AcceptsValidValues(IList cookies, string[] input) + { + var results = SetCookieHeaderValue.ParseStrictList(input); + + Assert.Equal(cookies, results); + } + + [Theory] + [MemberData(nameof(ListOfSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParseStrictList_AcceptsValidValues(IList cookies, string[] input) + { + IList results; + bool result = SetCookieHeaderValue.TryParseStrictList(input, out results); + Assert.True(result); + + Assert.Equal(cookies, results); + } + + [Theory] + [MemberData(nameof(ListWithInvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_ParseList_ExcludesInvalidValues(IList cookies, string[] input) + { + var results = SetCookieHeaderValue.ParseList(input); + // ParseList aways returns a list, even if empty. TryParseList may return null (via out). + Assert.Equal(cookies ?? new List(), results); + } + + [Theory] + [MemberData(nameof(ListWithInvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParseList_ExcludesInvalidValues(IList cookies, string[] input) + { + IList results; + bool result = SetCookieHeaderValue.TryParseList(input, out results); + Assert.Equal(cookies, results); + Assert.Equal(cookies?.Count > 0, result); + } + + [Theory] + [MemberData(nameof(ListWithInvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_ParseStrictList_ThrowsForAnyInvalidValues(IList cookies, string[] input) + { + Assert.Throws(() => SetCookieHeaderValue.ParseStrictList(input)); + } + + [Theory] + [MemberData(nameof(ListWithInvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParseStrictList_FailsForAnyInvalidValues(IList cookies, string[] input) + { + IList results; + bool result = SetCookieHeaderValue.TryParseStrictList(input, out results); + Assert.Null(results); + Assert.False(result); + } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs index ceb29fed10..2771614c2f 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs @@ -233,6 +233,43 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(expectedResults, results); } + [Fact] + public void ParseStrictList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "text1", + "text2,", + "textA,textB", + "text3;q=0.5", + "text4;q=0.5,", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results = StringWithQualityHeaderValue.ParseStrictList(inputs); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("textA"), + new StringWithQualityHeaderValue("textB"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + [Fact] public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() { @@ -272,7 +309,45 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void ParseList_WithSomeInvlaidValues_Throws() + public void TryParseStrictList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "text1", + "text2,", + "textA,textB", + "text3;q=0.5", + "text4;q=0.5,", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results; + Assert.True(StringWithQualityHeaderValue.TryParseStrictList(inputs, out results)); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("textA"), + new StringWithQualityHeaderValue("textB"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_IgnoresInvalidValues() { var inputs = new[] { @@ -288,11 +363,49 @@ namespace Microsoft.Net.Http.Headers "text7,text8;q=0.5", " text9 , text10 ; q = 0.5 ", }; - Assert.Throws(() => StringWithQualityHeaderValue.ParseList(inputs)); + var results = StringWithQualityHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("stuff"), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); } [Fact] - public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + public void ParseStrictList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "text1", + "text 1", + "text2", + "\"text 2\",", + "text3;q=0.5", + "text4;q=0.5, extra stuff", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + Assert.Throws(() => StringWithQualityHeaderValue.ParseStrictList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_IgnoresInvalidValues() { var inputs = new[] { @@ -309,7 +422,46 @@ namespace Microsoft.Net.Http.Headers " text9 , text10 ; q = 0.5 ", }; IList results; - Assert.False(StringWithQualityHeaderValue.TryParseList(inputs, out results)); + Assert.True(StringWithQualityHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("stuff"), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseStrictList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "text1", + "text 1", + "text2", + "\"text 2\",", + "text3;q=0.5", + "text4;q=0.5, extra stuff", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results; + Assert.False(StringWithQualityHeaderValue.TryParseStrictList(inputs, out results)); } #region Helper methods From 04e9da4e88c3dec941061ca311a5d6ed51e5e27e Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 5 Feb 2016 09:38:15 -0800 Subject: [PATCH 493/846] #527 Add IFileInfo overloads for SendFileAsync. --- .../SendFileResponseExtensions.cs | 98 ++++++++++++++++--- .../StreamCopyOperation.cs | 12 +-- .../project.json | 1 + .../IHttpSendFileFeature.cs | 2 +- 4 files changed, 90 insertions(+), 23 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs index 6058eb9a18..c747df187b 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs @@ -7,6 +7,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Http.Features; +using Microsoft.Extensions.FileProviders; namespace Microsoft.AspNetCore.Http { @@ -15,13 +16,73 @@ namespace Microsoft.AspNetCore.Http /// public static class SendFileResponseExtensions { + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// The file. + public static Task SendFileAsync(this HttpResponse response, IFileInfo file, + CancellationToken cancellationToken = default(CancellationToken)) + { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + if (file == null) + { + throw new ArgumentNullException(nameof(file)); + } + + return response.SendFileAsync(file, 0, null, cancellationToken); + } + + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// The file. + /// The offset in the file. + /// The number of bytes to send, or null to send the remainder of the file. + /// + /// + public static async Task SendFileAsync(this HttpResponse response, IFileInfo file, long offset, long? count, + CancellationToken cancellationToken = default(CancellationToken)) + { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + if (file == null) + { + throw new ArgumentNullException(nameof(file)); + } + CheckRange(offset, count, file.Length); + + if (string.IsNullOrEmpty(file.PhysicalPath)) + { + using (var fileContent = file.CreateReadStream()) + { + if (offset > 0) + { + fileContent.Seek(offset, SeekOrigin.Begin); + } + await StreamCopyOperation.CopyToAsync(fileContent, response.Body, count, cancellationToken); + } + } + else + { + await response.SendFileAsync(file.PhysicalPath, offset, count, cancellationToken); + } + } + /// /// Sends the given file using the SendFile extension. /// /// /// The full path to the file. /// - public static Task SendFileAsync(this HttpResponse response, string fileName) + public static Task SendFileAsync(this HttpResponse response, string fileName, + CancellationToken cancellationToken = default(CancellationToken)) { if (response == null) { @@ -33,7 +94,7 @@ namespace Microsoft.AspNetCore.Http throw new ArgumentNullException(nameof(fileName)); } - return response.SendFileAsync(fileName, 0, null, CancellationToken.None); + return response.SendFileAsync(fileName, 0, null, cancellationToken); } /// @@ -42,10 +103,11 @@ namespace Microsoft.AspNetCore.Http /// /// The full path to the file. /// The offset in the file. - /// The number of types to send, or null to send the remainder of the file. + /// The number of bytes to send, or null to send the remainder of the file. /// /// - public static Task SendFileAsync(this HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken) + public static Task SendFileAsync(this HttpResponse response, string fileName, long offset, long? count, + CancellationToken cancellationToken = default(CancellationToken)) { if (response == null) { @@ -67,21 +129,13 @@ namespace Microsoft.AspNetCore.Http } // Not safe for overlapped writes. - private static async Task SendFileAsync(Stream outputStream, string fileName, long offset, long? length, CancellationToken cancel) + private static async Task SendFileAsync(Stream outputStream, string fileName, long offset, long? count, + CancellationToken cancel = default(CancellationToken)) { cancel.ThrowIfCancellationRequested(); var fileInfo = new FileInfo(fileName); - if (offset < 0 || offset > fileInfo.Length) - { - throw new ArgumentOutOfRangeException(nameof(offset), offset, string.Empty); - } - - if (length.HasValue && - (length.Value < 0 || length.Value > fileInfo.Length - offset)) - { - throw new ArgumentOutOfRangeException(nameof(length), length, string.Empty); - } + CheckRange(offset, count, fileInfo.Length); int bufferSize = 1024 * 16; @@ -96,8 +150,20 @@ namespace Microsoft.AspNetCore.Http using (fileStream) { fileStream.Seek(offset, SeekOrigin.Begin); + await StreamCopyOperation.CopyToAsync(fileStream, outputStream, count, cancel); + } + } - await StreamCopyOperation.CopyToAsync(fileStream, outputStream, length, cancel); + private static void CheckRange(long offset, long? count, long fileLength) + { + if (offset < 0 || offset > fileLength) + { + throw new ArgumentOutOfRangeException(nameof(offset), offset, string.Empty); + } + if (count.HasValue && + (count.Value < 0 || count.Value > fileLength - offset)) + { + throw new ArgumentOutOfRangeException(nameof(count), count, string.Empty); } } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs index c42661a167..ef81ac3baf 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs @@ -15,9 +15,9 @@ namespace Microsoft.AspNetCore.Http.Extensions { private const int DefaultBufferSize = 4096; - public static async Task CopyToAsync(Stream source, Stream destination, long? length, CancellationToken cancel) + public static async Task CopyToAsync(Stream source, Stream destination, long? count, CancellationToken cancel) { - long? bytesRemaining = length; + long? bytesRemaining = count; var buffer = ArrayPool.Shared.Rent(DefaultBufferSize); try @@ -42,22 +42,22 @@ namespace Microsoft.AspNetCore.Http.Extensions { readLength = (int)Math.Min(bytesRemaining.Value, (long)readLength); } - int count = await source.ReadAsync(buffer, 0, readLength, cancel); + int read = await source.ReadAsync(buffer, 0, readLength, cancel); if (bytesRemaining.HasValue) { - bytesRemaining -= count; + bytesRemaining -= read; } // End of the source stream. - if (count == 0) + if (read == 0) { return; } cancel.ThrowIfCancellationRequested(); - await destination.WriteAsync(buffer, 0, count, cancel); + await destination.WriteAsync(buffer, 0, read, cancel); } } finally diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index f38f4a0f48..a641249366 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -11,6 +11,7 @@ }, "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", + "Microsoft.Extensions.FileProviders.Abstractions": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*", "System.Buffers": "4.0.0-*" }, diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs index 0776034e43..9418a7ffbe 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs @@ -8,6 +8,6 @@ namespace Microsoft.AspNetCore.Http.Features { public interface IHttpSendFileFeature { - Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); + Task SendFileAsync(string path, long offset, long? count, CancellationToken cancellation); } } \ No newline at end of file From 4a3e2ad3c537c341d6dfacf5ec01765f79b76ca5 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Tue, 9 Feb 2016 22:11:34 -0800 Subject: [PATCH 494/846] Enable tests to run using dotnet xunit runner --- .../project.json | 21 ++++++++----------- .../project.json | 21 ++++++++----------- .../project.json | 21 ++++++++----------- .../project.json | 21 ++++++++----------- .../project.json | 21 ++++++++----------- .../project.json | 19 +++++++---------- .../project.json | 21 ++++++++----------- 7 files changed, 62 insertions(+), 83 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index d10bac70ad..9e61b607f6 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -10,24 +10,21 @@ "xunit": "2.1.0" }, "frameworks": { + "dnxcore50": { + "dependencies": { + "dotnet-test-xunit": "1.0.0-dev-*" + }, + "imports": "portable-net451+win8" + }, "dnx451": { - "frameworkAssemblies": { + "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" }, "dependencies": { "xunit.runner.console": "2.1.0" } - }, - "dnxcore50": { - "dependencies": { - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "imports": "portable-net451+win8" } }, - "testRunner": "xunit", - "commands": { - "test": "xunit.runner.aspnet" - } -} + "testRunner": "xunit" +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index a4eb37611b..1b4695835c 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -7,24 +7,21 @@ "xunit": "2.1.0" }, "frameworks": { + "dnxcore50": { + "dependencies": { + "dotnet-test-xunit": "1.0.0-dev-*" + }, + "imports": "portable-net451+win8" + }, "dnx451": { - "frameworkAssemblies": { + "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" }, "dependencies": { "xunit.runner.console": "2.1.0" } - }, - "dnxcore50": { - "dependencies": { - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "imports": "portable-net451+win8" } }, - "testRunner": "xunit", - "commands": { - "test": "xunit.runner.aspnet" - } -} + "testRunner": "xunit" +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index f869ca29fc..3983cc014a 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -5,24 +5,21 @@ "xunit": "2.1.0" }, "frameworks": { + "dnxcore50": { + "dependencies": { + "dotnet-test-xunit": "1.0.0-dev-*" + }, + "imports": "portable-net451+win8" + }, "dnx451": { - "frameworkAssemblies": { + "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" }, "dependencies": { "xunit.runner.console": "2.1.0" } - }, - "dnxcore50": { - "dependencies": { - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "imports": "portable-net451+win8" } }, - "testRunner": "xunit", - "commands": { - "test": "xunit.runner.aspnet" - } -} + "testRunner": "xunit" +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index aac8b65b40..8993408d3c 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -5,24 +5,21 @@ "xunit": "2.1.0" }, "frameworks": { + "dnxcore50": { + "dependencies": { + "dotnet-test-xunit": "1.0.0-dev-*" + }, + "imports": "portable-net451+win8" + }, "dnx451": { - "frameworkAssemblies": { + "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" }, "dependencies": { "xunit.runner.console": "2.1.0" } - }, - "dnxcore50": { - "dependencies": { - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "imports": "portable-net451+win8" } }, - "testRunner": "xunit", - "commands": { - "test": "xunit.runner.aspnet" - } -} + "testRunner": "xunit" +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 73df7a8724..2175effd71 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -7,24 +7,21 @@ "xunit": "2.1.0" }, "frameworks": { + "dnxcore50": { + "dependencies": { + "dotnet-test-xunit": "1.0.0-dev-*" + }, + "imports": "portable-net451+win8" + }, "dnx451": { - "frameworkAssemblies": { + "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" }, "dependencies": { "xunit.runner.console": "2.1.0" } - }, - "dnxcore50": { - "dependencies": { - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "imports": "portable-net451+win8" } }, - "testRunner": "xunit", - "commands": { - "test": "xunit.runner.aspnet" - } -} + "testRunner": "xunit" +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 7320aa0841..89df6bf2bc 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -8,10 +8,14 @@ "warningsAsErrors": true }, "testRunner": "xunit", - "commands": { - "test": "xunit.runner.aspnet" - }, "frameworks": { + "dnxcore50": { + "dependencies": { + "System.Text.Encoding.Extensions": "4.0.11-*", + "dotnet-test-xunit": "1.0.0-dev-*" + }, + "imports": "portable-net451+win8" + }, "dnx451": { "frameworkAssemblies": { "System.Runtime": "", @@ -20,13 +24,6 @@ "dependencies": { "xunit.runner.console": "2.1.0" } - }, - "dnxcore50": { - "dependencies": { - "System.Text.Encoding.Extensions": "4.0.11-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "imports": "portable-net451+win8" } } -} +} \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 77979fd57c..4e379068e6 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -6,24 +6,21 @@ "xunit": "2.1.0" }, "frameworks": { + "dnxcore50": { + "dependencies": { + "dotnet-test-xunit": "1.0.0-dev-*" + }, + "imports": "portable-net451+win8" + }, "dnx451": { - "frameworkAssemblies": { + "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" }, "dependencies": { "xunit.runner.console": "2.1.0" } - }, - "dnxcore50": { - "dependencies": { - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "imports": "portable-net451+win8" } }, - "testRunner": "xunit", - "commands": { - "test": "xunit.runner.aspnet" - } -} + "testRunner": "xunit" +} \ No newline at end of file From cb09ffcccea2258a8eead40d4cb2d374f17e888b Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Fri, 22 Jan 2016 09:51:43 +0100 Subject: [PATCH 495/846] Changed SaveAs[Async](string) to CopyTo[Async](Stream) --- .../IFormFile.cs | 12 +++---- .../Features/FormFile.cs | 33 ++++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs index 871ca0efe4..7cb569d79f 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs @@ -48,16 +48,16 @@ namespace Microsoft.AspNetCore.Http Stream OpenReadStream(); /// - /// Saves the contents of the uploaded file. + /// Copies the contents of the uploaded file to the stream. /// - /// The path of the file to create. - void SaveAs(string path); + /// The stream to copy the file contents to. + void CopyTo(Stream target); /// - /// Asynchronously saves the contents of the uploaded file. + /// Asynchronously copies the contents of the uploaded file to the stream. /// - /// The path of the file to create. + /// The stream to copy the file contents to. /// - Task SaveAsAsync(string path, CancellationToken cancellationToken = default(CancellationToken)); + Task CopyToAsync(Stream target, CancellationToken cancellationToken = default(CancellationToken)); } } diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs index 72335cdb62..3a7b34153b 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -72,29 +73,37 @@ namespace Microsoft.AspNetCore.Http.Features.Internal } /// - /// Saves the contents of the uploaded file. + /// Copies the contents of the uploaded file to the stream. /// - /// The path of the file to create. - public void SaveAs(string path) + /// The stream to copy the file contents to. + public void CopyTo(Stream target) { - using (var fileStream = File.Create(path, DefaultBufferSize)) + if (target == null) { - var inputStream = OpenReadStream(); - inputStream.CopyTo(fileStream, DefaultBufferSize); + throw new ArgumentNullException(nameof(target)); + } + + using (var readStream = OpenReadStream()) + { + readStream.CopyTo(target, DefaultBufferSize); } } /// - /// Asynchronously saves the contents of the uploaded file. + /// Asynchronously copies the contents of the uploaded file to the stream. /// - /// The path of the file to create. + /// The stream to copy the file contents to. /// - public async Task SaveAsAsync(string path, CancellationToken cancellationToken = default(CancellationToken)) + public async Task CopyToAsync(Stream target, CancellationToken cancellationToken = default(CancellationToken)) { - using (var fileStream = File.Create(path, DefaultBufferSize, FileOptions.Asynchronous)) + if (target == null) { - var inputStream = OpenReadStream(); - await inputStream.CopyToAsync(fileStream, DefaultBufferSize, cancellationToken); + throw new ArgumentNullException(nameof(target)); + } + + using (var readStream = OpenReadStream()) + { + await readStream.CopyToAsync(target, DefaultBufferSize, cancellationToken); } } } From 5d8231ee0dbec0d2c6e04ef247dcd6b67c5d4e8b Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 17 Feb 2016 11:31:02 -0800 Subject: [PATCH 496/846] `OwinExtensions.UseBuilder()` should not leave `ApplicationServices` or `RequestServices` `null` Also correct tests to avoid warnings and to ensure scenarios are actually tested - tests previously went `async` without waiting for completion nit: add parameter `null` checks --- .../OwinExtensions.cs | 51 ++++++++- .../OwinExtensionTests.cs | 108 +++++++++++++++--- 2 files changed, 140 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs index 7d6d160113..a06530cd9d 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs @@ -12,20 +12,25 @@ using Microsoft.AspNetCore.Owin; namespace Microsoft.AspNetCore.Builder { + using AddMiddleware = Action, Task>, + Func, Task> + >>; using AppFunc = Func, Task>; using CreateMiddleware = Func< Func, Task>, Func, Task> >; - using AddMiddleware = Action, Task>, - Func, Task> - >>; public static class OwinExtensions { public static AddMiddleware UseOwin(this IApplicationBuilder builder) { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + AddMiddleware add = middleware => { Func middleware1 = next1 => @@ -61,6 +66,15 @@ namespace Microsoft.AspNetCore.Builder public static IApplicationBuilder UseOwin(this IApplicationBuilder builder, Action pipeline) { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (pipeline == null) + { + throw new ArgumentNullException(nameof(pipeline)); + } + pipeline(builder.UseOwin()); return builder; } @@ -72,6 +86,18 @@ namespace Microsoft.AspNetCore.Builder public static IApplicationBuilder UseBuilder(this AddMiddleware app, IServiceProvider serviceProvider) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + // Do not set ApplicationBuilder.ApplicationServices to null. May fail later due to missing services but + // at least that results in a more useful Exception than a NRE. + if (serviceProvider == null) + { + serviceProvider = new EmptyProvider(); + } + // Adapt WebSockets by default. app(OwinWebSocketAcceptAdapter.AdaptWebSockets); var builder = new ApplicationBuilder(serviceProvider: serviceProvider); @@ -125,9 +151,26 @@ namespace Microsoft.AspNetCore.Builder public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline, IServiceProvider serviceProvider) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + if (pipeline == null) + { + throw new ArgumentNullException(nameof(pipeline)); + } + var builder = app.UseBuilder(serviceProvider); pipeline(builder); return app; } + + private class EmptyProvider : IServiceProvider + { + public object GetService(Type serviceType) + { + return null; + } + } } } diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs index d894565968..66c62334bb 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs @@ -6,27 +6,30 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.DependencyInjection; using Xunit; namespace Microsoft.AspNetCore.Owin { + using AddMiddleware = Action, Task>, + Func, Task> + >>; using AppFunc = Func, Task>; using CreateMiddleware = Func< Func, Task>, Func, Task> >; - using AddMiddleware = Action, Task>, - Func, Task> - >>; public class OwinExtensionTests { static AppFunc notFound = env => new Task(() => { env["owin.ResponseStatusCode"] = 404; }); [Fact] - public void OwinConfigureServiceProviderAddsServices() + public async Task OwinConfigureServiceProviderAddsServices() { var list = new List(); AddMiddleware build = list.Add; @@ -36,21 +39,61 @@ namespace Microsoft.AspNetCore.Owin var builder = build.UseBuilder(applicationBuilder => { serviceProvider = applicationBuilder.ApplicationServices; - applicationBuilder.Run(async context => + applicationBuilder.Run(context => { fakeService = context.RequestServices.GetService(); + return Task.FromResult(0); }); - }, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider()); + }, + new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider()); list.Reverse(); - list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary()); + await list + .Aggregate(notFound, (next, middleware) => middleware(next)) + .Invoke(new Dictionary()); - Assert.NotNull(fakeService); + Assert.NotNull(serviceProvider); Assert.NotNull(serviceProvider.GetService()); + Assert.NotNull(fakeService); } [Fact] - public void OwinDefaultNoServices() + public async Task OwinDefaultNoServices() + { + var list = new List(); + AddMiddleware build = list.Add; + IServiceProvider expectedServiceProvider = new ServiceCollection().BuildServiceProvider(); + IServiceProvider serviceProvider = null; + FakeService fakeService = null; + bool builderExecuted = false; + bool applicationExecuted = false; + + var builder = build.UseBuilder(applicationBuilder => + { + builderExecuted = true; + serviceProvider = applicationBuilder.ApplicationServices; + applicationBuilder.Run(context => + { + applicationExecuted = true; + fakeService = context.RequestServices.GetService(); + return Task.FromResult(0); + }); + }, + expectedServiceProvider); + + list.Reverse(); + await list + .Aggregate(notFound, (next, middleware) => middleware(next)) + .Invoke(new Dictionary()); + + Assert.True(builderExecuted); + Assert.Equal(expectedServiceProvider, serviceProvider); + Assert.True(applicationExecuted); + Assert.Null(fakeService); + } + + [Fact] + public async Task OwinDefaultNullServiceProvider() { var list = new List(); AddMiddleware build = list.Add; @@ -63,25 +106,60 @@ namespace Microsoft.AspNetCore.Owin { builderExecuted = true; serviceProvider = applicationBuilder.ApplicationServices; - applicationBuilder.Run(async context => + applicationBuilder.Run(context => { applicationExecuted = true; fakeService = context.RequestServices.GetService(); + return Task.FromResult(0); }); }); list.Reverse(); - list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary()); + await list + .Aggregate(notFound, (next, middleware) => middleware(next)) + .Invoke(new Dictionary()); Assert.True(builderExecuted); - Assert.Null(fakeService); + Assert.NotNull(serviceProvider); Assert.True(applicationExecuted); - Assert.Null(serviceProvider); + Assert.Null(fakeService); + } + + [Fact] + public async Task UseOwin() + { + var serviceProvider = new ServiceCollection().BuildServiceProvider(); + var builder = new ApplicationBuilder(serviceProvider); + IDictionary environment = null; + var context = new DefaultHttpContext(); + + builder.UseOwin(addToPipeline => + { + addToPipeline(next => + { + Assert.NotNull(next); + return async env => + { + environment = env; + await next(env); + }; + }); + }); + await builder.Build().Invoke(context); + + // Dictionary contains context but does not contain "websocket.Accept" or "websocket.AcceptAlt" keys. + Assert.NotNull(environment); + var value = Assert.Single( + environment, + kvp => string.Equals(typeof(HttpContext).FullName, kvp.Key, StringComparison.Ordinal)) + .Value; + Assert.Equal(context, value); + Assert.False(environment.ContainsKey("websocket.Accept")); + Assert.False(environment.ContainsKey("websocket.AcceptAlt")); } private class FakeService { - } } } From 8c120a07922e8ccf1a16931beafc06de404b506c Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 17 Feb 2016 23:13:33 -0800 Subject: [PATCH 497/846] Extend `WebEncoders` API to avoid allocations within the methods - rewrite existing methods in terms of the new ones - don't allocate multiple 0-length arrays nits: - clarify a couple of doc comments e.g. using `` - move an error message into a resource - pass parameter names into new resource - rename parameters for consistency e.g. `inputLength` -> `count` - name literal `int` parameters - more `var` --- .../Resources.Designer.cs | 11 +- .../Resources.resx | 57 ++-- .../WebEncoders.cs | 257 ++++++++++++++---- .../WebEncodersTests.cs | 35 +++ 4 files changed, 286 insertions(+), 74 deletions(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs index d8071d1a4f..7972e005d0 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 @@ -76,5 +76,14 @@ namespace Microsoft.AspNetCore.WebUtilities { return ResourceManager.GetString("HttpResponseStreamWriter_StreamNotWritable", resourceCulture); } } + + /// + /// Looks up a localized string similar to Invalid {0}, {1} or {2} length.. + /// + internal static string WebEncoders_InvalidCountOffsetOrLength { + get { + return ResourceManager.GetString("WebEncoders_InvalidCountOffsetOrLength", resourceCulture); + } + } } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/Resources.resx b/src/Microsoft.AspNetCore.WebUtilities/Resources.resx index 9873865894..a32d2db5cc 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Resources.resx +++ b/src/Microsoft.AspNetCore.WebUtilities/Resources.resx @@ -1,17 +1,17 @@  - @@ -123,4 +123,7 @@ The stream must support writing. + + Invalid {0}, {1} or {2} length. + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs index dc462135d1..e317d924eb 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using System.Globalization; namespace Microsoft.AspNetCore.WebUtilities { @@ -11,6 +12,8 @@ namespace Microsoft.AspNetCore.WebUtilities /// public static class WebEncoders { + private static readonly byte[] EmptyBytes = new byte[0]; + /// /// Decodes a base64url-encoded string. /// @@ -18,7 +21,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// The base64url-decoded form of the input. /// /// The input must not contain any whitespace or padding characters. - /// Throws FormatException if the input is malformed. + /// Throws if the input is malformed. /// public static byte[] Base64UrlDecode(string input) { @@ -27,7 +30,7 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(input)); } - return Base64UrlDecode(input, 0, input.Length); + return Base64UrlDecode(input, offset: 0, count: input.Length); } /// @@ -39,7 +42,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// The base64url-decoded form of the input. /// /// The input must not contain any whitespace or padding characters. - /// Throws FormatException if the input is malformed. + /// Throws if the input is malformed. /// public static byte[] Base64UrlDecode(string input, int offset, int count) { @@ -48,50 +51,139 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(input)); } - ValidateParameters(input.Length, offset, count); + ValidateParameters(input.Length, nameof(input), offset, count); // Special-case empty input if (count == 0) { - return new byte[0]; + return EmptyBytes; + } + + // Create array large enough for the Base64 characters, not just shorter Base64-URL-encoded form. + var buffer = new char[GetArraySizeRequiredToDecode(count)]; + + return Base64UrlDecode(input, offset, buffer, bufferOffset: 0, count: count); + } + + /// + /// Decodes a base64url-encoded into a byte[]. + /// + /// A string containing the base64url-encoded input to decode. + /// The position in at which decoding should begin. + /// + /// Scratch buffer to hold the s to decode. Array must be large enough to hold + /// and characters as well as Base64 padding + /// characters. Content is not preserved. + /// + /// + /// The offset into at which to begin writing the s to decode. + /// + /// The number of characters in to decode. + /// The base64url-decoded form of the . + /// + /// The input must not contain any whitespace or padding characters. + /// Throws if the input is malformed. + /// + public static byte[] Base64UrlDecode(string input, int offset, char[] buffer, int bufferOffset, int count) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + ValidateParameters(input.Length, nameof(input), offset, count); + if (bufferOffset < 0) + { + throw new ArgumentOutOfRangeException(nameof(bufferOffset)); + } + + if (count == 0) + { + return EmptyBytes; } // Assumption: input is base64url encoded without padding and contains no whitespace. - // First, we need to add the padding characters back. - int numPaddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); - char[] completeBase64Array = new char[checked(count + numPaddingCharsToAdd)]; - Debug.Assert(completeBase64Array.Length % 4 == 0, "Invariant: Array length must be a multiple of 4."); - input.CopyTo(offset, completeBase64Array, 0, count); - for (int i = 1; i <= numPaddingCharsToAdd; i++) + var paddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); + var arraySizeRequired = checked(count + paddingCharsToAdd); + Debug.Assert(arraySizeRequired % 4 == 0, "Invariant: Array length must be a multiple of 4."); + + if (buffer.Length - bufferOffset < arraySizeRequired) { - completeBase64Array[completeBase64Array.Length - i] = '='; + throw new ArgumentException( + string.Format( + CultureInfo.CurrentCulture, + Resources.WebEncoders_InvalidCountOffsetOrLength, + nameof(count), + nameof(bufferOffset), + nameof(input)), + nameof(count)); } - // Next, fix up '-' -> '+' and '_' -> '/' - for (int i = 0; i < completeBase64Array.Length; i++) + // Copy input into buffer, fixing up '-' -> '+' and '_' -> '/'. + var i = bufferOffset; + for (var j = offset; i - bufferOffset < count; i++, j++) { - char c = completeBase64Array[i]; - if (c == '-') + var ch = input[j]; + if (ch == '-') { - completeBase64Array[i] = '+'; + buffer[i] = '+'; } - else if (c == '_') + else if (ch == '_') { - completeBase64Array[i] = '/'; + buffer[i] = '/'; + } + else + { + buffer[i] = ch; } } - // Finally, decode. + // Add the padding characters back. + for (; paddingCharsToAdd > 0; i++, paddingCharsToAdd--) + { + buffer[i] = '='; + } + + // Decode. // If the caller provided invalid base64 chars, they'll be caught here. - return Convert.FromBase64CharArray(completeBase64Array, 0, completeBase64Array.Length); + return Convert.FromBase64CharArray(buffer, bufferOffset, arraySizeRequired); } /// - /// Encodes an input using base64url encoding. + /// Gets the minimum char[] size required for decoding of characters + /// with the method. + /// + /// The number of characters to decode. + /// + /// The minimum char[] size required for decoding of characters. + /// + public static int GetArraySizeRequiredToDecode(int count) + { + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (count == 0) + { + return 0; + } + + var numPaddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); + + return checked(count + numPaddingCharsToAdd); + } + + /// + /// Encodes using base64url encoding. /// /// The binary input to encode. - /// The base64url-encoded form of the input. + /// The base64url-encoded form of . public static string Base64UrlEncode(byte[] input) { if (input == null) @@ -99,16 +191,16 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(input)); } - return Base64UrlEncode(input, 0, input.Length); + return Base64UrlEncode(input, offset: 0, count: input.Length); } /// - /// Encodes an input using base64url encoding. + /// Encodes using base64url encoding. /// /// The binary input to encode. /// The offset into at which to begin encoding. - /// The number of bytes of to encode. - /// The base64url-encoded form of the input. + /// The number of bytes from to encode. + /// The base64url-encoded form of . public static string Base64UrlEncode(byte[] input, int offset, int count) { if (input == null) @@ -116,7 +208,7 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(input)); } - ValidateParameters(input.Length, offset, count); + ValidateParameters(input.Length, nameof(input), offset, count); // Special-case empty input if (count == 0) @@ -124,38 +216,104 @@ namespace Microsoft.AspNetCore.WebUtilities return string.Empty; } - // We're going to use base64url encoding with no padding characters. - // See RFC 4648, Sec. 5. - char[] buffer = new char[GetNumBase64CharsRequiredForInput(count)]; - int numBase64Chars = Convert.ToBase64CharArray(input, offset, count, buffer, 0); + var buffer = new char[GetArraySizeRequiredToEncode(count)]; + var numBase64Chars = Base64UrlEncode(input, offset, buffer, outputOffset: 0, count: count); - // Fix up '+' -> '-' and '/' -> '_' - for (int i = 0; i < numBase64Chars; i++) + return new String(buffer, startIndex: 0, length: numBase64Chars); + } + + /// + /// Encodes using base64url encoding. + /// + /// The binary input to encode. + /// The offset into at which to begin encoding. + /// + /// Buffer to receive the base64url-encoded form of . Array must be large enough to + /// hold characters and the full base64-encoded form of + /// , including padding characters. + /// + /// + /// The offset into at which to begin writing the base64url-encoded form of + /// . + /// + /// The number of bytes from to encode. + /// + /// The number of characters written to , less any padding characters. + /// + public static int Base64UrlEncode(byte[] input, int offset, char[] output, int outputOffset, int count) + { + if (input == null) { - char ch = buffer[i]; + throw new ArgumentNullException(nameof(input)); + } + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + ValidateParameters(input.Length, nameof(input), offset, count); + if (outputOffset < 0) + { + throw new ArgumentOutOfRangeException(nameof(outputOffset)); + } + + var arraySizeRequired = GetArraySizeRequiredToEncode(count); + if (output.Length - outputOffset < arraySizeRequired) + { + throw new ArgumentException( + string.Format( + CultureInfo.CurrentCulture, + Resources.WebEncoders_InvalidCountOffsetOrLength, + nameof(count), + nameof(outputOffset), + nameof(output)), + nameof(count)); + } + + // Special-case empty input. + if (count == 0) + { + return 0; + } + + // Use base64url encoding with no padding characters. See RFC 4648, Sec. 5. + + // Start with default Base64 encoding. + var numBase64Chars = Convert.ToBase64CharArray(input, offset, count, output, outputOffset); + + // Fix up '+' -> '-' and '/' -> '_'. Drop padding characters. + for (var i = outputOffset; i - outputOffset < numBase64Chars; i++) + { + var ch = output[i]; if (ch == '+') { - buffer[i] = '-'; + output[i] = '-'; } else if (ch == '/') { - buffer[i] = '_'; + output[i] = '_'; } else if (ch == '=') { - // We've reached a padding character: truncate the string from this point - return new String(buffer, 0, i); + // We've reached a padding character; truncate the remainder. + return i - outputOffset; } } - // If we got this far, the buffer didn't contain any padding chars, so turn - // it directly into a string. - return new String(buffer, 0, numBase64Chars); + return numBase64Chars; } - private static int GetNumBase64CharsRequiredForInput(int inputLength) + /// + /// Get the minimum output char[] size required for encoding + /// s with the method. + /// + /// The number of characters to encode. + /// + /// The minimum output char[] size required for encoding s. + /// + public static int GetArraySizeRequiredToEncode(int count) { - int numWholeOrPartialInputBlocks = checked(inputLength + 2) / 3; + var numWholeOrPartialInputBlocks = checked(count + 2) / 3; return checked(numWholeOrPartialInputBlocks * 4); } @@ -190,7 +348,7 @@ namespace Microsoft.AspNetCore.WebUtilities } } - private static void ValidateParameters(int bufferLength, int offset, int count) + private static void ValidateParameters(int bufferLength, string inputName, int offset, int count) { if (offset < 0) { @@ -202,7 +360,14 @@ namespace Microsoft.AspNetCore.WebUtilities } if (bufferLength - offset < count) { - throw new ArgumentException("Invalid offset / length."); + throw new ArgumentException( + string.Format( + CultureInfo.CurrentCulture, + Resources.WebEncoders_InvalidCountOffsetOrLength, + nameof(count), + nameof(offset), + inputName), + nameof(count)); } } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs index 8804644e12..c781805fcc 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs @@ -57,6 +57,41 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.Equal(roundTrippedAsBase64, base64Input); } + [Theory] + [InlineData("", "")] + [InlineData("123456qwerty++//X+/x", "123456qwerty--__X-_x")] + [InlineData("123456qwerty++//X+/xxw==", "123456qwerty--__X-_xxw")] + [InlineData("123456qwerty++//X+/xxw0=", "123456qwerty--__X-_xxw0")] + public void Base64UrlEncode_And_Decode_WithBufferOffsets(string base64Input, string expectedBase64Url) + { + // Arrange + var input = new byte[3].Concat(Convert.FromBase64String(base64Input)).Concat(new byte[2]).ToArray(); + var buffer = new char[30]; + var output = new char[30]; + for (var i = 0; i < buffer.Length; i++) + { + buffer[i] = '^'; + output[i] = '^'; + } + + // Act 1 + var numEncodedChars = + WebEncoders.Base64UrlEncode(input, offset: 3, output: output, outputOffset: 4, count: input.Length - 5); + + // Assert 1 + var encodedString = new string(output, startIndex: 4, length: numEncodedChars); + Assert.Equal(expectedBase64Url, encodedString); + + // Act 2 + var roundTripInput = new string(output); + var roundTripped = + WebEncoders.Base64UrlDecode(roundTripInput, offset: 4, buffer: buffer, bufferOffset: 5, count: numEncodedChars); + + // Assert 2, verify that values round-trip + var roundTrippedAsBase64 = Convert.ToBase64String(roundTripped); + Assert.Equal(roundTrippedAsBase64, base64Input); + } + [Theory] [InlineData(0, 1, 0)] [InlineData(0, 0, 1)] From 5e7b30c04b89441df4b60c0bc49a3b05c3a642db Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 11 Feb 2016 14:21:47 -0800 Subject: [PATCH 498/846] #542 Add IHttpConnectionFeature.ConnectionId --- .../IHttpConnectionFeature.cs | 23 +++++++++++++++++++ .../Features/HttpConnectionFeature.cs | 2 ++ .../OwinConstants.cs | 1 + .../OwinEnvironment.cs | 3 +++ .../OwinFeatureCollection.cs | 6 +++++ 5 files changed, 35 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs index ac30742af8..932e9bfe2c 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs @@ -5,11 +5,34 @@ using System.Net; namespace Microsoft.AspNetCore.Http.Features { + /// + /// Information regarding the TCP/IP connection carrying the request. + /// public interface IHttpConnectionFeature { + /// + /// The unique identifier for the connection the request was received on. This is primarily for diagnostic purposes. + /// + string ConnectionId { get; set; } + + /// + /// The IPAddress of the client making the request. Note this may be for a proxy rather than the end user. + /// IPAddress RemoteIpAddress { get; set; } + + /// + /// The local IPAddress on which the request was received. + /// IPAddress LocalIpAddress { get; set; } + + /// + /// The remote port of the client making the request. + /// int RemotePort { get; set; } + + /// + /// The local port on which the request was received. + /// int LocalPort { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs index 05fc485c03..ab688ec777 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs @@ -11,6 +11,8 @@ namespace Microsoft.AspNetCore.Http.Features.Internal { } + public string ConnectionId { get; set; } + public IPAddress LocalIpAddress { get; set; } public int LocalPort { get; set; } diff --git a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs index 028866bae2..ca14cf9cbb 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs @@ -73,6 +73,7 @@ namespace Microsoft.AspNetCore.Owin public const string RemotePort = "server.RemotePort"; public const string LocalIpAddress = "server.LocalIpAddress"; public const string LocalPort = "server.LocalPort"; + public const string ConnectionId = "server.ConnectionId"; public const string TraceOutput = "host.TraceOutput"; public const string Addresses = "host.Addresses"; public const string AppName = "host.AppName"; diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index 11f3e2fab9..a69bcde215 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -74,6 +74,9 @@ namespace Microsoft.AspNetCore.Owin })) }, + { OwinConstants.CommonKeys.ConnectionId, new FeatureMap(feature => feature.ConnectionId, + (feature, value) => feature.ConnectionId = Convert.ToString(value, CultureInfo.InvariantCulture)) }, + { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, { OwinConstants.CommonKeys.RemotePort, new FeatureMap(feature => feature.RemotePort.ToString(CultureInfo.InvariantCulture), diff --git a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs index e2b7a8f83d..6809d5c4f2 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs @@ -190,6 +190,12 @@ namespace Microsoft.AspNetCore.Owin set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } } + string IHttpConnectionFeature.ConnectionId + { + get { return Prop(OwinConstants.CommonKeys.ConnectionId); } + set { Prop(OwinConstants.CommonKeys.ConnectionId, value); } + } + private bool SupportsSendFile { get From 91751015eacf9f3b7cbb8dafbf07eb2d3af5b1e3 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 18 Feb 2016 09:56:00 -0800 Subject: [PATCH 499/846] Reset fields on AuthenticateContext This is needed for cases where IAuthenticationHandler instances delegate or modify the output of each-other. --- .../Authentication/AuthenticateContext.cs | 18 +- .../Authentication/AuthenticateContextTest.cs | 162 ++++++++++++++++++ 2 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.AspNetCore.Http.Features.Tests/Authentication/AuthenticateContextTest.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs index 21aaf5b428..e73061667b 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs @@ -34,20 +34,36 @@ namespace Microsoft.AspNetCore.Http.Features.Authentication public virtual void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) { Accepted = true; + Principal = principal; Properties = properties; Description = description; + + // Set defaults for fields we don't use in case multiple handlers modified the context. + Error = null; } public virtual void NotAuthenticated() { Accepted = true; + + // Set defaults for fields we don't use in case multiple handlers modified the context. + Description = null; + Error = null; + Principal = null; + Properties = null; } public virtual void Failed(Exception error) { - Error = error; Accepted = true; + + Error = error; + + // Set defaults for fields we don't use in case multiple handlers modified the context. + Description = null; + Principal = null; + Properties = null; } } } diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Authentication/AuthenticateContextTest.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Authentication/AuthenticateContextTest.cs new file mode 100644 index 0000000000..c4d901322e --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Authentication/AuthenticateContextTest.cs @@ -0,0 +1,162 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNetCore.Http.Features.Authentication +{ + public class AuthenticateContextTest + { + [Fact] + public void AuthenticateContext_Authenticated() + { + // Arrange + var context = new AuthenticateContext("test"); + + var principal = new ClaimsPrincipal(); + var properties = new Dictionary(); + var description = new Dictionary(); + + // Act + context.Authenticated(principal, properties, description); + + // Assert + Assert.True(context.Accepted); + Assert.Equal("test", context.AuthenticationScheme); + Assert.Same(description, context.Description); + Assert.Null(context.Error); + Assert.Same(principal, context.Principal); + Assert.Same(properties, context.Properties); + } + + [Fact] + public void AuthenticateContext_Authenticated_SetsUnusedPropertiesToDefault() + { + // Arrange + var context = new AuthenticateContext("test"); + + var principal = new ClaimsPrincipal(); + var properties = new Dictionary(); + var description = new Dictionary(); + + context.Failed(new Exception()); + + // Act + context.Authenticated(principal, properties, description); + + // Assert + Assert.True(context.Accepted); + Assert.Equal("test", context.AuthenticationScheme); + Assert.Same(description, context.Description); + Assert.Null(context.Error); + Assert.Same(principal, context.Principal); + Assert.Same(properties, context.Properties); + } + + [Fact] + public void AuthenticateContext_Failed() + { + // Arrange + var context = new AuthenticateContext("test"); + + var exception = new Exception(); + + // Act + context.Failed(exception); + + // Assert + Assert.True(context.Accepted); + Assert.Equal("test", context.AuthenticationScheme); + Assert.Null(context.Description); + Assert.Same(exception, context.Error); + Assert.Null(context.Principal); + Assert.Null(context.Properties); + } + + [Fact] + public void AuthenticateContext_Failed_SetsUnusedPropertiesToDefault() + { + // Arrange + var context = new AuthenticateContext("test"); + + var exception = new Exception(); + + context.Authenticated(new ClaimsPrincipal(), new Dictionary(), new Dictionary()); + + // Act + context.Failed(exception); + + // Assert + Assert.True(context.Accepted); + Assert.Equal("test", context.AuthenticationScheme); + Assert.Null(context.Description); + Assert.Same(exception, context.Error); + Assert.Null(context.Principal); + Assert.Null(context.Properties); + } + + [Fact] + public void AuthenticateContext_NotAuthenticated() + { + // Arrange + var context = new AuthenticateContext("test"); + + // Act + context.NotAuthenticated(); + + // Assert + Assert.True(context.Accepted); + Assert.Equal("test", context.AuthenticationScheme); + Assert.Null(context.Description); + Assert.Null(context.Error); + Assert.Null(context.Principal); + Assert.Null(context.Properties); + } + + [Fact] + public void AuthenticateContext_NotAuthenticated_SetsUnusedPropertiesToDefault_Authenticated() + { + // Arrange + var context = new AuthenticateContext("test"); + + var exception = new Exception(); + + context.Authenticated(new ClaimsPrincipal(), new Dictionary(), new Dictionary()); + + // Act + context.NotAuthenticated(); + + // Assert + Assert.True(context.Accepted); + Assert.Equal("test", context.AuthenticationScheme); + Assert.Null(context.Description); + Assert.Null(context.Error); + Assert.Null(context.Principal); + Assert.Null(context.Properties); + } + + [Fact] + public void AuthenticateContext_NotAuthenticated_SetsUnusedPropertiesToDefault_Failed() + { + // Arrange + var context = new AuthenticateContext("test"); + + context.Failed(new Exception()); + + context.NotAuthenticated(); + + // Assert + Assert.True(context.Accepted); + Assert.Equal("test", context.AuthenticationScheme); + Assert.Null(context.Description); + Assert.Null(context.Error); + Assert.Null(context.Principal); + Assert.Null(context.Properties); + } + } +} From dc2aa0ec8fdc8080ad2b3caaca34fddf498ef957 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 18 Feb 2016 15:00:57 -0800 Subject: [PATCH 500/846] Updating test TFMs for custom test discovery --- test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Owin.Tests/project.json | 2 +- test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 9e61b607f6..846093b4e5 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -16,7 +16,7 @@ }, "imports": "portable-net451+win8" }, - "dnx451": { + "net451": { "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 1b4695835c..e49084a32a 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -13,7 +13,7 @@ }, "imports": "portable-net451+win8" }, - "dnx451": { + "net451": { "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 3983cc014a..a454ccb613 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -11,7 +11,7 @@ }, "imports": "portable-net451+win8" }, - "dnx451": { + "net451": { "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 8993408d3c..8d8a94cb21 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -11,7 +11,7 @@ }, "imports": "portable-net451+win8" }, - "dnx451": { + "net451": { "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 2175effd71..71ede3cb4f 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -13,7 +13,7 @@ }, "imports": "portable-net451+win8" }, - "dnx451": { + "net451": { "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 89df6bf2bc..26b48e2b10 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -16,7 +16,7 @@ }, "imports": "portable-net451+win8" }, - "dnx451": { + "net451": { "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 4e379068e6..d8145f7161 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -12,7 +12,7 @@ }, "imports": "portable-net451+win8" }, - "dnx451": { + "net451": { "frameworkAssemblies": { "System.Runtime": "", "System.Threading.Tasks": "" From c7029a1bd0de9dc56ce3d09a477e41e93f0e917b Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 18 Feb 2016 15:35:36 -0800 Subject: [PATCH 501/846] Update System.Linq 4.0.2-* => 4.1.0-*. --- src/Microsoft.AspNetCore.Http.Features/project.json | 2 +- src/Microsoft.Net.Http.Headers/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 9b2a35ebb8..1b4d02bfe0 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -17,7 +17,7 @@ "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-*", - "System.Linq": "4.0.2-*", + "System.Linq": "4.1.0-*", "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", "System.Runtime.Extensions": "4.1.0-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 07931164c9..a191b60875 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -18,7 +18,7 @@ "System.Diagnostics.Contracts": "4.0.1-*", "System.Globalization": "4.0.11-*", "System.Globalization.Extensions": "4.0.1-*", - "System.Linq": "4.0.2-*", + "System.Linq": "4.1.0-*", "System.Text.Encoding": "4.0.11-*", } } From d4e72564c735a6fc0a34bb3fdb1366569cd59550 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 12 Feb 2016 15:26:23 -0800 Subject: [PATCH 502/846] Add AuthenticationManager.HttpContext. Clean up contructors. --- samples/SampleApp/PooledHttpContext.cs | 8 ++++---- .../Authentication/AuthenticationManager.cs | 2 ++ .../Authentication/DefaultAuthenticationManager.cs | 12 ++++++++---- src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs | 6 +++--- src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs | 8 ++++---- src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs | 8 ++++---- 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/samples/SampleApp/PooledHttpContext.cs b/samples/SampleApp/PooledHttpContext.cs index 57b5f0e52b..9e124ebaf4 100644 --- a/samples/SampleApp/PooledHttpContext.cs +++ b/samples/SampleApp/PooledHttpContext.cs @@ -21,11 +21,11 @@ namespace SampleApp { if (_pooledHttpRequest != null) { - _pooledHttpRequest.Initialize(this, Features); + _pooledHttpRequest.Initialize(this); return _pooledHttpRequest; } - return new DefaultHttpRequest(this, Features); + return new DefaultHttpRequest(this); } protected override void UninitializeHttpRequest(HttpRequest instance) @@ -38,11 +38,11 @@ namespace SampleApp { if (_pooledHttpResponse != null) { - _pooledHttpResponse.Initialize(this, Features); + _pooledHttpResponse.Initialize(this); return _pooledHttpResponse; } - return new DefaultHttpResponse(this, Features); + return new DefaultHttpResponse(this); } protected override void UninitializeHttpResponse(HttpResponse instance) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs index b787a1ed28..0fa5789218 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -16,6 +16,8 @@ namespace Microsoft.AspNetCore.Http.Authentication /// public const string AutomaticScheme = "Automatic"; + public abstract HttpContext HttpContext { get; } + public abstract IEnumerable GetAuthenticationSchemes(); public abstract Task AuthenticateAsync(AuthenticateContext context); diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index 5933db0497..24eb05e799 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -14,16 +14,18 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager { + private HttpContext _context; private FeatureReferences _features; - public DefaultAuthenticationManager(IFeatureCollection features) + public DefaultAuthenticationManager(HttpContext context) { - Initialize(features); + Initialize(context); } - public virtual void Initialize(IFeatureCollection features) + public virtual void Initialize(HttpContext context) { - _features = new FeatureReferences(features); + _context = context; + _features = new FeatureReferences(context.Features); } public virtual void Uninitialize() @@ -31,6 +33,8 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal _features = default(FeatureReferences); } + public override HttpContext HttpContext => _context; + private IHttpAuthenticationFeature HttpAuthenticationFeature => _features.Fetch(ref _features.Cache, f => new HttpAuthenticationFeature()); diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs index 5d0424cf7c..4e99c52964 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs @@ -173,16 +173,16 @@ namespace Microsoft.AspNetCore.Http.Internal } - protected virtual HttpRequest InitializeHttpRequest() => new DefaultHttpRequest(this, Features); + protected virtual HttpRequest InitializeHttpRequest() => new DefaultHttpRequest(this); protected virtual void UninitializeHttpRequest(HttpRequest instance) { } - protected virtual HttpResponse InitializeHttpResponse() => new DefaultHttpResponse(this, Features); + protected virtual HttpResponse InitializeHttpResponse() => new DefaultHttpResponse(this); protected virtual void UninitializeHttpResponse(HttpResponse instance) { } protected virtual ConnectionInfo InitializeConnectionInfo() => new DefaultConnectionInfo(Features); protected virtual void UninitializeConnectionInfo(ConnectionInfo instance) { } - protected virtual AuthenticationManager InitializeAuthenticationManager() => new DefaultAuthenticationManager(Features); + protected virtual AuthenticationManager InitializeAuthenticationManager() => new DefaultAuthenticationManager(this); protected virtual void UninitializeAuthenticationManager(AuthenticationManager instance) { } protected virtual WebSocketManager InitializeWebSocketManager() => new DefaultWebSocketManager(Features); diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs index f133c993a0..2d5abcf7af 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs @@ -16,15 +16,15 @@ namespace Microsoft.AspNetCore.Http.Internal private HttpContext _context; private FeatureReferences _features; - public DefaultHttpRequest(HttpContext context, IFeatureCollection features) + public DefaultHttpRequest(HttpContext context) { - Initialize(context, features); + Initialize(context); } - public virtual void Initialize(HttpContext context, IFeatureCollection features) + public virtual void Initialize(HttpContext context) { _context = context; - _features = new FeatureReferences(features); + _features = new FeatureReferences(context.Features); } public virtual void Uninitialize() diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs index 0676913d62..6105ff1c5b 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs @@ -15,15 +15,15 @@ namespace Microsoft.AspNetCore.Http.Internal private HttpContext _context; private FeatureReferences _features; - public DefaultHttpResponse(HttpContext context, IFeatureCollection features) + public DefaultHttpResponse(HttpContext context) { - Initialize(context, features); + Initialize(context); } - public virtual void Initialize(HttpContext context, IFeatureCollection features) + public virtual void Initialize(HttpContext context) { _context = context; - _features = new FeatureReferences(features); + _features = new FeatureReferences(context.Features); } public virtual void Uninitialize() From 3e8368ad6629c8ca5a6769dc8520a9980997ac1c Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 18 Feb 2016 12:54:33 -0800 Subject: [PATCH 503/846] Enabled xml doc generation --- NuGetPackageVerifier.json | 14 ++------------ .../Extensions/HeaderDictionaryExtensions.cs | 4 ++++ .../project.json | 4 +++- .../SendFileResponseExtensions.cs | 2 ++ .../project.json | 4 +++- .../project.json | 4 +++- src/Microsoft.AspNetCore.Http/project.json | 4 +++- src/Microsoft.AspNetCore.Owin/project.json | 4 +++- .../FormReader.cs | 3 +++ .../MultipartReaderStream.cs | 5 +++-- .../WebEncoders.cs | 4 ++-- src/Microsoft.AspNetCore.WebUtilities/project.json | 4 +++- src/Microsoft.Net.Http.Headers/project.json | 4 +++- 13 files changed, 37 insertions(+), 23 deletions(-) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 647f42bb4f..9b4aae6984 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -1,12 +1,7 @@ { "adx": { // Packages written by the ADX team and that ship on NuGet.org "rules": [ - "AssemblyHasDocumentFileRule", - "AssemblyHasVersionAttributesRule", - "AssemblyHasServicingAttributeRule", - "AssemblyHasNeutralResourcesLanguageAttributeRule", - "SatellitePackageRule", - "StrictSemanticVersionValidationRule" + "AdxVerificationCompositeRule" ], "packages": { "Microsoft.AspNetCore.Http": { }, @@ -20,12 +15,7 @@ }, "Default": { // Rules to run for packages not listed in any other set. "rules": [ - "AssemblyHasDocumentFileRule", - "AssemblyHasVersionAttributesRule", - "AssemblyHasServicingAttributeRule", - "AssemblyHasNeutralResourcesLanguageAttributeRule", - "SatellitePackageRule", - "StrictSemanticVersionValidationRule" + "DefaultCompositeRule" ] } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs index 79da20b342..65484981e0 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs @@ -11,6 +11,7 @@ namespace Microsoft.AspNetCore.Http /// /// Add new values. Each item remains a separate array entry. /// + /// The to use. /// The header name. /// The header value. public static void Append(this IHeaderDictionary headers, string key, StringValues value) @@ -21,6 +22,7 @@ namespace Microsoft.AspNetCore.Http /// /// Quotes any values containing comas, and then coma joins all of the values with any existing values. /// + /// The to use. /// The header name. /// The header values. public static void AppendCommaSeparatedValues(this IHeaderDictionary headers, string key, params string[] values) @@ -32,6 +34,7 @@ namespace Microsoft.AspNetCore.Http /// Get the associated values from the collection separated into individual values. /// Quoted values will not be split, and the quotes will be removed. /// + /// The to use. /// The header name. /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) @@ -42,6 +45,7 @@ namespace Microsoft.AspNetCore.Http /// /// Quotes any values containing comas, and then coma joins all of the values. /// + /// The to use. /// The header name. /// The header values. public static void SetCommaSeparatedValues(this IHeaderDictionary headers, string key, params string[] values) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 1779b5ee28..20578bac5c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -7,7 +7,9 @@ }, "compilationOptions": { "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "keyFile": "../../tools/Key.snk", + "nowarn": [ "CS1591" ], + "xmlDoc": true }, "dependencies": { "Microsoft.AspNetCore.Http.Features": "1.0.0-*", diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs index c747df187b..cbddfe97c9 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs @@ -21,6 +21,7 @@ namespace Microsoft.AspNetCore.Http /// /// /// The file. + /// The . public static Task SendFileAsync(this HttpResponse response, IFileInfo file, CancellationToken cancellationToken = default(CancellationToken)) { @@ -80,6 +81,7 @@ namespace Microsoft.AspNetCore.Http /// /// /// The full path to the file. + /// The . /// public static Task SendFileAsync(this HttpResponse response, string fileName, CancellationToken cancellationToken = default(CancellationToken)) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index a641249366..7f9b1ab34a 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -7,7 +7,9 @@ }, "compilationOptions": { "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "keyFile": "../../tools/Key.snk", + "nowarn": [ "CS1591" ], + "xmlDoc": true }, "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 1b4d02bfe0..93ba9e9d4f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -7,7 +7,9 @@ }, "compilationOptions": { "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "keyFile": "../../tools/Key.snk", + "nowarn": [ "CS1591" ], + "xmlDoc": true }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*" diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 728e38ebcc..c2bc71063e 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -8,7 +8,9 @@ "compilationOptions": { "warningsAsErrors": true, "allowUnsafe": true, - "keyFile": "../../tools/Key.snk" + "keyFile": "../../tools/Key.snk", + "nowarn": [ "CS1591" ], + "xmlDoc": true }, "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 4a02e2515c..eb09487075 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -7,7 +7,9 @@ }, "compilationOptions": { "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "keyFile": "../../tools/Key.snk", + "nowarn": [ "CS1591" ], + "xmlDoc": true }, "dependencies": { "Microsoft.AspNetCore.Http": "1.0.0-*" diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs index a78e56c7d3..ca378895ef 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs @@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// Parses an HTTP form body. /// /// The HTTP form body to parse. + /// The . /// The collection containing the parsed HTTP form body. public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) { @@ -194,6 +195,8 @@ namespace Microsoft.AspNetCore.WebUtilities /// Parses an HTTP form body. /// /// The HTTP form body to parse. + /// The character encoding to use. + /// The . /// The collection containing the parsed HTTP form body. public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) { diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index 22836ee320..442c693eab 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -23,8 +23,9 @@ namespace Microsoft.AspNetCore.WebUtilities /// /// Creates a stream that reads until it reaches the given boundary pattern. /// - /// - /// + /// The . + /// The boundary pattern to use. + /// Specifies whether a leading crlf should be expected. public MultipartReaderStream(BufferedReadStream stream, string boundary, bool expectLeadingCrlf = true) { if (stream == null) diff --git a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs index e317d924eb..50f2eefbbc 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs @@ -156,7 +156,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// /// Gets the minimum char[] size required for decoding of characters - /// with the method. + /// with the method. /// /// The number of characters to decode. /// @@ -305,7 +305,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// /// Get the minimum output char[] size required for encoding - /// s with the method. + /// s with the method. /// /// The number of characters to encode. /// diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 9ff39f4337..6056e9e234 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -7,7 +7,9 @@ }, "compilationOptions": { "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "keyFile": "../../tools/Key.snk", + "nowarn": [ "CS1591" ], + "xmlDoc": true }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index a191b60875..323ec644c0 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -7,7 +7,9 @@ }, "compilationOptions": { "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "keyFile": "../../tools/Key.snk", + "nowarn": [ "CS1591" ], + "xmlDoc": true }, "dependencies": {}, "frameworks": { From 90f71aa6ec81c56b3c56d82cfd045bc0820ebd11 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 18 Feb 2016 19:42:11 -0800 Subject: [PATCH 504/846] Add missing `System.Resources.ResourceManager` dependency. --- src/Microsoft.Net.Http.Headers/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 323ec644c0..84faa09df2 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -22,6 +22,7 @@ "System.Globalization.Extensions": "4.0.1-*", "System.Linq": "4.1.0-*", "System.Text.Encoding": "4.0.11-*", + "System.Resources.ResourceManager": "4.0.1-*" } } } From c030ef9129a292fa7e477e2730a97cb3fd9dc1b5 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 18 Feb 2016 16:33:25 -0800 Subject: [PATCH 505/846] [Fixes #567] Adding port and host parsing in HostString --- .../HostString.cs | 145 +++++++++++++++--- .../Properties/Resources.Designer.cs | 16 ++ .../Resources.resx | 3 + .../HostStringTest.cs | 96 ++++++++++++ 4 files changed, 237 insertions(+), 23 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs index f767255b1f..2641f33540 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs @@ -3,6 +3,7 @@ using System; using System.Globalization; +using Microsoft.AspNetCore.Http.Abstractions; namespace Microsoft.AspNetCore.Http { @@ -24,6 +25,31 @@ namespace Microsoft.AspNetCore.Http _value = value; } + /// + /// Creates a new HostString from its host and port parts. + /// + /// The value should be Unicode rather than punycode. IPv6 addresses must use square braces. + /// A positive, greater than 0 value representing the port in the host string. + public HostString(string host, int port) + { + if(port <= 0) + { + throw new ArgumentOutOfRangeException(nameof(port), Resources.Exception_PortMustBeGreaterThanZero); + } + + int index; + if (host.IndexOf('[') == -1 + && (index = host.IndexOf(':')) >= 0 + && index < host.Length - 1 + && host.IndexOf(':', index + 1) >= 0) + { + // IPv6 without brackets ::1 is the only type of host with 2 or more colons + host = $"[{host}]"; + } + + _value = host + ":" + port.ToString(CultureInfo.InvariantCulture); + } + /// /// Returns the original value from the constructor. /// @@ -37,6 +63,45 @@ namespace Microsoft.AspNetCore.Http get { return !string.IsNullOrEmpty(_value); } } + /// + /// Returns the value of the host part of the value. The port is removed if it was present. + /// IPv6 addresses will have brackets added if they are missing. + /// + /// + public string Host + { + get + { + string host, port; + + GetParts(out host, out port); + + return host; + } + } + + /// + /// Returns the value of the port part of the host, or null if none is found. + /// + /// + public int? Port + { + get + { + string host, port; + int p; + + GetParts(out host, out port); + + if (string.IsNullOrEmpty(port) || !int.TryParse(port, out p)) + { + return null; + } + + return p; + } + } + /// /// Returns the value as normalized by ToUriComponent(). /// @@ -53,35 +118,25 @@ namespace Microsoft.AspNetCore.Http /// public string ToUriComponent() { - int index; if (string.IsNullOrEmpty(_value)) { return string.Empty; } - else if (_value.IndexOf('[') >= 0) - { - // IPv6 in brackets [::1], maybe with port - return _value; - } - else if ((index = _value.IndexOf(':')) >= 0 - && index < _value.Length - 1 - && _value.IndexOf(':', index + 1) >= 0) - { - // IPv6 without brackets ::1 is the only type of host with 2 or more colons - return $"[{_value}]"; - } - else if (index >= 0) - { - // Has a port - string port = _value.Substring(index); + + string host, port; + + GetParts(out host, out port); + + if (host.IndexOf('[') == -1) + { var mapping = new IdnMapping(); - return mapping.GetAscii(_value, 0, index) + port; - } - else - { - var mapping = new IdnMapping(); - return mapping.GetAscii(_value); + host = mapping.GetAscii(host); } + + return string.IsNullOrEmpty(port) + ? host + : string.Concat(host, ":", port); + } /// @@ -197,5 +252,49 @@ namespace Microsoft.AspNetCore.Http { return !left.Equals(right); } + + /// + /// Parses the current value. IPv6 addresses will have brackets added if they are missing. + /// + private void GetParts(out string host, out string port) + { + int index; + port = null; + host = null; + + if (string.IsNullOrEmpty(_value)) + { + return; + } + else if ((index = _value.IndexOf(']')) >= 0) + { + // IPv6 in brackets [::1], maybe with port + host = _value.Substring(0, index + 1); + + if ((index = _value.IndexOf(':', index + 1)) >= 0) + { + port = _value.Substring(index + 1); + } + } + else if ((index = _value.IndexOf(':')) >= 0 + && index < _value.Length - 1 + && _value.IndexOf(':', index + 1) >= 0) + { + // IPv6 without brackets ::1 is the only type of host with 2 or more colons + host = $"[{_value}]"; + port = null; + } + else if (index >= 0) + { + // Has a port + host = _value.Substring(0, index); + port = _value.Substring(index + 1); + } + else + { + host = _value; + port = null; + } + } } } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs index 438644852a..40e4255667 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs @@ -138,6 +138,22 @@ namespace Microsoft.AspNetCore.Http.Abstractions return string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeDoesNotSupportRefOrOutParams"), p0); } + /// + /// The value must be greater than zero. + /// + internal static string Exception_PortMustBeGreaterThanZero + { + get { return GetString("Exception_PortMustBeGreaterThanZero"); } + } + + /// + /// The value must be greater than zero. + /// + internal static string FormatException_PortMustBeGreaterThanZero() + { + return GetString("Exception_PortMustBeGreaterThanZero"); + } + private static string GetString(string name, params string[] formatterNames) { var value = _resourceManager.GetString(name); diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx index 414bad847d..19ce173d19 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx @@ -141,4 +141,7 @@ The '{0}' method must not have ref or out parameters. + + The value must be greater than zero. + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs new file mode 100644 index 0000000000..6e5a684e0b --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs @@ -0,0 +1,96 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Testing; +using Xunit; + +namespace Microsoft.AspNetCore.Http +{ + public class HostStringTests + { + [Theory] + [InlineData(0)] + [InlineData(-1)] + public void CtorThrows_IfPortIsNotGreaterThanZero(int port) + { + // Act and Assert + ExceptionAssert.ThrowsArgumentOutOfRange(() => new HostString("localhost", port), "port", "The value must be greater than zero."); + } + + [Theory] + [InlineData("localhost", "localhost")] + [InlineData("1.2.3.4", "1.2.3.4")] + [InlineData("[2001:db8:a0b:12f0::1]", "[2001:db8:a0b:12f0::1]")] + [InlineData("本地主機", "本地主機")] + [InlineData("localhost:5000", "localhost")] + [InlineData("1.2.3.4:5000", "1.2.3.4")] + [InlineData("[2001:db8:a0b:12f0::1]:5000", "[2001:db8:a0b:12f0::1]")] + [InlineData("本地主機:5000", "本地主機")] + public void Domain_ExtractsHostFromValue(string sourceValue, string expectedDomain) + { + // Arrange + var hostString = new HostString(sourceValue); + + // Act + var result = hostString.Host; + + // Assert + Assert.Equal(expectedDomain, result); + } + + [Theory] + [InlineData("localhost", null)] + [InlineData("1.2.3.4", null)] + [InlineData("[2001:db8:a0b:12f0::1]", null)] + [InlineData("本地主機", null)] + [InlineData("localhost:5000", 5000)] + [InlineData("1.2.3.4:5000", 5000)] + [InlineData("[2001:db8:a0b:12f0::1]:5000", 5000)] + [InlineData("本地主機:5000", 5000)] + public void Port_ExtractsPortFromValue(string sourceValue, int? expectedPort) + { + // Arrange + var hostString = new HostString(sourceValue); + + // Act + var result = hostString.Port; + + // Assert + Assert.Equal(expectedPort, result); + } + + [Theory] + [InlineData("localhost:BLAH")] + public void Port_ExtractsInvalidPortFromValue(string sourceValue) + { + // Arrange + var hostString = new HostString(sourceValue); + + // Act + var result = hostString.Port; + + // Assert + Assert.Equal(null, result); + } + + [Theory] + [InlineData("localhost", 5000, "localhost", 5000)] + [InlineData("1.2.3.4", 5000, "1.2.3.4", 5000)] + [InlineData("[2001:db8:a0b:12f0::1]", 5000, "[2001:db8:a0b:12f0::1]", 5000)] + [InlineData("2001:db8:a0b:12f0::1", 5000, "[2001:db8:a0b:12f0::1]", 5000)] + [InlineData("本地主機", 5000, "本地主機", 5000)] + public void Ctor_CreatesFromHostAndPort(string sourceHost, int sourcePort, string expectedHost, int expectedPort) + { + // Arrange + var hostString = new HostString(sourceHost, sourcePort); + + // Act + var host = hostString.Host; + var port = hostString.Port; + + // Assert + Assert.Equal(expectedHost, host); + Assert.Equal(expectedPort, port); + } + } +} From dc456ceab5e2e66b4c962d467564d481f111d03c Mon Sep 17 00:00:00 2001 From: Mukul Sabharwal Date: Fri, 19 Feb 2016 16:16:17 -0800 Subject: [PATCH 506/846] Downgrade to use CoreFX NET46 compatible packages --- .../project.json | 10 +++++----- .../project.json | 2 +- .../project.json | 12 ++++++------ src/Microsoft.AspNetCore.Http/project.json | 2 +- src/Microsoft.AspNetCore.WebUtilities/project.json | 6 +++--- src/Microsoft.Net.Http.Headers/project.json | 14 +++++++------- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 20578bac5c..fc6f8c7a66 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -28,12 +28,12 @@ }, "dotnet5.4": { "dependencies": { - "System.ComponentModel": "4.0.1-*", - "System.Globalization.Extensions": "4.0.1-*", - "System.Linq.Expressions": "4.0.11-*", + "System.ComponentModel": "4.0.0-*", + "System.Globalization.Extensions": "4.0.0-*", + "System.Linq.Expressions": "4.0.10-*", "System.Net.WebSockets": "4.0.0-*", - "System.Reflection.TypeExtensions": "4.1.0-*", - "System.Runtime.InteropServices": "4.1.0-*", + "System.Reflection.TypeExtensions": "4.0.0-*", + "System.Runtime.InteropServices": "4.0.20-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*" } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 7f9b1ab34a..326dcb2e67 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -21,7 +21,7 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.IO.FileSystem": "4.0.1-*" + "System.IO.FileSystem": "4.0.0-*" } } } diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 93ba9e9d4f..d5e67e5574 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -18,14 +18,14 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-*", - "System.Linq": "4.1.0-*", - "System.Net.Primitives": "4.0.11-*", + "System.Collections": "4.0.10-*", + "System.Linq": "4.0.0-*", + "System.Net.Primitives": "4.0.10-*", "System.Net.WebSockets": "4.0.0-*", - "System.Runtime.Extensions": "4.1.0-*", - "System.Security.Claims": "4.0.1-*", + "System.Runtime.Extensions": "4.0.10-*", + "System.Security.Claims": "4.0.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*", - "System.Security.Principal": "4.0.1-*" + "System.Security.Principal": "4.0.0-*" } } } diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index c2bc71063e..f017f5be8f 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -21,7 +21,7 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Threading": "4.0.11-*" + "System.Threading": "4.0.10-*" } } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 6056e9e234..3189604907 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -24,9 +24,9 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-*", - "System.IO": "4.1.0-*", - "System.IO.FileSystem": "4.0.1-*" + "System.Collections": "4.0.10-*", + "System.IO": "4.0.10-*", + "System.IO.FileSystem": "4.0.0-*" } } } diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 84faa09df2..35103cf5e2 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -16,13 +16,13 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-*", - "System.Diagnostics.Contracts": "4.0.1-*", - "System.Globalization": "4.0.11-*", - "System.Globalization.Extensions": "4.0.1-*", - "System.Linq": "4.1.0-*", - "System.Text.Encoding": "4.0.11-*", - "System.Resources.ResourceManager": "4.0.1-*" + "System.Collections": "4.0.10-*", + "System.Diagnostics.Contracts": "4.0.0-*", + "System.Globalization": "4.0.10-*", + "System.Globalization.Extensions": "4.0.0-*", + "System.Linq": "4.0.0-*", + "System.Text.Encoding": "4.0.10-*", + "System.Resources.ResourceManager": "4.0.0-*" } } } From dabe2e0c2485981675baf3e848261e0890ad2bd3 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 19 Feb 2016 20:33:13 -0800 Subject: [PATCH 507/846] Revert "Downgrade to use CoreFX NET46 compatible packages" This reverts commit dc456ceab5e2e66b4c962d467564d481f111d03c. --- .../project.json | 10 +++++----- .../project.json | 2 +- .../project.json | 12 ++++++------ src/Microsoft.AspNetCore.Http/project.json | 2 +- src/Microsoft.AspNetCore.WebUtilities/project.json | 6 +++--- src/Microsoft.Net.Http.Headers/project.json | 14 +++++++------- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index fc6f8c7a66..20578bac5c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -28,12 +28,12 @@ }, "dotnet5.4": { "dependencies": { - "System.ComponentModel": "4.0.0-*", - "System.Globalization.Extensions": "4.0.0-*", - "System.Linq.Expressions": "4.0.10-*", + "System.ComponentModel": "4.0.1-*", + "System.Globalization.Extensions": "4.0.1-*", + "System.Linq.Expressions": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", - "System.Reflection.TypeExtensions": "4.0.0-*", - "System.Runtime.InteropServices": "4.0.20-*", + "System.Reflection.TypeExtensions": "4.1.0-*", + "System.Runtime.InteropServices": "4.1.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*" } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 326dcb2e67..7f9b1ab34a 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -21,7 +21,7 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.IO.FileSystem": "4.0.0-*" + "System.IO.FileSystem": "4.0.1-*" } } } diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index d5e67e5574..93ba9e9d4f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -18,14 +18,14 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.10-*", - "System.Linq": "4.0.0-*", - "System.Net.Primitives": "4.0.10-*", + "System.Collections": "4.0.11-*", + "System.Linq": "4.1.0-*", + "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", - "System.Runtime.Extensions": "4.0.10-*", - "System.Security.Claims": "4.0.0-*", + "System.Runtime.Extensions": "4.1.0-*", + "System.Security.Claims": "4.0.1-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*", - "System.Security.Principal": "4.0.0-*" + "System.Security.Principal": "4.0.1-*" } } } diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index f017f5be8f..c2bc71063e 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -21,7 +21,7 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Threading": "4.0.10-*" + "System.Threading": "4.0.11-*" } } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 3189604907..6056e9e234 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -24,9 +24,9 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.10-*", - "System.IO": "4.0.10-*", - "System.IO.FileSystem": "4.0.0-*" + "System.Collections": "4.0.11-*", + "System.IO": "4.1.0-*", + "System.IO.FileSystem": "4.0.1-*" } } } diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 35103cf5e2..84faa09df2 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -16,13 +16,13 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.10-*", - "System.Diagnostics.Contracts": "4.0.0-*", - "System.Globalization": "4.0.10-*", - "System.Globalization.Extensions": "4.0.0-*", - "System.Linq": "4.0.0-*", - "System.Text.Encoding": "4.0.10-*", - "System.Resources.ResourceManager": "4.0.0-*" + "System.Collections": "4.0.11-*", + "System.Diagnostics.Contracts": "4.0.1-*", + "System.Globalization": "4.0.11-*", + "System.Globalization.Extensions": "4.0.1-*", + "System.Linq": "4.1.0-*", + "System.Text.Encoding": "4.0.11-*", + "System.Resources.ResourceManager": "4.0.1-*" } } } From 54f8004a4e3622198c434d8b789747e22aba394f Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 24 Feb 2016 12:45:01 -0800 Subject: [PATCH 508/846] Update `build.cmd` to match latest template - aspnet/Universe#347 - `%KOREBUILD_VERSION%` doesn't work without this fix --- build.cmd | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 65fb3e3353..95b049cf63 100644 --- a/build.cmd +++ b/build.cmd @@ -28,12 +28,11 @@ IF NOT EXIST %NUGET_PATH% ( copy %CACHED_NUGET% %NUGET_PATH% > nul ) +SET KOREBUILD_DOWNLOAD_ARGS= +IF NOT "%KOREBUILD_VERSION%"=="" ( + SET KOREBUILD_DOWNLOAD_ARGS=-version %KOREBUILD_VERSION% +) IF NOT EXIST %KOREBUILD_FOLDER% ( - SET KOREBUILD_DOWNLOAD_ARGS= - IF NOT "%KOREBUILD_VERSION%"=="" ( - SET KOREBUILD_DOWNLOAD_ARGS=-version %KOREBUILD_VERSION% - ) - %BUILD_FOLDER%\nuget.exe install KoreBuild-dotnet -ExcludeVersion -o %BUILD_FOLDER% -nocache -pre %KOREBUILD_DOWNLOAD_ARGS% ) From 3cfae9267ec8c147fa0e302e268a689c22f77370 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Sat, 27 Feb 2016 12:51:09 -0800 Subject: [PATCH 509/846] Update the build scripts --- build.cmd | 41 ++----------------------------------- build.ps1 | 36 +++++++++++++++++++++++++++++++++ build.sh | 60 +++++++++++++++++++++++-------------------------------- 3 files changed, 63 insertions(+), 74 deletions(-) create mode 100644 build.ps1 diff --git a/build.cmd b/build.cmd index 95b049cf63..2fa024b15e 100644 --- a/build.cmd +++ b/build.cmd @@ -1,39 +1,2 @@ -@ECHO off -SETLOCAL - -SET REPO_FOLDER=%~dp0 -CD "%REPO_FOLDER%" - -SET BUILD_FOLDER=.build -SET KOREBUILD_FOLDER=%BUILD_FOLDER%\KoreBuild-dotnet -SET KOREBUILD_VERSION= - -SET NUGET_PATH=%BUILD_FOLDER%\NuGet.exe -SET NUGET_VERSION=latest -SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe - -IF NOT EXIST %BUILD_FOLDER% ( - md %BUILD_FOLDER% -) - -IF NOT EXIST %NUGET_PATH% ( - IF NOT EXIST %CACHED_NUGET% ( - echo Downloading latest version of NuGet.exe... - IF NOT EXIST %LocalAppData%\NuGet ( - md %LocalAppData%\NuGet - ) - @powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" - ) - - copy %CACHED_NUGET% %NUGET_PATH% > nul -) - -SET KOREBUILD_DOWNLOAD_ARGS= -IF NOT "%KOREBUILD_VERSION%"=="" ( - SET KOREBUILD_DOWNLOAD_ARGS=-version %KOREBUILD_VERSION% -) -IF NOT EXIST %KOREBUILD_FOLDER% ( - %BUILD_FOLDER%\nuget.exe install KoreBuild-dotnet -ExcludeVersion -o %BUILD_FOLDER% -nocache -pre %KOREBUILD_DOWNLOAD_ARGS% -) - -"%KOREBUILD_FOLDER%\build\KoreBuild.cmd" %* +@ECHO OFF +PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*" \ No newline at end of file diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000000..4fd24a30d5 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,36 @@ +cd $PSScriptRoot + +$repoFolder = $PSScriptRoot +$env:REPO_FOLDER = $repoFolder + +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +if ($env:KOREBUILD_ZIP) +{ + $koreBuildZip=$env:KOREBUILD_ZIP +} + +$buildFolder = ".build" +$buildFile="$buildFolder\KoreBuild.ps1" + +if (!(Test-Path $buildFolder)) { + Write-Host "Downloading KoreBuild from $koreBuildZip" + + $tempFolder=$env:TEMP + "\KoreBuild-" + [guid]::NewGuid() + New-Item -Path "$tempFolder" -Type directory | Out-Null + + $localZipFile="$tempFolder\korebuild.zip" + + Invoke-WebRequest $koreBuildZip -OutFile $localZipFile + Add-Type -AssemblyName System.IO.Compression.FileSystem + [System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder) + + New-Item -Path "$buildFolder" -Type directory | Out-Null + copy-item "$tempFolder\**\build\*" $buildFolder -Recurse + + # Cleanup + if (Test-Path $tempFolder) { + Remove-Item -Recurse -Force $tempFolder + } +} + +&"$buildFile" $args \ No newline at end of file diff --git a/build.sh b/build.sh index 263fb667a8..79638d06b6 100755 --- a/build.sh +++ b/build.sh @@ -1,45 +1,35 @@ #!/usr/bin/env bash +repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd $repoFolder -buildFolder=.build -koreBuildFolder=$buildFolder/KoreBuild-dotnet - -nugetPath=$buildFolder/nuget.exe - -if test `uname` = Darwin; then - cachedir=~/Library/Caches/KBuild -else - if [ -z $XDG_DATA_HOME ]; then - cachedir=$HOME/.local/share - else - cachedir=$XDG_DATA_HOME; - fi +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +if [ ! -z $KOREBUILD_ZIP ]; then + koreBuildZip=$KOREBUILD_ZIP fi -mkdir -p $cachedir -nugetVersion=latest -cacheNuget=$cachedir/nuget.$nugetVersion.exe -nugetUrl=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe +buildFolder=".build" +buildFile="$buildFolder/KoreBuild.sh" if test ! -d $buildFolder; then + echo "Downloading KoreBuild from $koreBuildZip" + + tempFolder="/tmp/KoreBuild-$(uuidgen)" + mkdir $tempFolder + + localZipFile="$tempFolder/korebuild.zip" + + wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip /dev/null + unzip -q -d $tempFolder $localZipFile + mkdir $buildFolder -fi - -if test ! -f $nugetPath; then - if test ! -f $cacheNuget; then - wget -O $cacheNuget $nugetUrl 2>/dev/null || curl -o $cacheNuget --location $nugetUrl /dev/null + cp -r $tempFolder/**/build/** $buildFolder + + chmod +x $buildFile + + # Cleanup + if test ! -d $tempFolder; then + rm -rf $tempFolder fi - - cp $cacheNuget $nugetPath fi -if test ! -d $koreBuildFolder; then - mono $nugetPath install KoreBuild-dotnet -ExcludeVersion -o $buildFolder -nocache -pre - chmod +x $koreBuildFolder/build/KoreBuild.sh -fi - -makeFile=makefile.shade -if [ ! -e $makeFile ]; then - makeFile=$koreBuildFolder/build/makefile.shade -fi - -./$koreBuildFolder/build/KoreBuild.sh -n $nugetPath -m $makeFile "$@" +$buildFile -r $repoFolder "$@" From be651d01d1f253985755350785b9d0e69af5639b Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Sun, 28 Feb 2016 10:12:13 -0800 Subject: [PATCH 510/846] Return the error code from build.cmd --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 2fa024b15e..7d4894cb4a 100644 --- a/build.cmd +++ b/build.cmd @@ -1,2 +1,2 @@ @ECHO OFF -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*" \ No newline at end of file +PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" \ No newline at end of file From 9f499d7962a6488115cacfd06d93dde09614a05d Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 1 Mar 2016 13:31:53 -0800 Subject: [PATCH 511/846] Transition to netstandard. - dotnet5.X => netstandard1.y (where y = x-1). - DNXCore50 => netstandardapp1.5. - Applied the same changes to ifdefs. --- .../project.json | 13 +++++++++---- .../project.json | 13 +++++++++---- .../project.json | 13 +++++++++---- src/Microsoft.AspNetCore.Http/FormCollection.cs | 2 +- src/Microsoft.AspNetCore.Http/HeaderDictionary.cs | 2 +- .../HttpContextAccessor.cs | 4 ++-- src/Microsoft.AspNetCore.Http/QueryCollection.cs | 2 +- .../RequestCookieCollection.cs | 2 +- src/Microsoft.AspNetCore.Http/project.json | 15 ++++++++++----- src/Microsoft.AspNetCore.Owin/project.json | 12 +++++++++--- .../project.json | 13 +++++++++---- src/Microsoft.Net.Http.Headers/project.json | 13 +++++++++---- .../project.json | 7 +++++-- .../project.json | 7 +++++-- .../project.json | 7 +++++-- test/Microsoft.AspNetCore.Http.Tests/project.json | 7 +++++-- test/Microsoft.AspNetCore.Owin.Tests/project.json | 7 +++++-- .../HttpResponseStreamWriterTest.cs | 4 ++-- .../project.json | 7 +++++-- .../Microsoft.Net.Http.Headers.Tests/project.json | 7 +++++-- 20 files changed, 107 insertions(+), 50 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 20578bac5c..23f72dfaa3 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -8,7 +8,9 @@ "compilationOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", - "nowarn": [ "CS1591" ], + "nowarn": [ + "CS1591" + ], "xmlDoc": true }, "dependencies": { @@ -26,7 +28,7 @@ "System.Runtime": "" } }, - "dotnet5.4": { + "netstandard1.3": { "dependencies": { "System.ComponentModel": "4.0.1-*", "System.Globalization.Extensions": "4.0.1-*", @@ -35,7 +37,10 @@ "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.1.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*" - } + }, + "imports": [ + "dotnet5.4" + ] } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 7f9b1ab34a..81c223a0ff 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -8,7 +8,9 @@ "compilationOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", - "nowarn": [ "CS1591" ], + "nowarn": [ + "CS1591" + ], "xmlDoc": true }, "dependencies": { @@ -19,10 +21,13 @@ }, "frameworks": { "net451": {}, - "dotnet5.4": { + "netstandard1.3": { "dependencies": { "System.IO.FileSystem": "4.0.1-*" - } + }, + "imports": [ + "dotnet5.4" + ] } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 93ba9e9d4f..da11fe30e5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -8,7 +8,9 @@ "compilationOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", - "nowarn": [ "CS1591" ], + "nowarn": [ + "CS1591" + ], "xmlDoc": true }, "dependencies": { @@ -16,7 +18,7 @@ }, "frameworks": { "net451": {}, - "dotnet5.4": { + "netstandard1.3": { "dependencies": { "System.Collections": "4.0.11-*", "System.Linq": "4.1.0-*", @@ -26,7 +28,10 @@ "System.Security.Claims": "4.0.1-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*", "System.Security.Principal": "4.0.1-*" - } + }, + "imports": [ + "dotnet5.4" + ] } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/FormCollection.cs b/src/Microsoft.AspNetCore.Http/FormCollection.cs index 33c36d558d..6e44c39aad 100644 --- a/src/Microsoft.AspNetCore.Http/FormCollection.cs +++ b/src/Microsoft.AspNetCore.Http/FormCollection.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Http.Internal public class FormCollection : IFormCollection { public static readonly FormCollection Empty = new FormCollection(); -#if DOTNET5_4 +#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index a885ccad8c..304457459e 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// public class HeaderDictionary : IHeaderDictionary { -#if DOTNET5_4 +#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs index e009bf1cb1..be6bb471a6 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs @@ -5,7 +5,7 @@ using System; #if NET451 using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting; -#elif DOTNET5_4 +#elif NETSTANDARD1_3 using System.Threading; #endif @@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Http.Internal } } -#elif DOTNET5_4 +#elif NETSTANDARD1_3 private AsyncLocal _httpContextCurrent = new AsyncLocal(); public HttpContext HttpContext { diff --git a/src/Microsoft.AspNetCore.Http/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/QueryCollection.cs index fb0a260ceb..1809635d8b 100644 --- a/src/Microsoft.AspNetCore.Http/QueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http/QueryCollection.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Http.Internal public class QueryCollection : IQueryCollection { public static readonly QueryCollection Empty = new QueryCollection(); -#if DOTNET5_4 +#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs index b8e4f2d7b1..68a2f35968 100644 --- a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.Internal public class RequestCookieCollection : IRequestCookieCollection { public static readonly RequestCookieCollection Empty = new RequestCookieCollection(); -#if DOTNET5_4 +#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); #else private static readonly string[] EmptyKeys = new string[0]; diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index c2bc71063e..8e1578e21c 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -9,7 +9,9 @@ "warningsAsErrors": true, "allowUnsafe": true, "keyFile": "../../tools/Key.snk", - "nowarn": [ "CS1591" ], + "nowarn": [ + "CS1591" + ], "xmlDoc": true }, "dependencies": { @@ -19,10 +21,13 @@ }, "frameworks": { "net451": {}, - "dotnet5.4": { + "netstandard1.3": { "dependencies": { - "System.Threading": "4.0.11-*" - } + "System.Threading": "4.0.11-*" + }, + "imports": [ + "dotnet5.4" + ] } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index eb09487075..115a4a9192 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -8,7 +8,9 @@ "compilationOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", - "nowarn": [ "CS1591" ], + "nowarn": [ + "CS1591" + ], "xmlDoc": true }, "dependencies": { @@ -16,6 +18,10 @@ }, "frameworks": { "net451": {}, - "dotnet5.4": {} + "netstandard1.3": { + "imports": [ + "dotnet5.4" + ] + } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 6056e9e234..d186352ed5 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -8,7 +8,9 @@ "compilationOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", - "nowarn": [ "CS1591" ], + "nowarn": [ + "CS1591" + ], "xmlDoc": true }, "dependencies": { @@ -22,12 +24,15 @@ "System.Runtime": "" } }, - "dotnet5.4": { + "netstandard1.3": { "dependencies": { "System.Collections": "4.0.11-*", "System.IO": "4.1.0-*", "System.IO.FileSystem": "4.0.1-*" - } + }, + "imports": [ + "dotnet5.4" + ] } } -} +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 84faa09df2..6f42f8cd38 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -8,13 +8,15 @@ "compilationOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", - "nowarn": [ "CS1591" ], + "nowarn": [ + "CS1591" + ], "xmlDoc": true }, "dependencies": {}, "frameworks": { "net451": {}, - "dotnet5.4": { + "netstandard1.3": { "dependencies": { "System.Collections": "4.0.11-*", "System.Diagnostics.Contracts": "4.0.1-*", @@ -23,7 +25,10 @@ "System.Linq": "4.1.0-*", "System.Text.Encoding": "4.0.11-*", "System.Resources.ResourceManager": "4.0.1-*" - } + }, + "imports": [ + "dotnet5.4" + ] } } -} +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 846093b4e5..2a7298f1c4 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -10,11 +10,14 @@ "xunit": "2.1.0" }, "frameworks": { - "dnxcore50": { + "netstandardapp1.5": { "dependencies": { "dotnet-test-xunit": "1.0.0-dev-*" }, - "imports": "portable-net451+win8" + "imports": [ + "dnxcore50", + "portable-net451+win8" + ] }, "net451": { "frameworkAssemblies": { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index e49084a32a..61a7d6fbb7 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -7,11 +7,14 @@ "xunit": "2.1.0" }, "frameworks": { - "dnxcore50": { + "netstandardapp1.5": { "dependencies": { "dotnet-test-xunit": "1.0.0-dev-*" }, - "imports": "portable-net451+win8" + "imports": [ + "dnxcore50", + "portable-net451+win8" + ] }, "net451": { "frameworkAssemblies": { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index a454ccb613..0355df49c7 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -5,11 +5,14 @@ "xunit": "2.1.0" }, "frameworks": { - "dnxcore50": { + "netstandardapp1.5": { "dependencies": { "dotnet-test-xunit": "1.0.0-dev-*" }, - "imports": "portable-net451+win8" + "imports": [ + "dnxcore50", + "portable-net451+win8" + ] }, "net451": { "frameworkAssemblies": { diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 8d8a94cb21..ad9de0498f 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -5,11 +5,14 @@ "xunit": "2.1.0" }, "frameworks": { - "dnxcore50": { + "netstandardapp1.5": { "dependencies": { "dotnet-test-xunit": "1.0.0-dev-*" }, - "imports": "portable-net451+win8" + "imports": [ + "dnxcore50", + "portable-net451+win8" + ] }, "net451": { "frameworkAssemblies": { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 71ede3cb4f..73a7301871 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -7,11 +7,14 @@ "xunit": "2.1.0" }, "frameworks": { - "dnxcore50": { + "netstandardapp1.5": { "dependencies": { "dotnet-test-xunit": "1.0.0-dev-*" }, - "imports": "portable-net451+win8" + "imports": [ + "dnxcore50", + "portable-net451+win8" + ] }, "net451": { "frameworkAssemblies": { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 4f7a6d378f..372525731d 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -312,7 +312,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [Theory] [InlineData("你好世界", "utf-16")] -#if !DNXCORE50 +#if !NETSTANDARDAPP1_5 // CoreCLR does not like shift_jis as an encoding. [InlineData("こんにちは世界", "shift_jis")] #endif @@ -343,7 +343,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [InlineData('你', 1023, "utf-16")] [InlineData('你', 1024, "utf-16")] [InlineData('你', 1050, "utf-16")] -#if !DNXCORE50 +#if !NETSTANDARDAPP1_5 // CoreCLR does not like shift_jis as an encoding. [InlineData('こ', 1023, "shift_jis")] [InlineData('こ', 1024, "shift_jis")] diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 26b48e2b10..8e97596364 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -9,12 +9,15 @@ }, "testRunner": "xunit", "frameworks": { - "dnxcore50": { + "netstandardapp1.5": { "dependencies": { "System.Text.Encoding.Extensions": "4.0.11-*", "dotnet-test-xunit": "1.0.0-dev-*" }, - "imports": "portable-net451+win8" + "imports": [ + "dnxcore50", + "portable-net451+win8" + ] }, "net451": { "frameworkAssemblies": { diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index d8145f7161..7659408685 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -6,11 +6,14 @@ "xunit": "2.1.0" }, "frameworks": { - "dnxcore50": { + "netstandardapp1.5": { "dependencies": { "dotnet-test-xunit": "1.0.0-dev-*" }, - "imports": "portable-net451+win8" + "imports": [ + "dnxcore50", + "portable-net451+win8" + ] }, "net451": { "frameworkAssemblies": { From 3105fd1075f1d8b4ebd9957a759ae65f9765851d Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 2 Mar 2016 18:51:48 -0800 Subject: [PATCH 512/846] Remove project name from output path - aspnet/Coherence-Signed#187 - remove `` settings but maintain other unique aspects e.g. `` - in a few cases, standardize on VS version `14.0` and not something more specific --- samples/SampleApp/SampleApp.xproj | 7 ++----- .../Microsoft.AspNetCore.Http.Abstractions.xproj | 2 +- .../Microsoft.AspNetCore.Http.Extensions.xproj | 2 +- .../Microsoft.AspNetCore.Http.Features.xproj | 2 +- .../Microsoft.AspNetCore.Http.xproj | 2 +- .../Microsoft.AspNetCore.Owin.xproj | 2 +- .../Microsoft.AspNetCore.WebUtilities.xproj | 2 +- .../Microsoft.Net.Http.Headers.xproj | 2 +- .../Microsoft.AspNetCore.Http.Abstractions.Tests.xproj | 2 +- .../Microsoft.AspNetCore.Http.Extensions.Tests.xproj | 2 +- .../Microsoft.AspNetCore.Http.Features.Tests.xproj | 2 +- .../Microsoft.AspNetCore.Http.Tests.xproj | 2 +- .../Microsoft.AspNetCore.Owin.Tests.xproj | 2 +- .../Microsoft.AspNetCore.WebUtilities.Tests.xproj | 2 +- .../Microsoft.Net.Http.Headers.Tests.xproj | 2 +- 15 files changed, 16 insertions(+), 19 deletions(-) diff --git a/samples/SampleApp/SampleApp.xproj b/samples/SampleApp/SampleApp.xproj index dcc1bdf260..2b2d6526a4 100644 --- a/samples/SampleApp/SampleApp.xproj +++ b/samples/SampleApp/SampleApp.xproj @@ -4,17 +4,14 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - 1d0764b4-1deb-4232-a714-d4b7e846918a - SampleApp ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ - 2.0 - + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj index 67db5d869b..aea7baabf2 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj @@ -8,7 +8,7 @@ 22071333-15ba-4d16-a1d5-4d5b1a83fbdd ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj index 31d24d7bf6..d921fe5ef3 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj @@ -8,7 +8,7 @@ ccc4363e-81e2-4058-94dd-00494e9e992a ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj index 2326ea959f..4c0c8937c5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj @@ -8,7 +8,7 @@ d9128247-8f97-48b8-a863-f1f21a029fce ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj index 447e54485b..6ea19d1f49 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj @@ -8,7 +8,7 @@ bcf0f967-8753-4438-bd07-aadca9ce509a ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj index cf782585d1..1528a98ad3 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj @@ -8,7 +8,7 @@ 59bed991-f207-48ed-b24c-0a1d9c986c01 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj index 5f79a271e0..23b7477d54 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj @@ -8,7 +8,7 @@ a2fb7838-0031-4fad-ba3e-83c30b3af406 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj index 182749e71e..e9818030e2 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj @@ -8,7 +8,7 @@ 60aa2fdb-8121-4826-8d00-9a143fefaf66 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj index 7989ec74c0..d86ac3bafb 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj @@ -8,7 +8,7 @@ f16692b8-9f38-4dca-a582-e43172b989c6 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj index 258c09d86a..e6d17f9c63 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj @@ -8,7 +8,7 @@ ae25ef21-7f91-4b86-b73e-af746821d339 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj index 0e9350ca4e..06fb7d313b 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj @@ -8,7 +8,7 @@ c5d2bae1-e182-48a0-aa74-1af14b782bf7 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj index 278ef825da..d587be0a23 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj @@ -8,7 +8,7 @@ aa99af26-f7b1-4a6b-a922-5c25539f6391 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj index a923e01d9a..ecf2099ab1 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj @@ -8,7 +8,7 @@ 16219571-3268-4d12-8689-12b7163dba13 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj index 0042456e89..c9512fd419 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj @@ -8,7 +8,7 @@ 93c10e50-bcbb-4d8e-9492-d46e1396225b ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj index 819024d5ea..f5a6a1e8f8 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj @@ -8,7 +8,7 @@ e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + ..\..\artifacts\bin\ 2.0 From dd7198f410c7a039cf67732f9c82ef352e1bb6a3 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 3 Mar 2016 17:32:08 -0800 Subject: [PATCH 513/846] Added Company, Copyright and Product attributes to AssemblyInfo --- .../Properties/AssemblyInfo.cs | 5 ++++- .../Properties/AssemblyInfo.cs | 5 ++++- .../Properties/AssemblyInfo.cs | 5 ++++- src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs | 5 ++++- src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs | 5 ++++- .../Properties/AssemblyInfo.cs | 5 ++++- src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 4 +++- 7 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs index 6f39c4b2d6..0510a6409b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs @@ -7,4 +7,7 @@ using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: AssemblyCompany("Microsoft Corporation.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs index b2437d9ad6..76feceeff0 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs @@ -5,4 +5,7 @@ using System.Reflection; using System.Resources; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: AssemblyCompany("Microsoft Corporation.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs index b2437d9ad6..76feceeff0 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs @@ -5,4 +5,7 @@ using System.Reflection; using System.Resources; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: AssemblyCompany("Microsoft Corporation.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs index b2437d9ad6..76feceeff0 100644 --- a/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs @@ -5,4 +5,7 @@ using System.Reflection; using System.Resources; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: AssemblyCompany("Microsoft Corporation.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs index b2437d9ad6..76feceeff0 100644 --- a/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs @@ -5,4 +5,7 @@ using System.Reflection; using System.Resources; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: AssemblyCompany("Microsoft Corporation.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs index b2437d9ad6..76feceeff0 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs @@ -5,4 +5,7 @@ using System.Reflection; using System.Resources; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: AssemblyCompany("Microsoft Corporation.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index b2437d9ad6..1fb00238e5 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -5,4 +5,6 @@ using System.Reflection; using System.Resources; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: AssemblyCompany("Microsoft Corporation.")] +[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] From 97940747c38d3a43ba26569e28580a37af66febe Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 3 Mar 2016 17:50:40 -0800 Subject: [PATCH 514/846] Added missed attribute --- src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index 1fb00238e5..76feceeff0 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -8,3 +8,4 @@ using System.Resources; [assembly: NeutralResourcesLanguage("en-us")] [assembly: AssemblyCompany("Microsoft Corporation.")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] +[assembly: AssemblyProduct("Microsoft ASP.NET Core")] From 15649b7e31a1896562a72806119fc439527f94eb Mon Sep 17 00:00:00 2001 From: David Obando Date: Fri, 4 Mar 2016 10:41:27 -0800 Subject: [PATCH 515/846] Faster SubMatch implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Submatch has been sped up by implementing a modified Boyer–Moore–Horspool algorithm with an average-case complexity of O(N) on random text. Worst case, it behaves similarly to the previous implementation O(MN), where M is the length of the boundary and N is the length of the buffer to operate on. Method SubMatch looks for two things: 1. Whether the byte array segment fully contains the boundary, or 2. Whether the byte array ends with the start of the boundary. Case 1 is now a lot faster than the previous implementation. Case 2 remains using the same code as before. The method will do Case 1 until the matchOffset is equal to N-M. It then switches to Case 2, unless a match is found. The code can be further sped up with a full Boyer–Moore implementation, or something more sophisticated. This however can be evaluated in the case that this implementation is insufficiently performant for our main scenarios. This commit resolves issue #575. --- .../MultipartBoundary.cs | 72 +++++++++++++++++ .../MultipartReader.cs | 7 +- .../MultipartReaderStream.cs | 79 +++++++++++++------ .../MultipartReaderTests.cs | 60 ++++++++++++++ 4 files changed, 189 insertions(+), 29 deletions(-) create mode 100644 src/Microsoft.AspNetCore.WebUtilities/MultipartBoundary.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartBoundary.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartBoundary.cs new file mode 100644 index 0000000000..0da1303835 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartBoundary.cs @@ -0,0 +1,72 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Text; + +namespace Microsoft.AspNetCore.WebUtilities +{ + internal class MultipartBoundary + { + private readonly int[] _skipTable = new int[256]; + private readonly string _boundary; + private bool _expectLeadingCrlf; + + public MultipartBoundary(string boundary, bool expectLeadingCrlf = true) + { + if (boundary == null) + { + throw new ArgumentNullException(nameof(boundary)); + } + + _boundary = boundary; + _expectLeadingCrlf = expectLeadingCrlf; + Initialize(_boundary, _expectLeadingCrlf); + } + + private void Initialize(string boundary, bool expectLeadingCrlf) + { + if (expectLeadingCrlf) + { + BoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary); + } + else + { + BoundaryBytes = Encoding.UTF8.GetBytes("--" + boundary); + } + FinalBoundaryLength = BoundaryBytes.Length + 2; // Include the final '--' terminator. + + var length = BoundaryBytes.Length; + for (var i = 0; i < _skipTable.Length; ++i) + { + _skipTable[i] = length; + } + for (var i = 0; i < length; ++i) + { + _skipTable[BoundaryBytes[i]] = Math.Max(1, length - 1 - i); + } + } + + public int GetSkipValue(byte input) + { + return _skipTable[input]; + } + + public bool ExpectLeadingCrlf + { + get { return _expectLeadingCrlf; } + set + { + if (value != _expectLeadingCrlf) + { + _expectLeadingCrlf = value; + Initialize(_boundary, _expectLeadingCrlf); + } + } + } + + public byte[] BoundaryBytes { get; private set; } + + public int FinalBoundaryLength { get; private set; } + } +} diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs index 32dbdbcb9d..96b92dd501 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.WebUtilities private const int DefaultBufferSize = 1024 * 4; private readonly BufferedReadStream _stream; - private readonly string _boundary; + private readonly MultipartBoundary _boundary; private MultipartReaderStream _currentStream; public MultipartReader(string boundary, Stream stream) @@ -42,9 +42,9 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentOutOfRangeException(nameof(bufferSize), bufferSize, "Insufficient buffer space, the buffer must be larger than the boundary: " + boundary); } _stream = new BufferedReadStream(stream, bufferSize); - _boundary = boundary; + _boundary = new MultipartBoundary(boundary, false); // This stream will drain any preamble data and remove the first boundary marker. - _currentStream = new MultipartReaderStream(_stream, _boundary, expectLeadingCrlf: false); + _currentStream = new MultipartReaderStream(_stream, _boundary); } /// @@ -69,6 +69,7 @@ namespace Microsoft.AspNetCore.WebUtilities return null; } var headers = await ReadHeadersAsync(cancellationToken); + _boundary.ExpectLeadingCrlf = true; _currentStream = new MultipartReaderStream(_stream, _boundary); long? baseStreamOffset = _stream.CanSeek ? (long?)_stream.Position : null; return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index 442c693eab..fdd84a5c6d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -4,7 +4,6 @@ using System; using System.Diagnostics; using System.IO; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -12,9 +11,8 @@ namespace Microsoft.AspNetCore.WebUtilities { internal class MultipartReaderStream : Stream { + private readonly MultipartBoundary _boundary; private readonly BufferedReadStream _innerStream; - private readonly byte[] _boundaryBytes; - private readonly int _finalBoundaryLength; private readonly long _innerOffset; private long _position; private long _observedLength; @@ -25,8 +23,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// /// The . /// The boundary pattern to use. - /// Specifies whether a leading crlf should be expected. - public MultipartReaderStream(BufferedReadStream stream, string boundary, bool expectLeadingCrlf = true) + public MultipartReaderStream(BufferedReadStream stream, MultipartBoundary boundary) { if (stream == null) { @@ -40,15 +37,7 @@ namespace Microsoft.AspNetCore.WebUtilities _innerStream = stream; _innerOffset = _innerStream.CanSeek ? _innerStream.Position : 0; - if (expectLeadingCrlf) - { - _boundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary); - } - else - { - _boundaryBytes = Encoding.UTF8.GetBytes("--" + boundary); - } - _finalBoundaryLength = _boundaryBytes.Length + 2; // Include the final '--' terminator. + _boundary = boundary; } public bool FinalBoundaryFound { get; private set; } @@ -205,7 +194,7 @@ namespace Microsoft.AspNetCore.WebUtilities } PositionInnerStream(); - if (!_innerStream.EnsureBuffered(_finalBoundaryLength)) + if (!_innerStream.EnsureBuffered(_boundary.FinalBoundaryLength)) { throw new IOException("Unexpected end of stream."); } @@ -215,7 +204,7 @@ namespace Microsoft.AspNetCore.WebUtilities int matchOffset; int matchCount; int read; - if (SubMatch(bufferedData, _boundaryBytes, out matchOffset, out matchCount)) + if (SubMatch(bufferedData, _boundary.BoundaryBytes, out matchOffset, out matchCount)) { // We found a possible match, return any data before it. if (matchOffset > bufferedData.Offset) @@ -223,12 +212,12 @@ namespace Microsoft.AspNetCore.WebUtilities read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); return UpdatePosition(read); } - Debug.Assert(matchCount == _boundaryBytes.Length); + Debug.Assert(matchCount == _boundary.BoundaryBytes.Length); // "The boundary may be followed by zero or more characters of // linear whitespace. It is then terminated by either another CRLF" // or -- for the final boundary. - byte[] boundary = new byte[_boundaryBytes.Length]; + byte[] boundary = new byte[_boundary.BoundaryBytes.Length]; read = _innerStream.Read(boundary, 0, boundary.Length); Debug.Assert(read == boundary.Length); // It should have all been buffered var remainder = _innerStream.ReadLine(lengthLimit: 100); // Whitespace may exceed the buffer. @@ -256,7 +245,7 @@ namespace Microsoft.AspNetCore.WebUtilities } PositionInnerStream(); - if (!await _innerStream.EnsureBufferedAsync(_finalBoundaryLength, cancellationToken)) + if (!await _innerStream.EnsureBufferedAsync(_boundary.FinalBoundaryLength, cancellationToken)) { throw new IOException("Unexpected end of stream."); } @@ -266,7 +255,7 @@ namespace Microsoft.AspNetCore.WebUtilities int matchOffset; int matchCount; int read; - if (SubMatch(bufferedData, _boundaryBytes, out matchOffset, out matchCount)) + if (SubMatch(bufferedData, _boundary.BoundaryBytes, out matchOffset, out matchCount)) { // We found a possible match, return any data before it. if (matchOffset > bufferedData.Offset) @@ -275,12 +264,12 @@ namespace Microsoft.AspNetCore.WebUtilities read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); return UpdatePosition(read); } - Debug.Assert(matchCount == _boundaryBytes.Length); + Debug.Assert(matchCount == _boundary.BoundaryBytes.Length); // "The boundary may be followed by zero or more characters of // linear whitespace. It is then terminated by either another CRLF" // or -- for the final boundary. - byte[] boundary = new byte[_boundaryBytes.Length]; + byte[] boundary = new byte[_boundary.BoundaryBytes.Length]; read = _innerStream.Read(boundary, 0, boundary.Length); Debug.Assert(read == boundary.Length); // It should have all been buffered var remainder = await _innerStream.ReadLineAsync(lengthLimit: 100, cancellationToken: cancellationToken); // Whitespace may exceed the buffer. @@ -300,18 +289,44 @@ namespace Microsoft.AspNetCore.WebUtilities return UpdatePosition(read); } - // Does Segment1 contain all of segment2, or does it end with the start of segment2? + // Does segment1 contain all of matchBytes, or does it end with the start of matchBytes? // 1: AAAAABBBBBCCCCC // 2: BBBBB // Or: // 1: AAAAABBB // 2: BBBBB - private static bool SubMatch(ArraySegment segment1, byte[] matchBytes, out int matchOffset, out int matchCount) + private bool SubMatch(ArraySegment segment1, byte[] matchBytes, out int matchOffset, out int matchCount) { + // clear matchCount to zero matchCount = 0; - for (matchOffset = segment1.Offset; matchOffset < segment1.Offset + segment1.Count; matchOffset++) + + // case 1: does segment1 fully contain matchBytes? { - int countLimit = segment1.Offset - matchOffset + segment1.Count; + var matchBytesLengthMinusOne = matchBytes.Length - 1; + var matchBytesLastByte = matchBytes[matchBytesLengthMinusOne]; + var segmentEndMinusMatchBytesLength = segment1.Offset + segment1.Count - matchBytes.Length; + + matchOffset = segment1.Offset; + while (matchOffset < segmentEndMinusMatchBytesLength) + { + var lookaheadTailChar = segment1.Array[matchOffset + matchBytesLengthMinusOne]; + if (lookaheadTailChar == matchBytesLastByte && + CompareBuffers(segment1.Array, matchOffset, matchBytes, 0, matchBytesLengthMinusOne) == 0) + { + matchCount = matchBytes.Length; + return true; + } + matchOffset += _boundary.GetSkipValue(lookaheadTailChar); + } + } + + // case 2: does segment1 end with the start of matchBytes? + var segmentEnd = segment1.Offset + segment1.Count; + + matchCount = 0; + for (; matchOffset < segmentEnd; matchOffset++) + { + var countLimit = segmentEnd - matchOffset; for (matchCount = 0; matchCount < matchBytes.Length && matchCount < countLimit; matchCount++) { if (matchBytes[matchCount] != segment1.Array[matchOffset + matchCount]) @@ -327,5 +342,17 @@ namespace Microsoft.AspNetCore.WebUtilities } return matchCount > 0; } + + private static int CompareBuffers(byte[] buffer1, int offset1, byte[] buffer2, int offset2, int count) + { + for (; count-- > 0; offset1++, offset2++) + { + if (buffer1[offset1] != buffer2[offset2]) + { + return buffer1[offset1] - buffer2[offset2]; + } + } + return 0; + } } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs index 295241f2c3..853d75e563 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Text; using System.Threading.Tasks; @@ -74,11 +75,29 @@ namespace Microsoft.AspNetCore.WebUtilities "\r\n" + "--9051914041544843365972754266--\r\n"; + private const string TwoPartBodyIncompleteBuffer = +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\"\r\n" + +"Content-Type: text/plain\r\n" + +"\r\n" + +"Content of a.txt.\r\n" + +"\r\n" + +"--9051914041544843365"; + private static MemoryStream MakeStream(string text) { return new MemoryStream(Encoding.UTF8.GetBytes(text)); } + private static string GetString(byte[] buffer, int count) + { + return Encoding.ASCII.GetString(buffer, 0, count); + } + [Fact] public async Task MutipartReader_ReadSinglePartBody_Success() { @@ -217,6 +236,47 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.Null(await reader.ReadNextSectionAsync()); } + [Fact] + public void MutipartReader_BufferSizeMustBeLargerThanBoundary_Throws() + { + var stream = MakeStream(ThreePartBody); + Assert.Throws(() => + { + var reader = new MultipartReader(Boundary, stream, 5); + }); + } + + [Fact] + public async Task MutipartReader_TwoPartBodyIncompleteBuffer_TwoSectionsReadSuccessfullyThirdSectionThrows() + { + var stream = MakeStream(TwoPartBodyIncompleteBuffer); + var reader = new MultipartReader(Boundary, stream); + var buffer = new byte[128]; + + //first section can be read successfully + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var read = section.Body.Read(buffer, 0, buffer.Length); + Assert.Equal("text default", GetString(buffer, read)); + + //second section can be read successfully (even though the bottom boundary is truncated) + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file1\"; filename=\"a.txt\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/plain", section.Headers["Content-Type"][0]); + read = section.Body.Read(buffer, 0, buffer.Length); + Assert.Equal("Content of a.txt.\r\n", GetString(buffer, read)); + + await Assert.ThrowsAsync(async () => + { + // we'll be unable to ensure enough bytes are buffered to even contain a final boundary + section = await reader.ReadNextSectionAsync(); + }); + } + [Fact] public async Task MutipartReader_ReadInvalidUtf8Header_ReplacementCharacters() { From 1f754f65d30c95f76afd6d3f4e0c4510783cd859 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 4 Mar 2016 14:28:20 -0800 Subject: [PATCH 516/846] Add ISession.Id --- src/Microsoft.AspNetCore.Http.Features/ISession.cs | 6 ++++-- .../DefaultHttpContextTests.cs | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index fc729b5bff..05b846d814 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -8,6 +8,10 @@ namespace Microsoft.AspNetCore.Http.Features { public interface ISession { + string Id { get; } + + IEnumerable Keys { get; } + Task LoadAsync(); Task CommitAsync(); @@ -19,7 +23,5 @@ namespace Microsoft.AspNetCore.Http.Features void Remove(string key); void Clear(); - - IEnumerable Keys { get; } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index 5716ed3347..a47c97a02a 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -288,6 +288,8 @@ namespace Microsoft.AspNetCore.Http.Internal private Dictionary _store = new Dictionary(StringComparer.OrdinalIgnoreCase); + public string Id { get; set; } + public IEnumerable Keys { get { return _store.Keys; } } public void Clear() From 8c7274199263754561eacaad9dd9eb8e1e0eb9c2 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 4 Feb 2016 21:35:13 +0000 Subject: [PATCH 517/846] Lower alloc KeyValueAccumulator for common path --- .../KeyValueAccumulator.cs | 62 ++++++++++++++----- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs index 25032bfcd0..207ff4c36b 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs @@ -9,24 +9,55 @@ namespace Microsoft.AspNetCore.WebUtilities { public struct KeyValueAccumulator { - private Dictionary> _accumulator; + private Dictionary _accumulator; + private Dictionary> _expandingAccumulator; public void Append(string key, string value) { if (_accumulator == null) { - _accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + _accumulator = new Dictionary(StringComparer.OrdinalIgnoreCase); } - List values; + + StringValues values; if (_accumulator.TryGetValue(key, out values)) { - values.Add(value); + if (values.Count == 0) + { + // Marker entry for this key to indicate entry already in expanding list dictionary + _expandingAccumulator[key].Add(value); + } + else if (values.Count == 1) + { + // Second value for this key + _accumulator[key] = new string[] { values[0], value }; + } + else + { + // Third value for this key + // Add zero count entry and move to data to expanding list dictionary + _accumulator[key] = default(StringValues); + + if (_expandingAccumulator == null) + { + _expandingAccumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + } + + // Already 3 entries so use starting allocated as 8; then use List's expansion mechanism for more + var list = new List(8); + var array = values.ToArray(); + + list.Add(array[0]); + list.Add(array[1]); + list.Add(value); + + _expandingAccumulator[key] = list; + } } else { - values = new List(1); - values.Add(value); - _accumulator[key] = values; + // First value for this key + _accumulator[key] = new StringValues(value); } } @@ -34,19 +65,16 @@ namespace Microsoft.AspNetCore.WebUtilities public Dictionary GetResults() { - if (_accumulator == null) + if (_expandingAccumulator != null) { - return new Dictionary(StringComparer.OrdinalIgnoreCase); + // Coalesce count 3+ multi-value entries into _accumulator dictionary + foreach (var entry in _expandingAccumulator) + { + _accumulator[entry.Key] = new StringValues(entry.Value.ToArray()); + } } - var results = new Dictionary(_accumulator.Count, StringComparer.OrdinalIgnoreCase); - - foreach (var kv in _accumulator) - { - results.Add(kv.Key, kv.Value.Count == 1 ? new StringValues(kv.Value[0]) : new StringValues(kv.Value.ToArray())); - } - - return results; + return _accumulator ?? new Dictionary(0, StringComparer.OrdinalIgnoreCase); } } } From 0aacea0faf4d2d6a909a8b2268b2e928b9c82aac Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Mon, 7 Mar 2016 20:54:57 -0800 Subject: [PATCH 518/846] Update the build scripts to the latest version --- build.ps1 | 33 ++++++++++++++++++++++++++++++++- build.sh | 15 +++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/build.ps1 b/build.ps1 index 4fd24a30d5..8f2f99691a 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,3 +1,33 @@ +$ErrorActionPreference = "Stop" + +function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries) +{ + while($true) + { + try + { + Invoke-WebRequest $url -OutFile $downloadLocation + break + } + catch + { + $exceptionMessage = $_.Exception.Message + Write-Host "Failed to download '$url': $exceptionMessage" + if ($retries -gt 0) { + $retries-- + Write-Host "Waiting 10 seconds before retrying. Retries left: $retries" + Start-Sleep -Seconds 10 + + } + else + { + $exception = $_.Exception + throw $exception + } + } + } +} + cd $PSScriptRoot $repoFolder = $PSScriptRoot @@ -20,7 +50,8 @@ if (!(Test-Path $buildFolder)) { $localZipFile="$tempFolder\korebuild.zip" - Invoke-WebRequest $koreBuildZip -OutFile $localZipFile + DownloadWithRetry -url $koreBuildZip -downloadLocation $localZipFile -retries 6 + Add-Type -AssemblyName System.IO.Compression.FileSystem [System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder) diff --git a/build.sh b/build.sh index 79638d06b6..f4208100eb 100755 --- a/build.sh +++ b/build.sh @@ -18,7 +18,18 @@ if test ! -d $buildFolder; then localZipFile="$tempFolder/korebuild.zip" - wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip /dev/null + retries=6 + until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null) + do + echo "Failed to download '$koreBuildZip'" + if [ "$retries" -le 0 ]; then + exit 1 + fi + retries=$((retries - 1)) + echo "Waiting 10 seconds before retrying. Retries left: $retries" + sleep 10s + done + unzip -q -d $tempFolder $localZipFile mkdir $buildFolder @@ -32,4 +43,4 @@ if test ! -d $buildFolder; then fi fi -$buildFile -r $repoFolder "$@" +$buildFile -r $repoFolder "$@" \ No newline at end of file From 982aa08cdacfd04cdd56bcfb307b6feddf4d4887 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 3 Feb 2016 05:29:19 +0000 Subject: [PATCH 519/846] Cache doesn't need clearing when resolving uncached feature --- .../FeatureReferences.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs index f69094c252..a713141448 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Http.Features } var feature = cached; - if (feature == null) + if (feature == null || cleared) { feature = Collection.Get(); if (feature == null) @@ -45,10 +45,7 @@ namespace Microsoft.AspNetCore.Http.Features feature = factory(state); Collection.Set(feature); - if (!cleared) - { - Cache = default(TCache); - } + Revision = Collection.Revision; } cached = feature; From e23692a3381fe68804b84891699b4d0ff9def893 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 9 Mar 2016 16:35:09 -0800 Subject: [PATCH 520/846] Limit the branches that build on our public CI. [ci skip] --- .travis.yml | 6 ++++++ appveyor.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.travis.yml b/.travis.yml index e8f77f0f14..e63d71127a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,5 +16,11 @@ os: - linux - osx osx_image: xcode7.1 +branches: + only: + - master + - release + - dev + - /^(.*\\/)?ci-.*$/ script: - ./build.sh --quiet verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 636a7618d3..15ffe737a5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,11 @@ init: - git config --global core.autocrlf true +branches: + only: + - master + - release + - dev + - /^(.*\\/)?ci-.*$/ build_script: - build.cmd --quiet verify clone_depth: 1 From e07a02fbba0125e76a53fa8389d8cac81eab3b25 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 9 Mar 2016 17:44:48 -0800 Subject: [PATCH 521/846] Fix backslashes in yml config. [ci skip] --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index e63d71127a..304e307169 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,6 @@ branches: - master - release - dev - - /^(.*\\/)?ci-.*$/ + - /^(.*\/)?ci-.*$/ script: - ./build.sh --quiet verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 15ffe737a5..be95b88d6f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,7 @@ branches: - master - release - dev - - /^(.*\\/)?ci-.*$/ + - /^(.*\/)?ci-.*$/ build_script: - build.cmd --quiet verify clone_depth: 1 From a051244faffe99302dad919827261b79aa99e487 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 10 Mar 2016 10:30:48 -0800 Subject: [PATCH 522/846] Don't reference facades in NuSpec These can be removed entirely after dotnet/cli#164 --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 3 +-- src/Microsoft.AspNetCore.WebUtilities/project.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 23f72dfaa3..4ae60ff733 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -24,8 +24,7 @@ "frameworks": { "net451": { "frameworkAssemblies": { - "System.IO": "", - "System.Runtime": "" + "System.Runtime": { "type": "build" } } }, "netstandard1.3": { diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index d186352ed5..235585b0d8 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -21,7 +21,7 @@ "frameworks": { "net451": { "frameworkAssemblies": { - "System.Runtime": "" + "System.Runtime": { "type": "build" } } }, "netstandard1.3": { From 67449276a54b6cdd134b7e4a0b4a6189d717d4fa Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 11 Mar 2016 09:34:32 -0800 Subject: [PATCH 523/846] Target minimal TFMs --- .../ContentDispositionHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/HttpRuleParser.cs | 2 +- src/Microsoft.Net.Http.Headers/project.json | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index 6a3cb271c9..5ee589440a 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -511,7 +511,7 @@ namespace Microsoft.Net.Http.Headers { var encoding = Encoding.GetEncoding(parts[1]); var bytes = Convert.FromBase64String(parts[3]); - output = encoding.GetString(bytes); + output = encoding.GetString(bytes, 0, bytes.Length); return true; } catch (ArgumentException) diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index b1690e96fd..e30465bd4f 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -41,7 +41,7 @@ namespace Microsoft.Net.Http.Headers internal const int MaxInt32Digits = 10; // iso-8859-1, Western European (ISO) - internal static readonly Encoding DefaultHttpEncoding = Encoding.GetEncoding(28591); + internal static readonly Encoding DefaultHttpEncoding = Encoding.GetEncoding("iso-8859-1"); static HttpRuleParser() { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 6f42f8cd38..ceec7e3af1 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -15,19 +15,18 @@ }, "dependencies": {}, "frameworks": { - "net451": {}, - "netstandard1.3": { + "netstandard1.0": { "dependencies": { "System.Collections": "4.0.11-*", "System.Diagnostics.Contracts": "4.0.1-*", "System.Globalization": "4.0.11-*", - "System.Globalization.Extensions": "4.0.1-*", "System.Linq": "4.1.0-*", + "System.Resources.ResourceManager": "4.0.1-*", + "System.Runtime.Extensions": "4.1.0-*", "System.Text.Encoding": "4.0.11-*", - "System.Resources.ResourceManager": "4.0.1-*" }, "imports": [ - "dotnet5.4" + "dotnet5.1" ] } } From 5c9f3b6df4efe5df5fbef25a013df5c4ee703281 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 14 Mar 2016 21:42:15 -0700 Subject: [PATCH 524/846] ASP.NET 5 -> ASP.NET Core --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c05401f3ce..a66e3a23e8 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ HttpAbstractions | ---- | ---- | [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) | [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) | -Contains HTTP abstractions for ASP.NET 5 such as `HttpContext`, `HttpRequest`, `HttpResponse` and `RequestDelegate`. +Contains HTTP abstractions for ASP.NET Core such as `HttpContext`, `HttpRequest`, `HttpResponse` and `RequestDelegate`. It also contains `IApplicationBuilder` and extensions to create and compose your application's pipeline. -This project is part of ASP.NET 5. You can find samples, documentation and getting started instructions for ASP.NET 5 at the [Home](https://github.com/aspnet/home) repo. +This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo. From 5da3673777355d612ce5777146aa3fb0006a0f44 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Thu, 17 Mar 2016 14:32:34 -0700 Subject: [PATCH 525/846] Remove the makefile --- makefile.shade | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 makefile.shade diff --git a/makefile.shade b/makefile.shade deleted file mode 100644 index d5e473d558..0000000000 --- a/makefile.shade +++ /dev/null @@ -1,10 +0,0 @@ - -var VERSION='0.1' -var FULL_VERSION='0.1' -var AUTHORS='Microsoft Open Technologies, Inc.' - -use-standard-lifecycle -k-standard-goals - -#xml-docs-test .clean .build-compile description='Check generated XML documentation files for errors' target='package' - k-xml-docs-test From ce408a999ea271f8b2083cf5019226a99f00fd0c Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 17 Mar 2016 15:17:02 -0700 Subject: [PATCH 526/846] #578 Do not buffer the request body by default when reading forms. --- .../BufferingHelper.cs | 23 ++- .../Features/FormFeature.cs | 24 ++- .../Features/HttpResponseFeature.cs | 6 +- .../FakeResponseFeature.cs | 30 ++++ .../FormFeatureTests.cs | 152 +++++++++++++----- .../NonSeekableReadStream.cs | 72 +++++++++ 6 files changed, 261 insertions(+), 46 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Http.Tests/FakeResponseFeature.cs create mode 100644 test/Microsoft.AspNetCore.Http.Tests/NonSeekableReadStream.cs diff --git a/src/Microsoft.AspNetCore.Http/BufferingHelper.cs b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs index 80f95ecbf1..f7929f1532 100644 --- a/src/Microsoft.AspNetCore.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Http.Internal if (_tempDirectory == null) { // Look for folders in the following order. - var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP") ?? // ASPNET_TEMP - User set temporary location. + var temp = Environment.GetEnvironmentVariable("ASPNETCORE_TEMP") ?? // ASPNETCORE_TEMP - User set temporary location. Path.GetTempPath(); // Fall back. if (!Directory.Exists(temp)) @@ -54,5 +54,26 @@ namespace Microsoft.AspNetCore.Http.Internal } return request; } + + public static MultipartSection EnableRewind(this MultipartSection section, Action registerForDispose, int bufferThreshold = DefaultBufferThreshold) + { + if (section == null) + { + throw new ArgumentNullException(nameof(section)); + } + if (registerForDispose == null) + { + throw new ArgumentNullException(nameof(registerForDispose)); + } + + var body = section.Body; + if (!body.CanSeek) + { + var fileStream = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); + section.Body = fileStream; + registerForDispose(fileStream); + } + return section; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index 004e2892ce..1a9f00fa2b 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -118,8 +118,6 @@ namespace Microsoft.AspNetCore.Http.Features.Internal cancellationToken.ThrowIfCancellationRequested(); - _request.EnableRewind(); - FormCollection formFields = null; FormFileCollection files = null; @@ -146,16 +144,27 @@ namespace Microsoft.AspNetCore.Http.Features.Internal ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { + // Enable buffering for the file if not already done for the full body + section.EnableRewind(_request.HttpContext.Response.RegisterForDispose); // Find the end await section.Body.DrainAsync(cancellationToken); var name = HeaderUtilities.RemoveQuotes(contentDisposition.Name) ?? string.Empty; var fileName = HeaderUtilities.RemoveQuotes(contentDisposition.FileName) ?? string.Empty; - var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length, name, fileName) + FormFile file; + if (section.BaseStreamOffset.HasValue) { - Headers = new HeaderDictionary(section.Headers), - }; + // Relative reference to buffered request body + file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length, name, fileName); + } + else + { + // Individually buffered file body + file = new FormFile(section.Body, 0, section.Body.Length, name, fileName); + } + file.Headers = new HeaderDictionary(section.Headers); + if (files == null) { files = new FormFileCollection(); @@ -194,7 +203,10 @@ namespace Microsoft.AspNetCore.Http.Features.Internal } // Rewind so later readers don't have to. - _request.Body.Seek(0, SeekOrigin.Begin); + if (_request.Body.CanSeek) + { + _request.Body.Seek(0, SeekOrigin.Begin); + } if (formFields != null) { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs index c40074b92b..ef8f845ca1 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs @@ -25,17 +25,17 @@ namespace Microsoft.AspNetCore.Http.Features.Internal public Stream Body { get; set; } - public bool HasStarted + public virtual bool HasStarted { get { return false; } } - public void OnStarting(Func callback, object state) + public virtual void OnStarting(Func callback, object state) { throw new NotImplementedException(); } - public void OnCompleted(Func callback, object state) + public virtual void OnCompleted(Func callback, object state) { throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNetCore.Http.Tests/FakeResponseFeature.cs b/test/Microsoft.AspNetCore.Http.Tests/FakeResponseFeature.cs new file mode 100644 index 0000000000..10cd5cc6d5 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Tests/FakeResponseFeature.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http.Features.Internal; + +namespace Microsoft.AspNetCore.Http.Features.Internal +{ + public class FakeResponseFeature : HttpResponseFeature + { + List, object>> _onCompletedCallbacks = new List, object>>(); + + public override void OnCompleted(Func callback, object state) + { + _onCompletedCallbacks.Add(new Tuple, object>(callback, state)); + } + + public async Task CompleteAsync() + { + var callbacks = _onCompletedCallbacks; + _onCompletedCallbacks = null; + foreach (var callback in callbacks) + { + await callback.Item1(callback.Item2); + } + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs index 0ea7fe9681..280e77774f 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs @@ -13,68 +13,94 @@ namespace Microsoft.AspNetCore.Http.Features.Internal { public class FormFeatureTests { - [Fact] - public async Task ReadFormAsync_SimpleData_ReturnsParsedFormCollection() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_SimpleData_ReturnsParsedFormCollection(bool bufferRequest) { - // Arrange var formContent = Encoding.UTF8.GetBytes("foo=bar&baz=2"); var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); context.Request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; - context.Request.Body = new MemoryStream(formContent); + context.Request.Body = new NonSeekableReadStream(formContent); + + if (bufferRequest) + { + context.Request.EnableRewind(); + } // Not cached yet var formFeature = context.Features.Get(); Assert.Null(formFeature); - // Act var formCollection = await context.Request.ReadFormAsync(); - // Assert Assert.Equal("bar", formCollection["foo"]); Assert.Equal("2", formCollection["baz"]); - Assert.Equal(0, context.Request.Body.Position); - Assert.True(context.Request.Body.CanSeek); + Assert.Equal(bufferRequest, context.Request.Body.CanSeek); + if (bufferRequest) + { + Assert.Equal(0, context.Request.Body.Position); + } // Cached formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formFeature.Form, formCollection); + + // Cleanup + await responseFeature.CompleteAsync(); } - [Fact] - public async Task ReadFormAsync_EmptyKeyAtEndAllowed() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyKeyAtEndAllowed(bool bufferRequest) { - // Arrange var formContent = Encoding.UTF8.GetBytes("=bar"); - var body = new MemoryStream(formContent); + Stream body = new MemoryStream(formContent); + if (!bufferRequest) + { + body = new NonSeekableReadStream(body); + } var formCollection = await FormReader.ReadFormAsync(body); - // Assert Assert.Equal("bar", formCollection[""].FirstOrDefault()); } - [Fact] - public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed(bool bufferRequest) { - // Arrange var formContent = Encoding.UTF8.GetBytes("=bar&baz=2"); - var body = new MemoryStream(formContent); + Stream body = new MemoryStream(formContent); + if (!bufferRequest) + { + body = new NonSeekableReadStream(body); + } var formCollection = await FormReader.ReadFormAsync(body); - // Assert Assert.Equal("bar", formCollection[""].FirstOrDefault()); Assert.Equal("2", formCollection["baz"].FirstOrDefault()); } - [Fact] - public async Task ReadFormAsync_EmptyValuedAtEndAllowed() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyValuedAtEndAllowed(bool bufferRequest) { // Arrange var formContent = Encoding.UTF8.GetBytes("foo="); - var body = new MemoryStream(formContent); + Stream body = new MemoryStream(formContent); + if (!bufferRequest) + { + body = new NonSeekableReadStream(body); + } var formCollection = await FormReader.ReadFormAsync(body); @@ -82,12 +108,18 @@ namespace Microsoft.AspNetCore.Http.Features.Internal Assert.Equal("", formCollection["foo"].FirstOrDefault()); } - [Fact] - public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed(bool bufferRequest) { // Arrange var formContent = Encoding.UTF8.GetBytes("foo=&baz=2"); - var body = new MemoryStream(formContent); + Stream body = new MemoryStream(formContent); + if (!bufferRequest) + { + body = new NonSeekableReadStream(body); + } var formCollection = await FormReader.ReadFormAsync(body); @@ -125,13 +157,22 @@ namespace Microsoft.AspNetCore.Http.Features.Internal "Hello World\r\n" + "--WebKitFormBoundary5pDRpGheQXaM8k3T--"; - [Fact] - public async Task ReadForm_EmptyMultipart_ReturnsParsedFormCollection() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadForm_EmptyMultipart_ReturnsParsedFormCollection(bool bufferRequest) { var formContent = Encoding.UTF8.GetBytes(EmptyMultipartForm); var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); context.Request.ContentType = MultipartContentType; - context.Request.Body = new MemoryStream(formContent); + context.Request.Body = new NonSeekableReadStream(formContent); + + if (bufferRequest) + { + context.Request.EnableRewind(); + } // Not cached yet var formFeature = context.Features.Get(); @@ -152,15 +193,27 @@ namespace Microsoft.AspNetCore.Http.Features.Internal Assert.Equal(0, formCollection.Count); Assert.NotNull(formCollection.Files); Assert.Equal(0, formCollection.Files.Count); + + // Cleanup + await responseFeature.CompleteAsync(); } - [Fact] - public async Task ReadForm_MultipartWithField_ReturnsParsedFormCollection() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadForm_MultipartWithField_ReturnsParsedFormCollection(bool bufferRequest) { var formContent = Encoding.UTF8.GetBytes(MultipartFormWithField); var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); context.Request.ContentType = MultipartContentType; - context.Request.Body = new MemoryStream(formContent); + context.Request.Body = new NonSeekableReadStream(formContent); + + if (bufferRequest) + { + context.Request.EnableRewind(); + } // Not cached yet var formFeature = context.Features.Get(); @@ -183,15 +236,27 @@ namespace Microsoft.AspNetCore.Http.Features.Internal Assert.NotNull(formCollection.Files); Assert.Equal(0, formCollection.Files.Count); + + // Cleanup + await responseFeature.CompleteAsync(); } - [Fact] - public async Task ReadFormAsync_MultipartWithFile_ReturnsParsedFormCollection() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_MultipartWithFile_ReturnsParsedFormCollection(bool bufferRequest) { var formContent = Encoding.UTF8.GetBytes(MultipartFormWithFile); var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); context.Request.ContentType = MultipartContentType; - context.Request.Body = new MemoryStream(formContent); + context.Request.Body = new NonSeekableReadStream(formContent); + + if (bufferRequest) + { + context.Request.EnableRewind(); + } // Not cached yet var formFeature = context.Features.Get(); @@ -222,18 +287,30 @@ namespace Microsoft.AspNetCore.Http.Features.Internal var body = file.OpenReadStream(); using (var reader = new StreamReader(body)) { + Assert.True(body.CanSeek); var content = reader.ReadToEnd(); Assert.Equal(content, "Hello World"); } + + await responseFeature.CompleteAsync(); } - [Fact] - public async Task ReadFormAsync_MultipartWithFieldAndFile_ReturnsParsedFormCollection() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_MultipartWithFieldAndFile_ReturnsParsedFormCollection(bool bufferRequest) { var formContent = Encoding.UTF8.GetBytes(MultipartFormWithFieldAndFile); var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); context.Request.ContentType = MultipartContentType; - context.Request.Body = new MemoryStream(formContent); + context.Request.Body = new NonSeekableReadStream(formContent); + + if (bufferRequest) + { + context.Request.EnableRewind(); + } // Not cached yet var formFeature = context.Features.Get(); @@ -263,9 +340,12 @@ namespace Microsoft.AspNetCore.Http.Features.Internal var body = file.OpenReadStream(); using (var reader = new StreamReader(body)) { + Assert.True(body.CanSeek); var content = reader.ReadToEnd(); Assert.Equal(content, "Hello World"); } + + await responseFeature.CompleteAsync(); } } } diff --git a/test/Microsoft.AspNetCore.Http.Tests/NonSeekableReadStream.cs b/test/Microsoft.AspNetCore.Http.Tests/NonSeekableReadStream.cs new file mode 100644 index 0000000000..2e6af5ab4d --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Tests/NonSeekableReadStream.cs @@ -0,0 +1,72 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Http.Features.Internal +{ + public class NonSeekableReadStream : Stream + { + private Stream _inner; + + public NonSeekableReadStream(byte[] data) + : this(new MemoryStream(data)) + { + } + + public NonSeekableReadStream(Stream inner) + { + _inner = inner; + } + + public override bool CanRead => _inner.CanRead; + + public override bool CanSeek => false; + + public override bool CanWrite => false; + + public override long Length + { + get { throw new NotSupportedException(); } + } + + public override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override void Flush() + { + throw new NotImplementedException(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + return _inner.Read(buffer, offset, count); + } + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + return _inner.ReadAsync(buffer, offset, count, cancellationToken); + } + } +} From 131db6c41ece43dd0fb51afb9b4ad846bf95a8ef Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 21 Mar 2016 00:01:21 -0700 Subject: [PATCH 527/846] Reacting to CoreCLR package changes --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 3 +-- src/Microsoft.AspNetCore.Http.Features/project.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 4ae60ff733..54cbd3da92 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -34,8 +34,7 @@ "System.Linq.Expressions": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", "System.Reflection.TypeExtensions": "4.1.0-*", - "System.Runtime.InteropServices": "4.1.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*" + "System.Runtime.InteropServices": "4.1.0-*" }, "imports": [ "dotnet5.4" diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index da11fe30e5..249c11436b 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -26,7 +26,7 @@ "System.Net.WebSockets": "4.0.0-*", "System.Runtime.Extensions": "4.1.0-*", "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Cryptography.X509Certificates": "4.1.0-*", "System.Security.Principal": "4.0.1-*" }, "imports": [ From 6f24508a332b2deb66a7c8ef1c3776673a7c2ab5 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 21 Mar 2016 08:47:12 -0700 Subject: [PATCH 528/846] Move remaining feature interfaces into `Microsoft.AspNetCore.Http.Features` package and namespace - #590, also related to #561 - move feature interfaces from `Microsoft.AspNetCore.Http` package - move required classes from `Microsoft.AspNetCore.Http.Abstractions` package - move `ISession` and `WebSocketAcceptContext` to `Microsoft.AspNetCore.Http` namespace (#590) nit: remove transient dependencies listed in `Microsoft.AspNetCore.Http.Abstractions`'s `project.json` --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 2 -- .../SessionExtensions.cs | 1 - .../CookieOptions.cs | 0 .../IFormCollection.cs | 6 +++--- .../IFormFeature.cs | 2 +- .../IFormFile.cs | 0 .../IFormFileCollection.cs | 0 .../IItemsFeature.cs | 2 +- .../IQueryCollection.cs | 7 ++++--- .../IQueryFeature.cs | 2 +- .../IRequestCookieCollection.cs | 8 ++++---- .../IRequestCookiesFeature.cs | 2 +- .../IResponseCookies.cs | 0 .../IResponseCookiesFeature.cs | 2 +- .../IServiceProvidersFeature.cs | 2 +- src/Microsoft.AspNetCore.Http.Features/ISession.cs | 2 +- .../WebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNetCore.Http.Features/project.json | 1 + src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs | 2 +- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 2 +- .../DefaultHttpContextTests.cs | 3 +-- 23 files changed, 25 insertions(+), 27 deletions(-) rename src/{Microsoft.AspNetCore.Http.Abstractions => Microsoft.AspNetCore.Http.Features}/CookieOptions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Microsoft.AspNetCore.Http.Features}/IFormCollection.cs (97%) rename src/{Microsoft.AspNetCore.Http/Features => Microsoft.AspNetCore.Http.Features}/IFormFeature.cs (94%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Microsoft.AspNetCore.Http.Features}/IFormFile.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Microsoft.AspNetCore.Http.Features}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http/Features => Microsoft.AspNetCore.Http.Features}/IItemsFeature.cs (84%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Microsoft.AspNetCore.Http.Features}/IQueryCollection.cs (94%) rename src/{Microsoft.AspNetCore.Http/Features => Microsoft.AspNetCore.Http.Features}/IQueryFeature.cs (83%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Microsoft.AspNetCore.Http.Features}/IRequestCookieCollection.cs (96%) rename src/{Microsoft.AspNetCore.Http/Features => Microsoft.AspNetCore.Http.Features}/IRequestCookiesFeature.cs (83%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Microsoft.AspNetCore.Http.Features}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNetCore.Http/Features => Microsoft.AspNetCore.Http.Features}/IResponseCookiesFeature.cs (83%) rename src/{Microsoft.AspNetCore.Http/Features => Microsoft.AspNetCore.Http.Features}/IServiceProvidersFeature.cs (84%) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 54cbd3da92..1ad6d728ad 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -29,10 +29,8 @@ }, "netstandard1.3": { "dependencies": { - "System.ComponentModel": "4.0.1-*", "System.Globalization.Extensions": "4.0.1-*", "System.Linq.Expressions": "4.0.11-*", - "System.Net.WebSockets": "4.0.0-*", "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.1.0-*" }, diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs index 859e6c3715..fd7573fa95 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Text; -using Microsoft.AspNetCore.Http.Features; namespace Microsoft.AspNetCore.Http { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs rename to src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IFormCollection.cs similarity index 97% rename from src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/IFormCollection.cs index 668afa61a8..3c382f1c4b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IFormCollection.cs @@ -18,9 +18,9 @@ namespace Microsoft.AspNetCore.Http /// The number of elements contained in the . /// int Count { get; } - + /// - /// Gets an containing the keys of the + /// Gets an containing the keys of the /// . /// /// @@ -79,7 +79,7 @@ namespace Microsoft.AspNetCore.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IFormFeature.cs similarity index 94% rename from src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IFormFeature.cs index 4ed8ba238c..f10ed47b80 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IFormFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public interface IFormFeature { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNetCore.Http.Features/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs rename to src/Microsoft.AspNetCore.Http.Features/IFormFile.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/IFormFileCollection.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IItemsFeature.cs similarity index 84% rename from src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IItemsFeature.cs index 68f411b5c5..bea03e466c 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public interface IItemsFeature { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs similarity index 94% rename from src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs index 48d8448b58..9df3a78024 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Http int Count { get; } /// - /// Gets an containing the keys of the + /// Gets an containing the keys of the /// . /// /// @@ -73,13 +73,14 @@ namespace Microsoft.AspNetCore.Http /// The key of the value to get. /// /// - /// The element with the specified key, or .Empty if the key is not present. + /// The element with the specified key, or . + /// Empty if the key is not present. /// /// /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IQueryFeature.cs similarity index 83% rename from src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IQueryFeature.cs index 3f89bd2b4c..4f307f8f90 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IQueryFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public interface IQueryFeature { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs similarity index 96% rename from src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs index 7fffe314fe..c1a7344cff 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs @@ -17,9 +17,9 @@ namespace Microsoft.AspNetCore.Http /// The number of elements contained in the . /// int Count { get; } - + /// - /// Gets an containing the keys of the + /// Gets an containing the keys of the /// . /// /// @@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Http /// that implements . /// ICollection Keys { get; } - + /// /// Determines whether the contains an element /// with the specified key. @@ -78,7 +78,7 @@ namespace Microsoft.AspNetCore.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return String.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IRequestCookiesFeature.cs similarity index 83% rename from src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IRequestCookiesFeature.cs index 58cf459a04..55ba603642 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IRequestCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs rename to src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs similarity index 83% rename from src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs index 9277637217..fb5ea09258 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IServiceProvidersFeature.cs similarity index 84% rename from src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IServiceProvidersFeature.cs index 9816f2fe33..aed0fc91de 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index 05b846d814..0904703d39 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace Microsoft.AspNetCore.Http.Features +namespace Microsoft.AspNetCore.Http { public interface ISession { diff --git a/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs index b2627f5575..5e3659d647 100644 --- a/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNetCore.Http.Features +namespace Microsoft.AspNetCore.Http { public class WebSocketAcceptContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 249c11436b..a6b8321019 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -21,6 +21,7 @@ "netstandard1.3": { "dependencies": { "System.Collections": "4.0.11-*", + "System.ComponentModel": "4.0.1-*", "System.Linq": "4.1.0-*", "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index a69bcde215..fb0d954284 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -16,9 +16,9 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.AspNetCore.Http.Features.Authentication; using Microsoft.AspNetCore.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features.Internal; namespace Microsoft.AspNetCore.Owin { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 3cee220f46..3833f39a91 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http; namespace Microsoft.AspNetCore.Owin { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs index a891c9611f..a9fd28edba 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http; namespace Microsoft.AspNetCore.Owin { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs index 41b1960cb2..a77eeb67ba 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http; namespace Microsoft.AspNetCore.Owin { diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index a47c97a02a..fe58c81098 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -8,7 +8,6 @@ using System.Net.WebSockets; using System.Reflection; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Authentication.Internal; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features.Internal; using Xunit; @@ -204,7 +203,7 @@ namespace Microsoft.AspNetCore.Http.Internal var field = type .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) - .Single(f => + .Single(f => f.FieldType.GetTypeInfo().IsGenericType && f.FieldType.GetGenericTypeDefinition() == typeof(FeatureReferences<>)); From d035b7c533eecedb9a312ba0a383a3a6967c0c88 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 21 Mar 2016 10:29:13 -0700 Subject: [PATCH 529/846] Revert "Reacting to CoreCLR package changes" This reverts commit 131db6c41ece43dd0fb51afb9b4ad846bf95a8ef. --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 3 ++- src/Microsoft.AspNetCore.Http.Features/project.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 1ad6d728ad..6366ad5070 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -32,7 +32,8 @@ "System.Globalization.Extensions": "4.0.1-*", "System.Linq.Expressions": "4.0.11-*", "System.Reflection.TypeExtensions": "4.1.0-*", - "System.Runtime.InteropServices": "4.1.0-*" + "System.Runtime.InteropServices": "4.1.0-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*" }, "imports": [ "dotnet5.4" diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index a6b8321019..d6ccd9fb46 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -27,7 +27,7 @@ "System.Net.WebSockets": "4.0.0-*", "System.Runtime.Extensions": "4.1.0-*", "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.1.0-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*", "System.Security.Principal": "4.0.1-*" }, "imports": [ From 6a5a05303ff1b1b3870935111f3110b558721a01 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 22 Mar 2016 10:53:06 -0700 Subject: [PATCH 530/846] Revert "Revert "Reacting to CoreCLR package changes"" This reverts commit d035b7c533eecedb9a312ba0a383a3a6967c0c88. --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 3 +-- src/Microsoft.AspNetCore.Http.Features/project.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 6366ad5070..1ad6d728ad 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -32,8 +32,7 @@ "System.Globalization.Extensions": "4.0.1-*", "System.Linq.Expressions": "4.0.11-*", "System.Reflection.TypeExtensions": "4.1.0-*", - "System.Runtime.InteropServices": "4.1.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*" + "System.Runtime.InteropServices": "4.1.0-*" }, "imports": [ "dotnet5.4" diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index d6ccd9fb46..a6b8321019 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -27,7 +27,7 @@ "System.Net.WebSockets": "4.0.0-*", "System.Runtime.Extensions": "4.1.0-*", "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Cryptography.X509Certificates": "4.1.0-*", "System.Security.Principal": "4.0.1-*" }, "imports": [ From 8efc650e7458545573ee42bc76ba3f62f01890d6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 25 Mar 2016 01:54:05 -0700 Subject: [PATCH 531/846] Fixed build --- .../project.json | 5 +++-- test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json | 5 +++-- test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 5 +++-- test/Microsoft.AspNetCore.Http.Tests/project.json | 5 +++-- test/Microsoft.AspNetCore.Owin.Tests/project.json | 5 +++-- test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 5 +++-- test/Microsoft.Net.Http.Headers.Tests/project.json | 5 +++-- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 2a7298f1c4..53d46c1296 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -6,13 +6,14 @@ "dependencies": { "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Testing": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { "netstandardapp1.5": { "dependencies": { - "dotnet-test-xunit": "1.0.0-dev-*" + "dotnet-test-xunit": "1.0.0-dev-*", + "NETStandard.Library": "1.5.0-*", + "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ "dnxcore50", diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 61a7d6fbb7..6be3f37115 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -3,13 +3,14 @@ "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { "netstandardapp1.5": { "dependencies": { - "dotnet-test-xunit": "1.0.0-dev-*" + "dotnet-test-xunit": "1.0.0-dev-*", + "NETStandard.Library": "1.5.0-*", + "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ "dnxcore50", diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 0355df49c7..6eecb1fcd2 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,13 +1,14 @@ { "dependencies": { "Microsoft.AspNetCore.Http.Features": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { "netstandardapp1.5": { "dependencies": { - "dotnet-test-xunit": "1.0.0-dev-*" + "dotnet-test-xunit": "1.0.0-dev-*", + "NETStandard.Library": "1.5.0-*", + "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ "dnxcore50", diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index ad9de0498f..f1039dabcd 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,13 +1,14 @@ { "dependencies": { "Microsoft.AspNetCore.Http": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { "netstandardapp1.5": { "dependencies": { - "dotnet-test-xunit": "1.0.0-dev-*" + "dotnet-test-xunit": "1.0.0-dev-*", + "NETStandard.Library": "1.5.0-*", + "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ "dnxcore50", diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 73a7301871..86313d922a 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -3,13 +3,14 @@ "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { "netstandardapp1.5": { "dependencies": { - "dotnet-test-xunit": "1.0.0-dev-*" + "dotnet-test-xunit": "1.0.0-dev-*", + "NETStandard.Library": "1.5.0-*", + "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ "dnxcore50", diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 8e97596364..9fc1fb6945 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,7 +1,6 @@ { "dependencies": { "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "compilationOptions": { @@ -12,7 +11,9 @@ "netstandardapp1.5": { "dependencies": { "System.Text.Encoding.Extensions": "4.0.11-*", - "dotnet-test-xunit": "1.0.0-dev-*" + "dotnet-test-xunit": "1.0.0-dev-*", + "NETStandard.Library": "1.5.0-*", + "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ "dnxcore50", diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 7659408685..164e49f735 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -2,13 +2,14 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.Net.Http.Headers": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "xunit": "2.1.0" }, "frameworks": { "netstandardapp1.5": { "dependencies": { - "dotnet-test-xunit": "1.0.0-dev-*" + "dotnet-test-xunit": "1.0.0-dev-*", + "NETStandard.Library": "1.5.0-*", + "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ "dnxcore50", From 80813f7c1e98384b8bbbcc445eca69448f6428ec Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Sat, 19 Mar 2016 16:45:26 -0700 Subject: [PATCH 532/846] Use pooled `StringBuilder` to reduce allocations when adding response cookies - #561 - new `SetCookieHeaderValue.AppendToStringBuilder()` method; avoids per-call `StringBuilder` allocation - `ResponseCookies` uses `ObjectPool` that `ResponseCookiesFeature` provides - `ResponseCookies` works fine if no `ObjectPoolProvider` is available - `IHttpContextFactory` instance is a singleton instantiated from CI - make `HttpContextFactory` `ObjectPoolProvider` and `ResponseCookiesFeature`-aware - apply same pattern to sample `PooledHttpContextFactory` - pool is not currently configurable; defaults are fine for response cookies - if we need (policy) configuration, would add an `IOptions` nit: Add some doc comments --- samples/SampleApp/PooledHttpContextFactory.cs | 26 +++++- .../IResponseCookies.cs | 29 +++--- .../IResponseCookiesFeature.cs | 6 ++ .../Features/ResponseCookiesFeature.cs | 44 ++++++++- .../HttpContextFactory.cs | 27 +++++- .../ResponseCookies.cs | 93 ++++++++++++------- src/Microsoft.AspNetCore.Http/project.json | 1 + .../SetCookieHeaderValue.cs | 34 ++++--- .../HttpContextFactoryTests.cs | 5 +- .../ResponseCookiesTest.cs | 64 ++++++++++--- .../SetCookieHeaderValueTest.cs | 12 +++ 11 files changed, 261 insertions(+), 80 deletions(-) diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/samples/SampleApp/PooledHttpContextFactory.cs index 6128e4ff49..ca22e01183 100644 --- a/samples/SampleApp/PooledHttpContextFactory.cs +++ b/samples/SampleApp/PooledHttpContextFactory.cs @@ -1,24 +1,48 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; +using System.Text; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; +using Microsoft.Extensions.ObjectPool; namespace SampleApp { public class PooledHttpContextFactory : IHttpContextFactory { + private readonly ObjectPool _builderPool; private readonly IHttpContextAccessor _httpContextAccessor; private readonly Stack _pool = new Stack(); - public PooledHttpContextFactory(IHttpContextAccessor httpContextAccessor) + public PooledHttpContextFactory(ObjectPoolProvider poolProvider) + : this(poolProvider, httpContextAccessor: null) { + } + + public PooledHttpContextFactory(ObjectPoolProvider poolProvider, IHttpContextAccessor httpContextAccessor) + { + if (poolProvider == null) + { + throw new ArgumentNullException(nameof(poolProvider)); + } + + _builderPool = poolProvider.CreateStringBuilderPool(); _httpContextAccessor = httpContextAccessor; } public HttpContext Create(IFeatureCollection featureCollection) { + if (featureCollection == null) + { + throw new ArgumentNullException(nameof(featureCollection)); + } + + var responseCookiesFeature = new ResponseCookiesFeature(featureCollection, _builderPool); + featureCollection.Set(responseCookiesFeature); + PooledHttpContext httpContext = null; lock (_pool) { diff --git a/src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs b/src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs index dd8696f358..9c8c3b42ba 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs @@ -4,36 +4,39 @@ namespace Microsoft.AspNetCore.Http { /// - /// A wrapper for the response Set-Cookie header + /// A wrapper for the response Set-Cookie header. /// public interface IResponseCookies { /// - /// Add a new cookie and value + /// Add a new cookie and value. /// - /// - /// + /// Name of the new cookie. + /// Value of the new cookie. void Append(string key, string value); /// - /// Add a new cookie + /// Add a new cookie. /// - /// - /// - /// + /// Name of the new cookie. + /// Value of the new cookie. + /// included in the new cookie setting. void Append(string key, string value, CookieOptions options); /// - /// Sets an expired cookie + /// Sets an expired cookie. /// - /// + /// Name of the cookie to expire. void Delete(string key); /// - /// Sets an expired cookie + /// Sets an expired cookie. /// - /// - /// + /// Name of the cookie to expire. + /// + /// used to discriminate the particular cookie to expire. The + /// and values are especially important. + /// void Delete(string key, CookieOptions options); } } diff --git a/src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs index fb5ea09258..7ce1041840 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs @@ -3,8 +3,14 @@ namespace Microsoft.AspNetCore.Http.Features { + /// + /// A helper for creating the response Set-Cookie header. + /// public interface IResponseCookiesFeature { + /// + /// Gets the wrapper for the response Set-Cookie header. + /// IResponseCookies Cookies { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs index 136ecd2a8e..9481ac0a8e 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs @@ -1,23 +1,58 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Text; using Microsoft.AspNetCore.Http.Internal; +using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Http.Features.Internal { + /// + /// Default implementation of . + /// public class ResponseCookiesFeature : IResponseCookiesFeature { + // Object pool will be null only in test scenarios e.g. if code news up a DefaultHttpContext. + private readonly ObjectPool _builderPool; + private FeatureReferences _features; private IResponseCookies _cookiesCollection; + /// + /// Initializes a new instance. + /// + /// + /// containing all defined features, including this + /// and the . + /// public ResponseCookiesFeature(IFeatureCollection features) + : this(features, builderPool: null) { - _features = new FeatureReferences(features); } - private IHttpResponseFeature HttpResponseFeature => - _features.Fetch(ref _features.Cache, f => null); + /// + /// Initializes a new instance. + /// + /// + /// containing all defined features, including this + /// and the . + /// + /// The , if available. + public ResponseCookiesFeature(IFeatureCollection features, ObjectPool builderPool) + { + if (features == null) + { + throw new ArgumentNullException(nameof(features)); + } + _features = new FeatureReferences(features); + _builderPool = builderPool; + } + + private IHttpResponseFeature HttpResponseFeature => _features.Fetch(ref _features.Cache, f => null); + + /// public IResponseCookies Cookies { get @@ -25,8 +60,9 @@ namespace Microsoft.AspNetCore.Http.Features.Internal if (_cookiesCollection == null) { var headers = HttpResponseFeature.Headers; - _cookiesCollection = new ResponseCookies(headers); + _cookiesCollection = new ResponseCookies(headers, _builderPool); } + return _cookiesCollection; } } diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs index 2f6717641f..95efc68bf9 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs @@ -1,30 +1,51 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Text; using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; +using Microsoft.Extensions.ObjectPool; namespace Microsoft.AspNetCore.Http.Internal { public class HttpContextFactory : IHttpContextFactory { - private IHttpContextAccessor _httpContextAccessor; + private readonly ObjectPool _builderPool; + private readonly IHttpContextAccessor _httpContextAccessor; - public HttpContextFactory() : this(httpContextAccessor: null) + public HttpContextFactory(ObjectPoolProvider poolProvider) + : this(poolProvider, httpContextAccessor: null) { } - public HttpContextFactory(IHttpContextAccessor httpContextAccessor) + public HttpContextFactory(ObjectPoolProvider poolProvider, IHttpContextAccessor httpContextAccessor) { + if (poolProvider == null) + { + throw new ArgumentNullException(nameof(poolProvider)); + } + + _builderPool = poolProvider.CreateStringBuilderPool(); _httpContextAccessor = httpContextAccessor; } public HttpContext Create(IFeatureCollection featureCollection) { + if (featureCollection == null) + { + throw new ArgumentNullException(nameof(featureCollection)); + } + + var responseCookiesFeature = new ResponseCookiesFeature(featureCollection, _builderPool); + featureCollection.Set(responseCookiesFeature); + var httpContext = new DefaultHttpContext(featureCollection); if (_httpContextAccessor != null) { _httpContextAccessor.HttpContext = httpContext; } + return httpContext; } diff --git a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs index 16832c7dbc..4a8538371b 100644 --- a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs @@ -2,23 +2,27 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Text.Encodings.Web; using System.Collections.Generic; +using System.Text; +using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Http.Internal { /// - /// A wrapper for the response Set-Cookie header + /// A wrapper for the response Set-Cookie header. /// public class ResponseCookies : IResponseCookies { + private readonly ObjectPool _builderPool; + /// - /// Create a new wrapper + /// Create a new wrapper. /// - /// - public ResponseCookies(IHeaderDictionary headers) + /// The for the response. + /// The , if available. + public ResponseCookies(IHeaderDictionary headers, ObjectPool builderPool) { if (headers == null) { @@ -26,33 +30,44 @@ namespace Microsoft.AspNetCore.Http.Internal } Headers = headers; + _builderPool = builderPool; } private IHeaderDictionary Headers { get; set; } - /// - /// Add a new cookie and value - /// - /// - /// + /// public void Append(string key, string value) { var setCookieHeaderValue = new SetCookieHeaderValue( - Uri.EscapeDataString(key), - Uri.EscapeDataString(value)) + Uri.EscapeDataString(key), + Uri.EscapeDataString(value)) { Path = "/" }; - Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], setCookieHeaderValue.ToString()); + string cookieValue; + if (_builderPool == null) + { + cookieValue = setCookieHeaderValue.ToString(); + } + else + { + var stringBuilder = _builderPool.Get(); + try + { + setCookieHeaderValue.AppendToStringBuilder(stringBuilder); + cookieValue = stringBuilder.ToString(); + } + finally + { + _builderPool.Return(stringBuilder); + } + } + + Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], cookieValue); } - /// - /// Add a new cookie - /// - /// - /// - /// + /// public void Append(string key, string value, CookieOptions options) { if (options == null) @@ -61,8 +76,8 @@ namespace Microsoft.AspNetCore.Http.Internal } var setCookieHeaderValue = new SetCookieHeaderValue( - Uri.EscapeDataString(key), - Uri.EscapeDataString(value)) + Uri.EscapeDataString(key), + Uri.EscapeDataString(value)) { Domain = options.Domain, Path = options.Path, @@ -71,30 +86,42 @@ namespace Microsoft.AspNetCore.Http.Internal HttpOnly = options.HttpOnly, }; - Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], setCookieHeaderValue.ToString()); + string cookieValue; + if (_builderPool == null) + { + cookieValue = setCookieHeaderValue.ToString(); + } + else + { + var stringBuilder = _builderPool.Get(); + try + { + setCookieHeaderValue.AppendToStringBuilder(stringBuilder); + cookieValue = stringBuilder.ToString(); + } + finally + { + _builderPool.Return(stringBuilder); + } + } + + Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], cookieValue); } - /// - /// Sets an expired cookie - /// - /// + /// public void Delete(string key) { Delete(key, new CookieOptions() { Path = "/" }); } - /// - /// Sets an expired cookie - /// - /// - /// + /// public void Delete(string key, CookieOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } - + var encodedKeyPlusEquals = Uri.EscapeDataString(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); @@ -130,7 +157,7 @@ namespace Microsoft.AspNetCore.Http.Internal newValues.Add(values[i]); } } - + Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); } diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 8e1578e21c..0052abaf91 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -17,6 +17,7 @@ "dependencies": { "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", + "Microsoft.Extensions.ObjectPool": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 37372e013c..7f790d6617 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -90,42 +90,54 @@ namespace Microsoft.Net.Http.Headers public override string ToString() { StringBuilder header = new StringBuilder(); + AppendToStringBuilder(header); - header.Append(_name); - header.Append("="); - header.Append(_value); + return header.ToString(); + } + + /// + /// Append string representation of this to given + /// . + /// + /// + /// The to receive the string representation of this + /// . + /// + public void AppendToStringBuilder(StringBuilder builder) + { + builder.Append(_name); + builder.Append("="); + builder.Append(_value); if (Expires.HasValue) { - AppendSegment(header, ExpiresToken, HeaderUtilities.FormatDate(Expires.Value)); + AppendSegment(builder, ExpiresToken, HeaderUtilities.FormatDate(Expires.Value)); } if (MaxAge.HasValue) { - AppendSegment(header, MaxAgeToken, HeaderUtilities.FormatInt64((long)MaxAge.Value.TotalSeconds)); + AppendSegment(builder, MaxAgeToken, HeaderUtilities.FormatInt64((long)MaxAge.Value.TotalSeconds)); } if (Domain != null) { - AppendSegment(header, DomainToken, Domain); + AppendSegment(builder, DomainToken, Domain); } if (Path != null) { - AppendSegment(header, PathToken, Path); + AppendSegment(builder, PathToken, Path); } if (Secure) { - AppendSegment(header, SecureToken, null); + AppendSegment(builder, SecureToken, null); } if (HttpOnly) { - AppendSegment(header, HttpOnlyToken, null); + AppendSegment(builder, HttpOnlyToken, null); } - - return header.ToString(); } private static void AppendSegment(StringBuilder builder, string name, string value) diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index f44a567b24..29029c4ad8 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Http.Features; +using Microsoft.Extensions.ObjectPool; using Xunit; namespace Microsoft.AspNetCore.Http.Internal @@ -13,7 +14,7 @@ namespace Microsoft.AspNetCore.Http.Internal { // Arrange var accessor = new HttpContextAccessor(); - var contextFactory = new HttpContextFactory(accessor); + var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), accessor); // Act var context = contextFactory.Create(new FeatureCollection()); @@ -26,7 +27,7 @@ namespace Microsoft.AspNetCore.Http.Internal public void AllowsCreatingContextWithoutSettingAccessor() { // Arrange - var contextFactory = new HttpContextFactory(); + var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider()); // Act & Assert var context = contextFactory.Create(new FeatureCollection()); diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index cc26d657c7..021f517bd6 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -1,19 +1,37 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Xunit; -using Microsoft.Net.Http.Headers; +using System.Text; using Microsoft.AspNetCore.Http.Internal; +using Microsoft.Extensions.ObjectPool; +using Microsoft.Net.Http.Headers; +using Xunit; namespace Microsoft.AspNetCore.Http.Tests { public class ResponseCookiesTest { - [Fact] - public void DeleteCookieShouldSetDefaultPath() + private static readonly ObjectPool _builderPool = + new DefaultObjectPoolProvider().Create(new StringBuilderPooledObjectPolicy()); + + public static TheoryData BuilderPoolData + { + get + { + return new TheoryData> + { + null, + _builderPool, + }; + } + } + + [Theory] + [MemberData(nameof(BuilderPoolData))] + public void DeleteCookieShouldSetDefaultPath(ObjectPool builderPool) { var headers = new HeaderDictionary(); - var cookies = new ResponseCookies(headers); + var cookies = new ResponseCookies(headers, builderPool); var testcookie = "TestCookie"; cookies.Delete(testcookie); @@ -25,11 +43,12 @@ namespace Microsoft.AspNetCore.Http.Tests Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); } - [Fact] - public void NoParamsDeleteRemovesCookieCreatedByAdd() + [Theory] + [MemberData(nameof(BuilderPoolData))] + public void NoParamsDeleteRemovesCookieCreatedByAdd(ObjectPool builderPool) { var headers = new HeaderDictionary(); - var cookies = new ResponseCookies(headers); + var cookies = new ResponseCookies(headers, builderPool); var testcookie = "TestCookie"; cookies.Append(testcookie, testcookie); @@ -42,14 +61,33 @@ namespace Microsoft.AspNetCore.Http.Tests Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); } + public static TheoryData EscapesKeyValuesBeforeSettingCookieData + { + get + { + // key, value, object pool, expected + return new TheoryData, string> + { + { "key", "value", null, "key=value" }, + { "key,", "!value", null, "key%2C=%21value" }, + { "ke#y,", "val^ue", null, "ke%23y%2C=val%5Eue" }, + { "key", "value", _builderPool, "key=value" }, + { "key,", "!value", _builderPool, "key%2C=%21value" }, + { "ke#y,", "val^ue", _builderPool, "ke%23y%2C=val%5Eue" }, + }; + } + } + [Theory] - [InlineData("key", "value", "key=value")] - [InlineData("key,", "!value", "key%2C=%21value")] - [InlineData("ke#y,", "val^ue", "ke%23y%2C=val%5Eue")] - public void EscapesKeyValuesBeforeSettingCookie(string key, string value, string expected) + [MemberData(nameof(EscapesKeyValuesBeforeSettingCookieData))] + public void EscapesKeyValuesBeforeSettingCookie( + string key, + string value, + ObjectPool builderPool, + string expected) { var headers = new HeaderDictionary(); - var cookies = new ResponseCookies(headers); + var cookies = new ResponseCookies(headers, builderPool); cookies.Append(key, value); diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index 5d2c138558..a3dad09a24 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using Xunit; namespace Microsoft.Net.Http.Headers @@ -264,6 +265,17 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(expectedValue, input.ToString()); } + [Theory] + [MemberData(nameof(SetCookieHeaderDataSet))] + public void SetCookieHeaderValue_AppendToStringBuilder(SetCookieHeaderValue input, string expectedValue) + { + var builder = new StringBuilder(); + + input.AppendToStringBuilder(builder); + + Assert.Equal(expectedValue, builder.ToString()); + } + [Theory] [MemberData(nameof(SetCookieHeaderDataSet))] public void SetCookieHeaderValue_Parse_AcceptsValidValues(SetCookieHeaderValue cookie, string expectedValue) From 78a3fc91d346688039e58665e6e3c7455ba9c7d6 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Sat, 26 Mar 2016 22:42:17 -0700 Subject: [PATCH 533/846] Fix package metadata --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 5 ++++- src/Microsoft.AspNetCore.Http.Extensions/project.json | 7 +++++-- src/Microsoft.AspNetCore.Http.Features/project.json | 7 +++++-- src/Microsoft.AspNetCore.Http/project.json | 7 +++++-- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 4 ++-- .../WebSockets/WebSocketAcceptAdapter.cs | 4 ++-- src/Microsoft.AspNetCore.Owin/project.json | 9 +++++++-- src/Microsoft.AspNetCore.WebUtilities/project.json | 5 ++++- src/Microsoft.Net.Http.Headers/project.json | 9 ++++++--- 9 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 1ad6d728ad..8bed79501e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "description": "ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder.\r\nCommonly used types:\r\nMicrosoft.AspNetCore.Builder.IApplicationBuilder\r\nMicrosoft.AspNetCore.Http.HttpContext\r\nMicrosoft.AspNetCore.Http.HttpRequest\r\nMicrosoft.AspNetCore.Http.HttpResponse", + "tags": [ + "aspnetcore" + ], "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 81c223a0ff..231707f9bf 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", + "description": "ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state.", + "tags": [ + "aspnetcore" + ], "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" @@ -20,7 +23,7 @@ "System.Buffers": "4.0.0-*" }, "frameworks": { - "net451": {}, + "net451": { }, "netstandard1.3": { "dependencies": { "System.IO.FileSystem": "4.0.1-*" diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index a6b8321019..534ba03d3b 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature interface definitions.", + "description": "ASP.NET Core HTTP feature interface definitions.", + "tags": [ + "aspnetcore" + ], "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" @@ -17,7 +20,7 @@ "Microsoft.Extensions.Primitives": "1.0.0-*" }, "frameworks": { - "net451": {}, + "net451": { }, "netstandard1.3": { "dependencies": { "System.Collections": "4.0.11-*", diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 0052abaf91..b5ba767975 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature implementations.", + "description": "ASP.NET Core default HTTP feature implementations.", + "tags": [ + "aspnetcore" + ], "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" @@ -21,7 +24,7 @@ "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { - "net451": {}, + "net451": { }, "netstandard1.3": { "dependencies": { "System.Threading": "4.0.11-*" diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 3833f39a91..5fe43dedd2 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -28,8 +28,8 @@ namespace Microsoft.AspNetCore.Owin >; /// - /// This adapts the OWIN WebSocket accept flow to match the ASP.NET WebSocket Accept flow. - /// This enables ASP.NET components to use WebSockets on OWIN based servers. + /// This adapts the OWIN WebSocket accept flow to match the ASP.NET Core WebSocket Accept flow. + /// This enables ASP.NET Core components to use WebSockets on OWIN based servers. /// public class OwinWebSocketAcceptAdapter { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs index a77eeb67ba..f1355da4c2 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -29,8 +29,8 @@ namespace Microsoft.AspNetCore.Owin >; /// - /// This adapts the ASP.NET WebSocket Accept flow to match the OWIN WebSocket accept flow. - /// This enables OWIN based components to use WebSockets on ASP.NET servers. + /// This adapts the ASP.NET Core WebSocket Accept flow to match the OWIN WebSocket accept flow. + /// This enables OWIN based components to use WebSockets on ASP.NET Core servers. /// public class WebSocketAcceptAdapter { diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 115a4a9192..dc8ffb89a7 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -1,6 +1,11 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 component for running OWIN middleware.", + "description": "ASP.NET Core component for running OWIN middleware in an ASP.NET Core application.", + "tags": [ + "aspnetcore", + "katana", + "owin" + ], "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" @@ -17,7 +22,7 @@ "Microsoft.AspNetCore.Http": "1.0.0-*" }, "frameworks": { - "net451": {}, + "net451": { }, "netstandard1.3": { "imports": [ "dotnet5.4" diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 235585b0d8..336e6a4a21 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 common helper methods.", + "description": "ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings.", + "tags": [ + "aspnetcore" + ], "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index ceec7e3af1..908a938538 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP header implementations.", + "description": "ASP.NET Core HTTP header parser implementations.", + "tags": [ + "aspnetcore" + ], "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" @@ -13,7 +16,7 @@ ], "xmlDoc": true }, - "dependencies": {}, + "dependencies": { }, "frameworks": { "netstandard1.0": { "dependencies": { @@ -23,7 +26,7 @@ "System.Linq": "4.1.0-*", "System.Resources.ResourceManager": "4.0.1-*", "System.Runtime.Extensions": "4.1.0-*", - "System.Text.Encoding": "4.0.11-*", + "System.Text.Encoding": "4.0.11-*" }, "imports": [ "dotnet5.1" From 1b7174815017ffb789268de3e472ce2afa9ccbd3 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Mon, 28 Mar 2016 10:26:49 -0700 Subject: [PATCH 534/846] More package metadata fixes --- src/Microsoft.AspNetCore.Owin/project.json | 2 +- src/Microsoft.Net.Http.Headers/project.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index dc8ffb89a7..a5f53d0f54 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -1,6 +1,6 @@ { "version": "1.0.0-*", - "description": "ASP.NET Core component for running OWIN middleware in an ASP.NET Core application.", + "description": "ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application.", "tags": [ "aspnetcore", "katana", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 908a938538..3fa2366ec5 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,8 +1,8 @@ { "version": "1.0.0-*", - "description": "ASP.NET Core HTTP header parser implementations.", + "description": "HTTP header parser implementations.", "tags": [ - "aspnetcore" + "http" ], "repository": { "type": "git", From bd60507dcd317f2c1f42da37afd9dbc928f50928 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 28 Mar 2016 13:57:08 -0700 Subject: [PATCH 535/846] #553 Use System.Buffers for temporary arrays --- src/Microsoft.AspNetCore.Http/project.json | 3 +- .../WebSockets/OwinWebSocketAdapter.cs | 17 +++-- .../BufferedReadStream.cs | 21 ++++-- .../FileBufferingReadStream.cs | 71 ++++++++++++++++--- .../FormReader.cs | 69 ++++++++++++------ .../HttpRequestStreamReader.cs | 31 +------- .../HttpResponseStreamWriter.cs | 30 +------- .../MultipartReaderStream.cs | 40 ++++++++--- .../StreamHelperExtensions.cs | 25 +++++-- .../ContentDispositionHeaderValue.cs | 11 ++- src/Microsoft.Net.Http.Headers/project.json | 7 +- 11 files changed, 211 insertions(+), 114 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index b5ba767975..3027e66a12 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -21,7 +21,8 @@ "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "Microsoft.Extensions.ObjectPool": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" + "Microsoft.Net.Http.Headers": "1.0.0-*", + "System.Buffers": "4.0.0-*" }, "frameworks": { "net451": { }, diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs index 17bd2ede40..e7eed159ea 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -33,6 +34,7 @@ namespace Microsoft.AspNetCore.Owin public class OwinWebSocketAdapter : WebSocket { + private const int _rentedBufferSize = 1024; private IDictionary _websocketContext; private WebSocketSendAsync _sendAsync; private WebSocketReceiveAsync _receiveAsync; @@ -126,11 +128,18 @@ namespace Microsoft.AspNetCore.Owin await CloseOutputAsync(closeStatus, statusDescription, cancellationToken); } - byte[] buffer = new byte[1024]; - while (State == WebSocketState.CloseSent) + var buffer = ArrayPool.Shared.Rent(_rentedBufferSize); + try { - // Drain until close received - await ReceiveAsync(new ArraySegment(buffer), cancellationToken); + while (State == WebSocketState.CloseSent) + { + // Drain until close received + await ReceiveAsync(new ArraySegment(buffer), cancellationToken); + } + } + finally + { + ArrayPool.Shared.Return(buffer); } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs index 7a1e2448e3..f9ea281d05 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.IO; using System.Text; using System.Threading; @@ -16,11 +17,17 @@ namespace Microsoft.AspNetCore.WebUtilities private readonly Stream _inner; private readonly byte[] _buffer; + private readonly ArrayPool _bytePool; private int _bufferOffset = 0; private int _bufferCount = 0; private bool _disposed; public BufferedReadStream(Stream inner, int bufferSize) + : this(inner, bufferSize, ArrayPool.Shared) + { + } + + public BufferedReadStream(Stream inner, int bufferSize, ArrayPool bytePool) { if (inner == null) { @@ -28,7 +35,8 @@ namespace Microsoft.AspNetCore.WebUtilities } _inner = inner; - _buffer = new byte[bufferSize]; + _bytePool = bytePool; + _buffer = bytePool.Rent(bufferSize); } public ArraySegment BufferedData @@ -128,10 +136,15 @@ namespace Microsoft.AspNetCore.WebUtilities protected override void Dispose(bool disposing) { - _disposed = true; - if (disposing) + if (!_disposed) { - _inner.Dispose(); + _disposed = true; + _bytePool.Return(_buffer); + + if (disposing) + { + _inner.Dispose(); + } } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs index a80f02a5fd..06f9de2644 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.Diagnostics; using System.IO; using System.Threading; @@ -16,12 +17,15 @@ namespace Microsoft.AspNetCore.WebUtilities /// public class FileBufferingReadStream : Stream { + private const int _maxRentedBufferSize = 1024 * 1024; // 1MB private readonly Stream _inner; + private readonly ArrayPool _bytePool; private readonly int _memoryThreshold; private string _tempFileDirectory; private readonly Func _tempFileDirectoryAccessor; - private Stream _buffer = new MemoryStream(); // TODO: We could have a more efficiently expanding buffer stream. + private Stream _buffer; + private byte[] _rentedBuffer; private bool _inMemory = true; private bool _completelyBuffered; @@ -32,6 +36,15 @@ namespace Microsoft.AspNetCore.WebUtilities Stream inner, int memoryThreshold, Func tempFileDirectoryAccessor) + : this(inner, memoryThreshold, tempFileDirectoryAccessor, ArrayPool.Shared) + { + } + + public FileBufferingReadStream( + Stream inner, + int memoryThreshold, + Func tempFileDirectoryAccessor, + ArrayPool bytePool) { if (inner == null) { @@ -43,6 +56,18 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(tempFileDirectoryAccessor)); } + _bytePool = bytePool; + if (memoryThreshold < _maxRentedBufferSize) + { + _rentedBuffer = bytePool.Rent(memoryThreshold); + _buffer = new MemoryStream(_rentedBuffer); + _buffer.SetLength(0); + } + else + { + _buffer = new MemoryStream(); + } + _inner = inner; _memoryThreshold = memoryThreshold; _tempFileDirectoryAccessor = tempFileDirectoryAccessor; @@ -50,6 +75,15 @@ namespace Microsoft.AspNetCore.WebUtilities // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? public FileBufferingReadStream(Stream inner, int memoryThreshold, string tempFileDirectory) + : this(inner, memoryThreshold, tempFileDirectory, ArrayPool.Shared) + { + } + + public FileBufferingReadStream( + Stream inner, + int memoryThreshold, + string tempFileDirectory, + ArrayPool bytePool) { if (inner == null) { @@ -61,6 +95,18 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(tempFileDirectory)); } + _bytePool = bytePool; + if (memoryThreshold < _maxRentedBufferSize) + { + _rentedBuffer = bytePool.Rent(memoryThreshold); + _buffer = new MemoryStream(_rentedBuffer); + _buffer.SetLength(0); + } + else + { + _buffer = new MemoryStream(); + } + _inner = inner; _memoryThreshold = memoryThreshold; _tempFileDirectory = tempFileDirectory; @@ -145,11 +191,11 @@ namespace Microsoft.AspNetCore.WebUtilities if (_inMemory && _buffer.Length + read > _memoryThreshold) { - var oldBuffer = _buffer; - _buffer = CreateTempFile(); _inMemory = false; - oldBuffer.Position = 0; - oldBuffer.CopyTo(_buffer, 1024 * 16); + _buffer = CreateTempFile(); + _buffer.Write(_rentedBuffer, 0, (int)_buffer.Length); + _bytePool.Return(_rentedBuffer); + _rentedBuffer = null; } if (read > 0) @@ -216,11 +262,11 @@ namespace Microsoft.AspNetCore.WebUtilities if (_inMemory && _buffer.Length + read > _memoryThreshold) { - var oldBuffer = _buffer; - _buffer = CreateTempFile(); _inMemory = false; - oldBuffer.Position = 0; - await oldBuffer.CopyToAsync(_buffer, 1024 * 16, cancellationToken); + _buffer = CreateTempFile(); + await _buffer.WriteAsync(_rentedBuffer, 0, (int)_buffer.Length, cancellationToken); + _bytePool.Return(_rentedBuffer); + _rentedBuffer = null; } if (read > 0) @@ -270,6 +316,11 @@ namespace Microsoft.AspNetCore.WebUtilities if (!_disposed) { _disposed = true; + if (_rentedBuffer != null) + { + _bytePool.Return(_rentedBuffer); + } + if (disposing) { _buffer.Dispose(); @@ -285,4 +336,4 @@ namespace Microsoft.AspNetCore.WebUtilities } } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs index ca378895ef..df12872c99 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.Collections.Generic; using System.IO; using System.Text; @@ -14,25 +15,40 @@ namespace Microsoft.AspNetCore.WebUtilities /// /// Used to read an 'application/x-www-form-urlencoded' form. /// - public class FormReader + public class FormReader : IDisposable { + private const int _rentedCharPoolLength = 8192; private readonly TextReader _reader; - private readonly char[] _buffer = new char[1024]; + private readonly char[] _buffer; + private readonly ArrayPool _charPool; private readonly StringBuilder _builder = new StringBuilder(); private int _bufferOffset; private int _bufferCount; + private bool _disposed; public FormReader(string data) + : this(data, ArrayPool.Shared) + { + } + + public FormReader(string data, ArrayPool charPool) { if (data == null) { throw new ArgumentNullException(nameof(data)); } + _buffer = charPool.Rent(_rentedCharPoolLength); + _charPool = charPool; _reader = new StringReader(data); } public FormReader(Stream stream, Encoding encoding) + : this(stream, encoding, ArrayPool.Shared) + { + } + + public FormReader(Stream stream, Encoding encoding, ArrayPool charPool) { if (stream == null) { @@ -44,6 +60,8 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(encoding)); } + _buffer = charPool.Rent(_rentedCharPoolLength); + _charPool = charPool; _reader = new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); } @@ -167,17 +185,18 @@ namespace Microsoft.AspNetCore.WebUtilities /// The collection containing the parsed HTTP form body. public static Dictionary ReadForm(string text) { - var reader = new FormReader(text); - - var accumulator = new KeyValueAccumulator(); - var pair = reader.ReadNextPair(); - while (pair.HasValue) + using (var reader = new FormReader(text)) { - accumulator.Append(pair.Value.Key, pair.Value.Value); - pair = reader.ReadNextPair(); - } + var accumulator = new KeyValueAccumulator(); + var pair = reader.ReadNextPair(); + while (pair.HasValue) + { + accumulator.Append(pair.Value.Key, pair.Value.Value); + pair = reader.ReadNextPair(); + } - return accumulator.GetResults(); + return accumulator.GetResults(); + } } /// @@ -200,17 +219,27 @@ namespace Microsoft.AspNetCore.WebUtilities /// The collection containing the parsed HTTP form body. public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) { - var reader = new FormReader(stream, encoding); - - var accumulator = new KeyValueAccumulator(); - var pair = await reader.ReadNextPairAsync(cancellationToken); - while (pair.HasValue) + using (var reader = new FormReader(stream, encoding)) { - accumulator.Append(pair.Value.Key, pair.Value.Value); - pair = await reader.ReadNextPairAsync(cancellationToken); - } + var accumulator = new KeyValueAccumulator(); + var pair = await reader.ReadNextPairAsync(cancellationToken); + while (pair.HasValue) + { + accumulator.Append(pair.Value.Key, pair.Value.Value); + pair = await reader.ReadNextPairAsync(cancellationToken); + } - return accumulator.GetResults(); + return accumulator.GetResults(); + } + } + + public void Dispose() + { + if (!_disposed) + { + _disposed = true; + _charPool.Return(_buffer); + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs index 15e98d7eaa..67977ca6f0 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs @@ -34,40 +34,13 @@ namespace Microsoft.AspNetCore.WebUtilities private bool _isBlocked; public HttpRequestStreamReader(Stream stream, Encoding encoding) - : this(stream, encoding, DefaultBufferSize) + : this(stream, encoding, DefaultBufferSize, ArrayPool.Shared, ArrayPool.Shared) { } public HttpRequestStreamReader(Stream stream, Encoding encoding, int bufferSize) + : this(stream, encoding, bufferSize, ArrayPool.Shared, ArrayPool.Shared) { - if (stream == null) - { - throw new ArgumentNullException(nameof(stream)); - } - - if (!stream.CanRead) - { - throw new ArgumentException(Resources.HttpRequestStreamReader_StreamNotReadable, nameof(stream)); - } - - if (encoding == null) - { - throw new ArgumentNullException(nameof(encoding)); - } - - _stream = stream; - _encoding = encoding; - _decoder = encoding.GetDecoder(); - - if (bufferSize < MinBufferSize) - { - bufferSize = MinBufferSize; - } - - _byteBufferSize = bufferSize; - _byteBuffer = new byte[bufferSize]; - var maxCharsPerBuffer = encoding.GetMaxCharCount(bufferSize); - _charBuffer = new char[maxCharsPerBuffer]; } public HttpRequestStreamReader( diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs index 30f6423fef..9ec8da2338 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs @@ -34,39 +34,13 @@ namespace Microsoft.AspNetCore.WebUtilities private int _charBufferCount; public HttpResponseStreamWriter(Stream stream, Encoding encoding) - : this(stream, encoding, DefaultBufferSize) + : this(stream, encoding, DefaultBufferSize, ArrayPool.Shared, ArrayPool.Shared) { } public HttpResponseStreamWriter(Stream stream, Encoding encoding, int bufferSize) + : this(stream, encoding, bufferSize, ArrayPool.Shared, ArrayPool.Shared) { - if (stream == null) - { - throw new ArgumentNullException(nameof(stream)); - } - - if (!stream.CanWrite) - { - throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); - } - - if (encoding == null) - { - throw new ArgumentNullException(nameof(encoding)); - } - - _stream = stream; - Encoding = encoding; - _charBufferSize = bufferSize; - - if (bufferSize < MinBufferSize) - { - bufferSize = MinBufferSize; - } - - _encoder = encoding.GetEncoder(); - _byteBuffer = new byte[encoding.GetMaxByteCount(bufferSize)]; - _charBuffer = new char[bufferSize]; } public HttpResponseStreamWriter( diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index fdd84a5c6d..c94b27b003 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.Diagnostics; using System.IO; using System.Threading; @@ -13,6 +14,8 @@ namespace Microsoft.AspNetCore.WebUtilities { private readonly MultipartBoundary _boundary; private readonly BufferedReadStream _innerStream; + private readonly ArrayPool _bytePool; + private readonly long _innerOffset; private long _position; private long _observedLength; @@ -24,6 +27,17 @@ namespace Microsoft.AspNetCore.WebUtilities /// The . /// The boundary pattern to use. public MultipartReaderStream(BufferedReadStream stream, MultipartBoundary boundary) + : this(stream, boundary, ArrayPool.Shared) + { + } + + /// + /// Creates a stream that reads until it reaches the given boundary pattern. + /// + /// The . + /// The boundary pattern to use. + /// The ArrayPool pool to use for temporary byte arrays. + public MultipartReaderStream(BufferedReadStream stream, MultipartBoundary boundary, ArrayPool bytePool) { if (stream == null) { @@ -35,6 +49,7 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentNullException(nameof(boundary)); } + _bytePool = bytePool; _innerStream = stream; _innerOffset = _innerStream.CanSeek ? _innerStream.Position : 0; _boundary = boundary; @@ -212,14 +227,18 @@ namespace Microsoft.AspNetCore.WebUtilities read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); return UpdatePosition(read); } - Debug.Assert(matchCount == _boundary.BoundaryBytes.Length); + + var length = _boundary.BoundaryBytes.Length; + Debug.Assert(matchCount == length); // "The boundary may be followed by zero or more characters of // linear whitespace. It is then terminated by either another CRLF" // or -- for the final boundary. - byte[] boundary = new byte[_boundary.BoundaryBytes.Length]; - read = _innerStream.Read(boundary, 0, boundary.Length); - Debug.Assert(read == boundary.Length); // It should have all been buffered + var boundary = _bytePool.Rent(length); + read = _innerStream.Read(boundary, 0, length); + _bytePool.Return(boundary); + Debug.Assert(read == length); // It should have all been buffered + var remainder = _innerStream.ReadLine(lengthLimit: 100); // Whitespace may exceed the buffer. remainder = remainder.Trim(); if (string.Equals("--", remainder, StringComparison.Ordinal)) @@ -227,7 +246,6 @@ namespace Microsoft.AspNetCore.WebUtilities FinalBoundaryFound = true; } Debug.Assert(FinalBoundaryFound || string.Equals(string.Empty, remainder, StringComparison.Ordinal), "Un-expected data found on the boundary line: " + remainder); - _finished = true; return 0; } @@ -264,14 +282,18 @@ namespace Microsoft.AspNetCore.WebUtilities read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); return UpdatePosition(read); } - Debug.Assert(matchCount == _boundary.BoundaryBytes.Length); + + var length = _boundary.BoundaryBytes.Length; + Debug.Assert(matchCount == length); // "The boundary may be followed by zero or more characters of // linear whitespace. It is then terminated by either another CRLF" // or -- for the final boundary. - byte[] boundary = new byte[_boundary.BoundaryBytes.Length]; - read = _innerStream.Read(boundary, 0, boundary.Length); - Debug.Assert(read == boundary.Length); // It should have all been buffered + var boundary = _bytePool.Rent(length); + read = _innerStream.Read(boundary, 0, length); + _bytePool.Return(boundary); + Debug.Assert(read == length); // It should have all been buffered + var remainder = await _innerStream.ReadLineAsync(lengthLimit: 100, cancellationToken: cancellationToken); // Whitespace may exceed the buffer. remainder = remainder.Trim(); if (string.Equals("--", remainder, StringComparison.Ordinal)) diff --git a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs index ac5d4c43a3..90830e897e 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Buffers; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -9,14 +10,28 @@ namespace Microsoft.AspNetCore.WebUtilities { public static class StreamHelperExtensions { - public static async Task DrainAsync(this Stream stream, CancellationToken cancellationToken) + private const int _maxReadBufferSize = 1024 * 4; + + public static Task DrainAsync(this Stream stream, CancellationToken cancellationToken) + { + return stream.DrainAsync(ArrayPool.Shared, cancellationToken); + } + + public static async Task DrainAsync(this Stream stream, ArrayPool bytePool, CancellationToken cancellationToken) { - byte[] buffer = new byte[1024]; cancellationToken.ThrowIfCancellationRequested(); - while (await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken) > 0) + var buffer = bytePool.Rent(_maxReadBufferSize); + try { - // Not all streams support cancellation directly. - cancellationToken.ThrowIfCancellationRequested(); + while (await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken) > 0) + { + // Not all streams support cancellation directly. + cancellationToken.ThrowIfCancellationRequested(); + } + } + finally + { + bytePool.Return(buffer); } } } diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index 5ee589440a..7ceb8728d4 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; @@ -578,12 +579,13 @@ namespace Microsoft.Net.Http.Headers } var decoded = new StringBuilder(); + byte[] unescapedBytes = null; try { var encoding = Encoding.GetEncoding(parts[0]); var dataString = parts[2]; - var unescapedBytes = new byte[dataString.Length]; + unescapedBytes = ArrayPool.Shared.Rent(dataString.Length); var unescapedBytesCount = 0; for (var index = 0; index < dataString.Length; index++) { @@ -615,6 +617,13 @@ namespace Microsoft.Net.Http.Headers { return false; // Unknown encoding or bad characters } + finally + { + if (unescapedBytes != null) + { + ArrayPool.Shared.Return(unescapedBytes); + } + } output = decoded.ToString(); return true; diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 3fa2366ec5..c3fa7a950f 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -18,7 +18,7 @@ }, "dependencies": { }, "frameworks": { - "netstandard1.0": { + "netstandard1.1": { "dependencies": { "System.Collections": "4.0.11-*", "System.Diagnostics.Contracts": "4.0.1-*", @@ -26,10 +26,11 @@ "System.Linq": "4.1.0-*", "System.Resources.ResourceManager": "4.0.1-*", "System.Runtime.Extensions": "4.1.0-*", - "System.Text.Encoding": "4.0.11-*" + "System.Text.Encoding": "4.0.11-*", + "System.Buffers": "4.0.0-*" }, "imports": [ - "dotnet5.1" + "dotnet5.2" ] } } From 4b6a38350e6158810075cf2e2237e107085c87b6 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 30 Mar 2016 15:01:39 -0700 Subject: [PATCH 536/846] Updating samples --- samples/SampleApp/project.json | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 94e788f9ad..bbf9e0643d 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,15 +1,13 @@ { "version": "1.0.0-*", - "dependencies": { - "Microsoft.AspNetCore.Http": "1.0.0-*" + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.NETCore.Platforms": "1.0.1-*" }, - "commands": { "SampleApp": "SampleApp" }, - "frameworks": { - "dnx451": { } + "dnx451": {} } -} +} \ No newline at end of file From 294fdbf71976dd92cc0ededae3ec115f1064f646 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 30 Mar 2016 15:04:01 -0700 Subject: [PATCH 537/846] Update sample TFM --- samples/SampleApp/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index bbf9e0643d..25d699cf37 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -8,6 +8,6 @@ "SampleApp": "SampleApp" }, "frameworks": { - "dnx451": {} + "net451": {} } } \ No newline at end of file From ff0a37c5f5be561c9a155f86c33a95ab0f202137 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 30 Mar 2016 15:41:33 -0700 Subject: [PATCH 538/846] Webhooks notification --- .travis.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 304e307169..5323c4b2da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,4 +23,10 @@ branches: - dev - /^(.*\/)?ci-.*$/ script: - - ./build.sh --quiet verify \ No newline at end of file + - ./build.sh --quiet verify +notifications: + webhooks: + secure: "XshregcmoXywFrrlIk7MLluUV2Pd8Z/VftrviVZjRL5+3akix2QnP15eT2E13yNtyS1yIc3lWfrVrLLf+H5bN9dUSzxIMNoJQ/S18F/AO5VD5ewd6pLC0uYhUcHdTRQuzjLGVPlt2suKpPllV2SsGlAdGatdCfj5zM6eOG31jaA=" + on_success: always + on_failure: always + on_start: always \ No newline at end of file From 6725d68559a55713fdd3d2e38de2ab22059219da Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Sun, 27 Mar 2016 00:51:12 -0700 Subject: [PATCH 539/846] Move some implementations (all feature implementations) out of `.Internal` namespaces - #549, #592 - move feature implementations to `Microsoft.AspNetCore.Http.Features` and `...Authentication.Features` - move `DefaultHttpContext`, `HttpContextAccessor`, `HttpContextFactory`, `FormCollection` and `HeaderDictionary` to `Microsoft.AspNetCore.Http` - move `FormFile` to `Microsoft.AspNetCore.Http.Internal` - that and `Microsoft.AspNetCore.Http.Authentication.Internal` are the remaining `.Internal` namespaces nits: - remove a couple of parameterless constructors - add / fill subfolders to align with new namespaces - remove all use of (unnecessary) "T:..." `` values --- samples/SampleApp/PooledHttpContext.cs | 2 +- samples/SampleApp/PooledHttpContextFactory.cs | 1 - .../Internal/HeaderSegment.cs | 3 +- .../IFormCollection.cs | 32 +++++++++--------- .../IQueryCollection.cs | 33 +++++++++---------- .../IRequestCookieCollection.cs | 32 +++++++++--------- .../DefaultAuthenticationManager.cs | 1 - .../DefaultHttpContext.cs | 9 +++-- .../HttpAuthenticationFeature.cs | 6 +--- .../Features/DefaultSessionFeature.cs | 2 +- .../Features/FormFeature.cs | 2 +- .../Features/HttpConnectionFeature.cs | 6 +--- .../Features/HttpRequestFeature.cs | 3 +- .../Features/HttpRequestIdentifierFeature.cs | 2 +- .../Features/HttpRequestLifetimeFeature.cs | 2 +- .../Features/HttpResponseFeature.cs | 3 +- .../Features/ItemsFeature.cs | 2 +- .../Features/QueryFeature.cs | 2 +- .../Features/RequestCookiesFeature.cs | 4 +-- .../Features/ResponseCookiesFeature.cs | 2 +- .../Features/ServiceProvidersFeature.cs | 2 +- .../Features/TlsConnectionFeature.cs | 6 +--- .../FormCollection.cs | 23 ++++++------- .../HeaderDictionary.cs | 30 ++++++++--------- .../HttpContextAccessor.cs | 5 ++- .../HttpContextFactory.cs | 3 +- .../{ => Internal}/ApplicationBuilder.cs | 0 .../{ => Internal}/BufferingHelper.cs | 0 .../{ => Internal}/Constants.cs | 0 .../{ => Internal}/DefaultConnectionInfo.cs | 1 - .../{ => Internal}/DefaultHttpRequest.cs | 1 - .../{ => Internal}/DefaultHttpResponse.cs | 3 +- .../{ => Internal}/DefaultWebSocketManager.cs | 0 .../{Features => Internal}/FormFile.cs | 3 +- .../{ => Internal}/FormFileCollection.cs | 0 .../{ => Internal}/ItemsDictionary.cs | 0 .../{ => Internal}/ParsingHelpers.cs | 2 +- .../{ => Internal}/QueryCollection.cs | 20 +++++------ .../{ => Internal}/ReferenceReadStream.cs | 0 .../{ => Internal}/RequestCookieCollection.cs | 14 ++++---- .../{ => Internal}/ResponseCookies.cs | 0 .../OwinEnvironment.cs | 2 -- .../OwinExtensions.cs | 1 - .../HttpResponseWritingExtensionsTests.cs | 1 - .../MapPathMiddlewareTests.cs | 1 - .../MapPredicateMiddlewareTests.cs | 2 -- .../UseMiddlewareTest.cs | 1 - .../HeaderDictionaryTypeExtensionsTest.cs | 1 - .../ResponseExtensionTests.cs | 3 -- .../SendFileResponseExtensionsTests.cs | 2 -- .../UriHelperTests.cs | 1 - .../DefaultAuthenticationManagerTests.cs | 3 -- .../DefaultHttpContextTests.cs | 3 +- .../{ => Features}/FakeResponseFeature.cs | 3 +- .../{ => Features}/FormFeatureTests.cs | 2 +- .../HttpRequestIdentifierFeatureTests.cs | 3 +- .../{ => Features}/NonSeekableReadStream.cs | 2 +- .../{ => Features}/QueryFeatureTests.cs | 2 +- .../HeaderDictionaryTests.cs | 2 +- .../HttpContextFactoryTests.cs | 2 +- .../{ => Internal}/ApplicationBuilderTests.cs | 2 +- .../{ => Internal}/BufferingHelperTests.cs | 0 .../{ => Internal}/DefaultHttpRequestTests.cs | 0 .../DefaultHttpResponseTests.cs | 0 .../OwinEnvironmentTests.cs | 1 - .../OwinExtensionTests.cs | 1 - 66 files changed, 128 insertions(+), 175 deletions(-) rename src/Microsoft.AspNetCore.Http/{ => Internal}/ApplicationBuilder.cs (100%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/BufferingHelper.cs (100%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/Constants.cs (100%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/DefaultConnectionInfo.cs (98%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/DefaultHttpRequest.cs (98%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/DefaultHttpResponse.cs (98%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/DefaultWebSocketManager.cs (100%) rename src/Microsoft.AspNetCore.Http/{Features => Internal}/FormFile.cs (97%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/FormFileCollection.cs (100%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/ItemsDictionary.cs (100%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/ParsingHelpers.cs (99%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/QueryCollection.cs (86%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/ReferenceReadStream.cs (100%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/RequestCookieCollection.cs (92%) rename src/Microsoft.AspNetCore.Http/{ => Internal}/ResponseCookies.cs (100%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Features}/FakeResponseFeature.cs (89%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Features}/FormFeatureTests.cs (99%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Features}/HttpRequestIdentifierFeatureTests.cs (92%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Features}/NonSeekableReadStream.cs (97%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Features}/QueryFeatureTests.cs (93%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Internal}/ApplicationBuilderTests.cs (93%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Internal}/BufferingHelperTests.cs (100%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Internal}/DefaultHttpRequestTests.cs (100%) rename test/Microsoft.AspNetCore.Http.Tests/{ => Internal}/DefaultHttpResponseTests.cs (100%) diff --git a/samples/SampleApp/PooledHttpContext.cs b/samples/SampleApp/PooledHttpContext.cs index 9e124ebaf4..58166bb572 100644 --- a/samples/SampleApp/PooledHttpContext.cs +++ b/samples/SampleApp/PooledHttpContext.cs @@ -12,7 +12,7 @@ namespace SampleApp DefaultHttpRequest _pooledHttpRequest; DefaultHttpResponse _pooledHttpResponse; - public PooledHttpContext(IFeatureCollection featureCollection) : + public PooledHttpContext(IFeatureCollection featureCollection) : base(featureCollection) { } diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/samples/SampleApp/PooledHttpContextFactory.cs index ca22e01183..6743336466 100644 --- a/samples/SampleApp/PooledHttpContextFactory.cs +++ b/samples/SampleApp/PooledHttpContextFactory.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Text; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Extensions.ObjectPool; namespace SampleApp diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs index a1234ff61a..a405c7c9d4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs @@ -4,7 +4,6 @@ using System; using Microsoft.Extensions.Primitives; - namespace Microsoft.AspNetCore.Http.Internal { internal struct HeaderSegment : IEquatable @@ -13,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.Internal private readonly StringSegment _data; // - // Initializes a new instance of the class. + // Initializes a new instance of the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// - /// Gets an containing the keys of the - /// . + /// Gets an containing the keys of the + /// . /// /// - /// An containing the keys of the object - /// that implements . + /// An containing the keys of the object + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// - /// + /// /// key is null. /// bool ContainsKey(string key); @@ -58,10 +58,10 @@ namespace Microsoft.AspNetCore.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// - /// + /// /// key is null. /// bool TryGetValue(string key, out StringValues value); @@ -73,14 +73,14 @@ namespace Microsoft.AspNetCore.Http /// The key of the value to get. /// /// - /// The element with the specified key, or .Empty if the key is not present. + /// The element with the specified key, or StringValues.Empty if the key is not present. /// - /// + /// /// key is null. /// /// - /// has a different indexer contract than - /// , as it will return StringValues.Empty for missing entries + /// has a different indexer contract than + /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// StringValues this[string key] { get; } diff --git a/src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs index 9df3a78024..5d45ad2493 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs @@ -12,35 +12,35 @@ namespace Microsoft.AspNetCore.Http public interface IQueryCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// - /// Gets an containing the keys of the - /// . + /// Gets an containing the keys of the + /// . /// /// - /// An containing the keys of the object - /// that implements . + /// An containing the keys of the object + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// - /// + /// /// key is null. /// bool ContainsKey(string key); @@ -58,10 +58,10 @@ namespace Microsoft.AspNetCore.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// - /// + /// /// key is null. /// bool TryGetValue(string key, out StringValues value); @@ -73,15 +73,14 @@ namespace Microsoft.AspNetCore.Http /// The key of the value to get. /// /// - /// The element with the specified key, or . - /// Empty if the key is not present. + /// The element with the specified key, or StringValues.Empty if the key is not present. /// - /// + /// /// key is null. /// /// - /// has a different indexer contract than - /// , as it will return StringValues.Empty for missing entries + /// has a different indexer contract than + /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// StringValues this[string key] { get; } diff --git a/src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs index c1a7344cff..6e9444ac8f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs @@ -11,35 +11,35 @@ namespace Microsoft.AspNetCore.Http public interface IRequestCookieCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// - /// Gets an containing the keys of the - /// . + /// Gets an containing the keys of the + /// . /// /// - /// An containing the keys of the object - /// that implements . + /// An containing the keys of the object + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// - /// + /// /// key is null. /// bool ContainsKey(string key); @@ -57,10 +57,10 @@ namespace Microsoft.AspNetCore.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// - /// + /// /// key is null. /// bool TryGetValue(string key, out string value); @@ -72,14 +72,14 @@ namespace Microsoft.AspNetCore.Http /// The key of the value to get. /// /// - /// The element with the specified key, or .Empty if the key is not present. + /// The element with the specified key, or string.Empty if the key is not present. /// - /// + /// /// key is null. /// /// - /// has a different indexer contract than - /// , as it will return String.Empty for missing entries + /// has a different indexer contract than + /// , as it will return string.Empty for missing entries /// rather than throwing an Exception. /// string this[string key] { get; } diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index 24eb05e799..a9f79ba630 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -8,7 +8,6 @@ using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features.Authentication; -using Microsoft.AspNetCore.Http.Features.Authentication.Internal; namespace Microsoft.AspNetCore.Http.Authentication.Internal { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs index 4e99c52964..7feb5324a6 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs @@ -9,10 +9,9 @@ using Microsoft.AspNetCore.Http.Authentication; using Microsoft.AspNetCore.Http.Authentication.Internal; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features.Authentication; -using Microsoft.AspNetCore.Http.Features.Authentication.Internal; -using Microsoft.AspNetCore.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { public class DefaultHttpContext : HttpContext { @@ -72,7 +71,7 @@ namespace Microsoft.AspNetCore.Http.Internal _websockets = null; } } - + private IItemsFeature ItemsFeature => _features.Fetch(ref _features.Cache.Items, f => new ItemsFeature()); @@ -165,7 +164,7 @@ namespace Microsoft.AspNetCore.Http.Internal } } - + public override void Abort() { diff --git a/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs index f3fd228853..9a14b65712 100644 --- a/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs @@ -3,14 +3,10 @@ using System.Security.Claims; -namespace Microsoft.AspNetCore.Http.Features.Authentication.Internal +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { - public HttpAuthenticationFeature() - { - } - public ClaimsPrincipal User { get; diff --git a/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs index 374e4dcd68..6790133467 100644 --- a/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { /// /// This type exists only for the purpose of unit testing where the user can directly set the diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index 1a9f00fa2b..d4fa79772a 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs index ab688ec777..2e8d5b0a1c 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs @@ -3,14 +3,10 @@ using System.Net; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class HttpConnectionFeature : IHttpConnectionFeature { - public HttpConnectionFeature() - { - } - public string ConnectionId { get; set; } public IPAddress LocalIpAddress { get; set; } diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs index b85484b879..c23051f6a3 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class HttpRequestFeature : IHttpRequestFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs index 289ecbdc85..34663937a5 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs @@ -4,7 +4,7 @@ using System; using System.Threading; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs index 17e6ec31d2..df327d0758 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class HttpRequestLifetimeFeature : IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs index ef8f845ca1..d0cb806ba5 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs @@ -4,9 +4,8 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class HttpResponseFeature : IHttpResponseFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs index e434666762..6bf0669b45 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs index 015fba5669..92d9aaa342 100644 --- a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs @@ -5,7 +5,7 @@ using System; using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.WebUtilities; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs index 0102ab7f68..49ae550676 100644 --- a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs @@ -7,14 +7,14 @@ using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class RequestCookiesFeature : IRequestCookiesFeature { private FeatureReferences _features; private StringValues _original; private IRequestCookieCollection _parsedValues; - + public RequestCookiesFeature(IRequestCookieCollection cookies) { if (cookies == null) diff --git a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs index 9481ac0a8e..59b8f68bb8 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs @@ -6,7 +6,7 @@ using System.Text; using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.ObjectPool; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { /// /// Default implementation of . diff --git a/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs index 3cd172a0d0..d1cf4e6cba 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs index 081cf97b75..f9bfcdef7f 100644 --- a/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs @@ -5,14 +5,10 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class TlsConnectionFeature : ITlsConnectionFeature { - public TlsConnectionFeature() - { - } - public X509Certificate2 ClientCertificate { get; set; } public Task GetClientCertificateAsync(CancellationToken cancellationToken) diff --git a/src/Microsoft.AspNetCore.Http/FormCollection.cs b/src/Microsoft.AspNetCore.Http/FormCollection.cs index 6e44c39aad..564fdcbb29 100644 --- a/src/Microsoft.AspNetCore.Http/FormCollection.cs +++ b/src/Microsoft.AspNetCore.Http/FormCollection.cs @@ -4,9 +4,10 @@ using System; using System.Collections; using System.Collections.Generic; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { /// /// Contains the parsed form values. @@ -20,7 +21,7 @@ namespace Microsoft.AspNetCore.Http.Internal #else private static readonly string[] EmptyKeys = new string[0]; private static readonly StringValues[] EmptyValues = new StringValues[0]; -#endif +#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; @@ -77,9 +78,9 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -101,10 +102,10 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -119,7 +120,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) @@ -131,9 +132,9 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. + /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) @@ -148,7 +149,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection, boxes in non-empty path. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator> IEnumerable>.GetEnumerator() { if (Store == null || Store.Count == 0) @@ -163,7 +164,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection, boxes in non-empty path. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator IEnumerable.GetEnumerator() { if (Store == null || Store.Count == 0) diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 304457459e..6fc02201ba 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { /// /// Represents a wrapper for RequestHeaders and ResponseHeaders. @@ -19,13 +19,13 @@ namespace Microsoft.AspNetCore.Http.Internal #else private static readonly string[] EmptyKeys = new string[0]; private static readonly StringValues[] EmptyValues = new StringValues[0]; -#endif +#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; - public HeaderDictionary() + public HeaderDictionary() { } @@ -98,9 +98,9 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -110,9 +110,9 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Gets a value that indicates whether the is in read-only mode. + /// Gets a value that indicates whether the is in read-only mode. /// - /// true if the is in read-only mode; otherwise, false. + /// true if the is in read-only mode; otherwise, false. public bool IsReadOnly { get @@ -207,10 +207,10 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -221,9 +221,9 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Copies the elements to a one-dimensional Array instance at the specified index. + /// Copies the elements to a one-dimensional Array instance at the specified index. /// - /// The one-dimensional Array that is the destination of the specified objects copied from the . + /// The one-dimensional Array that is the destination of the specified objects copied from the . /// The zero-based index in at which copying begins. public void CopyTo(KeyValuePair[] array, int arrayIndex) { @@ -279,7 +279,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) @@ -293,7 +293,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) @@ -307,7 +307,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator> IEnumerable>.GetEnumerator() { if (Store == null || Store.Count == 0) @@ -321,7 +321,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator IEnumerable.GetEnumerator() { if (Store == null || Store.Count == 0) diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs index be6bb471a6..9bb3dc375a 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs @@ -1,15 +1,14 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; #if NET451 -using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting; +using System.Runtime.Remoting.Messaging; #elif NETSTANDARD1_3 using System.Threading; #endif -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { public class HttpContextAccessor : IHttpContextAccessor { diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs index 95efc68bf9..7acd6a9653 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs @@ -4,10 +4,9 @@ using System; using System.Text; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Extensions.ObjectPool; -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { public class HttpContextFactory : IHttpContextFactory { diff --git a/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs rename to src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNetCore.Http/BufferingHelper.cs b/src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/BufferingHelper.cs rename to src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs diff --git a/src/Microsoft.AspNetCore.Http/Constants.cs b/src/Microsoft.AspNetCore.Http/Internal/Constants.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Constants.cs rename to src/Microsoft.AspNetCore.Http/Internal/Constants.cs diff --git a/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs similarity index 98% rename from src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs rename to src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs index 35c8c584a7..02db70767e 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs @@ -6,7 +6,6 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Features.Internal; namespace Microsoft.AspNetCore.Http.Internal { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs similarity index 98% rename from src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs rename to src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs index 2d5abcf7af..f761cec1ae 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs @@ -6,7 +6,6 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Http.Internal diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs similarity index 98% rename from src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs rename to src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs index 6105ff1c5b..2073f8255e 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs @@ -5,7 +5,6 @@ using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Http.Internal @@ -37,7 +36,7 @@ namespace Microsoft.AspNetCore.Http.Internal private IResponseCookiesFeature ResponseCookiesFeature => _features.Fetch(ref _features.Cache.Cookies, f => new ResponseCookiesFeature(f)); - + public override HttpContext HttpContext { get { return _context; } } diff --git a/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs rename to src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs b/src/Microsoft.AspNetCore.Http/Internal/FormFile.cs similarity index 97% rename from src/Microsoft.AspNetCore.Http/Features/FormFile.cs rename to src/Microsoft.AspNetCore.Http/Internal/FormFile.cs index 3a7b34153b..b4a3f4d91f 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/FormFile.cs @@ -5,9 +5,8 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNetCore.Http/FormFileCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/FormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/FormFileCollection.cs rename to src/Microsoft.AspNetCore.Http/Internal/FormFileCollection.cs diff --git a/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs b/src/Microsoft.AspNetCore.Http/Internal/ItemsDictionary.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/ItemsDictionary.cs rename to src/Microsoft.AspNetCore.Http/Internal/ItemsDictionary.cs diff --git a/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs similarity index 99% rename from src/Microsoft.AspNetCore.Http/ParsingHelpers.cs rename to src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs index 7a018ebd1a..5e406d8513 100644 --- a/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Http.Internal private readonly StringSegment _data; // - // Initializes a new instance of the class. + // Initializes a new instance of the structure. // public HeaderSegment(StringSegment formatting, StringSegment data) { diff --git a/src/Microsoft.AspNetCore.Http/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs similarity index 86% rename from src/Microsoft.AspNetCore.Http/QueryCollection.cs rename to src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs index 1809635d8b..f2db4a874c 100644 --- a/src/Microsoft.AspNetCore.Http/QueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Http.Internal #else private static readonly string[] EmptyKeys = new string[0]; private static readonly StringValues[] EmptyValues = new StringValues[0]; -#endif +#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; @@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Http.Internal private Dictionary Store { get; set; } - public QueryCollection() + public QueryCollection() { } @@ -71,9 +71,9 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -99,10 +99,10 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -117,7 +117,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) @@ -131,7 +131,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) @@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator> IEnumerable>.GetEnumerator() { if (Store == null || Store.Count == 0) @@ -159,7 +159,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator IEnumerable.GetEnumerator() { if (Store == null || Store.Count == 0) diff --git a/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs rename to src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs diff --git a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs similarity index 92% rename from src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs rename to src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs index 68a2f35968..afc34489e7 100644 --- a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Http.Internal private static readonly string[] EmptyKeys = Array.Empty(); #else private static readonly string[] EmptyKeys = new string[0]; -#endif +#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; @@ -59,7 +59,7 @@ namespace Microsoft.AspNetCore.Http.Internal return null; } } - + public static RequestCookieCollection Parse(IList values) { if (values.Count == 0) @@ -135,7 +135,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an struct enumerator that iterates through a collection without boxing. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) @@ -150,7 +150,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Returns an enumerator that iterates through a collection, boxes in non-empty path. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator> IEnumerable>.GetEnumerator() { if (Store == null || Store.Count == 0) @@ -159,13 +159,13 @@ namespace Microsoft.AspNetCore.Http.Internal return EmptyIEnumeratorType; } // Boxed Enumerator - return GetEnumerator(); + return GetEnumerator(); } /// /// Returns an enumerator that iterates through a collection, boxes in non-empty path. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. IEnumerator IEnumerable.GetEnumerator() { if (Store == null || Store.Count == 0) @@ -176,7 +176,7 @@ namespace Microsoft.AspNetCore.Http.Internal // Boxed Enumerator return GetEnumerator(); } - + public struct Enumerator : IEnumerator> { // Do NOT make this readonly, or MoveNext will not work diff --git a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/ResponseCookies.cs rename to src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index fb0d954284..45bd5884aa 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -17,8 +17,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features.Authentication; -using Microsoft.AspNetCore.Http.Features.Authentication.Internal; -using Microsoft.AspNetCore.Http.Features.Internal; namespace Microsoft.AspNetCore.Owin { diff --git a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs index a06530cd9d..0344c1a552 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.Owin; namespace Microsoft.AspNetCore.Builder diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs index 42ca2a227f..f8e9e27d1c 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,7 +3,6 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Http diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index a7966947be..aaee3cc318 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -5,7 +5,6 @@ using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Builder.Extensions diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index b970ee8d34..0313a730d5 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Builder.Extensions diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index f1b6e327b6..ce197e0c17 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Http.Abstractions; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Http diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index 4161625ea6..1d01466284 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNetCore.Http.Internal; using Microsoft.Net.Http.Headers; using Xunit; diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs index d63f2b8429..ae6b147fd2 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -2,12 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Internal; -using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNetCore.Http.Extensions diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index c1e145c34d..f4c7c0f2a9 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -1,11 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. See License.txt in the project root for license information. -using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Http.Extensions.Tests diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index 7bd7159b3c..06c4f4a383 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Http.Extensions diff --git a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 3d547ea05a..85968a9425 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -4,10 +4,7 @@ using System; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features.Authentication; -using Microsoft.AspNetCore.Http.Features.Authentication.Internal; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Http.Authentication.Internal diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index fe58c81098..b88e90a5b9 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -9,10 +9,9 @@ using System.Reflection; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Http.Features.Internal; using Xunit; -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/FakeResponseFeature.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FakeResponseFeature.cs similarity index 89% rename from test/Microsoft.AspNetCore.Http.Tests/FakeResponseFeature.cs rename to test/Microsoft.AspNetCore.Http.Tests/Features/FakeResponseFeature.cs index 10cd5cc6d5..43a7acab58 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/FakeResponseFeature.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FakeResponseFeature.cs @@ -4,9 +4,8 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Features.Internal; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class FakeResponseFeature : HttpResponseFeature { diff --git a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs similarity index 99% rename from test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index 280e77774f..e4f01b86bb 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.WebUtilities; using Xunit; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class FormFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/HttpRequestIdentifierFeatureTests.cs similarity index 92% rename from test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Features/HttpRequestIdentifierFeatureTests.cs index 95c3f39f06..7b17028cdf 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/HttpRequestIdentifierFeatureTests.cs @@ -1,10 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNetCore.Http.Features.Internal; using Xunit; -namespace Microsoft.AspNetCore.Http.Tests +namespace Microsoft.AspNetCore.Http.Features { public class HttpRequestIdentifierFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/NonSeekableReadStream.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/NonSeekableReadStream.cs similarity index 97% rename from test/Microsoft.AspNetCore.Http.Tests/NonSeekableReadStream.cs rename to test/Microsoft.AspNetCore.Http.Tests/Features/NonSeekableReadStream.cs index 2e6af5ab4d..279da7992b 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/NonSeekableReadStream.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/NonSeekableReadStream.cs @@ -6,7 +6,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class NonSeekableReadStream : Stream { diff --git a/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs similarity index 93% rename from test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs index c56b4962c9..0b9399780c 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs @@ -3,7 +3,7 @@ using Xunit; -namespace Microsoft.AspNetCore.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features { public class QueryFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index 3d82b07a38..a1fac3658e 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index 29029c4ad8..dd476f8116 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.ObjectPool; using Xunit; -namespace Microsoft.AspNetCore.Http.Internal +namespace Microsoft.AspNetCore.Http { public class HttpContextFactoryTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs similarity index 93% rename from test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs index 280e51bf41..3a1a4b1606 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.Http; using Xunit; namespace Microsoft.AspNetCore.Builder.Internal diff --git a/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/BufferingHelperTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Internal/BufferingHelperTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpResponseTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpResponseTests.cs diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs index 5c076b61fc..7cd6ef8826 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Security.Claims; using System.Threading; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Owin diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs index 66c62334bb..c4c51fba0a 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.DependencyInjection; using Xunit; From 3a97a6bdfdcc3787bf4b68cecdf277588de5ee76 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 31 Mar 2016 12:35:20 -0700 Subject: [PATCH 540/846] #602 Invoke APM callbacks on the threadpool. --- .../Internal/ReferenceReadStream.cs | 23 +++++++++++++------ .../BufferedReadStream.cs | 18 ++++++++++++++- .../FileBufferingReadStream.cs | 23 +++++++++++++------ .../MultipartReaderStream.cs | 23 +++++++++++++------ 4 files changed, 65 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs index be51a2f487..8a8c1e95de 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs @@ -139,19 +139,28 @@ namespace Microsoft.AspNetCore.Http.Internal if (callback != null) { - try + // Offload callbacks to avoid stack dives on sync completions. + var ignored = Task.Run(() => { - callback(tcs.Task); - } - catch (Exception) - { - // Suppress exceptions on background threads. - } + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + }); } } public override int EndRead(IAsyncResult asyncResult) { + if (asyncResult == null) + { + throw new ArgumentNullException(nameof(asyncResult)); + } + var task = (Task)asyncResult; return task.GetAwaiter().GetResult(); } diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs index f9ea281d05..6cf2fa7d11 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs @@ -229,7 +229,18 @@ namespace Microsoft.AspNetCore.WebUtilities tcs.TrySetResult(toCopy); if (callback != null) { - callback(tcs.Task); + // Offload callbacks to avoid stack dives on sync completions. + var ignored = Task.Run(() => + { + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + }); } return tcs.Task; } @@ -239,6 +250,11 @@ namespace Microsoft.AspNetCore.WebUtilities public override int EndRead(IAsyncResult asyncResult) { + if (asyncResult == null) + { + throw new ArgumentNullException(nameof(asyncResult)); + } + Task task = asyncResult as Task; if (task != null) { diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs index 06f9de2644..ada0c67bf4 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs @@ -232,19 +232,28 @@ namespace Microsoft.AspNetCore.WebUtilities if (callback != null) { - try + // Offload callbacks to avoid stack dives on sync completions. + var ignored = Task.Run(() => { - callback(tcs.Task); - } - catch (Exception) - { - // Suppress exceptions on background threads. - } + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + }); } } public override int EndRead(IAsyncResult asyncResult) { + if (asyncResult == null) + { + throw new ArgumentNullException(nameof(asyncResult)); + } + var task = (Task)asyncResult; return task.GetAwaiter().GetResult(); } diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index c94b27b003..09f11959df 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -184,19 +184,28 @@ namespace Microsoft.AspNetCore.WebUtilities if (callback != null) { - try + // Offload callbacks to avoid stack dives on sync completions. + var ignored = Task.Run(() => { - callback(tcs.Task); - } - catch (Exception) - { - // Suppress exceptions on background threads. - } + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + }); } } public override int EndRead(IAsyncResult asyncResult) { + if (asyncResult == null) + { + throw new ArgumentNullException(nameof(asyncResult)); + } + var task = (Task)asyncResult; return task.GetAwaiter().GetResult(); } From ac12319cd75d9383b5f5ea1c8edf6a320e634592 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 31 Mar 2016 16:12:00 -0700 Subject: [PATCH 541/846] #333 Add doc comments for feature interfaces. --- .../IHttpRequestFeature.cs | 47 +++++++++++++++++++ .../IHttpRequestLifetimeFeature.cs | 10 ++++ .../IHttpResponseFeature.cs | 39 +++++++++++++++ .../IHttpSendFileFeature.cs | 13 +++++ .../IHttpUpgradeFeature.cs | 10 ++++ .../IHttpWebSocketFeature.cs | 9 ++++ .../ISession.cs | 35 ++++++++++++++ 7 files changed, 163 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs index 4b52060177..16511caa74 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs @@ -5,15 +5,62 @@ using System.IO; namespace Microsoft.AspNetCore.Http.Features { + /// + /// Contains the details of a given request. These properties should all be mutable. + /// None of these properties should ever be set to null. + /// public interface IHttpRequestFeature { + /// + /// The HTTP-version as defined in RFC 7230. E.g. "HTTP/1.1" + /// string Protocol { get; set; } + + /// + /// The request uri scheme. E.g. "http" or "https". Note this value is not included + /// in the original request, it is inferred by checking if the transport used a TLS + /// connection or not. + /// string Scheme { get; set; } + + /// + /// The request method as defined in RFC 7230. E.g. "GET", "HEAD", "POST", etc.. + /// string Method { get; set; } + + /// + /// The first portion of the request path associated with application root. The value + /// is un-escaped. The value may be string.Empty. + /// string PathBase { get; set; } + + /// + /// The portion of the request path that identifies the requested resource. The value + /// is un-escaped. The value may be string.Empty if contains the + /// full path. + /// string Path { get; set; } + + /// + /// The query portion of the request-target as defined in RFC 7230. The value + /// may be string.Empty. If not empty then the leading '?' will be included. The value + /// is in its original form, without un-escaping. + /// string QueryString { get; set; } + + /// + /// Headers included in the request, aggregated by header name. The values are not split + /// or merged across header lines. E.g. The following headers: + /// HeaderA: value1, value2 + /// HeaderA: value3 + /// Result in Headers["HeaderA"] = { "value1, value2", "value3" } + /// IHeaderDictionary Headers { get; set; } + + /// + /// A representing the request body, if any. Stream.Null may be used + /// to represent an empty request body. + /// Stream Body { get; set; } } } diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs index 3a93c3d1e5..1bdac15766 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs @@ -7,7 +7,17 @@ namespace Microsoft.AspNetCore.Http.Features { public interface IHttpRequestLifetimeFeature { + /// + /// A that fires if the request is aborted and + /// the application should cease processing. The token will not fire if the request + /// completes successfully. + /// CancellationToken RequestAborted { get; set; } + + /// + /// Forcefully aborts the request if it has not already completed. This will result in + /// RequestAborted being triggered. + /// void Abort(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs index 8ea43d61fd..9d3b957efb 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs @@ -7,14 +7,53 @@ using System.Threading.Tasks; namespace Microsoft.AspNetCore.Http.Features { + /// + /// Represents the fields and state of an HTTP response. + /// public interface IHttpResponseFeature { + /// + /// The status-code as defined in RFC 7230. The default value is 200. + /// int StatusCode { get; set; } + + /// + /// The reason-phrase as defined in RFC 7230. Note this field is no longer supported by HTTP/2. + /// string ReasonPhrase { get; set; } + + /// + /// The response headers to send. Headers with multiple values will be emitted as multiple headers. + /// IHeaderDictionary Headers { get; set; } + + /// + /// The for writing the response body. + /// Stream Body { get; set; } + + /// + /// Indicates if the response has started. If true, the , + /// , and are now immutable, and + /// OnStarting should no longer be called. + /// bool HasStarted { get; } + + /// + /// Registers a callback to be invoked just before the response starts. This is the + /// last chance to modify the , , or + /// . + /// + /// The callback to invoke when starting the response. + /// The state to pass into the callback. void OnStarting(Func callback, object state); + + /// + /// Registers a callback to be invoked after a response has fully completed. This is + /// intended for resource cleanup. + /// + /// The callback to invoke after the response has completed. + /// The state to pass into the callback. void OnCompleted(Func callback, object state); } } diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs index 9418a7ffbe..1e2684130f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs @@ -1,13 +1,26 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.IO; using System.Threading; using System.Threading.Tasks; namespace Microsoft.AspNetCore.Http.Features { + /// + /// Provides an efficient mechanism for transferring files from disk to the network. + /// public interface IHttpSendFileFeature { + /// + /// Sends the requested file in the response body. This may bypass the IHttpResponseFeature.Body + /// . A response may include multiple writes. + /// + /// The full disk path to the file. + /// The offset in the file to start at. + /// The number of bytes to send, or null to send the remainder of the file. + /// A used to abort the transmission. + /// Task SendFileAsync(string path, long offset, long? count, CancellationToken cancellation); } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs index e98065bc4d..e434fe0b97 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs @@ -8,7 +8,17 @@ namespace Microsoft.AspNetCore.Http.Features { public interface IHttpUpgradeFeature { + /// + /// Indicates if the server can upgrade this request to an opaque, bidirectional stream. + /// bool IsUpgradableRequest { get; } + + /// + /// Attempt to upgrade the request to an opaque, bidirectional stream. The response status code + /// and headers need to be set before this is invoked. Check + /// before invoking. + /// + /// Task UpgradeAsync(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs index 49b28bc38f..c1d116126a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs @@ -8,8 +8,17 @@ namespace Microsoft.AspNetCore.Http.Features { public interface IHttpWebSocketFeature { + /// + /// Indicates if this is a WebSocket upgrade request. + /// bool IsWebSocketRequest { get; } + /// + /// Attempts to upgrade the request to a . Check + /// before invoking this. + /// + /// + /// Task AcceptAsync(WebSocketAcceptContext context); } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index 0904703d39..74b63baa62 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -8,20 +8,55 @@ namespace Microsoft.AspNetCore.Http { public interface ISession { + /// + /// A unique identifier for the current session. This is not the same as the session cookie + /// since the cookie lifetime may not be the same as the session entry lifetime in the data store. + /// string Id { get; } + /// + /// Enumerates all the keys, if any. + /// IEnumerable Keys { get; } + /// + /// Load the session from the data store. This may throw if the data store is unavailable. + /// + /// Task LoadAsync(); + /// + /// Store the session in the data store. This may throw if the data store is unavailable. + /// + /// Task CommitAsync(); + /// + /// Retrieve the value of the given key, if present. + /// + /// + /// + /// bool TryGetValue(string key, out byte[] value); + /// + /// Set the given key and value in the current session. This will throw if the session + /// was not established prior to sending the response. + /// + /// + /// void Set(string key, byte[] value); + /// + /// Remove the given key from the session if present. + /// + /// void Remove(string key); + /// + /// Remove all entries from the current session, if any. + /// The session cookie is not removed. + /// void Clear(); } } \ No newline at end of file From 8196f2ab81f6ae0d21e54c3ebfb20c4eba4e8aa1 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 1 Apr 2016 11:34:45 -0700 Subject: [PATCH 542/846] #605 Fix regressions in FormReader / FileBufferingReadStream. --- .../FileBufferingReadStream.cs | 45 ++++++- .../Features/FormFeatureTests.cs | 125 ++++++++++++++++++ 2 files changed, 164 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs index ada0c67bf4..3d10321c7f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs @@ -192,10 +192,26 @@ namespace Microsoft.AspNetCore.WebUtilities if (_inMemory && _buffer.Length + read > _memoryThreshold) { _inMemory = false; + var oldBuffer = _buffer; _buffer = CreateTempFile(); - _buffer.Write(_rentedBuffer, 0, (int)_buffer.Length); - _bytePool.Return(_rentedBuffer); - _rentedBuffer = null; + if (_rentedBuffer == null) + { + oldBuffer.Position = 0; + var rentedBuffer = _bytePool.Rent(Math.Min((int)oldBuffer.Length, _maxRentedBufferSize)); + var copyRead = oldBuffer.Read(rentedBuffer, 0, rentedBuffer.Length); + while (copyRead > 0) + { + _buffer.Write(rentedBuffer, 0, copyRead); + copyRead = oldBuffer.Read(rentedBuffer, 0, rentedBuffer.Length); + } + _bytePool.Return(rentedBuffer); + } + else + { + _buffer.Write(_rentedBuffer, 0, (int)oldBuffer.Length); + _bytePool.Return(_rentedBuffer); + _rentedBuffer = null; + } } if (read > 0) @@ -272,10 +288,27 @@ namespace Microsoft.AspNetCore.WebUtilities if (_inMemory && _buffer.Length + read > _memoryThreshold) { _inMemory = false; + var oldBuffer = _buffer; _buffer = CreateTempFile(); - await _buffer.WriteAsync(_rentedBuffer, 0, (int)_buffer.Length, cancellationToken); - _bytePool.Return(_rentedBuffer); - _rentedBuffer = null; + if (_rentedBuffer == null) + { + oldBuffer.Position = 0; + var rentedBuffer = _bytePool.Rent(Math.Min((int)oldBuffer.Length, _maxRentedBufferSize)); + // oldBuffer is a MemoryStream, no need to do async reads. + var copyRead = oldBuffer.Read(rentedBuffer, 0, rentedBuffer.Length); + while (copyRead > 0) + { + await _buffer.WriteAsync(rentedBuffer, 0, copyRead, cancellationToken); + copyRead = oldBuffer.Read(rentedBuffer, 0, rentedBuffer.Length); + } + _bytePool.Return(rentedBuffer); + } + else + { + await _buffer.WriteAsync(_rentedBuffer, 0, (int)oldBuffer.Length, cancellationToken); + _bytePool.Return(_rentedBuffer); + _rentedBuffer = null; + } } if (read > 0) diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index e4f01b86bb..a1472eeefa 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Linq; using System.Text; @@ -347,5 +348,129 @@ namespace Microsoft.AspNetCore.Http.Features await responseFeature.CompleteAsync(); } + + [Theory] + // FileBufferingReadStream transitions to disk storage after 30kb, and stops pooling buffers at 1mb. + [InlineData(true, 1024)] + [InlineData(false, 1024)] + [InlineData(true, 40 * 1024)] + [InlineData(false, 40 * 1024)] + [InlineData(true, 4 * 1024 * 1024)] + [InlineData(false, 4 * 1024 * 1024)] + public async Task ReadFormAsync_MultipartWithFieldAndMediumFile_ReturnsParsedFormCollection(bool bufferRequest, int fileSize) + { + var fileContents = CreateFile(fileSize); + var formContent = CreateMultipartWithFormAndFile(fileContents); + var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new NonSeekableReadStream(formContent); + + if (bufferRequest) + { + context.Request.EnableRewind(); + } + + // Not cached yet + var formFeature = context.Features.Get(); + Assert.Null(formFeature); + + var formCollection = await context.Request.ReadFormAsync(); + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.Features.Get(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); + Assert.Same(formCollection, context.Request.Form); + + // Content + Assert.Equal(1, formCollection.Count); + Assert.Equal("Foo", formCollection["description"]); + + Assert.NotNull(formCollection.Files); + Assert.Equal(1, formCollection.Files.Count); + + var file = formCollection.Files["myfile1"]; + Assert.Equal("text/html", file.ContentType); + Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""", file.ContentDisposition); + using (var body = file.OpenReadStream()) + { + Assert.True(body.CanSeek); + CompareStreams(fileContents, body); + } + + await responseFeature.CompleteAsync(); + } + + private Stream CreateFile(int size) + { + var stream = new MemoryStream(size); + var bytes = Encoding.ASCII.GetBytes("HelloWorld_ABCDEFGHIJKLMNOPQRSTUVWXYZ.abcdefghijklmnopqrstuvwxyz,0123456789;"); + int written = 0; + while (written < size) + { + var toWrite = Math.Min(size - written, bytes.Length); + stream.Write(bytes, 0, toWrite); + written += toWrite; + } + stream.Position = 0; + return stream; + } + + private Stream CreateMultipartWithFormAndFile(Stream fileContents) + { + var stream = new MemoryStream(); + var header = +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"description\"\r\n" + +"\r\n" + +"Foo\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n"; + var footer = +"\r\n--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + + var bytes = Encoding.ASCII.GetBytes(header); + stream.Write(bytes, 0, bytes.Length); + + fileContents.CopyTo(stream); + fileContents.Position = 0; + + bytes = Encoding.ASCII.GetBytes(footer); + stream.Write(bytes, 0, bytes.Length); + stream.Position = 0; + return stream; + } + + private void CompareStreams(Stream streamA, Stream streamB) + { + Assert.Equal(streamA.Length, streamB.Length); + byte[] bytesA = new byte[1024], bytesB = new byte[1024]; + var readA = streamA.Read(bytesA, 0, bytesA.Length); + var readB = streamB.Read(bytesB, 0, bytesB.Length); + Assert.Equal(readA, readB); + var loops = 0; + while (readA > 0) + { + for (int i = 0; i < readA; i++) + { + if (bytesA[i] != bytesB[i]) + { + throw new Exception($"Value mismatch at loop {loops}, index {i}; A:{bytesA[i]}, B:{bytesB[i]}"); + } + } + + readA = streamA.Read(bytesA, 0, bytesA.Length); + readB = streamB.Read(bytesB, 0, bytesB.Length); + Assert.Equal(readA, readB); + loops++; + } + } } } From 1f36d50a4efb4365691320f45d5facebc442072b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 6 Apr 2016 09:46:20 -0700 Subject: [PATCH 543/846] Updating to release. --- NuGet.config | 4 ++-- build.ps1 | 2 +- build.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index 8f2f99691a..cf8bff13bb 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/release.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index f4208100eb..f88fe4052e 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/release.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi From e07008ddec3e5eb45cd68ce5f6e8d984f76494bc Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 5 Apr 2016 09:25:54 -0700 Subject: [PATCH 544/846] Prevent double flush in HttpResponseStreamWriter. --- .../HttpResponseStreamWriter.cs | 8 ++--- .../HttpResponseStreamWriterTest.cs | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs index 9ec8da2338..f5568fb4a3 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs @@ -302,12 +302,12 @@ namespace Microsoft.AspNetCore.WebUtilities 0, flush: flushEncoder); + _charBufferCount = 0; + if (count > 0) { _stream.Write(_byteBuffer, 0, count); } - - _charBufferCount = 0; } // Note: our FlushInternalAsync method does NOT flush the underlying stream. This would result in @@ -327,12 +327,12 @@ namespace Microsoft.AspNetCore.WebUtilities 0, flush: flushEncoder); + _charBufferCount = 0; + if (count > 0) { await _stream.WriteAsync(_byteBuffer, 0, count); } - - _charBufferCount = 0; } private void CopyToCharBuffer(string value, ref int index, ref int count) diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 372525731d..9c1d7dcb6b 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -220,6 +220,29 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(byteLength, stream.Length); } + [Theory] + [InlineData(1023)] + [InlineData(1024)] + public async Task FlushWriteThrows_DontFlushInDispose(int byteLength) + { + // Arrange + var stream = new TestMemoryStream() { ThrowOnWrite = true }; + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + await writer.WriteAsync(new string('a', byteLength)); + await Assert.ThrowsAsync(() => writer.FlushAsync()); + + // Act + writer.Dispose(); + + // Assert + Assert.Equal(1, stream.WriteAsyncCallCount); + Assert.Equal(0, stream.WriteCallCount); + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(0, stream.Length); + } + [Theory] [InlineData(1023)] [InlineData(1024)] @@ -419,6 +442,8 @@ namespace Microsoft.AspNetCore.WebUtilities.Test public int WriteAsyncCallCount { get; private set; } + public bool ThrowOnWrite { get; set; } + public override void Flush() { FlushCallCount++; @@ -434,12 +459,20 @@ namespace Microsoft.AspNetCore.WebUtilities.Test public override void Write(byte[] buffer, int offset, int count) { WriteCallCount++; + if (ThrowOnWrite) + { + throw new IOException("Test IOException"); + } base.Write(buffer, offset, count); } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { WriteAsyncCallCount++; + if (ThrowOnWrite) + { + throw new IOException("Test IOException"); + } return base.WriteAsync(buffer, offset, count, cancellationToken); } From b50cd32b8edc323e4adaa25dfdb5354aba470aa1 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 7 Apr 2016 15:29:54 -0700 Subject: [PATCH 545/846] Removing imports from src projects --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 9 ++++----- src/Microsoft.AspNetCore.Http.Extensions/project.json | 7 ++----- src/Microsoft.AspNetCore.Http.Features/project.json | 7 ++----- src/Microsoft.AspNetCore.Http/project.json | 7 ++----- src/Microsoft.AspNetCore.Owin/project.json | 8 ++------ src/Microsoft.AspNetCore.WebUtilities/project.json | 9 ++++----- src/Microsoft.Net.Http.Headers/project.json | 7 ++----- 7 files changed, 18 insertions(+), 36 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 8bed79501e..6aaeb09cc1 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -27,7 +27,9 @@ "frameworks": { "net451": { "frameworkAssemblies": { - "System.Runtime": { "type": "build" } + "System.Runtime": { + "type": "build" + } } }, "netstandard1.3": { @@ -36,10 +38,7 @@ "System.Linq.Expressions": "4.0.11-*", "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.1.0-*" - }, - "imports": [ - "dotnet5.4" - ] + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 231707f9bf..d20a79b21b 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -23,14 +23,11 @@ "System.Buffers": "4.0.0-*" }, "frameworks": { - "net451": { }, + "net451": {}, "netstandard1.3": { "dependencies": { "System.IO.FileSystem": "4.0.1-*" - }, - "imports": [ - "dotnet5.4" - ] + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 534ba03d3b..1591dff8f2 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -20,7 +20,7 @@ "Microsoft.Extensions.Primitives": "1.0.0-*" }, "frameworks": { - "net451": { }, + "net451": {}, "netstandard1.3": { "dependencies": { "System.Collections": "4.0.11-*", @@ -32,10 +32,7 @@ "System.Security.Claims": "4.0.1-*", "System.Security.Cryptography.X509Certificates": "4.1.0-*", "System.Security.Principal": "4.0.1-*" - }, - "imports": [ - "dotnet5.4" - ] + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 3027e66a12..b2ac67da68 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -25,14 +25,11 @@ "System.Buffers": "4.0.0-*" }, "frameworks": { - "net451": { }, + "net451": {}, "netstandard1.3": { "dependencies": { "System.Threading": "4.0.11-*" - }, - "imports": [ - "dotnet5.4" - ] + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index a5f53d0f54..6a4c6a8dfe 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -22,11 +22,7 @@ "Microsoft.AspNetCore.Http": "1.0.0-*" }, "frameworks": { - "net451": { }, - "netstandard1.3": { - "imports": [ - "dotnet5.4" - ] - } + "net451": {}, + "netstandard1.3": {} } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 336e6a4a21..6ae109fc44 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -24,7 +24,9 @@ "frameworks": { "net451": { "frameworkAssemblies": { - "System.Runtime": { "type": "build" } + "System.Runtime": { + "type": "build" + } } }, "netstandard1.3": { @@ -32,10 +34,7 @@ "System.Collections": "4.0.11-*", "System.IO": "4.1.0-*", "System.IO.FileSystem": "4.0.1-*" - }, - "imports": [ - "dotnet5.4" - ] + } } } } \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index c3fa7a950f..1dd40479b7 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -16,7 +16,7 @@ ], "xmlDoc": true }, - "dependencies": { }, + "dependencies": {}, "frameworks": { "netstandard1.1": { "dependencies": { @@ -28,10 +28,7 @@ "System.Runtime.Extensions": "4.1.0-*", "System.Text.Encoding": "4.0.11-*", "System.Buffers": "4.0.0-*" - }, - "imports": [ - "dotnet5.2" - ] + } } } } \ No newline at end of file From b0ebcc3aeb2be302572ce2f2d9787f432f85842f Mon Sep 17 00:00:00 2001 From: Jimmy Hannon Date: Thu, 14 Apr 2016 14:49:09 +0200 Subject: [PATCH 546/846] Update RunExtensions.cs small typo --- .../Extensions/RunExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs index 328c490c9e..1124043064 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs @@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Builder public static class RunExtensions { /// - /// Adds a terminal middleware delagate to the application's request pipeline. + /// Adds a terminal middleware delegate to the application's request pipeline. /// /// The instance. /// A delegate that handles the request. @@ -31,4 +31,4 @@ namespace Microsoft.AspNetCore.Builder app.Use(_ => handler); } } -} \ No newline at end of file +} From 440b8bc0bae7c8447b0267399343c1427eb8467c Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 14 Apr 2016 14:34:51 -0700 Subject: [PATCH 547/846] Migrate tests, tools and samples to portable --- .../project.json | 7 +++++-- .../project.json | 7 +++++-- test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 7 +++++-- test/Microsoft.AspNetCore.Http.Tests/project.json | 7 +++++-- test/Microsoft.AspNetCore.Owin.Tests/project.json | 7 +++++-- .../HttpResponseStreamWriterTest.cs | 4 ++-- test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 7 +++++-- test/Microsoft.Net.Http.Headers.Tests/project.json | 7 +++++-- 8 files changed, 37 insertions(+), 16 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 53d46c1296..89f0b35888 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -9,10 +9,13 @@ "xunit": "2.1.0" }, "frameworks": { - "netstandardapp1.5": { + "netcoreapp1.0": { "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + }, "dotnet-test-xunit": "1.0.0-dev-*", - "NETStandard.Library": "1.5.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 6be3f37115..231a6b5335 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -6,10 +6,13 @@ "xunit": "2.1.0" }, "frameworks": { - "netstandardapp1.5": { + "netcoreapp1.0": { "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + }, "dotnet-test-xunit": "1.0.0-dev-*", - "NETStandard.Library": "1.5.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 6eecb1fcd2..df5ad046eb 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -4,10 +4,13 @@ "xunit": "2.1.0" }, "frameworks": { - "netstandardapp1.5": { + "netcoreapp1.0": { "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + }, "dotnet-test-xunit": "1.0.0-dev-*", - "NETStandard.Library": "1.5.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index f1039dabcd..9e1e7cc91e 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -4,10 +4,13 @@ "xunit": "2.1.0" }, "frameworks": { - "netstandardapp1.5": { + "netcoreapp1.0": { "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + }, "dotnet-test-xunit": "1.0.0-dev-*", - "NETStandard.Library": "1.5.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 86313d922a..14b0a2149a 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -6,10 +6,13 @@ "xunit": "2.1.0" }, "frameworks": { - "netstandardapp1.5": { + "netcoreapp1.0": { "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + }, "dotnet-test-xunit": "1.0.0-dev-*", - "NETStandard.Library": "1.5.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 372525731d..1fe8ed17bd 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -312,7 +312,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [Theory] [InlineData("你好世界", "utf-16")] -#if !NETSTANDARDAPP1_5 +#if !NETCOREAPP1_0 // CoreCLR does not like shift_jis as an encoding. [InlineData("こんにちは世界", "shift_jis")] #endif @@ -343,7 +343,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [InlineData('你', 1023, "utf-16")] [InlineData('你', 1024, "utf-16")] [InlineData('你', 1050, "utf-16")] -#if !NETSTANDARDAPP1_5 +#if !NETCOREAPP1_0 // CoreCLR does not like shift_jis as an encoding. [InlineData('こ', 1023, "shift_jis")] [InlineData('こ', 1024, "shift_jis")] diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 9fc1fb6945..22d1b91b1f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -8,11 +8,14 @@ }, "testRunner": "xunit", "frameworks": { - "netstandardapp1.5": { + "netcoreapp1.0": { "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + }, "System.Text.Encoding.Extensions": "4.0.11-*", "dotnet-test-xunit": "1.0.0-dev-*", - "NETStandard.Library": "1.5.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 164e49f735..37b79db045 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -5,10 +5,13 @@ "xunit": "2.1.0" }, "frameworks": { - "netstandardapp1.5": { + "netcoreapp1.0": { "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + }, "dotnet-test-xunit": "1.0.0-dev-*", - "NETStandard.Library": "1.5.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ From 87b8d478e095e62df723696cf3cc53b1550d1b4b Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Mon, 18 Apr 2016 16:52:06 -0700 Subject: [PATCH 548/846] Bring Microsoft.NETCore.Platforms dependency back --- samples/SampleApp/project.json | 3 +-- test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json | 1 + test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json | 1 + test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 1 + test/Microsoft.AspNetCore.Http.Tests/project.json | 1 + test/Microsoft.AspNetCore.Owin.Tests/project.json | 1 + test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 1 + test/Microsoft.Net.Http.Headers.Tests/project.json | 1 + 8 files changed, 8 insertions(+), 2 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 25d699cf37..3d6d5e467f 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,8 +1,7 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNetCore.Http": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*" + "Microsoft.AspNetCore.Http": "1.0.0-*" }, "commands": { "SampleApp": "SampleApp" diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 89f0b35888..9da69bd6f9 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -4,6 +4,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Testing": "1.0.0-*", "xunit": "2.1.0" diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 231a6b5335..926a14d984 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index df5ad046eb..689db3f105 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http.Features": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 9e1e7cc91e..c7f41c04f7 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 14b0a2149a..b490af4867 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 22d1b91b1f..e502668201 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 37b79db045..4d15211e76 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,6 +1,7 @@ { "version": "1.0.0-*", "dependencies": { + "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.Net.Http.Headers": "1.0.0-*", "xunit": "2.1.0" }, From f429cd262bc4f5c58fae31c8affc9661320cc6fe Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 19 Apr 2016 14:54:02 -0700 Subject: [PATCH 549/846] Use latest build of dotnet-test-xunit --- test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Owin.Tests/project.json | 2 +- test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 9da69bd6f9..c8789c2209 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -16,7 +16,7 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-dev-*", + "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 926a14d984..b3af851c1f 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -13,7 +13,7 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-dev-*", + "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 689db3f105..5a464a3c59 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -11,7 +11,7 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-dev-*", + "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index c7f41c04f7..985b574bbc 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -11,7 +11,7 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-dev-*", + "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index b490af4867..931834256d 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -13,7 +13,7 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-dev-*", + "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index e502668201..fed448f2a3 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -16,7 +16,7 @@ "type": "platform" }, "System.Text.Encoding.Extensions": "4.0.11-*", - "dotnet-test-xunit": "1.0.0-dev-*", + "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 4d15211e76..d67f3b3e49 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -12,7 +12,7 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-dev-*", + "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ From 13f73c6101650299305e0dee5f51652db755045f Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 25 Apr 2016 11:59:40 -0700 Subject: [PATCH 550/846] Make the form body limits configurable. --- .../Features/FormFeature.cs | 61 +++- .../Features/FormOptions.cs | 26 ++ .../HttpContextFactory.cs | 16 +- .../Internal/BufferingHelper.cs | 9 +- .../RequestFormReaderExtensions.cs | 48 +++ src/Microsoft.AspNetCore.Http/project.json | 1 + .../BufferedReadStream.cs | 4 +- .../FileBufferingReadStream.cs | 45 ++- .../FormReader.cs | 148 +++++---- .../KeyValueAccumulator.cs | 2 + .../MultipartReader.cs | 48 ++- .../MultipartReaderStream.cs | 6 + .../StreamHelperExtensions.cs | 19 +- .../Features/FormFeatureTests.cs | 136 +------- .../HttpContextFactoryTests.cs | 5 +- .../FileBufferingReadStreamTests.cs | 294 ++++++++++++++++++ .../FormReaderTests.cs | 156 ++++++++++ .../MultipartReaderTests.cs | 33 ++ .../NonSeekableReadStream.cs | 72 +++++ 19 files changed, 894 insertions(+), 235 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http/Features/FormOptions.cs create mode 100644 src/Microsoft.AspNetCore.Http/RequestFormReaderExtensions.cs create mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs create mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs create mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index d4fa79772a..649f50d849 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -14,7 +14,10 @@ namespace Microsoft.AspNetCore.Http.Features { public class FormFeature : IFormFeature { + private static readonly FormOptions DefaultFormOptions = new FormOptions(); + private readonly HttpRequest _request; + private readonly FormOptions _options; private Task _parsedFormTask; private IFormCollection _form; @@ -27,15 +30,24 @@ namespace Microsoft.AspNetCore.Http.Features Form = form; } - public FormFeature(HttpRequest request) + : this(request, DefaultFormOptions) + { + } + + public FormFeature(HttpRequest request, FormOptions options) { if (request == null) { throw new ArgumentNullException(nameof(request)); } + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } _request = request; + _options = options; } private MediaTypeHeaderValue ContentType @@ -118,6 +130,11 @@ namespace Microsoft.AspNetCore.Http.Features cancellationToken.ThrowIfCancellationRequested(); + if (_options.BufferBody) + { + _request.EnableRewind(_options.MemoryBufferThreshold, _options.BufferBodyLengthLimit); + } + FormCollection formFields = null; FormFileCollection files = null; @@ -129,14 +146,27 @@ namespace Microsoft.AspNetCore.Http.Features if (HasApplicationFormContentType(contentType)) { var encoding = FilterEncoding(contentType.Encoding); - formFields = new FormCollection(await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken)); + using (var formReader = new FormReader(_request.Body, encoding) + { + KeyCountLimit = _options.KeyCountLimit, + KeyLengthLimit = _options.KeyLengthLimit, + ValueLengthLimit = _options.ValueLengthLimit, + }) + { + formFields = new FormCollection(await formReader.ReadFormAsync(cancellationToken)); + } } else if (HasMultipartFormContentType(contentType)) { var formAccumulator = new KeyValueAccumulator(); - var boundary = GetBoundary(contentType); - var multipartReader = new MultipartReader(boundary, _request.Body); + var boundary = GetBoundary(contentType, _options.MultipartBoundaryLengthLimit); + var multipartReader = new MultipartReader(boundary, _request.Body) + { + HeadersCountLimit = _options.MultipartHeadersCountLimit, + HeadersLengthLimit = _options.MultipartHeadersLengthLimit, + BodyLengthLimit = _options.MultipartBodyLengthLimit, + }; var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { @@ -145,7 +175,8 @@ namespace Microsoft.AspNetCore.Http.Features if (HasFileContentDisposition(contentDisposition)) { // Enable buffering for the file if not already done for the full body - section.EnableRewind(_request.HttpContext.Response.RegisterForDispose); + section.EnableRewind(_request.HttpContext.Response.RegisterForDispose, + _options.MemoryBufferThreshold, _options.MultipartBodyLengthLimit); // Find the end await section.Body.DrainAsync(cancellationToken); @@ -169,6 +200,10 @@ namespace Microsoft.AspNetCore.Http.Features { files = new FormFileCollection(); } + if (files.Count >= _options.KeyCountLimit) + { + throw new InvalidDataException($"Form key count limit {_options.KeyCountLimit} exceeded."); + } files.Add(file); } else if (HasFormDataContentDisposition(contentDisposition)) @@ -177,14 +212,20 @@ namespace Microsoft.AspNetCore.Http.Features // // value + // Do not limit the key name length here because the mulipart headers length limit is already in effect. var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); MediaTypeHeaderValue mediaType; MediaTypeHeaderValue.TryParse(section.ContentType, out mediaType); var encoding = FilterEncoding(mediaType?.Encoding); using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { + // The value length limit is enforced by MultipartBodyLengthLimit var value = await reader.ReadToEndAsync(); formAccumulator.Append(key, value); + if (formAccumulator.Count > _options.KeyCountLimit) + { + throw new InvalidDataException($"Form key count limit {_options.KeyCountLimit} exceeded."); + } } } else @@ -261,13 +302,17 @@ namespace Microsoft.AspNetCore.Http.Features } // Content-Type: multipart/form-data; boundary="----WebKitFormBoundarymx2fSWqWSd0OxQqq" - // TODO: Limit the length of boundary we accept. The spec says ~70 chars. - private static string GetBoundary(MediaTypeHeaderValue contentType) + // The spec says 70 characters is a reasonable limit. + private static string GetBoundary(MediaTypeHeaderValue contentType, int lengthLimit) { var boundary = HeaderUtilities.RemoveQuotes(contentType.Boundary); if (string.IsNullOrWhiteSpace(boundary)) { - throw new InvalidOperationException("Missing content-type boundary."); + throw new InvalidDataException("Missing content-type boundary."); + } + if (boundary.Length > lengthLimit) + { + throw new InvalidDataException($"Multipart boundary length limit {lengthLimit} exceeded."); } return boundary; } diff --git a/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs b/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs new file mode 100644 index 0000000000..2e6e8c5720 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.WebUtilities; + +namespace Microsoft.AspNetCore.Http.Features +{ + public class FormOptions + { + public const int DefaultMemoryBufferThreshold = 1024 * 64; + public const int DefaultBufferBodyLengthLimit = 1024 * 1024 * 128; + public const int DefaultMultipartBoundaryLengthLimit = 128; + public const long DefaultMultipartBodyLengthLimit = 1024 * 1024 * 128; + + public bool BufferBody { get; set; } = false; + public int MemoryBufferThreshold { get; set; } = DefaultMemoryBufferThreshold; + public long BufferBodyLengthLimit { get; set; } = DefaultBufferBodyLengthLimit; + public int KeyCountLimit { get; set; } = FormReader.DefaultKeyCountLimit; + public int KeyLengthLimit { get; set; } = FormReader.DefaultKeyLengthLimit; + public int ValueLengthLimit { get; set; } = FormReader.DefaultValueLengthLimit; + public int MultipartBoundaryLengthLimit { get; set; } = DefaultMultipartBoundaryLengthLimit; + public int MultipartHeadersCountLimit { get; set; } = MultipartReader.DefaultHeadersCountLimit; + public int MultipartHeadersLengthLimit { get; set; } = MultipartReader.DefaultHeadersLengthLimit; + public long MultipartBodyLengthLimit { get; set; } = DefaultMultipartBodyLengthLimit; + } +} diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs index 7acd6a9653..f2abfa8188 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs @@ -5,6 +5,7 @@ using System; using System.Text; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.ObjectPool; +using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.Http { @@ -12,20 +13,26 @@ namespace Microsoft.AspNetCore.Http { private readonly ObjectPool _builderPool; private readonly IHttpContextAccessor _httpContextAccessor; + private readonly FormOptions _formOptions; - public HttpContextFactory(ObjectPoolProvider poolProvider) - : this(poolProvider, httpContextAccessor: null) + public HttpContextFactory(ObjectPoolProvider poolProvider, IOptions formOptions) + : this(poolProvider, formOptions, httpContextAccessor: null) { } - public HttpContextFactory(ObjectPoolProvider poolProvider, IHttpContextAccessor httpContextAccessor) + public HttpContextFactory(ObjectPoolProvider poolProvider, IOptions formOptions, IHttpContextAccessor httpContextAccessor) { if (poolProvider == null) { throw new ArgumentNullException(nameof(poolProvider)); } + if (formOptions == null) + { + throw new ArgumentNullException(nameof(formOptions)); + } _builderPool = poolProvider.CreateStringBuilderPool(); + _formOptions = formOptions.Value; _httpContextAccessor = httpContextAccessor; } @@ -45,6 +52,9 @@ namespace Microsoft.AspNetCore.Http _httpContextAccessor.HttpContext = httpContext; } + var formFeature = new FormFeature(httpContext.Request, _formOptions); + featureCollection.Set(formFeature); + return httpContext; } diff --git a/src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs b/src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs index f7929f1532..b912f37116 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.Http.Internal } } - public static HttpRequest EnableRewind(this HttpRequest request, int bufferThreshold = DefaultBufferThreshold) + public static HttpRequest EnableRewind(this HttpRequest request, int bufferThreshold = DefaultBufferThreshold, long? bufferLimit = null) { if (request == null) { @@ -48,14 +48,15 @@ namespace Microsoft.AspNetCore.Http.Internal var body = request.Body; if (!body.CanSeek) { - var fileStream = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); + var fileStream = new FileBufferingReadStream(body, bufferThreshold, bufferLimit, _getTempDirectory); request.Body = fileStream; request.HttpContext.Response.RegisterForDispose(fileStream); } return request; } - public static MultipartSection EnableRewind(this MultipartSection section, Action registerForDispose, int bufferThreshold = DefaultBufferThreshold) + public static MultipartSection EnableRewind(this MultipartSection section, Action registerForDispose, + int bufferThreshold = DefaultBufferThreshold, long? bufferLimit = null) { if (section == null) { @@ -69,7 +70,7 @@ namespace Microsoft.AspNetCore.Http.Internal var body = section.Body; if (!body.CanSeek) { - var fileStream = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); + var fileStream = new FileBufferingReadStream(body, bufferThreshold, bufferLimit, _getTempDirectory); section.Body = fileStream; registerForDispose(fileStream); } diff --git a/src/Microsoft.AspNetCore.Http/RequestFormReaderExtensions.cs b/src/Microsoft.AspNetCore.Http/RequestFormReaderExtensions.cs new file mode 100644 index 0000000000..8675ad7f8c --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/RequestFormReaderExtensions.cs @@ -0,0 +1,48 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http.Features; + +namespace Microsoft.AspNetCore.Http +{ + public static class RequestFormReaderExtensions + { + /// + /// Read the request body as a form with the given options. These options will only be used + /// if the form has not already been read. + /// + /// The request. + /// Options for reading the form. + /// + /// The parsed form. + public static Task ReadFormAsync(this HttpRequest request, FormOptions options, + CancellationToken cancellationToken = new CancellationToken()) + { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + + if (!request.HasFormContentType) + { + throw new InvalidOperationException("Incorrect Content-Type: " + request.ContentType); + } + + var features = request.HttpContext.Features; + var formFeature = features.Get(); + if (formFeature == null || formFeature.Form == null) + { + // We haven't read the form yet, replace the reader with one using our own options. + features.Set(new FormFeature(request, options)); + } + return request.ReadFormAsync(cancellationToken); + } + } +} diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index b2ac67da68..a7d6d3b148 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -21,6 +21,7 @@ "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "Microsoft.Extensions.ObjectPool": "1.0.0-*", + "Microsoft.Extensions.Options": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*", "System.Buffers": "4.0.0-*" }, diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs index 6cf2fa7d11..ef72c199c9 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs @@ -352,7 +352,7 @@ namespace Microsoft.AspNetCore.WebUtilities { if (builder.Length > lengthLimit) { - throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit.ToString()); + throw new InvalidDataException($"Line length limit {lengthLimit} exceeded."); } ProcessLineChar(builder, ref foundCR, ref foundCRLF); } @@ -372,7 +372,7 @@ namespace Microsoft.AspNetCore.WebUtilities { if (builder.Length > lengthLimit) { - throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit.ToString()); + throw new InvalidDataException($"Line length limit {lengthLimit} exceeded."); } ProcessLineChar(builder, ref foundCR, ref foundCRLF); diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs index 3d10321c7f..2eea705a57 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs @@ -21,8 +21,10 @@ namespace Microsoft.AspNetCore.WebUtilities private readonly Stream _inner; private readonly ArrayPool _bytePool; private readonly int _memoryThreshold; + private readonly long? _bufferLimit; private string _tempFileDirectory; private readonly Func _tempFileDirectoryAccessor; + private string _tempFileName; private Stream _buffer; private byte[] _rentedBuffer; @@ -31,18 +33,19 @@ namespace Microsoft.AspNetCore.WebUtilities private bool _disposed; - // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? public FileBufferingReadStream( Stream inner, int memoryThreshold, + long? bufferLimit, Func tempFileDirectoryAccessor) - : this(inner, memoryThreshold, tempFileDirectoryAccessor, ArrayPool.Shared) + : this(inner, memoryThreshold, bufferLimit, tempFileDirectoryAccessor, ArrayPool.Shared) { } public FileBufferingReadStream( Stream inner, int memoryThreshold, + long? bufferLimit, Func tempFileDirectoryAccessor, ArrayPool bytePool) { @@ -70,18 +73,23 @@ namespace Microsoft.AspNetCore.WebUtilities _inner = inner; _memoryThreshold = memoryThreshold; + _bufferLimit = bufferLimit; _tempFileDirectoryAccessor = tempFileDirectoryAccessor; } - // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? - public FileBufferingReadStream(Stream inner, int memoryThreshold, string tempFileDirectory) - : this(inner, memoryThreshold, tempFileDirectory, ArrayPool.Shared) + public FileBufferingReadStream( + Stream inner, + int memoryThreshold, + long? bufferLimit, + string tempFileDirectory) + : this(inner, memoryThreshold, bufferLimit, tempFileDirectory, ArrayPool.Shared) { } public FileBufferingReadStream( Stream inner, int memoryThreshold, + long? bufferLimit, string tempFileDirectory, ArrayPool bytePool) { @@ -109,9 +117,20 @@ namespace Microsoft.AspNetCore.WebUtilities _inner = inner; _memoryThreshold = memoryThreshold; + _bufferLimit = bufferLimit; _tempFileDirectory = tempFileDirectory; } + public bool InMemory + { + get { return _inMemory; } + } + + public string TempFileName + { + get { return _tempFileName; } + } + public override bool CanRead { get { return true; } @@ -173,8 +192,8 @@ namespace Microsoft.AspNetCore.WebUtilities Debug.Assert(_tempFileDirectory != null); } - var fileName = Path.Combine(_tempFileDirectory, "ASPNET_" + Guid.NewGuid().ToString() + ".tmp"); - return new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete, 1024 * 16, + _tempFileName = Path.Combine(_tempFileDirectory, "ASPNETCORE_" + Guid.NewGuid().ToString() + ".tmp"); + return new FileStream(_tempFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete, 1024 * 16, FileOptions.Asynchronous | FileOptions.DeleteOnClose | FileOptions.SequentialScan); } @@ -189,6 +208,12 @@ namespace Microsoft.AspNetCore.WebUtilities int read = _inner.Read(buffer, offset, count); + if (_bufferLimit.HasValue && _bufferLimit - read < _buffer.Length) + { + Dispose(); + throw new IOException("Buffer limit exceeded."); + } + if (_inMemory && _buffer.Length + read > _memoryThreshold) { _inMemory = false; @@ -285,6 +310,12 @@ namespace Microsoft.AspNetCore.WebUtilities int read = await _inner.ReadAsync(buffer, offset, count, cancellationToken); + if (_bufferLimit.HasValue && _bufferLimit - read < _buffer.Length) + { + Dispose(); + throw new IOException("Buffer limit exceeded."); + } + if (_inMemory && _buffer.Length + read > _memoryThreshold) { _inMemory = false; diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs index df12872c99..db2866b7fd 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs @@ -17,6 +17,10 @@ namespace Microsoft.AspNetCore.WebUtilities /// public class FormReader : IDisposable { + public const int DefaultKeyCountLimit = 1024; + public const int DefaultKeyLengthLimit = 1024 * 2; + public const int DefaultValueLengthLimit = 1024 * 1024 * 4; + private const int _rentedCharPoolLength = 8192; private readonly TextReader _reader; private readonly char[] _buffer; @@ -43,6 +47,11 @@ namespace Microsoft.AspNetCore.WebUtilities _reader = new StringReader(data); } + public FormReader(Stream stream) + : this(stream, Encoding.UTF8, ArrayPool.Shared) + { + } + public FormReader(Stream stream, Encoding encoding) : this(stream, encoding, ArrayPool.Shared) { @@ -65,6 +74,21 @@ namespace Microsoft.AspNetCore.WebUtilities _reader = new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); } + /// + /// The limit on the number of form keys to allow in ReadForm or ReadFormAsync. + /// + public int KeyCountLimit { get; set; } = DefaultKeyCountLimit; + + /// + /// The limit on the length of form keys. + /// + public int KeyLengthLimit { get; set; } = DefaultKeyLengthLimit; + + /// + /// The limit on the length of form values. + /// + public int ValueLengthLimit { get; set; } = DefaultValueLengthLimit; + // Format: key1=value1&key2=value2 /// /// Reads the next key value pair from the form. @@ -73,12 +97,12 @@ namespace Microsoft.AspNetCore.WebUtilities /// The next key value pair, or null when the end of the form is reached. public KeyValuePair? ReadNextPair() { - var key = ReadWord('='); + var key = ReadWord('=', KeyLengthLimit); if (string.IsNullOrEmpty(key) && _bufferCount == 0) { return null; } - var value = ReadWord('&'); + var value = ReadWord('&', ValueLengthLimit); return new KeyValuePair(key, value); } @@ -88,20 +112,19 @@ namespace Microsoft.AspNetCore.WebUtilities /// /// /// The next key value pair, or null when the end of the form is reached. - public async Task?> ReadNextPairAsync(CancellationToken cancellationToken) + public async Task?> ReadNextPairAsync(CancellationToken cancellationToken = new CancellationToken()) { - var key = await ReadWordAsync('=', cancellationToken); + var key = await ReadWordAsync('=', KeyLengthLimit, cancellationToken); if (string.IsNullOrEmpty(key) && _bufferCount == 0) { return null; } - var value = await ReadWordAsync('&', cancellationToken); + var value = await ReadWordAsync('&', ValueLengthLimit, cancellationToken); return new KeyValuePair(key, value); } - private string ReadWord(char seperator) + private string ReadWord(char seperator, int limit) { - // TODO: Configurable value size limit while (true) { // Empty @@ -110,26 +133,16 @@ namespace Microsoft.AspNetCore.WebUtilities Buffer(); } - // End - if (_bufferCount == 0) + string word; + if (ReadChar(seperator, limit, out word)) { - return BuildWord(); + return word; } - - var c = _buffer[_bufferOffset++]; - _bufferCount--; - - if (c == seperator) - { - return BuildWord(); - } - _builder.Append(c); } } - private async Task ReadWordAsync(char seperator, CancellationToken cancellationToken) + private async Task ReadWordAsync(char seperator, int limit, CancellationToken cancellationToken) { - // TODO: Configurable value size limit while (true) { // Empty @@ -138,23 +151,40 @@ namespace Microsoft.AspNetCore.WebUtilities await BufferAsync(cancellationToken); } - // End - if (_bufferCount == 0) + string word; + if (ReadChar(seperator, limit, out word)) { - return BuildWord(); + return word; } - - var c = _buffer[_bufferOffset++]; - _bufferCount--; - - if (c == seperator) - { - return BuildWord(); - } - _builder.Append(c); } } + private bool ReadChar(char seperator, int limit, out string word) + { + // End + if (_bufferCount == 0) + { + word = BuildWord(); + return true; + } + + var c = _buffer[_bufferOffset++]; + _bufferCount--; + + if (c == seperator) + { + word = BuildWord(); + return true; + } + if (_builder.Length >= limit) + { + throw new InvalidDataException($"Form key or value length limit {limit} exceeded."); + } + _builder.Append(c); + word = null; + return false; + } + // '+' un-escapes to ' ', %HH un-escapes as ASCII (or utf-8?) private string BuildWord() { @@ -181,56 +211,44 @@ namespace Microsoft.AspNetCore.WebUtilities /// /// Parses text from an HTTP form body. /// - /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static Dictionary ReadForm(string text) + public Dictionary ReadForm() { - using (var reader = new FormReader(text)) + var accumulator = new KeyValueAccumulator(); + var pair = ReadNextPair(); + while (pair.HasValue) { - var accumulator = new KeyValueAccumulator(); - var pair = reader.ReadNextPair(); - while (pair.HasValue) + accumulator.Append(pair.Value.Key, pair.Value.Value); + if (accumulator.Count > KeyCountLimit) { - accumulator.Append(pair.Value.Key, pair.Value.Value); - pair = reader.ReadNextPair(); + throw new InvalidDataException($"Form key count limit {KeyCountLimit} exceeded."); } - - return accumulator.GetResults(); + pair = ReadNextPair(); } + + return accumulator.GetResults(); } /// /// Parses an HTTP form body. /// - /// The HTTP form body to parse. /// The . /// The collection containing the parsed HTTP form body. - public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + public async Task> ReadFormAsync(CancellationToken cancellationToken = new CancellationToken()) { - return ReadFormAsync(stream, Encoding.UTF8, cancellationToken); - } - - /// - /// Parses an HTTP form body. - /// - /// The HTTP form body to parse. - /// The character encoding to use. - /// The . - /// The collection containing the parsed HTTP form body. - public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) - { - using (var reader = new FormReader(stream, encoding)) + var accumulator = new KeyValueAccumulator(); + var pair = await ReadNextPairAsync(cancellationToken); + while (pair.HasValue) { - var accumulator = new KeyValueAccumulator(); - var pair = await reader.ReadNextPairAsync(cancellationToken); - while (pair.HasValue) + accumulator.Append(pair.Value.Key, pair.Value.Value); + if (accumulator.Count > KeyCountLimit) { - accumulator.Append(pair.Value.Key, pair.Value.Value); - pair = await reader.ReadNextPairAsync(cancellationToken); + throw new InvalidDataException($"Form key count limit {KeyCountLimit} exceeded."); } - - return accumulator.GetResults(); + pair = await ReadNextPairAsync(cancellationToken); } + + return accumulator.GetResults(); } public void Dispose() diff --git a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs index 207ff4c36b..1420344346 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs @@ -63,6 +63,8 @@ namespace Microsoft.AspNetCore.WebUtilities public bool HasValues => _accumulator != null; + public int Count => _accumulator?.Count ?? 0; + public Dictionary GetResults() { if (_expandingAccumulator != null) diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs index 96b92dd501..59c9cc0042 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs @@ -14,6 +14,8 @@ namespace Microsoft.AspNetCore.WebUtilities // https://www.ietf.org/rfc/rfc2046.txt public class MultipartReader { + public const int DefaultHeadersCountLimit = 16; + public const int DefaultHeadersLengthLimit = 1024 * 16; private const int DefaultBufferSize = 1024 * 4; private readonly BufferedReadStream _stream; @@ -44,18 +46,24 @@ namespace Microsoft.AspNetCore.WebUtilities _stream = new BufferedReadStream(stream, bufferSize); _boundary = new MultipartBoundary(boundary, false); // This stream will drain any preamble data and remove the first boundary marker. - _currentStream = new MultipartReaderStream(_stream, _boundary); + // TODO: HeadersLengthLimit can't be modified until after the constructor. + _currentStream = new MultipartReaderStream(_stream, _boundary) { LengthLimit = HeadersLengthLimit }; } /// - /// The limit for individual header lines inside a multipart section. + /// The limit for the number of headers to read. /// - public int HeaderLengthLimit { get; set; } = 1024 * 4; + public int HeadersCountLimit { get; set; } = DefaultHeadersCountLimit; /// /// The combined size limit for headers per multipart section. /// - public int TotalHeaderSizeLimit { get; set; } = 1024 * 16; + public int HeadersLengthLimit { get; set; } = DefaultHeadersLengthLimit; + + /// + /// The optional limit for the total response body length. + /// + public long? BodyLengthLimit { get; set; } public async Task ReadNextSectionAsync(CancellationToken cancellationToken = new CancellationToken()) { @@ -65,12 +73,12 @@ namespace Microsoft.AspNetCore.WebUtilities if (_currentStream.FinalBoundaryFound) { // There may be trailer data after the last boundary. - await _stream.DrainAsync(cancellationToken); + await _stream.DrainAsync(HeadersLengthLimit, cancellationToken); return null; } var headers = await ReadHeadersAsync(cancellationToken); _boundary.ExpectLeadingCrlf = true; - _currentStream = new MultipartReaderStream(_stream, _boundary); + _currentStream = new MultipartReaderStream(_stream, _boundary) { LengthLimit = BodyLengthLimit }; long? baseStreamOffset = _stream.CanSeek ? (long?)_stream.Position : null; return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; } @@ -79,23 +87,29 @@ namespace Microsoft.AspNetCore.WebUtilities { int totalSize = 0; var accumulator = new KeyValueAccumulator(); - var line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); + var line = await _stream.ReadLineAsync(HeadersLengthLimit - totalSize, cancellationToken); while (!string.IsNullOrEmpty(line)) { + if (HeadersLengthLimit - totalSize < line.Length) + { + throw new InvalidDataException($"Multipart headers length limit {HeadersLengthLimit} exceeded."); + } totalSize += line.Length; - if (totalSize > TotalHeaderSizeLimit) - { - throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit.ToString()); - } int splitIndex = line.IndexOf(':'); - Debug.Assert(splitIndex > 0, $"Invalid header line: {line}"); - if (splitIndex >= 0) + if (splitIndex <= 0) { - var name = line.Substring(0, splitIndex); - var value = line.Substring(splitIndex + 1, line.Length - splitIndex - 1).Trim(); - accumulator.Append(name, value); + throw new InvalidDataException($"Invalid header line: {line}"); } - line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); + + var name = line.Substring(0, splitIndex); + var value = line.Substring(splitIndex + 1, line.Length - splitIndex - 1).Trim(); + accumulator.Append(name, value); + if (accumulator.Count > HeadersCountLimit) + { + throw new InvalidDataException($"Multipart headers count limit {HeadersCountLimit} exceeded."); + } + + line = await _stream.ReadLineAsync(HeadersLengthLimit - totalSize, cancellationToken); } return accumulator.GetResults(); diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index 09f11959df..e9220a8d25 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -57,6 +57,8 @@ namespace Microsoft.AspNetCore.WebUtilities public bool FinalBoundaryFound { get; private set; } + public long? LengthLimit { get; set; } + public override bool CanRead { get { return true; } @@ -159,6 +161,10 @@ namespace Microsoft.AspNetCore.WebUtilities if (_observedLength < _position) { _observedLength = _position; + if (LengthLimit.HasValue && _observedLength > LengthLimit.Value) + { + throw new InvalidDataException($"Multipart body length limit {LengthLimit.Value} exceeded."); + } } return read; } diff --git a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs index 90830e897e..e2c16a9cf2 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs @@ -14,19 +14,32 @@ namespace Microsoft.AspNetCore.WebUtilities public static Task DrainAsync(this Stream stream, CancellationToken cancellationToken) { - return stream.DrainAsync(ArrayPool.Shared, cancellationToken); + return stream.DrainAsync(ArrayPool.Shared, null, cancellationToken); } - public static async Task DrainAsync(this Stream stream, ArrayPool bytePool, CancellationToken cancellationToken) + public static Task DrainAsync(this Stream stream, long? limit, CancellationToken cancellationToken) + { + return stream.DrainAsync(ArrayPool.Shared, limit, cancellationToken); + } + + public static async Task DrainAsync(this Stream stream, ArrayPool bytePool, long? limit, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var buffer = bytePool.Rent(_maxReadBufferSize); + long total = 0; try { - while (await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken) > 0) + var read = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); + while (read > 0) { // Not all streams support cancellation directly. cancellationToken.ThrowIfCancellationRequested(); + if (limit.HasValue && limit.Value - total < read) + { + throw new InvalidDataException($"The stream exceeded the data limit {limit.Value}."); + } + total += read; + read = await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken); } } finally diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index a1472eeefa..1c3bdac123 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -3,11 +3,9 @@ using System; using System.IO; -using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Internal; -using Microsoft.AspNetCore.WebUtilities; using Xunit; namespace Microsoft.AspNetCore.Http.Features @@ -26,14 +24,8 @@ namespace Microsoft.AspNetCore.Http.Features context.Request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; context.Request.Body = new NonSeekableReadStream(formContent); - if (bufferRequest) - { - context.Request.EnableRewind(); - } - - // Not cached yet - var formFeature = context.Features.Get(); - Assert.Null(formFeature); + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); var formCollection = await context.Request.ReadFormAsync(); @@ -55,80 +47,6 @@ namespace Microsoft.AspNetCore.Http.Features await responseFeature.CompleteAsync(); } - [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task ReadFormAsync_EmptyKeyAtEndAllowed(bool bufferRequest) - { - var formContent = Encoding.UTF8.GetBytes("=bar"); - Stream body = new MemoryStream(formContent); - if (!bufferRequest) - { - body = new NonSeekableReadStream(body); - } - - var formCollection = await FormReader.ReadFormAsync(body); - - Assert.Equal("bar", formCollection[""].FirstOrDefault()); - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed(bool bufferRequest) - { - var formContent = Encoding.UTF8.GetBytes("=bar&baz=2"); - Stream body = new MemoryStream(formContent); - if (!bufferRequest) - { - body = new NonSeekableReadStream(body); - } - - var formCollection = await FormReader.ReadFormAsync(body); - - Assert.Equal("bar", formCollection[""].FirstOrDefault()); - Assert.Equal("2", formCollection["baz"].FirstOrDefault()); - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task ReadFormAsync_EmptyValuedAtEndAllowed(bool bufferRequest) - { - // Arrange - var formContent = Encoding.UTF8.GetBytes("foo="); - Stream body = new MemoryStream(formContent); - if (!bufferRequest) - { - body = new NonSeekableReadStream(body); - } - - var formCollection = await FormReader.ReadFormAsync(body); - - // Assert - Assert.Equal("", formCollection["foo"].FirstOrDefault()); - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed(bool bufferRequest) - { - // Arrange - var formContent = Encoding.UTF8.GetBytes("foo=&baz=2"); - Stream body = new MemoryStream(formContent); - if (!bufferRequest) - { - body = new NonSeekableReadStream(body); - } - - var formCollection = await FormReader.ReadFormAsync(body); - - // Assert - Assert.Equal("", formCollection["foo"].FirstOrDefault()); - Assert.Equal("2", formCollection["baz"].FirstOrDefault()); - } - private const string MultipartContentType = "multipart/form-data; boundary=WebKitFormBoundary5pDRpGheQXaM8k3T"; private const string EmptyMultipartForm = "--WebKitFormBoundary5pDRpGheQXaM8k3T--"; @@ -170,14 +88,8 @@ namespace Microsoft.AspNetCore.Http.Features context.Request.ContentType = MultipartContentType; context.Request.Body = new NonSeekableReadStream(formContent); - if (bufferRequest) - { - context.Request.EnableRewind(); - } - - // Not cached yet - var formFeature = context.Features.Get(); - Assert.Null(formFeature); + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); var formCollection = context.Request.Form; @@ -211,14 +123,8 @@ namespace Microsoft.AspNetCore.Http.Features context.Request.ContentType = MultipartContentType; context.Request.Body = new NonSeekableReadStream(formContent); - if (bufferRequest) - { - context.Request.EnableRewind(); - } - - // Not cached yet - var formFeature = context.Features.Get(); - Assert.Null(formFeature); + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); var formCollection = context.Request.Form; @@ -254,14 +160,8 @@ namespace Microsoft.AspNetCore.Http.Features context.Request.ContentType = MultipartContentType; context.Request.Body = new NonSeekableReadStream(formContent); - if (bufferRequest) - { - context.Request.EnableRewind(); - } - - // Not cached yet - var formFeature = context.Features.Get(); - Assert.Null(formFeature); + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); var formCollection = await context.Request.ReadFormAsync(); @@ -308,14 +208,8 @@ namespace Microsoft.AspNetCore.Http.Features context.Request.ContentType = MultipartContentType; context.Request.Body = new NonSeekableReadStream(formContent); - if (bufferRequest) - { - context.Request.EnableRewind(); - } - - // Not cached yet - var formFeature = context.Features.Get(); - Assert.Null(formFeature); + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); var formCollection = await context.Request.ReadFormAsync(); @@ -367,14 +261,8 @@ namespace Microsoft.AspNetCore.Http.Features context.Request.ContentType = MultipartContentType; context.Request.Body = new NonSeekableReadStream(formContent); - if (bufferRequest) - { - context.Request.EnableRewind(); - } - - // Not cached yet - var formFeature = context.Features.Get(); - Assert.Null(formFeature); + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); var formCollection = await context.Request.ReadFormAsync(); diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index dd476f8116..40d3fa8935 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.ObjectPool; +using Microsoft.Extensions.Options; using Xunit; namespace Microsoft.AspNetCore.Http @@ -14,7 +15,7 @@ namespace Microsoft.AspNetCore.Http { // Arrange var accessor = new HttpContextAccessor(); - var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), accessor); + var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions()), accessor); // Act var context = contextFactory.Create(new FeatureCollection()); @@ -27,7 +28,7 @@ namespace Microsoft.AspNetCore.Http public void AllowsCreatingContextWithoutSettingAccessor() { // Arrange - var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider()); + var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions())); // Act & Assert var context = contextFactory.Create(new FeatureCollection()); diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs new file mode 100644 index 0000000000..51e7a987ad --- /dev/null +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs @@ -0,0 +1,294 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNetCore.WebUtilities +{ + public class FileBufferingReadStreamTests + { + private Stream MakeStream(int size) + { + // TODO: Fill with random data? Make readonly? + return new MemoryStream(new byte[size]); + } + + [Fact] + public void FileBufferingReadStream_Properties_ExpectedValues() + { + var inner = MakeStream(1024 * 2); + using (var stream = new FileBufferingReadStream(inner, 1024, null, Directory.GetCurrentDirectory())) + { + Assert.True(stream.CanRead); + Assert.True(stream.CanSeek); + Assert.False(stream.CanWrite); + Assert.Equal(0, stream.Length); // Nothing buffered yet + Assert.Equal(0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + } + } + + [Fact] + public void FileBufferingReadStream_SyncReadUnderThreshold_DoesntCreateFile() + { + var inner = MakeStream(1024 * 2); + using (var stream = new FileBufferingReadStream(inner, 1024 * 3, null, Directory.GetCurrentDirectory())) + { + var bytes = new byte[1000]; + var read0 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read1 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read1); + Assert.Equal(read0 + read1, stream.Length); + Assert.Equal(read0 + read1, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read2 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(inner.Length - read0 - read1, read2); + Assert.Equal(read0 + read1 + read2, stream.Length); + Assert.Equal(read0 + read1 + read2, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read3 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(0, read3); + } + } + + [Fact] + public void FileBufferingReadStream_SyncReadOverThreshold_CreatesFile() + { + var inner = MakeStream(1024 * 2); + string tempFileName; + using (var stream = new FileBufferingReadStream(inner, 1024, null, Directory.GetCurrentDirectory())) + { + var bytes = new byte[1000]; + var read0 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read1 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read1); + Assert.Equal(read0 + read1, stream.Length); + Assert.Equal(read0 + read1, stream.Position); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + tempFileName = stream.TempFileName; + Assert.True(File.Exists(tempFileName)); + + var read2 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(inner.Length - read0 - read1, read2); + Assert.Equal(read0 + read1 + read2, stream.Length); + Assert.Equal(read0 + read1 + read2, stream.Position); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + Assert.True(File.Exists(tempFileName)); + + var read3 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(0, read3); + } + + Assert.False(File.Exists(tempFileName)); + } + + [Fact] + public void FileBufferingReadStream_SyncReadWithInMemoryLimit_EnforcesLimit() + { + var inner = MakeStream(1024 * 2); + using (var stream = new FileBufferingReadStream(inner, 1024, 900, Directory.GetCurrentDirectory())) + { + var bytes = new byte[500]; + var read0 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var exception = Assert.Throws(() => stream.Read(bytes, 0, bytes.Length)); + Assert.Equal("Buffer limit exceeded.", exception.Message); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + Assert.False(File.Exists(stream.TempFileName)); + } + } + + [Fact] + public void FileBufferingReadStream_SyncReadWithOnDiskLimit_EnforcesLimit() + { + var inner = MakeStream(1024 * 2); + string tempFileName; + using (var stream = new FileBufferingReadStream(inner, 512, 1024, Directory.GetCurrentDirectory())) + { + var bytes = new byte[500]; + var read0 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read1 = stream.Read(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read1); + Assert.Equal(read0 + read1, stream.Length); + Assert.Equal(read0 + read1, stream.Position); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + tempFileName = stream.TempFileName; + Assert.True(File.Exists(tempFileName)); + + var exception = Assert.Throws(() => stream.Read(bytes, 0, bytes.Length)); + Assert.Equal("Buffer limit exceeded.", exception.Message); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + Assert.False(File.Exists(tempFileName)); + } + + Assert.False(File.Exists(tempFileName)); + } + + /////////////////// + + [Fact] + public async Task FileBufferingReadStream_AsyncReadUnderThreshold_DoesntCreateFile() + { + var inner = MakeStream(1024 * 2); + using (var stream = new FileBufferingReadStream(inner, 1024 * 3, null, Directory.GetCurrentDirectory())) + { + var bytes = new byte[1000]; + var read0 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read1 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read1); + Assert.Equal(read0 + read1, stream.Length); + Assert.Equal(read0 + read1, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read2 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(inner.Length - read0 - read1, read2); + Assert.Equal(read0 + read1 + read2, stream.Length); + Assert.Equal(read0 + read1 + read2, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read3 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(0, read3); + } + } + + [Fact] + public async Task FileBufferingReadStream_AsyncReadOverThreshold_CreatesFile() + { + var inner = MakeStream(1024 * 2); + string tempFileName; + using (var stream = new FileBufferingReadStream(inner, 1024, null, Directory.GetCurrentDirectory())) + { + var bytes = new byte[1000]; + var read0 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read1 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read1); + Assert.Equal(read0 + read1, stream.Length); + Assert.Equal(read0 + read1, stream.Position); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + tempFileName = stream.TempFileName; + Assert.True(File.Exists(tempFileName)); + + var read2 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(inner.Length - read0 - read1, read2); + Assert.Equal(read0 + read1 + read2, stream.Length); + Assert.Equal(read0 + read1 + read2, stream.Position); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + Assert.True(File.Exists(tempFileName)); + + var read3 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(0, read3); + } + + Assert.False(File.Exists(tempFileName)); + } + + [Fact] + public async Task FileBufferingReadStream_AsyncReadWithInMemoryLimit_EnforcesLimit() + { + var inner = MakeStream(1024 * 2); + using (var stream = new FileBufferingReadStream(inner, 1024, 900, Directory.GetCurrentDirectory())) + { + var bytes = new byte[500]; + var read0 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var exception = await Assert.ThrowsAsync(() => stream.ReadAsync(bytes, 0, bytes.Length)); + Assert.Equal("Buffer limit exceeded.", exception.Message); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + Assert.False(File.Exists(stream.TempFileName)); + } + } + + [Fact] + public async Task FileBufferingReadStream_AsyncReadWithOnDiskLimit_EnforcesLimit() + { + var inner = MakeStream(1024 * 2); + string tempFileName; + using (var stream = new FileBufferingReadStream(inner, 512, 1024, Directory.GetCurrentDirectory())) + { + var bytes = new byte[500]; + var read0 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read0); + Assert.Equal(read0, stream.Length); + Assert.Equal(read0, stream.Position); + Assert.True(stream.InMemory); + Assert.Null(stream.TempFileName); + + var read1 = await stream.ReadAsync(bytes, 0, bytes.Length); + Assert.Equal(bytes.Length, read1); + Assert.Equal(read0 + read1, stream.Length); + Assert.Equal(read0 + read1, stream.Position); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + tempFileName = stream.TempFileName; + Assert.True(File.Exists(tempFileName)); + + var exception = await Assert.ThrowsAsync(() => stream.ReadAsync(bytes, 0, bytes.Length)); + Assert.Equal("Buffer limit exceeded.", exception.Message); + Assert.False(stream.InMemory); + Assert.NotNull(stream.TempFileName); + Assert.False(File.Exists(tempFileName)); + } + + Assert.False(File.Exists(tempFileName)); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs new file mode 100644 index 0000000000..fb0557d275 --- /dev/null +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs @@ -0,0 +1,156 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNetCore.WebUtilities +{ + public class FormReaderTests + { + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyKeyAtEndAllowed(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "=bar"); + + var formCollection = await new FormReader(body).ReadFormAsync(); + + Assert.Equal("bar", formCollection[""].ToString()); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "=bar&baz=2"); + + var formCollection = await new FormReader(body).ReadFormAsync(); + + Assert.Equal("bar", formCollection[""].ToString()); + Assert.Equal("2", formCollection["baz"].ToString()); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyValuedAtEndAllowed(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo="); + + var formCollection = await new FormReader(body).ReadFormAsync(); + + Assert.Equal("", formCollection["foo"].ToString()); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=&baz=2"); + + var formCollection = await new FormReader(body).ReadFormAsync(); + + Assert.Equal("", formCollection["foo"].ToString()); + Assert.Equal("2", formCollection["baz"].ToString()); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_KeyCountLimitMet_Success(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=1&bar=2&baz=3&baz=4"); + + var formCollection = await new FormReader(body) { KeyCountLimit = 3 }.ReadFormAsync(); + + Assert.Equal("1", formCollection["foo"].ToString()); + Assert.Equal("2", formCollection["bar"].ToString()); + Assert.Equal("3,4", formCollection["baz"].ToString()); + Assert.Equal(3, formCollection.Count); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_KeyCountLimitExceeded_Throw(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=1&baz=2&bar=3&baz=4&baf=5"); + + var exception = await Assert.ThrowsAsync( + () => new FormReader(body) { KeyCountLimit = 3 }.ReadFormAsync()); + Assert.Equal("Form key count limit 3 exceeded.", exception.Message); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_KeyLengthLimitMet_Success(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=1&bar=2&baz=3&baz=4"); + + var formCollection = await new FormReader(body) { KeyLengthLimit = 10 }.ReadFormAsync(); + + Assert.Equal("1", formCollection["foo"].ToString()); + Assert.Equal("2", formCollection["bar"].ToString()); + Assert.Equal("3,4", formCollection["baz"].ToString()); + Assert.Equal(3, formCollection.Count); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_KeyLengthLimitExceeded_Throw(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=1&baz1234567890=2"); + + var exception = await Assert.ThrowsAsync( + () => new FormReader(body) { KeyLengthLimit = 10 }.ReadFormAsync()); + Assert.Equal("Form key or value length limit 10 exceeded.", exception.Message); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_ValueLengthLimitMet_Success(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=1&bar=1234567890&baz=3&baz=4"); + + var formCollection = await new FormReader(body) { ValueLengthLimit = 10 }.ReadFormAsync(); + + Assert.Equal("1", formCollection["foo"].ToString()); + Assert.Equal("1234567890", formCollection["bar"].ToString()); + Assert.Equal("3,4", formCollection["baz"].ToString()); + Assert.Equal(3, formCollection.Count); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_ValueLengthLimitExceeded_Throw(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=1&baz=1234567890123"); + + var exception = await Assert.ThrowsAsync( + () => new FormReader(body) { ValueLengthLimit = 10 }.ReadFormAsync()); + Assert.Equal("Form key or value length limit 10 exceeded.", exception.Message); + } + + private static Stream MakeStream(bool bufferRequest, string text) + { + var formContent = Encoding.UTF8.GetBytes(text); + Stream body = new MemoryStream(formContent); + if (!bufferRequest) + { + body = new NonSeekableReadStream(body); + } + return body; + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs index 853d75e563..90c2ffdfcb 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs @@ -18,6 +18,13 @@ namespace Microsoft.AspNetCore.WebUtilities "Content-Disposition: form-data; name=\"text\"\r\n" + "\r\n" + "text default\r\n" + +"--9051914041544843365972754266--\r\n"; + private const string OnePartBodyTwoHeaders = +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"Custom-header: custom-value\r\n" + +"\r\n" + +"text default\r\n" + "--9051914041544843365972754266--\r\n"; private const string OnePartBodyWithTrailingWhitespace = "--9051914041544843365972754266 \r\n" + @@ -115,6 +122,32 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.Null(await reader.ReadNextSectionAsync()); } + [Fact] + public async Task MutipartReader_HeaderCountExceeded_Throws() + { + var stream = MakeStream(OnePartBodyTwoHeaders); + var reader = new MultipartReader(Boundary, stream) + { + HeadersCountLimit = 1, + }; + + var exception = await Assert.ThrowsAsync(() => reader.ReadNextSectionAsync()); + Assert.Equal("Multipart headers count limit 1 exceeded.", exception.Message); + } + + [Fact] + public async Task MutipartReader_HeadersLengthExceeded_Throws() + { + var stream = MakeStream(OnePartBodyTwoHeaders); + var reader = new MultipartReader(Boundary, stream) + { + HeadersLengthLimit = 60, + }; + + var exception = await Assert.ThrowsAsync(() => reader.ReadNextSectionAsync()); + Assert.Equal("Line length limit 17 exceeded.", exception.Message); + } + [Fact] public async Task MutipartReader_ReadSinglePartBodyWithTrailingWhitespace_Success() { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs new file mode 100644 index 0000000000..11c5d0ccc9 --- /dev/null +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs @@ -0,0 +1,72 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.WebUtilities +{ + public class NonSeekableReadStream : Stream + { + private Stream _inner; + + public NonSeekableReadStream(byte[] data) + : this(new MemoryStream(data)) + { + } + + public NonSeekableReadStream(Stream inner) + { + _inner = inner; + } + + public override bool CanRead => _inner.CanRead; + + public override bool CanSeek => false; + + public override bool CanWrite => false; + + public override long Length + { + get { throw new NotSupportedException(); } + } + + public override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override void Flush() + { + throw new NotImplementedException(); + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + return _inner.Read(buffer, offset, count); + } + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + return _inner.ReadAsync(buffer, offset, count, cancellationToken); + } + } +} From 3a7f6a7228fe10b14996b97eed83bcb72684088a Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 26 Apr 2016 14:09:48 -0700 Subject: [PATCH 551/846] Add GetAuthenticateInfo method --- .../Authentication/AuthenticateInfo.cs | 24 +++++++++++++++++ .../Authentication/AuthenticationManager.cs | 12 +++------ .../DefaultAuthenticationManager.cs | 27 +++++++++++++++++++ 3 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs new file mode 100644 index 0000000000..41ffdfbb81 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs @@ -0,0 +1,24 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; + +namespace Microsoft.AspNetCore.Http.Authentication +{ + /// + /// Used to store the results of an Authenticate call. + /// + public class AuthenticateInfo + { + /// + /// The . + /// + public ClaimsPrincipal Principal { get; set; } + + /// + /// The . + /// + public AuthenticationProperties Properties { get; set; } + } +} diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs index 0fa5789218..56d9dbad5f 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -20,18 +20,14 @@ namespace Microsoft.AspNetCore.Http.Authentication public abstract IEnumerable GetAuthenticationSchemes(); + public abstract Task GetAuthenticateInfoAsync(string authenticationScheme); + + // Will remove once callees have been updated public abstract Task AuthenticateAsync(AuthenticateContext context); public virtual async Task AuthenticateAsync(string authenticationScheme) { - if (authenticationScheme == null) - { - throw new ArgumentNullException(nameof(authenticationScheme)); - } - - var context = new AuthenticateContext(authenticationScheme); - await AuthenticateAsync(context); - return context.Principal; + return (await GetAuthenticateInfoAsync(authenticationScheme))?.Principal; } public virtual Task ChallengeAsync() diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index a9f79ba630..257ca2d759 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -50,6 +50,7 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal return describeContext.Results.Select(description => new AuthenticationDescription(description)); } + // Remove once callers have been switched to GetAuthenticateInfoAsync public override async Task AuthenticateAsync(AuthenticateContext context) { if (context == null) @@ -69,6 +70,32 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal } } + public override async Task GetAuthenticateInfoAsync(string authenticationScheme) + { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + + var handler = HttpAuthenticationFeature.Handler; + var context = new AuthenticateContext(authenticationScheme); + if (handler != null) + { + await handler.AuthenticateAsync(context); + } + + if (!context.Accepted) + { + throw new InvalidOperationException($"No authentication handler is configured to authenticate for the scheme: {context.AuthenticationScheme}"); + } + + return new AuthenticateInfo + { + Principal = context.Principal, + Properties = new AuthenticationProperties(context.Properties) + }; + } + public override async Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) { if (string.IsNullOrEmpty(authenticationScheme)) From 7ebd87a6b2904be19d382b00ac25b13ae5f8a844 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 29 Apr 2016 10:24:26 -0700 Subject: [PATCH 552/846] Add doc comments for FormOptions. --- .../Features/FormOptions.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs b/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs index 2e6e8c5720..dc249781e7 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.IO; using Microsoft.AspNetCore.WebUtilities; namespace Microsoft.AspNetCore.Http.Features @@ -12,15 +13,66 @@ namespace Microsoft.AspNetCore.Http.Features public const int DefaultMultipartBoundaryLengthLimit = 128; public const long DefaultMultipartBodyLengthLimit = 1024 * 1024 * 128; + /// + /// Enables full request body buffering. Use this if multiple components need to read the raw stream. + /// The default value is false. + /// public bool BufferBody { get; set; } = false; + + /// + /// If is enabled, this many bytes of the body will be buffered in memory. + /// If this threshold is exceeded then the buffer will be moved to a temp file on disk instead. + /// This also applies when buffering individual multipart section bodies. + /// public int MemoryBufferThreshold { get; set; } = DefaultMemoryBufferThreshold; + + /// + /// If is enabled, this is the limit for the total number of bytes that will + /// be buffered. Forms that exceed this limit will throw an when parsed. + /// public long BufferBodyLengthLimit { get; set; } = DefaultBufferBodyLengthLimit; + + /// + /// A limit for the number of form entries to allow. Entries with the same key will be combined. + /// Forms that exceed this limit will throw an when parsed. + /// public int KeyCountLimit { get; set; } = FormReader.DefaultKeyCountLimit; + + /// + /// A limit on the length of individual keys. Forms containing keys that exceed this limit will + /// throw an when parsed. + /// public int KeyLengthLimit { get; set; } = FormReader.DefaultKeyLengthLimit; + + /// + /// A limit on the length of individual form values. Forms containing values that exceed this + /// limit will throw an when parsed. + /// public int ValueLengthLimit { get; set; } = FormReader.DefaultValueLengthLimit; + + /// + /// A limit for the length of the boundary identifier. Forms with boundaries that exceed this + /// limit will throw an when parsed. + /// public int MultipartBoundaryLengthLimit { get; set; } = DefaultMultipartBoundaryLengthLimit; + + /// + /// A limit for the number of headers to allow in each multipart section. Headers with the same name will + /// be combined. Form sections that exceed this limit will throw an + /// when parsed. + /// public int MultipartHeadersCountLimit { get; set; } = MultipartReader.DefaultHeadersCountLimit; + + /// + /// A limit for the total length of the header keys and values in each multipart section. + /// Form sections that exceed this limit will throw an when parsed. + /// public int MultipartHeadersLengthLimit { get; set; } = MultipartReader.DefaultHeadersLengthLimit; + + /// + /// A limit for the length of each multipart body. Forms sections that exceed this limit will throw an + /// when parsed. + /// public long MultipartBodyLengthLimit { get; set; } = DefaultMultipartBodyLengthLimit; } } From edff60f293b78ddb29e90eb76bb9d7d01fb30caf Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 2 May 2016 11:27:17 -0700 Subject: [PATCH 553/846] Fix build warnings --- .../project.json | 16 ++++++++------- .../project.json | 16 ++++++++------- .../project.json | 16 ++++++++------- src/Microsoft.AspNetCore.Http/project.json | 16 ++++++++------- src/Microsoft.AspNetCore.Owin/project.json | 20 ++++++++++--------- .../project.json | 16 ++++++++------- src/Microsoft.Net.Http.Headers/project.json | 16 ++++++++------- .../project.json | 4 ++-- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 4 ++-- .../project.json | 2 +- 14 files changed, 74 insertions(+), 60 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 6aaeb09cc1..a5b23b096d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -1,14 +1,16 @@ { "version": "1.0.0-*", "description": "ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder.\r\nCommonly used types:\r\nMicrosoft.AspNetCore.Builder.IApplicationBuilder\r\nMicrosoft.AspNetCore.Http.HttpContext\r\nMicrosoft.AspNetCore.Http.HttpRequest\r\nMicrosoft.AspNetCore.Http.HttpResponse", - "tags": [ - "aspnetcore" - ], - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" + "packOptions": { + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "tags": [ + "aspnetcore" + ] }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", "nowarn": [ diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index d20a79b21b..60f729f8a9 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -1,14 +1,16 @@ { "version": "1.0.0-*", "description": "ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state.", - "tags": [ - "aspnetcore" - ], - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" + "packOptions": { + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "tags": [ + "aspnetcore" + ] }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", "nowarn": [ diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 1591dff8f2..476740b4ce 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -1,14 +1,16 @@ { "version": "1.0.0-*", "description": "ASP.NET Core HTTP feature interface definitions.", - "tags": [ - "aspnetcore" - ], - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" + "packOptions": { + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "tags": [ + "aspnetcore" + ] }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", "nowarn": [ diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index a7d6d3b148..e6d5e6dae3 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -1,14 +1,16 @@ { "version": "1.0.0-*", "description": "ASP.NET Core default HTTP feature implementations.", - "tags": [ - "aspnetcore" - ], - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" + "packOptions": { + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "tags": [ + "aspnetcore" + ] }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "allowUnsafe": true, "keyFile": "../../tools/Key.snk", diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 6a4c6a8dfe..4e64034799 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -1,16 +1,18 @@ { "version": "1.0.0-*", "description": "ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application.", - "tags": [ - "aspnetcore", - "katana", - "owin" - ], - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" + "packOptions": { + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "tags": [ + "aspnetcore", + "katana", + "owin" + ] }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", "nowarn": [ diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 6ae109fc44..a712242d2c 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -1,14 +1,16 @@ { "version": "1.0.0-*", "description": "ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings.", - "tags": [ - "aspnetcore" - ], - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" + "packOptions": { + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "tags": [ + "aspnetcore" + ] }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", "nowarn": [ diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 1dd40479b7..dfe26943fc 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,14 +1,16 @@ { "version": "1.0.0-*", "description": "HTTP header parser implementations.", - "tags": [ - "http" - ], - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" + "packOptions": { + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "tags": [ + "http" + ] }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", "nowarn": [ diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index c8789c2209..0ec5cdf3de 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -1,9 +1,10 @@ { - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true, "keyFile": "../../tools/Key.snk" }, "dependencies": { + "dotnet-test-xunit": "1.0.0-*", "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Testing": "1.0.0-*", @@ -16,7 +17,6 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index b3af851c1f..94b4aa69aa 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "dotnet-test-xunit": "1.0.0-*", "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", @@ -13,7 +14,6 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 5a464a3c59..a31e0b097d 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "dotnet-test-xunit": "1.0.0-*", "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http.Features": "1.0.0-*", "xunit": "2.1.0" @@ -11,7 +12,6 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 985b574bbc..861120db82 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "dotnet-test-xunit": "1.0.0-*", "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "xunit": "2.1.0" @@ -11,7 +12,6 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 931834256d..c6ae85cf17 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "dotnet-test-xunit": "1.0.0-*", "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Owin": "1.0.0-*", @@ -13,7 +14,6 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index fed448f2a3..6cd8a485e8 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,10 +1,11 @@ { "dependencies": { + "dotnet-test-xunit": "1.0.0-*", "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "xunit": "2.1.0" }, - "compilationOptions": { + "buildOptions": { "warningsAsErrors": true }, "testRunner": "xunit", @@ -16,7 +17,6 @@ "type": "platform" }, "System.Text.Encoding.Extensions": "4.0.11-*", - "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index d67f3b3e49..c3baa5aa34 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,6 +1,7 @@ { "version": "1.0.0-*", "dependencies": { + "dotnet-test-xunit": "1.0.0-*", "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.Net.Http.Headers": "1.0.0-*", "xunit": "2.1.0" @@ -12,7 +13,6 @@ "version": "1.0.0-*", "type": "platform" }, - "dotnet-test-xunit": "1.0.0-*", "System.Diagnostics.Process": "4.1.0-*" }, "imports": [ From 57673068759772158eec697e519c875639b8c2c0 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 2 May 2016 14:44:26 -0700 Subject: [PATCH 554/846] #547 Remove '+' replacement from request cookies. --- .../Internal/RequestCookieCollection.cs | 4 +- .../RequestCookiesCollectionTests.cs | 46 +++++++++++++++++++ .../ResponseCookiesTest.cs | 1 + 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs index afc34489e7..1555b0b7a4 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs @@ -79,8 +79,8 @@ namespace Microsoft.AspNetCore.Http.Internal for (var i = 0; i < cookies.Count; i++) { var cookie = cookies[i]; - var name = Uri.UnescapeDataString(cookie.Name.Replace('+', ' ')); - var value = Uri.UnescapeDataString(cookie.Value.Replace('+', ' ')); + var name = Uri.UnescapeDataString(cookie.Name); + var value = Uri.UnescapeDataString(cookie.Value); store[name] = value; } diff --git a/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs b/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs new file mode 100644 index 0000000000..6af99b8464 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Linq; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.Extensions.Primitives; +using Xunit; + +namespace Microsoft.AspNetCore.Http.Tests +{ + public class RequestCookiesCollectionTests + { + public static TheoryData UnEscapesKeyValues_Data + { + get + { + // key, value, expected + return new TheoryData + { + { "key=value", "key", "value" }, + { "key%2C=%21value", "key,", "!value" }, + { "ke%23y%2C=val%5Eue", "ke#y,", "val^ue" }, + { "key=value", "key", "value" }, + { "key%2C=%21value", "key,", "!value" }, + { "ke%23y%2C=val%5Eue", "ke#y,", "val^ue" }, + { "base64=QUI%2BREU%2FRw%3D%3D", "base64", "QUI+REU/Rw==" }, + { "base64=QUI+REU/Rw==", "base64", "QUI+REU/Rw==" }, + }; + } + } + + [Theory] + [MemberData(nameof(UnEscapesKeyValues_Data))] + public void UnEscapesKeyValues( + string input, + string expectedKey, + string expectedValue) + { + var cookies = RequestCookieCollection.Parse(new StringValues(input)); + + Assert.Equal(1, cookies.Count); + Assert.Equal(expectedKey, cookies.Keys.Single()); + Assert.Equal(expectedValue, cookies[expectedKey]); + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index 021f517bd6..f5625f0fc6 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -74,6 +74,7 @@ namespace Microsoft.AspNetCore.Http.Tests { "key", "value", _builderPool, "key=value" }, { "key,", "!value", _builderPool, "key%2C=%21value" }, { "ke#y,", "val^ue", _builderPool, "ke%23y%2C=val%5Eue" }, + { "base64", "QUI+REU/Rw==", _builderPool, "base64=QUI%2BREU%2FRw%3D%3D" }, }; } } From b95843452c703d55050801436e50e0f86d9b7562 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 13 May 2016 15:08:56 -0700 Subject: [PATCH 555/846] #612 Move CookieSecureOption / SecurePolicy to Http.Abstractions --- .../CookieSecurePolicy.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/CookieSecurePolicy.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieSecurePolicy.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieSecurePolicy.cs new file mode 100644 index 0000000000..af32d851b0 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieSecurePolicy.cs @@ -0,0 +1,34 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Http +{ + /// + /// Determines how cookie security properties are set. + /// + public enum CookieSecurePolicy + { + /// + /// If the URI that provides the cookie is HTTPS, then the cookie will only be returned to the server on + /// subsequent HTTPS requests. Otherwise if the URI that provides the cookie is HTTP, then the cookie will + /// be returned to the server on all HTTP and HTTPS requests. This is the default value because it ensures + /// HTTPS for all authenticated requests on deployed servers, and also supports HTTP for localhost development + /// and for servers that do not have HTTPS support. + /// + SameAsRequest, + + /// + /// Secure is always marked true. Use this value when your login page and all subsequent pages + /// requiring the authenticated identity are HTTPS. Local development will also need to be done with HTTPS urls. + /// + Always, + + /// + /// Secure is not marked true. Use this value when your login page is HTTPS, but other pages + /// on the site which are HTTP also require authentication information. This setting is not recommended because + /// the authentication information provided with an HTTP request may be observed and used by other computers + /// on your local network or wireless connection. + /// + None, + } +} From 097b339f74903fc99fc575f245cf0cd7bd08695d Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 17 May 2016 14:39:32 -0700 Subject: [PATCH 556/846] React to updated CoreCLR packages https://github.com/aspnet/Coherence/issues/97 --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index a5b23b096d..b0af101030 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -37,7 +37,7 @@ "netstandard1.3": { "dependencies": { "System.Globalization.Extensions": "4.0.1-*", - "System.Linq.Expressions": "4.0.11-*", + "System.Linq.Expressions": "4.1.0-*", "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.1.0-*" } From 36329b07c8cf19f649e26f05db3627e82e119277 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 17 May 2016 14:14:10 -0700 Subject: [PATCH 557/846] Add Description as well to AuthenticateInfo (needed by Identity) --- .../Authentication/AuthenticateInfo.cs | 5 +++++ .../Authentication/DefaultAuthenticationManager.cs | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs index 41ffdfbb81..9e8e3fd537 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs @@ -20,5 +20,10 @@ namespace Microsoft.AspNetCore.Http.Authentication /// The . /// public AuthenticationProperties Properties { get; set; } + + /// + /// The . + /// + public AuthenticationDescription Description { get; set; } } } diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index 257ca2d759..e6540d2b7d 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -92,7 +92,8 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal return new AuthenticateInfo { Principal = context.Principal, - Properties = new AuthenticationProperties(context.Properties) + Properties = new AuthenticationProperties(context.Properties), + Description = new AuthenticationDescription(context.Description) }; } From 8f233ea796823a677e470bff18ace41ac537a1e9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 18 May 2016 09:42:01 -0700 Subject: [PATCH 558/846] Revert "React to updated CoreCLR packages" This reverts commit 097b339f74903fc99fc575f245cf0cd7bd08695d. --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index b0af101030..a5b23b096d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -37,7 +37,7 @@ "netstandard1.3": { "dependencies": { "System.Globalization.Extensions": "4.0.1-*", - "System.Linq.Expressions": "4.1.0-*", + "System.Linq.Expressions": "4.0.11-*", "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.1.0-*" } From 504a8254063f7166bedcee8a27787e743d3550c2 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Fri, 20 May 2016 11:37:13 -0700 Subject: [PATCH 559/846] Fix owin spec links --- .../OwinConstants.cs | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs index ca14cf9cbb..4234b65aa6 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Owin { #region OWIN v1.0.0 - 3.2.1. Request Data - // http://owin.org/spec/owin-1.0.0.html + // http://owin.org/spec/spec/owin-1.0.0.html public const string RequestScheme = "owin.RequestScheme"; public const string RequestMethod = "owin.RequestMethod"; @@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Owin #region OWIN v1.0.0 - 3.2.2. Response Data - // http://owin.org/spec/owin-1.0.0.html + // http://owin.org/spec/spec/owin-1.0.0.html public const string ResponseStatusCode = "owin.ResponseStatusCode"; public const string ResponseReasonPhrase = "owin.ResponseReasonPhrase"; @@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Owin #region OWIN v1.0.0 - 3.2.3. Other Data - // http://owin.org/spec/owin-1.0.0.html + // http://owin.org/spec/spec/owin-1.0.0.html public const string CallCancelled = "owin.CallCancelled"; @@ -63,7 +63,7 @@ namespace Microsoft.AspNetCore.Owin #region OWIN Key Guidelines and Common Keys - 6. Common keys - // http://owin.org/spec/CommonKeys.html + // http://owin.org/spec/spec/CommonKeys.html internal static class CommonKeys { @@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Owin #region SendFiles v0.3.0 - // http://owin.org/extensions/owin-SendFile-Extension-v0.3.0.htm + // http://owin.org/spec/extensions/owin-SendFile-Extension-v0.3.0.htm internal static class SendFiles { @@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Owin #region Opaque v0.3.0 - // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + // http://owin.org/spec/extensions/owin-OpaqueStream-Extension-v0.3.0.htm internal static class OpaqueConstants { @@ -132,7 +132,7 @@ namespace Microsoft.AspNetCore.Owin #region WebSocket v0.4.0 - // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + // http://owin.org/spec/extensions/owin-OpaqueStream-Extension-v0.3.0.htm internal static class WebSocket { @@ -165,23 +165,11 @@ namespace Microsoft.AspNetCore.Owin #region Security v0.1.0 - // http://owin.org/extensions/owin-Security-Extension-v0.1.0.htm - internal static class Security { // 3.2. Per Request public const string User = "server.User"; - - public const string Authenticate = "security.Authenticate"; - - // 3.3. Response - - public const string SignIn = "security.SignIn"; - - public const string SignOut = "security.SignOut"; - - public const string Challenge = "security.Challenge"; } #endregion From 6d91a160b6fa1bc4c35b5f342e73c6e590205178 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 19 May 2016 12:44:54 -0700 Subject: [PATCH 560/846] Add IsAvailable property to ISession #634 --- .gitignore | 1 + src/Microsoft.AspNetCore.Http.Features/ISession.cs | 5 +++++ .../DefaultHttpContextTests.cs | 2 ++ 3 files changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index a2eb01c895..0f91ad1208 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ nuget.exe project.lock.json .build/ .testPublish/ +/.vs/ diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index 74b63baa62..c3e4df60e7 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -8,6 +8,11 @@ namespace Microsoft.AspNetCore.Http { public interface ISession { + /// + /// Indicate whether the current session has loaded correctly. + /// + bool IsAvailable { get; } + /// /// A unique identifier for the current session. This is not the same as the session cookie /// since the cookie lifetime may not be the same as the session entry lifetime in the data store. diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index b88e90a5b9..13b9ee65cc 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -288,6 +288,8 @@ namespace Microsoft.AspNetCore.Http public string Id { get; set; } + public bool IsAvailable { get; } = true; + public IEnumerable Keys { get { return _store.Keys; } } public void Clear() From 440c6e43e185594e83b33f280e45868b58199926 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 23 May 2016 10:15:39 -0700 Subject: [PATCH 561/846] Minor rewording missed from PR --- src/Microsoft.AspNetCore.Http.Features/ISession.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index c3e4df60e7..c2dc435801 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Http public interface ISession { /// - /// Indicate whether the current session has loaded correctly. + /// Indicate whether the current session has loaded. /// bool IsAvailable { get; } From e854d3aa9a31493c891324080428b16fcd5d0503 Mon Sep 17 00:00:00 2001 From: moozzyk Date: Thu, 19 May 2016 15:16:51 -0700 Subject: [PATCH 562/846] Allow query string parameters without values Addresses #624 --- .../QueryHelpers.cs | 8 +++- .../Features/QueryFeatureTests.cs | 39 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs index c3a56ba71d..6bd1a0bb82 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs @@ -140,7 +140,6 @@ namespace Microsoft.AspNetCore.WebUtilities scanIndex = 1; } - int textLength = queryString.Length; int equalIndex = queryString.IndexOf('='); if (equalIndex == -1) @@ -171,6 +170,13 @@ namespace Microsoft.AspNetCore.WebUtilities equalIndex = textLength; } } + else + { + if (delimiterIndex > scanIndex) + { + accumulator.Append(queryString.Substring(scanIndex, delimiterIndex - scanIndex), string.Empty); + } + } scanIndex = delimiterIndex + 1; } diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs index 0b9399780c..e43e3ce7a9 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs @@ -24,5 +24,44 @@ namespace Microsoft.AspNetCore.Http.Features // Assert Assert.Equal("bar", queryCollection["foo"]); } + + [Theory] + [InlineData("?q", "q")] + [InlineData("?q&", "q")] + [InlineData("?q1=abc&q2", "q2")] + [InlineData("?q=", "q")] + [InlineData("?q=&", "q")] + public void KeyWithoutValuesAddedToQueryCollection(string queryString, string emptyParam) + { + var features = new FeatureCollection(); + var request = new HttpRequestFeature(); + request.QueryString = queryString; + features[typeof(IHttpRequestFeature)] = request; + + var provider = new QueryFeature(features); + + var queryCollection = provider.Query; + + Assert.True(queryCollection.Keys.Contains(emptyParam)); + Assert.Equal(string.Empty, queryCollection[emptyParam]); + } + + [Theory] + [InlineData("?&&")] + [InlineData("?&")] + [InlineData("&&")] + public void EmptyKeysNotAddedToQueryCollection(string queryString) + { + var features = new FeatureCollection(); + var request = new HttpRequestFeature(); + request.QueryString = queryString; + features[typeof(IHttpRequestFeature)] = request; + + var provider = new QueryFeature(features); + + var queryCollection = provider.Query; + + Assert.Equal(0, queryCollection.Count); + } } } From a49ba744aa1a02d4e4987cecdbade7c12f8f7e9b Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 3 May 2016 15:35:03 +0100 Subject: [PATCH 563/846] Reduce Revision check calls via interface --- .../FeatureReferences.cs | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs index a713141448..adc10b3add 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs @@ -26,34 +26,39 @@ namespace Microsoft.AspNetCore.Http.Features public TFeature Fetch( ref TFeature cached, TState state, - Func factory) + Func factory) where TFeature : class { - var cleared = false; - if (Revision != Collection.Revision) + var revision = Collection.Revision; + if (Revision == revision) { - cleared = true; - Cache = default(TCache); + // collection unchanged, use cached + return cached ?? UpdateCached(ref cached, state, factory); + } + + // collection changed, clear cache + Cache = default(TCache); + // empty cache is current revision + Revision = revision; + + return UpdateCached(ref cached, state, factory); + } + + private TFeature UpdateCached(ref TFeature cached, TState state, Func factory) where TFeature : class + { + cached = Collection.Get(); + if (cached == null) + { + // create if item not in collection + cached = factory(state); + Collection.Set(cached); + // Revision changed by .Set, update revision Revision = Collection.Revision; } - var feature = cached; - if (feature == null || cleared) - { - feature = Collection.Get(); - if (feature == null) - { - feature = factory(state); - - Collection.Set(feature); - - Revision = Collection.Revision; - } - cached = feature; - } - return feature; + return cached; } - public TFeature Fetch(ref TFeature cached, Func factory) => - Fetch(ref cached, Collection, factory); + public TFeature Fetch(ref TFeature cached, Func factory) + where TFeature : class => Fetch(ref cached, Collection, factory); } } \ No newline at end of file From 485e2e832721923a3906b50dfd750af040806c24 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 26 May 2016 18:28:04 -0700 Subject: [PATCH 564/846] React to updated CoreCLR packages https://github.com/aspnet/Coherence/issues/97 --- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index a5b23b096d..b0af101030 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -37,7 +37,7 @@ "netstandard1.3": { "dependencies": { "System.Globalization.Extensions": "4.0.1-*", - "System.Linq.Expressions": "4.0.11-*", + "System.Linq.Expressions": "4.1.0-*", "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.1.0-*" } From c63f02c19f5a07ce1055a8a317c14302b7a24640 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 25 May 2016 10:32:06 -0700 Subject: [PATCH 565/846] Optimize form reader allocations --- .../FormReader.cs | 147 ++++++++++++------ .../FormReaderAsyncTest.cs | 22 +++ .../FormReaderTests.cs | 67 ++++++-- .../NonSeekableReadStream.cs | 2 + 4 files changed, 178 insertions(+), 60 deletions(-) create mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderAsyncTest.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs index db2866b7fd..9080ca1daf 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs @@ -28,6 +28,9 @@ namespace Microsoft.AspNetCore.WebUtilities private readonly StringBuilder _builder = new StringBuilder(); private int _bufferOffset; private int _bufferCount; + private string _currentKey; + private string _currentValue; + private bool _endOfStream; private bool _disposed; public FormReader(string data) @@ -97,13 +100,29 @@ namespace Microsoft.AspNetCore.WebUtilities /// The next key value pair, or null when the end of the form is reached. public KeyValuePair? ReadNextPair() { - var key = ReadWord('=', KeyLengthLimit); - if (string.IsNullOrEmpty(key) && _bufferCount == 0) + ReadNextPairImpl(); + if (ReadSucceded()) { - return null; + return new KeyValuePair(_currentKey, _currentValue); + } + return null; + } + + private void ReadNextPairImpl() + { + StartReadNextPair(); + while (!_endOfStream) + { + // Empty + if (_bufferCount == 0) + { + Buffer(); + } + if (TryReadNextPair()) + { + break; + } } - var value = ReadWord('&', ValueLengthLimit); - return new KeyValuePair(key, value); } // Format: key1=value1&key2=value2 @@ -114,51 +133,74 @@ namespace Microsoft.AspNetCore.WebUtilities /// The next key value pair, or null when the end of the form is reached. public async Task?> ReadNextPairAsync(CancellationToken cancellationToken = new CancellationToken()) { - var key = await ReadWordAsync('=', KeyLengthLimit, cancellationToken); - if (string.IsNullOrEmpty(key) && _bufferCount == 0) + await ReadNextPairAsyncImpl(cancellationToken); + if (ReadSucceded()) { - return null; + return new KeyValuePair(_currentKey, _currentValue); } - var value = await ReadWordAsync('&', ValueLengthLimit, cancellationToken); - return new KeyValuePair(key, value); + return null; } - private string ReadWord(char seperator, int limit) + private async Task ReadNextPairAsyncImpl(CancellationToken cancellationToken = new CancellationToken()) { - while (true) - { - // Empty - if (_bufferCount == 0) - { - Buffer(); - } - - string word; - if (ReadChar(seperator, limit, out word)) - { - return word; - } - } - } - - private async Task ReadWordAsync(char seperator, int limit, CancellationToken cancellationToken) - { - while (true) + StartReadNextPair(); + while (!_endOfStream) { // Empty if (_bufferCount == 0) { await BufferAsync(cancellationToken); } - - string word; - if (ReadChar(seperator, limit, out word)) + if (TryReadNextPair()) { - return word; + break; } } } + private void StartReadNextPair() + { + _currentKey = null; + _currentValue = null; + } + + private bool TryReadNextPair() + { + if (_currentKey == null) + { + if (!TryReadWord('=', KeyLengthLimit, out _currentKey)) + { + return false; + } + + if (_bufferCount == 0) + { + return false; + } + } + + if (_currentValue == null) + { + if (!TryReadWord('&', ValueLengthLimit, out _currentValue)) + { + return false; + } + } + return true; + } + + private bool TryReadWord(char seperator, int limit, out string value) + { + do + { + if (ReadChar(seperator, limit, out value)) + { + return true; + } + } while (_bufferCount > 0); + return false; + } + private bool ReadChar(char seperator, int limit, out string word) { // End @@ -198,6 +240,7 @@ namespace Microsoft.AspNetCore.WebUtilities { _bufferOffset = 0; _bufferCount = _reader.Read(_buffer, 0, _buffer.Length); + _endOfStream = _bufferCount == 0; } private async Task BufferAsync(CancellationToken cancellationToken) @@ -206,6 +249,7 @@ namespace Microsoft.AspNetCore.WebUtilities cancellationToken.ThrowIfCancellationRequested(); _bufferOffset = 0; _bufferCount = await _reader.ReadAsync(_buffer, 0, _buffer.Length); + _endOfStream = _bufferCount == 0; } /// @@ -215,17 +259,11 @@ namespace Microsoft.AspNetCore.WebUtilities public Dictionary ReadForm() { var accumulator = new KeyValueAccumulator(); - var pair = ReadNextPair(); - while (pair.HasValue) + while (!_endOfStream) { - accumulator.Append(pair.Value.Key, pair.Value.Value); - if (accumulator.Count > KeyCountLimit) - { - throw new InvalidDataException($"Form key count limit {KeyCountLimit} exceeded."); - } - pair = ReadNextPair(); + ReadNextPairImpl(); + Append(ref accumulator); } - return accumulator.GetResults(); } @@ -237,18 +275,29 @@ namespace Microsoft.AspNetCore.WebUtilities public async Task> ReadFormAsync(CancellationToken cancellationToken = new CancellationToken()) { var accumulator = new KeyValueAccumulator(); - var pair = await ReadNextPairAsync(cancellationToken); - while (pair.HasValue) + while (!_endOfStream) { - accumulator.Append(pair.Value.Key, pair.Value.Value); + await ReadNextPairAsyncImpl(cancellationToken); + Append(ref accumulator); + } + return accumulator.GetResults(); + } + + private bool ReadSucceded() + { + return _currentKey != null && _currentValue != null; + } + + private void Append(ref KeyValueAccumulator accumulator) + { + if (ReadSucceded()) + { + accumulator.Append(_currentKey, _currentValue); if (accumulator.Count > KeyCountLimit) { throw new InvalidDataException($"Form key count limit {KeyCountLimit} exceeded."); } - pair = await ReadNextPairAsync(cancellationToken); } - - return accumulator.GetResults(); } public void Dispose() diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderAsyncTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderAsyncTest.cs new file mode 100644 index 0000000000..0a7b5e20a9 --- /dev/null +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderAsyncTest.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNetCore.WebUtilities +{ + public class FormReaderAsyncTest : FormReaderTests + { + protected override async Task> ReadFormAsync(FormReader reader) + { + return await reader.ReadFormAsync(); + } + + protected override async Task?> ReadPair(FormReader reader) + { + return await reader.ReadNextPairAsync(); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs index fb0557d275..f28f307f05 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs @@ -1,10 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNetCore.WebUtilities @@ -18,7 +19,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var body = MakeStream(bufferRequest, "=bar"); - var formCollection = await new FormReader(body).ReadFormAsync(); + var formCollection = await ReadFormAsync(new FormReader(body)); Assert.Equal("bar", formCollection[""].ToString()); } @@ -30,7 +31,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var body = MakeStream(bufferRequest, "=bar&baz=2"); - var formCollection = await new FormReader(body).ReadFormAsync(); + var formCollection = await ReadFormAsync(new FormReader(body)); Assert.Equal("bar", formCollection[""].ToString()); Assert.Equal("2", formCollection["baz"].ToString()); @@ -43,7 +44,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var body = MakeStream(bufferRequest, "foo="); - var formCollection = await new FormReader(body).ReadFormAsync(); + var formCollection = await ReadFormAsync(new FormReader(body)); Assert.Equal("", formCollection["foo"].ToString()); } @@ -55,7 +56,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var body = MakeStream(bufferRequest, "foo=&baz=2"); - var formCollection = await new FormReader(body).ReadFormAsync(); + var formCollection = await ReadFormAsync(new FormReader(body)); Assert.Equal("", formCollection["foo"].ToString()); Assert.Equal("2", formCollection["baz"].ToString()); @@ -68,7 +69,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var body = MakeStream(bufferRequest, "foo=1&bar=2&baz=3&baz=4"); - var formCollection = await new FormReader(body) { KeyCountLimit = 3 }.ReadFormAsync(); + var formCollection = await ReadFormAsync(new FormReader(body) { KeyCountLimit = 3 }); Assert.Equal("1", formCollection["foo"].ToString()); Assert.Equal("2", formCollection["bar"].ToString()); @@ -84,7 +85,7 @@ namespace Microsoft.AspNetCore.WebUtilities var body = MakeStream(bufferRequest, "foo=1&baz=2&bar=3&baz=4&baf=5"); var exception = await Assert.ThrowsAsync( - () => new FormReader(body) { KeyCountLimit = 3 }.ReadFormAsync()); + () => ReadFormAsync(new FormReader(body) { KeyCountLimit = 3 })); Assert.Equal("Form key count limit 3 exceeded.", exception.Message); } @@ -95,7 +96,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var body = MakeStream(bufferRequest, "foo=1&bar=2&baz=3&baz=4"); - var formCollection = await new FormReader(body) { KeyLengthLimit = 10 }.ReadFormAsync(); + var formCollection = await ReadFormAsync(new FormReader(body) { KeyLengthLimit = 10 }); Assert.Equal("1", formCollection["foo"].ToString()); Assert.Equal("2", formCollection["bar"].ToString()); @@ -111,7 +112,7 @@ namespace Microsoft.AspNetCore.WebUtilities var body = MakeStream(bufferRequest, "foo=1&baz1234567890=2"); var exception = await Assert.ThrowsAsync( - () => new FormReader(body) { KeyLengthLimit = 10 }.ReadFormAsync()); + () => ReadFormAsync(new FormReader(body) { KeyLengthLimit = 10 })); Assert.Equal("Form key or value length limit 10 exceeded.", exception.Message); } @@ -122,7 +123,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var body = MakeStream(bufferRequest, "foo=1&bar=1234567890&baz=3&baz=4"); - var formCollection = await new FormReader(body) { ValueLengthLimit = 10 }.ReadFormAsync(); + var formCollection = await ReadFormAsync(new FormReader(body) { ValueLengthLimit = 10 }); Assert.Equal("1", formCollection["foo"].ToString()); Assert.Equal("1234567890", formCollection["bar"].ToString()); @@ -138,10 +139,54 @@ namespace Microsoft.AspNetCore.WebUtilities var body = MakeStream(bufferRequest, "foo=1&baz=1234567890123"); var exception = await Assert.ThrowsAsync( - () => new FormReader(body) { ValueLengthLimit = 10 }.ReadFormAsync()); + () => ReadFormAsync(new FormReader(body) { ValueLengthLimit = 10 })); Assert.Equal("Form key or value length limit 10 exceeded.", exception.Message); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadNextPair_ReadsAllPairs(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "foo=&baz=2"); + + var reader = new FormReader(body); + + var pair = (KeyValuePair)await ReadPair(reader); + + Assert.Equal("foo", pair.Key); + Assert.Equal("", pair.Value); + + pair = (KeyValuePair)await ReadPair(reader); + + Assert.Equal("baz", pair.Key); + Assert.Equal("2", pair.Value); + + Assert.Null(await ReadPair(reader)); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadNextPair_ReturnsNullOnEmptyStream(bool bufferRequest) + { + var body = MakeStream(bufferRequest, ""); + + var reader = new FormReader(body); + + Assert.Null(await ReadPair(reader)); + } + + protected virtual Task> ReadFormAsync(FormReader reader) + { + return Task.FromResult(reader.ReadForm()); + } + + protected virtual Task?> ReadPair(FormReader reader) + { + return Task.FromResult(reader.ReadNextPair()); + } + private static Stream MakeStream(bool bufferRequest, string text) { var formContent = Encoding.UTF8.GetBytes(text); diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs index 11c5d0ccc9..f3c77abb38 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs @@ -61,11 +61,13 @@ namespace Microsoft.AspNetCore.WebUtilities public override int Read(byte[] buffer, int offset, int count) { + count = Math.Max(count, 1); return _inner.Read(buffer, offset, count); } public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { + count = Math.Max(count, 1); return _inner.ReadAsync(buffer, offset, count, cancellationToken); } } From 0c8fb843e458a70cc5cef241edfa2f69f0137add Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Fri, 27 May 2016 11:36:29 -0700 Subject: [PATCH 566/846] Fix OSX build on Travis. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5323c4b2da..60138360be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,6 +22,8 @@ branches: - release - dev - /^(.*\/)?ci-.*$/ +before_install: + - if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; brew link --force openssl; fi script: - ./build.sh --quiet verify notifications: From 82126948742cf81f66cec7a1d575849ac34d2d82 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Tue, 24 May 2016 21:08:49 -0700 Subject: [PATCH 567/846] Add RawTarget property to IHttpRequestFeature (#596). --- .../IHttpRequestFeature.cs | 11 +++++++++++ .../Features/HttpRequestFeature.cs | 2 ++ .../OwinFeatureCollection.cs | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs index 16511caa74..5a84221b57 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs @@ -48,6 +48,17 @@ namespace Microsoft.AspNetCore.Http.Features /// string QueryString { get; set; } + /// + /// The request target as it was sent in the HTTP request. This property contains the + /// raw path and full query, as well as other request targets such as * for OPTIONS + /// requests (https://tools.ietf.org/html/rfc7230#section-5.3). + /// + /// + /// This property is not used internally for routing or authorization decisions. It has not + /// been UrlDecoded and care should be taken in its use. + /// + string RawTarget { get; set; } + /// /// Headers included in the request, aggregated by header name. The values are not split /// or merged across header lines. E.g. The following headers: diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs index c23051f6a3..b8b667bf4e 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs @@ -17,6 +17,7 @@ namespace Microsoft.AspNetCore.Http.Features PathBase = string.Empty; Path = string.Empty; QueryString = string.Empty; + RawTarget = string.Empty; } public string Protocol { get; set; } @@ -25,6 +26,7 @@ namespace Microsoft.AspNetCore.Http.Features public string PathBase { get; set; } public string Path { get; set; } public string QueryString { get; set; } + public string RawTarget { get; set; } public IHeaderDictionary Headers { get; set; } public Stream Body { get; set; } } diff --git a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs index 6809d5c4f2..4838b99f5c 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs @@ -102,6 +102,12 @@ namespace Microsoft.AspNetCore.Owin set { Prop(OwinConstants.RequestQueryString, Utilities.RemoveQuestionMark(value)); } } + string IHttpRequestFeature.RawTarget + { + get { return string.Empty; } + set { throw new NotSupportedException(); } + } + IHeaderDictionary IHttpRequestFeature.Headers { get { return Utilities.MakeHeaderDictionary(Prop>(OwinConstants.RequestHeaders)); } From 8b3c308c226dd61532e543697d9d35bb94aba823 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 31 May 2016 16:25:40 -0700 Subject: [PATCH 568/846] Limit value number instead of key number in form reader --- .../Features/FormFeature.cs | 10 +- .../Features/FormOptions.cs | 4 +- .../FormReader.cs | 10 +- .../KeyValueAccumulator.cs | 8 +- .../MultipartReader.cs | 2 +- .../Features/FormFeatureTests.cs | 104 +++++++++++++----- .../FormReaderTests.cs | 26 +++-- 7 files changed, 114 insertions(+), 50 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index 649f50d849..1aee72ff50 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -148,7 +148,7 @@ namespace Microsoft.AspNetCore.Http.Features var encoding = FilterEncoding(contentType.Encoding); using (var formReader = new FormReader(_request.Body, encoding) { - KeyCountLimit = _options.KeyCountLimit, + ValueCountLimit = _options.ValueCountLimit, KeyLengthLimit = _options.KeyLengthLimit, ValueLengthLimit = _options.ValueLengthLimit, }) @@ -200,9 +200,9 @@ namespace Microsoft.AspNetCore.Http.Features { files = new FormFileCollection(); } - if (files.Count >= _options.KeyCountLimit) + if (files.Count >= _options.ValueCountLimit) { - throw new InvalidDataException($"Form key count limit {_options.KeyCountLimit} exceeded."); + throw new InvalidDataException($"Form value count limit {_options.ValueCountLimit} exceeded."); } files.Add(file); } @@ -222,9 +222,9 @@ namespace Microsoft.AspNetCore.Http.Features // The value length limit is enforced by MultipartBodyLengthLimit var value = await reader.ReadToEndAsync(); formAccumulator.Append(key, value); - if (formAccumulator.Count > _options.KeyCountLimit) + if (formAccumulator.ValueCount > _options.ValueCountLimit) { - throw new InvalidDataException($"Form key count limit {_options.KeyCountLimit} exceeded."); + throw new InvalidDataException($"Form value count limit {_options.ValueCountLimit} exceeded."); } } } diff --git a/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs b/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs index dc249781e7..17e521b215 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs @@ -33,10 +33,10 @@ namespace Microsoft.AspNetCore.Http.Features public long BufferBodyLengthLimit { get; set; } = DefaultBufferBodyLengthLimit; /// - /// A limit for the number of form entries to allow. Entries with the same key will be combined. + /// A limit for the number of form entries to allow. /// Forms that exceed this limit will throw an when parsed. /// - public int KeyCountLimit { get; set; } = FormReader.DefaultKeyCountLimit; + public int ValueCountLimit { get; set; } = FormReader.DefaultValueCountLimit; /// /// A limit on the length of individual keys. Forms containing keys that exceed this limit will diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs index 9080ca1daf..958a4971fa 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// public class FormReader : IDisposable { - public const int DefaultKeyCountLimit = 1024; + public const int DefaultValueCountLimit = 1024; public const int DefaultKeyLengthLimit = 1024 * 2; public const int DefaultValueLengthLimit = 1024 * 1024 * 4; @@ -78,9 +78,9 @@ namespace Microsoft.AspNetCore.WebUtilities } /// - /// The limit on the number of form keys to allow in ReadForm or ReadFormAsync. + /// The limit on the number of form values to allow in ReadForm or ReadFormAsync. /// - public int KeyCountLimit { get; set; } = DefaultKeyCountLimit; + public int ValueCountLimit { get; set; } = DefaultValueCountLimit; /// /// The limit on the length of form keys. @@ -293,9 +293,9 @@ namespace Microsoft.AspNetCore.WebUtilities if (ReadSucceded()) { accumulator.Append(_currentKey, _currentValue); - if (accumulator.Count > KeyCountLimit) + if (accumulator.ValueCount > ValueCountLimit) { - throw new InvalidDataException($"Form key count limit {KeyCountLimit} exceeded."); + throw new InvalidDataException($"Form value count limit {ValueCountLimit} exceeded."); } } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs index 1420344346..5ae402e523 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs @@ -59,11 +59,15 @@ namespace Microsoft.AspNetCore.WebUtilities // First value for this key _accumulator[key] = new StringValues(value); } + + ValueCount++; } - public bool HasValues => _accumulator != null; + public bool HasValues => ValueCount > 0; - public int Count => _accumulator?.Count ?? 0; + public int KeyCount => _accumulator?.Count ?? 0; + + public int ValueCount { get; private set; } public Dictionary GetResults() { diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs index 59c9cc0042..2da50a5360 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs @@ -104,7 +104,7 @@ namespace Microsoft.AspNetCore.WebUtilities var name = line.Substring(0, splitIndex); var value = line.Substring(splitIndex + 1, line.Length - splitIndex - 1).Trim(); accumulator.Append(name, value); - if (accumulator.Count > HeadersCountLimit) + if (accumulator.KeyCount > HeadersCountLimit) { throw new InvalidDataException($"Multipart headers count limit {HeadersCountLimit} exceeded."); } diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index 1c3bdac123..79bdb9f947 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNetCore.Http.Internal; using Xunit; namespace Microsoft.AspNetCore.Http.Features @@ -48,33 +48,35 @@ namespace Microsoft.AspNetCore.Http.Features } private const string MultipartContentType = "multipart/form-data; boundary=WebKitFormBoundary5pDRpGheQXaM8k3T"; - private const string EmptyMultipartForm = -"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + + private const string EmptyMultipartForm = "--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + // Note that CRLF (\r\n) is required. You can't use multi-line C# strings here because the line breaks on Linux are just LF. + private const string MultipartFormEnd = "--WebKitFormBoundary5pDRpGheQXaM8k3T--\r\n"; + + private const string MultipartFormField = "--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"description\"\r\n" + +"\r\n" + +"Foo\r\n"; + + private const string MultipartFormFile = "--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + +"Hello World\r\n"; + private const string MultipartFormWithField = -"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + -"Content-Disposition: form-data; name=\"description\"\r\n" + -"\r\n" + -"Foo\r\n" + -"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + MultipartFormField + + MultipartFormEnd; + private const string MultipartFormWithFile = -"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + -"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + -"Content-Type: text/html\r\n" + -"\r\n" + -"Hello World\r\n" + -"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + MultipartFormFile + + MultipartFormEnd; + private const string MultipartFormWithFieldAndFile = -"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + -"Content-Disposition: form-data; name=\"description\"\r\n" + -"\r\n" + -"Foo\r\n" + -"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + -"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + -"Content-Type: text/html\r\n" + -"\r\n" + -"Hello World\r\n" + -"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + MultipartFormField + + MultipartFormFile + + MultipartFormEnd; [Theory] [InlineData(true)] @@ -243,6 +245,55 @@ namespace Microsoft.AspNetCore.Http.Features await responseFeature.CompleteAsync(); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_ValueCountLimitExceeded_Throw(bool bufferRequest) + { + var formContent = new List(); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormField)); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormField)); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormField)); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormEnd)); + + var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new NonSeekableReadStream(formContent.ToArray()); + + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest, ValueCountLimit = 2 }); + context.Features.Set(formFeature); + + var exception = await Assert.ThrowsAsync (() => context.Request.ReadFormAsync()); + Assert.Equal(exception.Message, "Form value count limit 2 exceeded."); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_ValueCountLimitExceededWithFiles_Throw(bool bufferRequest) + { + var formContent = new List(); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFile)); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFile)); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFile)); + formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormEnd)); + + + var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new NonSeekableReadStream(formContent.ToArray()); + + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest, ValueCountLimit = 2 }); + context.Features.Set(formFeature); + + var exception = await Assert.ThrowsAsync (() => context.Request.ReadFormAsync()); + Assert.Equal(exception.Message, "Form value count limit 2 exceeded."); + } + [Theory] // FileBufferingReadStream transitions to disk storage after 30kb, and stops pooling buffers at 1mb. [InlineData(true, 1024)] @@ -313,10 +364,7 @@ namespace Microsoft.AspNetCore.Http.Features { var stream = new MemoryStream(); var header = -"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + -"Content-Disposition: form-data; name=\"description\"\r\n" + -"\r\n" + -"Foo\r\n" + +MultipartFormField + "--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + "Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + "Content-Type: text/html\r\n" + diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs index f28f307f05..fbe6af6cce 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs @@ -65,28 +65,40 @@ namespace Microsoft.AspNetCore.WebUtilities [Theory] [InlineData(true)] [InlineData(false)] - public async Task ReadFormAsync_KeyCountLimitMet_Success(bool bufferRequest) + public async Task ReadFormAsync_ValueCountLimitMet_Success(bool bufferRequest) { - var body = MakeStream(bufferRequest, "foo=1&bar=2&baz=3&baz=4"); + var body = MakeStream(bufferRequest, "foo=1&bar=2&baz=3"); - var formCollection = await ReadFormAsync(new FormReader(body) { KeyCountLimit = 3 }); + var formCollection = await ReadFormAsync(new FormReader(body) { ValueCountLimit = 3 }); Assert.Equal("1", formCollection["foo"].ToString()); Assert.Equal("2", formCollection["bar"].ToString()); - Assert.Equal("3,4", formCollection["baz"].ToString()); + Assert.Equal("3", formCollection["baz"].ToString()); Assert.Equal(3, formCollection.Count); } [Theory] [InlineData(true)] [InlineData(false)] - public async Task ReadFormAsync_KeyCountLimitExceeded_Throw(bool bufferRequest) + public async Task ReadFormAsync_ValueCountLimitExceeded_Throw(bool bufferRequest) { var body = MakeStream(bufferRequest, "foo=1&baz=2&bar=3&baz=4&baf=5"); var exception = await Assert.ThrowsAsync( - () => ReadFormAsync(new FormReader(body) { KeyCountLimit = 3 })); - Assert.Equal("Form key count limit 3 exceeded.", exception.Message); + () => ReadFormAsync(new FormReader(body) { ValueCountLimit = 3 })); + Assert.Equal("Form value count limit 3 exceeded.", exception.Message); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_ValueCountLimitExceededSameKey_Throw(bool bufferRequest) + { + var body = MakeStream(bufferRequest, "baz=1&baz=2&baz=3&baz=4"); + + var exception = await Assert.ThrowsAsync( + () => ReadFormAsync(new FormReader(body) { ValueCountLimit = 3 })); + Assert.Equal("Form value count limit 3 exceeded.", exception.Message); } [Theory] From 3fc1fef2bee19dceb7aea5b3bdb7f682475e61bf Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 3 Jun 2016 13:11:40 -0700 Subject: [PATCH 569/846] #573 Rename UriHelper.Encode --- samples/SampleApp/Program.cs | 29 ++++++---------- samples/SampleApp/project.json | 22 +++++++++--- .../UriHelper.cs | 34 +++++++++---------- .../UriHelperTests.cs | 8 ++--- 4 files changed, 48 insertions(+), 45 deletions(-) diff --git a/samples/SampleApp/Program.cs b/samples/SampleApp/Program.cs index 0bfe4fbd10..28d24befe0 100644 --- a/samples/SampleApp/Program.cs +++ b/samples/SampleApp/Program.cs @@ -1,30 +1,21 @@ using System; -using System.Diagnostics; -using Microsoft.Extensions.Primitives; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; namespace SampleApp { public class Program { - public void Main(string[] args) + public static void Main(string[] args) { - for (int i = 0; i < 10; i++) + var query = new QueryBuilder() { - Stopwatch timer = new Stopwatch(); - timer.Start(); - string myString; - string[] myArray; - StringValues myValues; - for (int j = 0; j < 100000000; j++) - { - myString = new string('a', 40); - myArray = new[] { myString }; - // myValues = new StringValues(myString); - myValues = new StringValues(myArray); - } - timer.Stop(); - Console.WriteLine(timer.Elapsed + ", " + Environment.WorkingSet); - } + { "hello", "world" } + }.ToQueryString(); + + var uri = UriHelper.BuildAbsolute("http", new HostString("contoso.com"), query: query); + + Console.WriteLine(uri); } } } diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 3d6d5e467f..5bd99c71c7 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,12 +1,24 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNetCore.Http": "1.0.0-*" - }, - "commands": { - "SampleApp": "SampleApp" + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*" }, "frameworks": { - "net451": {} + "net451": { }, + "netcoreapp1.0": { + "imports": [ + "dnxcore50" + ], + "dependencies": { + "Microsoft.NETCore.App": { + "version": "1.0.0-*", + "type": "platform" + } + } + } + }, + "buildOptions": { + "emitEntryPoint": true } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index e7a7eb20a5..2c8c0f6840 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -16,12 +16,12 @@ namespace Microsoft.AspNetCore.Http.Extensions /// /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. /// - /// - /// - /// - /// + /// The first portion of the request path associated with application root. + /// The portion of the request path that identifies the requested resource. + /// The query, if any. + /// The fragment, if any. /// - public static string Encode( + public static string BuildRelative( PathString pathBase = new PathString(), PathString path = new PathString(), QueryString query = new QueryString(), @@ -35,14 +35,14 @@ namespace Microsoft.AspNetCore.Http.Extensions /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. /// Note that unicode in the HostString will be encoded as punycode. /// - /// - /// - /// - /// - /// - /// + /// http, https, etc. + /// The host portion of the uri normally included in the Host header. This may include the port. + /// The first portion of the request path associated with application root. + /// The portion of the request path that identifies the requested resource. + /// The query, if any. + /// The fragment, if any. /// - public static string Encode( + public static string BuildAbsolute( string scheme, HostString host, PathString pathBase = new PathString(), @@ -74,13 +74,13 @@ namespace Microsoft.AspNetCore.Http.Extensions /// Generates a string from the given absolute or relative Uri that is appropriately encoded for use in /// HTTP headers. Note that a unicode host name will be encoded as punycode. /// - /// + /// The Uri to encode. /// public static string Encode(Uri uri) { if (uri.IsAbsoluteUri) { - return Encode( + return BuildAbsolute( scheme: uri.Scheme, host: HostString.FromUriComponent(uri), pathBase: PathString.FromUriComponent(uri), @@ -97,18 +97,18 @@ namespace Microsoft.AspNetCore.Http.Extensions /// Returns the combined components of the request URL in a fully escaped form suitable for use in HTTP headers /// and other HTTP operations. /// - /// + /// The request to assemble the uri pieces from. /// public static string GetEncodedUrl(this HttpRequest request) { - return Encode(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); + return BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); } /// /// Returns the combined components of the request URL in a fully un-escaped form (except for the QueryString) /// suitable only for display. This format should not be used in HTTP headers or other HTTP operations. /// - /// + /// The request to assemble the uri pieces from. /// public static string GetDisplayUrl(this HttpRequest request) { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index 06c4f4a383..0b0aeda6e1 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Http.Extensions [Fact] public void EncodeEmptyPartialUrl() { - var result = UriHelper.Encode(); + var result = UriHelper.BuildRelative(); Assert.Equal("/", result); } @@ -18,7 +18,7 @@ namespace Microsoft.AspNetCore.Http.Extensions [Fact] public void EncodePartialUrl() { - var result = UriHelper.Encode(new PathString("/un?escaped/base"), new PathString("/un?escaped"), + var result = UriHelper.BuildRelative(new PathString("/un?escaped/base"), new PathString("/un?escaped"), new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); Assert.Equal("/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); @@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Http.Extensions [Fact] public void EncodeEmptyFullUrl() { - var result = UriHelper.Encode("http", new HostString(string.Empty)); + var result = UriHelper.BuildAbsolute("http", new HostString(string.Empty)); Assert.Equal("http:///", result); } @@ -35,7 +35,7 @@ namespace Microsoft.AspNetCore.Http.Extensions [Fact] public void EncodeFullUrl() { - var result = UriHelper.Encode("http", new HostString("my.HoΨst:80"), new PathString("/un?escaped/base"), new PathString("/un?escaped"), + var result = UriHelper.BuildAbsolute("http", new HostString("my.HoΨst:80"), new PathString("/un?escaped/base"), new PathString("/un?escaped"), new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); From cdb16d656c9587c1ebab676db0066c7d5dd581e1 Mon Sep 17 00:00:00 2001 From: jacalvar Date: Tue, 7 Jun 2016 17:03:49 -0700 Subject: [PATCH 570/846] Remove unncessary imports --- samples/SampleApp/project.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 5bd99c71c7..90f0bcd2e5 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -7,9 +7,6 @@ "frameworks": { "net451": { }, "netcoreapp1.0": { - "imports": [ - "dnxcore50" - ], "dependencies": { "Microsoft.NETCore.App": { "version": "1.0.0-*", From 54bdd47763c95ffc164860c629a12fb4c42e9b90 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 13 Jun 2016 15:28:32 -0700 Subject: [PATCH 571/846] Remove direct Microsoft.NETCore.Platforms dependency. - Microsoft.NETCore.App now pulls this package in. aspnet/Coherence-Signed#344 --- test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json | 1 - test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json | 1 - test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 1 - test/Microsoft.AspNetCore.Http.Tests/project.json | 1 - test/Microsoft.AspNetCore.Owin.Tests/project.json | 1 - test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 1 - test/Microsoft.Net.Http.Headers.Tests/project.json | 1 - 7 files changed, 7 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 0ec5cdf3de..a90bc986b7 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -5,7 +5,6 @@ }, "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Testing": "1.0.0-*", "xunit": "2.1.0" diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 94b4aa69aa..1d88439fd6 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,7 +1,6 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index a31e0b097d..a49622b9c5 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,7 +1,6 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http.Features": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 861120db82..40589df898 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,7 +1,6 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index c6ae85cf17..a758373f9a 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,7 +1,6 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.Http": "1.0.0-*", "Microsoft.AspNetCore.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 6cd8a485e8..e2eff2067f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,7 +1,6 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index c3baa5aa34..5868906f0a 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -2,7 +2,6 @@ "version": "1.0.0-*", "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.NETCore.Platforms": "1.0.1-*", "Microsoft.Net.Http.Headers": "1.0.0-*", "xunit": "2.1.0" }, From 7af884d4ea485ac3638305a83af488caf611b528 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 14 Jun 2016 16:22:24 -0700 Subject: [PATCH 572/846] Updating to release. --- NuGet.config | 4 ++-- build.ps1 | 2 +- build.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index 8f2f99691a..cf8bff13bb 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/release.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index f4208100eb..f88fe4052e 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/release.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi From 2a1e6649b0d3d9bbf9fb8e73b5e7b27ee457dfb7 Mon Sep 17 00:00:00 2001 From: Alex Forbes-Reed <0xdeafcafe@users.noreply.github.com> Date: Mon, 13 Jun 2016 12:04:09 +0100 Subject: [PATCH 573/846] Added RFC 4918 support --- src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index 9c0f4999ce..b40744d0a1 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -12,6 +12,7 @@ namespace Microsoft.AspNetCore.Http public const int Status204NoContent = 204; public const int Status205ResetContent = 205; public const int Status206PartialContent = 206; + public const int Status207MultiStatus = 207; public const int Status300MultipleChoices = 300; public const int Status301MovedPermanently = 301; @@ -42,6 +43,9 @@ namespace Microsoft.AspNetCore.Http public const int Status417ExpectationFailed = 417; public const int Status418ImATeapot = 418; public const int Status419AuthenticationTimeout = 419; + public const int Status422UnprocessableEntity = 422; + public const int Status423Locked = 423; + public const int Status424FailedDependency = 424; public const int Status500InternalServerError = 500; public const int Status501NotImplemented = 501; @@ -50,5 +54,6 @@ namespace Microsoft.AspNetCore.Http public const int Status504GatewayTimeout = 504; public const int Status505HttpVersionNotsupported = 505; public const int Status506VariantAlsoNegotiates = 506; + public const int Status507InsufficientStorage = 507; } -} \ No newline at end of file +} From 0a3213ebaaac72939033b67058d3748221a74988 Mon Sep 17 00:00:00 2001 From: Alex Forbes-Reed <0xdeafcafe@users.noreply.github.com> Date: Mon, 13 Jun 2016 12:04:47 +0100 Subject: [PATCH 574/846] Added RFC 7538 support --- src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index b40744d0a1..6129ea699f 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -22,6 +22,7 @@ namespace Microsoft.AspNetCore.Http public const int Status305UseProxy = 305; public const int Status306SwitchProxy = 306; public const int Status307TemporaryRedirect = 307; + public const int Status308PermanentRedirect = 308; public const int Status400BadRequest = 400; public const int Status401Unauthorized = 401; From 3865136b97ed6dde2f1ef4b5ebc79f3a8e5007c8 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 14 Jun 2016 11:27:18 +0200 Subject: [PATCH 575/846] Added "451 Unavailable For Legal Reasons" to StatusCodes From RFC7725 - https://tools.ietf.org/html/rfc7725 --- src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index 6129ea699f..0d169b1982 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -47,6 +47,7 @@ namespace Microsoft.AspNetCore.Http public const int Status422UnprocessableEntity = 422; public const int Status423Locked = 423; public const int Status424FailedDependency = 424; + public const int Status451UnavailableForLegalReasons = 451; public const int Status500InternalServerError = 500; public const int Status501NotImplemented = 501; From 8f3d894b9544c147be70579f11001c257c356151 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 15 Jun 2016 15:33:24 -0700 Subject: [PATCH 576/846] #625 Changes Error Message when trying to reuse stream --- .../MultipartReaderStream.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index e9220a8d25..bc40b08afc 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -226,7 +226,7 @@ namespace Microsoft.AspNetCore.WebUtilities PositionInnerStream(); if (!_innerStream.EnsureBuffered(_boundary.FinalBoundaryLength)) { - throw new IOException("Unexpected end of stream."); + throw new IOException("Unexpected end of Stream, the content may have already been read by another component. "); } var bufferedData = _innerStream.BufferedData; @@ -280,7 +280,7 @@ namespace Microsoft.AspNetCore.WebUtilities PositionInnerStream(); if (!await _innerStream.EnsureBufferedAsync(_boundary.FinalBoundaryLength, cancellationToken)) { - throw new IOException("Unexpected end of stream."); + throw new IOException("Unexpected end of Stream, the content may have already been read by another component. "); } var bufferedData = _innerStream.BufferedData; From d71c2cb6ce43346b57ddf32d7e1034854fd7b591 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 15 Jun 2016 14:11:42 -0700 Subject: [PATCH 577/846] Adds Refactor to Equals in Path String, Adds Regression Tests --- .../PathString.cs | 16 +++++--- .../PathStringTests.cs | 38 +++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 9565c361ab..72e8d9590c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -213,7 +213,7 @@ namespace Microsoft.AspNetCore.Http /// True if both PathString values are equal public bool Equals(PathString other) { - return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + return Equals(other, StringComparison.OrdinalIgnoreCase); } /// @@ -224,6 +224,10 @@ namespace Microsoft.AspNetCore.Http /// True if both PathString values are equal public bool Equals(PathString other, StringComparison comparisonType) { + if (!HasValue && !other.HasValue) + { + return true; + } return string.Equals(_value, other._value, comparisonType); } @@ -236,9 +240,9 @@ namespace Microsoft.AspNetCore.Http { if (ReferenceEquals(null, obj)) { - return false; + return !HasValue; } - return obj is PathString && Equals((PathString)obj, StringComparison.OrdinalIgnoreCase); + return obj is PathString && Equals((PathString)obj); } /// @@ -247,7 +251,7 @@ namespace Microsoft.AspNetCore.Http /// The hash code public override int GetHashCode() { - return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); + return (HasValue ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); } /// @@ -258,7 +262,7 @@ namespace Microsoft.AspNetCore.Http /// True if both PathString values are equal public static bool operator ==(PathString left, PathString right) { - return left.Equals(right, StringComparison.OrdinalIgnoreCase); + return left.Equals(right); } /// @@ -269,7 +273,7 @@ namespace Microsoft.AspNetCore.Http /// True if both PathString values are not equal public static bool operator !=(PathString left, PathString right) { - return !left.Equals(right, StringComparison.OrdinalIgnoreCase); + return !left.Equals(right); } /// diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index e1be9d988d..6aa15216af 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -16,6 +16,44 @@ namespace Microsoft.AspNetCore.Http ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", "The path in 'value' must start with '/'."); } + [Fact] + public void Equals_EmptyPathStringAndDefaultPathString() + { + // Act and Assert + Assert.Equal(PathString.Empty, default(PathString)); + Assert.Equal(default(PathString), PathString.Empty); + Assert.True(PathString.Empty == default(PathString)); + Assert.True(default(PathString) == PathString.Empty); + Assert.True(PathString.Empty.Equals(default(PathString))); + Assert.True(default(PathString).Equals(PathString.Empty)); + } + + [Fact] + public void NotEquals_DefaultPathStringAndNonNullPathString() + { + // Arrange + var pathString = new PathString("/hello"); + + // Act and Assert + Assert.NotEqual(pathString, default(PathString)); + } + + [Fact] + public void NotEquals_EmptyPathStringAndNonNullPathString() + { + // Arrange + var pathString = new PathString("/hello"); + + // Act and Assert + Assert.NotEqual(pathString, PathString.Empty); + } + + [Fact] + public void HashCode_CheckNullAndEmptyHaveSameHashcodes() + { + Assert.Equal(PathString.Empty.GetHashCode(), default(PathString).GetHashCode()); + } + [Theory] [InlineData(null, null)] [InlineData("", null)] From 20d608170e22a69004c60821582bea6cd781cfb8 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 16 Jun 2016 10:17:57 -0700 Subject: [PATCH 578/846] Updating to dev versions --- samples/SampleApp/project.json | 8 ++++---- .../project.json | 6 +++--- .../project.json | 8 ++++---- src/Microsoft.AspNetCore.Http.Features/project.json | 4 ++-- src/Microsoft.AspNetCore.Http/project.json | 12 ++++++------ src/Microsoft.AspNetCore.Owin/project.json | 4 ++-- src/Microsoft.AspNetCore.WebUtilities/project.json | 4 ++-- src/Microsoft.Net.Http.Headers/project.json | 2 +- .../project.json | 4 ++-- .../project.json | 6 +++--- .../project.json | 2 +- test/Microsoft.AspNetCore.Http.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Owin.Tests/project.json | 6 +++--- .../project.json | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 4 ++-- 15 files changed, 37 insertions(+), 37 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 90f0bcd2e5..0795191078 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,11 +1,11 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "dependencies": { - "Microsoft.AspNetCore.Http": "1.0.0-*", - "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*" + "Microsoft.AspNetCore.Http": "1.1.0-*", + "Microsoft.AspNetCore.Http.Extensions": "1.1.0-*" }, "frameworks": { - "net451": { }, + "net451": {}, "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index b0af101030..1353449366 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "description": "ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder.\r\nCommonly used types:\r\nMicrosoft.AspNetCore.Builder.IApplicationBuilder\r\nMicrosoft.AspNetCore.Http.HttpContext\r\nMicrosoft.AspNetCore.Http.HttpRequest\r\nMicrosoft.AspNetCore.Http.HttpResponse", "packOptions": { "repository": { @@ -19,10 +19,10 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http.Features": "1.0.0-*", + "Microsoft.AspNetCore.Http.Features": "1.1.0-*", "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", - "version": "1.0.0-*" + "version": "1.1.0-*" }, "System.Text.Encodings.Web": "4.0.0-*" }, diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 60f729f8a9..d37c25798a 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "description": "ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state.", "packOptions": { "repository": { @@ -19,9 +19,9 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", - "Microsoft.Extensions.FileProviders.Abstractions": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.1.0-*", + "Microsoft.Extensions.FileProviders.Abstractions": "1.1.0-*", + "Microsoft.Net.Http.Headers": "1.1.0-*", "System.Buffers": "4.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 476740b4ce..acd20aef2e 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "description": "ASP.NET Core HTTP feature interface definitions.", "packOptions": { "repository": { @@ -19,7 +19,7 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*" + "Microsoft.Extensions.Primitives": "1.1.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index e6d5e6dae3..079d9b853e 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "description": "ASP.NET Core default HTTP feature implementations.", "packOptions": { "repository": { @@ -20,11 +20,11 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", - "Microsoft.Extensions.ObjectPool": "1.0.0-*", - "Microsoft.Extensions.Options": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.1.0-*", + "Microsoft.AspNetCore.WebUtilities": "1.1.0-*", + "Microsoft.Extensions.ObjectPool": "1.1.0-*", + "Microsoft.Extensions.Options": "1.1.0-*", + "Microsoft.Net.Http.Headers": "1.1.0-*", "System.Buffers": "4.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 4e64034799..2c22181651 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "description": "ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application.", "packOptions": { "repository": { @@ -21,7 +21,7 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http": "1.0.0-*" + "Microsoft.AspNetCore.Http": "1.1.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index a712242d2c..fbf32d145c 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "description": "ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings.", "packOptions": { "repository": { @@ -19,7 +19,7 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*", + "Microsoft.Extensions.Primitives": "1.1.0-*", "System.Buffers": "4.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index dfe26943fc..af1a98f866 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "description": "HTTP header parser implementations.", "packOptions": { "repository": { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index a90bc986b7..c026a93197 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -5,8 +5,8 @@ }, "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.AspNetCore.Http": "1.0.0-*", - "Microsoft.AspNetCore.Testing": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.1.0-*", + "Microsoft.AspNetCore.Testing": "1.1.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 1d88439fd6..e3ee138c99 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,9 +1,9 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.AspNetCore.Http": "1.0.0-*", - "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", - "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.1.0-*", + "Microsoft.AspNetCore.Http.Extensions": "1.1.0-*", + "Microsoft.Extensions.DependencyInjection": "1.1.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index a49622b9c5..7ad6f6a48a 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.AspNetCore.Http.Features": "1.0.0-*", + "Microsoft.AspNetCore.Http.Features": "1.1.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 40589df898..1ec28e19c8 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.1.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index a758373f9a..8ba199e06b 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,9 +1,9 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.AspNetCore.Http": "1.0.0-*", - "Microsoft.AspNetCore.Owin": "1.0.0-*", - "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.1.0-*", + "Microsoft.AspNetCore.Owin": "1.1.0-*", + "Microsoft.Extensions.DependencyInjection": "1.1.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index e2eff2067f..6e3fedb6fe 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", + "Microsoft.AspNetCore.WebUtilities": "1.1.0-*", "xunit": "2.1.0" }, "buildOptions": { diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 5868906f0a..4f7d2a8e7f 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,8 +1,8 @@ { - "version": "1.0.0-*", + "version": "1.1.0-*", "dependencies": { "dotnet-test-xunit": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.1.0-*", "xunit": "2.1.0" }, "frameworks": { From 3c0c02112d07f3e42c16fc881ecd15f0a7a7d707 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 23 Jun 2016 14:22:23 -0700 Subject: [PATCH 579/846] #659 Parse headers with consecutive commas --- .../Internal/HeaderSegmentCollection.cs | 3 +++ .../HeaderDictionaryTests.cs | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs index 4ef781990a..77ece1864f 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs @@ -188,6 +188,9 @@ namespace Microsoft.AspNetCore.Http.Internal switch (attr) { case Attr.Delimiter: + _valueStart = _valueStart == -1 ? _offset : _valueStart; + _valueEnd = _valueEnd == -1 ? _offset : _valueEnd; + _trailingStart = _trailingStart == -1 ? _offset : _trailingStart; _leadingEnd = _offset; _mode = Mode.Produce; break; diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index a1fac3658e..40c94df9dd 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -10,6 +10,14 @@ namespace Microsoft.AspNetCore.Http { public class HeaderDictionaryTests { + public static TheoryData HeaderSegmentData => new TheoryData> + { + new[] { "Value1", "Value2", "Value3", "Value4" }, + new[] { "Value1", "", "Value3", "Value4" }, + new[] { "Value1", "", "", "Value4" }, + new[] { "", "", "", "" } + }; + [Fact] public void PropertiesAreAccessible() { @@ -26,5 +34,22 @@ namespace Microsoft.AspNetCore.Http Assert.Equal("Value1", headers["header1"]); Assert.Equal(new[] { "Value1" }, headers["header1"].ToArray()); } + + [Theory] + [MemberData(nameof(HeaderSegmentData))] + public void EmptyHeaderSegmentsAreParsable(IEnumerable segments) + { + var header = string.Join(",", segments); + + var headers = new HeaderDictionary( + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Header1", header}, + }); + + var result = headers.GetCommaSeparatedValues("Header1"); + + Assert.Equal(segments, result); + } } } \ No newline at end of file From 4986137ffe7d32dbca60b9ebb8563e1595aa5476 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 29 Jun 2016 11:14:27 -0700 Subject: [PATCH 580/846] Use filename* for files in multipart forms when available #651 --- .../Features/FormFeature.cs | 4 +- .../Features/FormFeatureTests.cs | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index 1aee72ff50..ff1fd9ccf3 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -181,7 +181,9 @@ namespace Microsoft.AspNetCore.Http.Features await section.Body.DrainAsync(cancellationToken); var name = HeaderUtilities.RemoveQuotes(contentDisposition.Name) ?? string.Empty; - var fileName = HeaderUtilities.RemoveQuotes(contentDisposition.FileName) ?? string.Empty; + var fileName = HeaderUtilities.RemoveQuotes(contentDisposition.FileNameStar) ?? + HeaderUtilities.RemoveQuotes(contentDisposition.FileName) ?? + string.Empty; FormFile file; if (section.BaseStreamOffset.HasValue) diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index 79bdb9f947..7a73c1f446 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -63,6 +63,12 @@ namespace Microsoft.AspNetCore.Http.Features "Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + "Content-Type: text/html\r\n" + "\r\n" + +"Hello World\r\n"; + + private const string MultipartFormEncodedFilename = "--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"; filename*=utf-8\'\'t%c3%a9mp.html\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + "Hello World\r\n"; private const string MultipartFormWithField = @@ -78,6 +84,10 @@ namespace Microsoft.AspNetCore.Http.Features MultipartFormFile + MultipartFormEnd; + private const string MultipartFormWithEncodedFilename = + MultipartFormEncodedFilename + + MultipartFormEnd; + [Theory] [InlineData(true)] [InlineData(false)] @@ -198,6 +208,54 @@ namespace Microsoft.AspNetCore.Http.Features await responseFeature.CompleteAsync(); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_MultipartWithEncodedFilename_ReturnsParsedFormCollection(bool bufferRequest) + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithEncodedFilename); + var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new NonSeekableReadStream(formContent); + + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); + + var formCollection = await context.Request.ReadFormAsync(); + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.Features.Get(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); + Assert.Same(formCollection, context.Request.Form); + + // Content + Assert.Equal(0, formCollection.Count); + + Assert.NotNull(formCollection.Files); + Assert.Equal(1, formCollection.Files.Count); + + var file = formCollection.Files["myfile1"]; + Assert.Equal("myfile1", file.Name); + Assert.Equal("t\u00e9mp.html", file.FileName); + Assert.Equal("text/html", file.ContentType); + Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""; filename*=utf-8''t%c3%a9mp.html", file.ContentDisposition); + var body = file.OpenReadStream(); + using (var reader = new StreamReader(body)) + { + Assert.True(body.CanSeek); + var content = reader.ReadToEnd(); + Assert.Equal(content, "Hello World"); + } + + await responseFeature.CompleteAsync(); + } + [Theory] [InlineData(true)] [InlineData(false)] From 62eaf16585025f16fdce49fb000a0b902b65c457 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 30 Jun 2016 14:59:22 -0700 Subject: [PATCH 581/846] Updating to RTM builds of xunit --- .../project.json | 23 ++++--------------- .../project.json | 23 ++++--------------- .../project.json | 23 ++++--------------- .../project.json | 23 ++++--------------- .../project.json | 23 ++++--------------- .../project.json | 23 ++++--------------- .../project.json | 23 ++++--------------- 7 files changed, 35 insertions(+), 126 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index c026a93197..962a99e2fb 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -4,10 +4,10 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "dotnet-test-xunit": "1.0.0-*", + "dotnet-test-xunit": "2.2.0-*", "Microsoft.AspNetCore.Http": "1.1.0-*", "Microsoft.AspNetCore.Testing": "1.1.0-*", - "xunit": "2.1.0" + "xunit": "2.2.0-*" }, "frameworks": { "netcoreapp1.0": { @@ -15,23 +15,10 @@ "Microsoft.NETCore.App": { "version": "1.0.0-*", "type": "platform" - }, - "System.Diagnostics.Process": "4.1.0-*" - }, - "imports": [ - "dnxcore50", - "portable-net451+win8" - ] - }, - "net451": { - "frameworkAssemblies": { - "System.Runtime": "", - "System.Threading.Tasks": "" - }, - "dependencies": { - "xunit.runner.console": "2.1.0" + } } - } + }, + "net451": {} }, "testRunner": "xunit" } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index e3ee138c99..e238763f98 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,10 +1,10 @@ { "dependencies": { - "dotnet-test-xunit": "1.0.0-*", + "dotnet-test-xunit": "2.2.0-*", "Microsoft.AspNetCore.Http": "1.1.0-*", "Microsoft.AspNetCore.Http.Extensions": "1.1.0-*", "Microsoft.Extensions.DependencyInjection": "1.1.0-*", - "xunit": "2.1.0" + "xunit": "2.2.0-*" }, "frameworks": { "netcoreapp1.0": { @@ -12,23 +12,10 @@ "Microsoft.NETCore.App": { "version": "1.0.0-*", "type": "platform" - }, - "System.Diagnostics.Process": "4.1.0-*" - }, - "imports": [ - "dnxcore50", - "portable-net451+win8" - ] - }, - "net451": { - "frameworkAssemblies": { - "System.Runtime": "", - "System.Threading.Tasks": "" - }, - "dependencies": { - "xunit.runner.console": "2.1.0" + } } - } + }, + "net451": {} }, "testRunner": "xunit" } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 7ad6f6a48a..01ae630ab4 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,8 +1,8 @@ { "dependencies": { - "dotnet-test-xunit": "1.0.0-*", + "dotnet-test-xunit": "2.2.0-*", "Microsoft.AspNetCore.Http.Features": "1.1.0-*", - "xunit": "2.1.0" + "xunit": "2.2.0-*" }, "frameworks": { "netcoreapp1.0": { @@ -10,23 +10,10 @@ "Microsoft.NETCore.App": { "version": "1.0.0-*", "type": "platform" - }, - "System.Diagnostics.Process": "4.1.0-*" - }, - "imports": [ - "dnxcore50", - "portable-net451+win8" - ] - }, - "net451": { - "frameworkAssemblies": { - "System.Runtime": "", - "System.Threading.Tasks": "" - }, - "dependencies": { - "xunit.runner.console": "2.1.0" + } } - } + }, + "net451": {} }, "testRunner": "xunit" } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 1ec28e19c8..fb5875eb55 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,8 +1,8 @@ { "dependencies": { - "dotnet-test-xunit": "1.0.0-*", + "dotnet-test-xunit": "2.2.0-*", "Microsoft.AspNetCore.Http": "1.1.0-*", - "xunit": "2.1.0" + "xunit": "2.2.0-*" }, "frameworks": { "netcoreapp1.0": { @@ -10,23 +10,10 @@ "Microsoft.NETCore.App": { "version": "1.0.0-*", "type": "platform" - }, - "System.Diagnostics.Process": "4.1.0-*" - }, - "imports": [ - "dnxcore50", - "portable-net451+win8" - ] - }, - "net451": { - "frameworkAssemblies": { - "System.Runtime": "", - "System.Threading.Tasks": "" - }, - "dependencies": { - "xunit.runner.console": "2.1.0" + } } - } + }, + "net451": {} }, "testRunner": "xunit" } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 8ba199e06b..473d83b60e 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,10 +1,10 @@ { "dependencies": { - "dotnet-test-xunit": "1.0.0-*", + "dotnet-test-xunit": "2.2.0-*", "Microsoft.AspNetCore.Http": "1.1.0-*", "Microsoft.AspNetCore.Owin": "1.1.0-*", "Microsoft.Extensions.DependencyInjection": "1.1.0-*", - "xunit": "2.1.0" + "xunit": "2.2.0-*" }, "frameworks": { "netcoreapp1.0": { @@ -12,23 +12,10 @@ "Microsoft.NETCore.App": { "version": "1.0.0-*", "type": "platform" - }, - "System.Diagnostics.Process": "4.1.0-*" - }, - "imports": [ - "dnxcore50", - "portable-net451+win8" - ] - }, - "net451": { - "frameworkAssemblies": { - "System.Runtime": "", - "System.Threading.Tasks": "" - }, - "dependencies": { - "xunit.runner.console": "2.1.0" + } } - } + }, + "net451": {} }, "testRunner": "xunit" } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 6e3fedb6fe..5735268ac3 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,8 +1,8 @@ { "dependencies": { - "dotnet-test-xunit": "1.0.0-*", + "dotnet-test-xunit": "2.2.0-*", "Microsoft.AspNetCore.WebUtilities": "1.1.0-*", - "xunit": "2.1.0" + "xunit": "2.2.0-*" }, "buildOptions": { "warningsAsErrors": true @@ -15,22 +15,9 @@ "version": "1.0.0-*", "type": "platform" }, - "System.Text.Encoding.Extensions": "4.0.11-*", - "System.Diagnostics.Process": "4.1.0-*" - }, - "imports": [ - "dnxcore50", - "portable-net451+win8" - ] - }, - "net451": { - "frameworkAssemblies": { - "System.Runtime": "", - "System.Threading.Tasks": "" - }, - "dependencies": { - "xunit.runner.console": "2.1.0" + "System.Text.Encoding.Extensions": "4.0.11-*" } - } + }, + "net451": {} } } \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 4f7d2a8e7f..293b526faf 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,9 +1,9 @@ { "version": "1.1.0-*", "dependencies": { - "dotnet-test-xunit": "1.0.0-*", + "dotnet-test-xunit": "2.2.0-*", "Microsoft.Net.Http.Headers": "1.1.0-*", - "xunit": "2.1.0" + "xunit": "2.2.0-*" }, "frameworks": { "netcoreapp1.0": { @@ -11,23 +11,10 @@ "Microsoft.NETCore.App": { "version": "1.0.0-*", "type": "platform" - }, - "System.Diagnostics.Process": "4.1.0-*" - }, - "imports": [ - "dnxcore50", - "portable-net451+win8" - ] - }, - "net451": { - "frameworkAssemblies": { - "System.Runtime": "", - "System.Threading.Tasks": "" - }, - "dependencies": { - "xunit.runner.console": "2.1.0" + } } - } + }, + "net451": {} }, "testRunner": "xunit" } \ No newline at end of file From 59b605cafb15a9029ef6fcec3e52e8a420af1acb Mon Sep 17 00:00:00 2001 From: Derek Gray Date: Thu, 30 Jun 2016 13:24:58 -0500 Subject: [PATCH 582/846] Add UseWhenExtensions and UseWhenExtensionsTests --- .../Extensions/UseWhenExtensions.cs | 67 +++++++ .../UseWhenExtensionsTests.cs | 170 ++++++++++++++++++ 2 files changed, 237 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs create mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseWhenExtensionsTests.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs new file mode 100644 index 0000000000..3709a1e94c --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs @@ -0,0 +1,67 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Builder +{ + using Predicate = Func; + + /// + /// Extension methods for . + /// + public static class UseWhenExtensions + { + /// + /// Conditionally creates a branch in the request pipeline that is rejoined to the main pipeline. + /// + /// + /// Invoked with the request environment to determine if the branch should be taken + /// Configures a branch to take + /// + public static IApplicationBuilder UseWhen(this IApplicationBuilder app, Predicate predicate, Action configuration) + { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + if (predicate == null) + { + throw new ArgumentNullException(nameof(predicate)); + } + + if (configuration == null) + { + throw new ArgumentNullException(nameof(configuration)); + } + + // Create and configure the branch builder right away; otherwise, + // we would end up running our branch after all the components + // that were subsequently added to the main builder. + var branchBuilder = app.New(); + configuration(branchBuilder); + + return app.Use(main => + { + // This is called only when the main application builder + // is built, not per request. + branchBuilder.Run(main); + var branch = branchBuilder.Build(); + + return async context => + { + if (predicate(context)) + { + await branch(context); + } + else + { + await main(context); + } + }; + }); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseWhenExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseWhenExtensionsTests.cs new file mode 100644 index 0000000000..902a003b26 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseWhenExtensionsTests.cs @@ -0,0 +1,170 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Xunit; + +namespace Microsoft.AspNetCore.Builder.Extensions +{ + public class UseWhenExtensionsTests + { + [Fact] + public void NullArguments_ArgumentNullException() + { + // Arrange + var builder = CreateBuilder(); + + // Act + Action nullPredicate = () => builder.UseWhen(null, app => { }); + Action nullConfiguration = () => builder.UseWhen(TruePredicate, null); + + // Assert + Assert.Throws(nullPredicate); + Assert.Throws(nullConfiguration); + } + + [Fact] + public void PredicateTrue_BranchTaken_WillRejoin() + { + // Arrange + var context = CreateContext(); + var parent = CreateBuilder(); + + parent.UseWhen(TruePredicate, child => + { + child.UseWhen(TruePredicate, grandchild => + { + grandchild.Use(Increment("grandchild")); + }); + + child.Use(Increment("child")); + }); + + parent.Use(Increment("parent")); + + // Act + parent.Build().Invoke(context).Wait(); + + // Assert + Assert.Equal(1, Count(context, "parent")); + Assert.Equal(1, Count(context, "child")); + Assert.Equal(1, Count(context, "grandchild")); + } + + [Fact] + public void PredicateTrue_BranchTaken_CanTerminate() + { + // Arrange + var context = CreateContext(); + var parent = CreateBuilder(); + + parent.UseWhen(TruePredicate, child => + { + child.UseWhen(TruePredicate, grandchild => + { + grandchild.Use(Increment("grandchild", terminate: true)); + }); + + child.Use(Increment("child")); + }); + + parent.Use(Increment("parent")); + + // Act + parent.Build().Invoke(context).Wait(); + + // Assert + Assert.Equal(0, Count(context, "parent")); + Assert.Equal(0, Count(context, "child")); + Assert.Equal(1, Count(context, "grandchild")); + } + + [Fact] + public void PredicateFalse_PassThrough() + { + // Arrange + var context = CreateContext(); + var parent = CreateBuilder(); + + parent.UseWhen(FalsePredicate, child => + { + child.Use(Increment("child")); + }); + + parent.Use(Increment("parent")); + + // Act + parent.Build().Invoke(context).Wait(); + + // Assert + Assert.Equal(1, Count(context, "parent")); + Assert.Equal(0, Count(context, "child")); + } + + private static HttpContext CreateContext() + { + return new DefaultHttpContext(); + } + + private static ApplicationBuilder CreateBuilder() + { + return new ApplicationBuilder(serviceProvider: null); + } + + private static bool TruePredicate(HttpContext context) + { + return true; + } + + private static bool FalsePredicate(HttpContext context) + { + return false; + } + + private static Func, Task> Increment(string key, bool terminate = false) + { + return (context, next) => + { + if (!context.Items.ContainsKey(key)) + { + context.Items[key] = 1; + } + else + { + var item = context.Items[key]; + + if (item is int) + { + context.Items[key] = 1 + (int)item; + } + else + { + context.Items[key] = 1; + } + } + + return terminate ? Task.FromResult(null) : next(); + }; + } + + private static int Count(HttpContext context, string key) + { + if (!context.Items.ContainsKey(key)) + { + return 0; + } + + var item = context.Items[key]; + + if (item is int) + { + return (int)item; + } + + return 0; + } + } +} From 01f247db4854fd066fb8567a599a4bb591cb392b Mon Sep 17 00:00:00 2001 From: Derek Gray Date: Tue, 5 Jul 2016 15:26:10 -0500 Subject: [PATCH 583/846] Prevent an unnecessary allocation of a state machine (thanks @PinpointTownes) --- .../Extensions/UseWhenExtensions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs index 3709a1e94c..f506c41c89 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs @@ -50,15 +50,15 @@ namespace Microsoft.AspNetCore.Builder branchBuilder.Run(main); var branch = branchBuilder.Build(); - return async context => + return context => { if (predicate(context)) { - await branch(context); + return branch(context); } else { - await main(context); + return main(context); } }; }); From 748e96f5133bf2158b4076e54d1cc8e9962a662a Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Thu, 7 Jul 2016 12:01:29 -0700 Subject: [PATCH 584/846] One build to rule them all - well, at least VS and command-line builds will share output - part of aspnet/Coherence-Signed#277 --- samples/SampleApp/SampleApp.xproj | 4 ++-- .../Microsoft.AspNetCore.Http.Abstractions.xproj | 4 ++-- .../Microsoft.AspNetCore.Http.Extensions.xproj | 4 ++-- .../Microsoft.AspNetCore.Http.Features.xproj | 4 ++-- src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj | 4 ++-- src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj | 4 ++-- .../Microsoft.AspNetCore.WebUtilities.xproj | 4 ++-- .../Microsoft.Net.Http.Headers.xproj | 4 ++-- .../Microsoft.AspNetCore.Http.Abstractions.Tests.xproj | 4 ++-- .../Microsoft.AspNetCore.Http.Extensions.Tests.xproj | 4 ++-- .../Microsoft.AspNetCore.Http.Features.Tests.xproj | 4 ++-- .../Microsoft.AspNetCore.Http.Tests.xproj | 4 ++-- .../Microsoft.AspNetCore.Owin.Tests.xproj | 4 ++-- .../Microsoft.AspNetCore.WebUtilities.Tests.xproj | 4 ++-- .../Microsoft.Net.Http.Headers.Tests.xproj | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/samples/SampleApp/SampleApp.xproj b/samples/SampleApp/SampleApp.xproj index 2b2d6526a4..7b7ac55328 100644 --- a/samples/SampleApp/SampleApp.xproj +++ b/samples/SampleApp/SampleApp.xproj @@ -7,8 +7,8 @@ 1d0764b4-1deb-4232-a714-d4b7e846918a - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj index aea7baabf2..a8b6b1f83b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj @@ -7,8 +7,8 @@ 22071333-15ba-4d16-a1d5-4d5b1a83fbdd - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj index d921fe5ef3..883e22ae6e 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj @@ -7,8 +7,8 @@ ccc4363e-81e2-4058-94dd-00494e9e992a - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj index 4c0c8937c5..7024f5bbbb 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj @@ -7,8 +7,8 @@ d9128247-8f97-48b8-a863-f1f21a029fce - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj index 6ea19d1f49..905047ba45 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj @@ -7,8 +7,8 @@ bcf0f967-8753-4438-bd07-aadca9ce509a - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj index 1528a98ad3..5eee22decd 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj @@ -7,8 +7,8 @@ 59bed991-f207-48ed-b24c-0a1d9c986c01 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj index 23b7477d54..3785e08db8 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj @@ -7,8 +7,8 @@ a2fb7838-0031-4fad-ba3e-83c30b3af406 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj index e9818030e2..fe0f8915df 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj @@ -7,8 +7,8 @@ 60aa2fdb-8121-4826-8d00-9a143fefaf66 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj index d86ac3bafb..277ff2e03d 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj @@ -7,8 +7,8 @@ f16692b8-9f38-4dca-a582-e43172b989c6 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj index e6d17f9c63..2174e09495 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj @@ -7,8 +7,8 @@ ae25ef21-7f91-4b86-b73e-af746821d339 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj index 06fb7d313b..bbff3d9959 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj @@ -7,8 +7,8 @@ c5d2bae1-e182-48a0-aa74-1af14b782bf7 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj index d587be0a23..dbf688786f 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj @@ -7,8 +7,8 @@ aa99af26-f7b1-4a6b-a922-5c25539f6391 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj index ecf2099ab1..0fd152ad0c 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj @@ -7,8 +7,8 @@ 16219571-3268-4d12-8689-12b7163dba13 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj index c9512fd419..fae7a5dd1c 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj @@ -7,8 +7,8 @@ 93c10e50-bcbb-4d8e-9492-d46e1396225b - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj index f5a6a1e8f8..c887d6a957 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj @@ -7,8 +7,8 @@ e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\ + .\obj + .\bin\ 2.0 From 150b4708f158c0cdcc2d49f2ec72f3e82c6c64e4 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 7 Jul 2016 10:06:30 -0700 Subject: [PATCH 585/846] Fix PathString over-encoding Base on RFC 3986, ensure following characters are not encoded alpha, digit, "-", "_", ".", "~", "@", ":", "/", "!", "$", ";", "=", "'", "(", ")", "*", "+", "," --- .../Internal/PathStringHelper.cs | 32 +++++++ .../PathString.cs | 83 ++++++++++++++++--- .../PathStringTests.cs | 16 ++++ 3 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs new file mode 100644 index 0000000000..45b44ab1bb --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs @@ -0,0 +1,32 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Http.Internal +{ + internal class PathStringHelper + { + private static bool[] ValidPathChars = { + false, false, false, false, false, false, false, false, // 0x00 - 0x07 + false, false, false, false, false, false, false, false, // 0x08 - 0x0F + false, false, false, false, false, false, false, false, // 0x10 - 0x17 + false, false, false, false, false, false, false, false, // 0x18 - 0x1F + false, true, false, false, true, false, true, true, // 0x20 - 0x27 + true, true, true, true, true, true, true, true, // 0x28 - 0x2F + true, true, true, true, true, true, true, true, // 0x30 - 0x37 + true, true, true, true, false, true, false, false, // 0x38 - 0x3F + true, true, true, true, true, true, true, true, // 0x40 - 0x47 + true, true, true, true, true, true, true, true, // 0x48 - 0x4F + true, true, true, true, true, true, true, true, // 0x50 - 0x57 + true, true, true, false, false, false, false, true, // 0x58 - 0x5F + false, true, true, true, true, true, true, true, // 0x60 - 0x67 + true, true, true, true, true, true, true, true, // 0x68 - 0x6F + true, true, true, true, true, true, true, true, // 0x70 - 0x77 + true, true, true, false, false, false, true, false, // 0x78 - 0x7F + }; + + public static bool IsValidPathChar(char c) + { + return c < ValidPathChars.Length && ValidPathChars[c]; + } + } +} diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 72e8d9590c..0b56e46292 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Text.Encodings.Web; +using System.Text; using Microsoft.AspNetCore.Http.Abstractions; +using Microsoft.AspNetCore.Http.Internal; namespace Microsoft.AspNetCore.Http { @@ -66,25 +67,83 @@ namespace Microsoft.AspNetCore.Http /// The escaped path value public string ToUriComponent() { - // TODO: Measure the cost of this escaping and consider optimizing. if (!HasValue) { return string.Empty; } - var values = _value.Split(splitChar); - var changed = false; - for (var i = 0; i < values.Length; i++) - { - var value = values[i]; - values[i] = UrlEncoder.Default.Encode(value); - if (!changed && value != values[i]) + StringBuilder buffer = null; + + var start = 0; + var count = 0; + var requiresEscaping = false; + for (int i = 0; i < _value.Length; ++i) + { + if (PathStringHelper.IsValidPathChar(_value[i])) { - changed = true; + if (requiresEscaping) + { + // the current segment requires escape + if (buffer == null) + { + buffer = new StringBuilder(_value.Length * 3); + } + + buffer.Append(Uri.EscapeDataString(_value.Substring(start, count))); + + requiresEscaping = false; + start = i; + count = 0; + } + + count++; + } + else + { + if (!requiresEscaping) + { + // the current segument doesn't require escape + if (buffer == null) + { + buffer = new StringBuilder(_value.Length * 3); + } + + buffer.Append(_value, start, count); + + requiresEscaping = true; + start = i; + count = 0; + } + + count++; } } - return changed ? string.Join("/", values) : _value; + if (count == _value.Length && !requiresEscaping) + { + return _value; + } + else + { + if (count > 0) + { + if (buffer == null) + { + buffer = new StringBuilder(_value.Length * 3); + } + + if (requiresEscaping) + { + buffer.Append(Uri.EscapeDataString(_value.Substring(start, count))); + } + else + { + buffer.Append(_value, start, count); + } + } + + return buffer.ToString(); + } } /// @@ -335,7 +394,7 @@ namespace Microsoft.AspNetCore.Http /// Implicitly calls ToString(). /// /// - public static implicit operator string (PathString path) + public static implicit operator string(PathString path) { return path.ToString(); } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index 6aa15216af..b901944524 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -185,5 +185,21 @@ namespace Microsoft.AspNetCore.Http Assert.Equal(expectedResult, result); } + + [Theory] + [InlineData("unreserved", "/abc123.-_~", "/abc123.-_~")] + [InlineData("colon", "/:", "/:")] + [InlineData("at", "/@", "/@")] + [InlineData("sub-delims", "/!$&'()*+,;=", "/!$&'()*+,;=")] + [InlineData("reserved", "/?#[]", "/%3F%23%5B%5D")] + [InlineData("pct-encoding", "/单行道", "/%E5%8D%95%E8%A1%8C%E9%81%93")] + [InlineData("mixed1", "/index/单行道=(x*y)[abc]", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D")] + [InlineData("mixed2", "/index/单行道=(x*y)[abc]_", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D_")] + public void ToUriComponentEscapeCorrectly(string category, string input, string expected) + { + var path = new PathString(input); + + Assert.Equal(expected, path.ToUriComponent()); + } } } From 9a28932b7aecf3b4d97a38ceb7ed2ee573844bf8 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 11 Jul 2016 16:19:20 -0700 Subject: [PATCH 586/846] To de-dupe, we must remove (again) - part of aspnet/Common#93 - use `WebEncoders` from Common repo - leave some of `WebEncodersTests` to ensure resources are brought in correctly --- .../WebEncoders.cs | 374 ------------------ .../project.json | 7 +- .../WebEncodersTests.cs | 68 ---- 3 files changed, 6 insertions(+), 443 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs deleted file mode 100644 index 50f2eefbbc..0000000000 --- a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Globalization; - -namespace Microsoft.AspNetCore.WebUtilities -{ - /// - /// Contains utility APIs to assist with common encoding and decoding operations. - /// - public static class WebEncoders - { - private static readonly byte[] EmptyBytes = new byte[0]; - - /// - /// Decodes a base64url-encoded string. - /// - /// The base64url-encoded input to decode. - /// The base64url-decoded form of the input. - /// - /// The input must not contain any whitespace or padding characters. - /// Throws if the input is malformed. - /// - public static byte[] Base64UrlDecode(string input) - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - - return Base64UrlDecode(input, offset: 0, count: input.Length); - } - - /// - /// Decodes a base64url-encoded substring of a given string. - /// - /// A string containing the base64url-encoded input to decode. - /// The position in at which decoding should begin. - /// The number of characters in to decode. - /// The base64url-decoded form of the input. - /// - /// The input must not contain any whitespace or padding characters. - /// Throws if the input is malformed. - /// - public static byte[] Base64UrlDecode(string input, int offset, int count) - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - - ValidateParameters(input.Length, nameof(input), offset, count); - - // Special-case empty input - if (count == 0) - { - return EmptyBytes; - } - - // Create array large enough for the Base64 characters, not just shorter Base64-URL-encoded form. - var buffer = new char[GetArraySizeRequiredToDecode(count)]; - - return Base64UrlDecode(input, offset, buffer, bufferOffset: 0, count: count); - } - - /// - /// Decodes a base64url-encoded into a byte[]. - /// - /// A string containing the base64url-encoded input to decode. - /// The position in at which decoding should begin. - /// - /// Scratch buffer to hold the s to decode. Array must be large enough to hold - /// and characters as well as Base64 padding - /// characters. Content is not preserved. - /// - /// - /// The offset into at which to begin writing the s to decode. - /// - /// The number of characters in to decode. - /// The base64url-decoded form of the . - /// - /// The input must not contain any whitespace or padding characters. - /// Throws if the input is malformed. - /// - public static byte[] Base64UrlDecode(string input, int offset, char[] buffer, int bufferOffset, int count) - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - - ValidateParameters(input.Length, nameof(input), offset, count); - if (bufferOffset < 0) - { - throw new ArgumentOutOfRangeException(nameof(bufferOffset)); - } - - if (count == 0) - { - return EmptyBytes; - } - - // Assumption: input is base64url encoded without padding and contains no whitespace. - - var paddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); - var arraySizeRequired = checked(count + paddingCharsToAdd); - Debug.Assert(arraySizeRequired % 4 == 0, "Invariant: Array length must be a multiple of 4."); - - if (buffer.Length - bufferOffset < arraySizeRequired) - { - throw new ArgumentException( - string.Format( - CultureInfo.CurrentCulture, - Resources.WebEncoders_InvalidCountOffsetOrLength, - nameof(count), - nameof(bufferOffset), - nameof(input)), - nameof(count)); - } - - // Copy input into buffer, fixing up '-' -> '+' and '_' -> '/'. - var i = bufferOffset; - for (var j = offset; i - bufferOffset < count; i++, j++) - { - var ch = input[j]; - if (ch == '-') - { - buffer[i] = '+'; - } - else if (ch == '_') - { - buffer[i] = '/'; - } - else - { - buffer[i] = ch; - } - } - - // Add the padding characters back. - for (; paddingCharsToAdd > 0; i++, paddingCharsToAdd--) - { - buffer[i] = '='; - } - - // Decode. - // If the caller provided invalid base64 chars, they'll be caught here. - return Convert.FromBase64CharArray(buffer, bufferOffset, arraySizeRequired); - } - - /// - /// Gets the minimum char[] size required for decoding of characters - /// with the method. - /// - /// The number of characters to decode. - /// - /// The minimum char[] size required for decoding of characters. - /// - public static int GetArraySizeRequiredToDecode(int count) - { - if (count < 0) - { - throw new ArgumentOutOfRangeException(nameof(count)); - } - - if (count == 0) - { - return 0; - } - - var numPaddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); - - return checked(count + numPaddingCharsToAdd); - } - - /// - /// Encodes using base64url encoding. - /// - /// The binary input to encode. - /// The base64url-encoded form of . - public static string Base64UrlEncode(byte[] input) - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - - return Base64UrlEncode(input, offset: 0, count: input.Length); - } - - /// - /// Encodes using base64url encoding. - /// - /// The binary input to encode. - /// The offset into at which to begin encoding. - /// The number of bytes from to encode. - /// The base64url-encoded form of . - public static string Base64UrlEncode(byte[] input, int offset, int count) - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - - ValidateParameters(input.Length, nameof(input), offset, count); - - // Special-case empty input - if (count == 0) - { - return string.Empty; - } - - var buffer = new char[GetArraySizeRequiredToEncode(count)]; - var numBase64Chars = Base64UrlEncode(input, offset, buffer, outputOffset: 0, count: count); - - return new String(buffer, startIndex: 0, length: numBase64Chars); - } - - /// - /// Encodes using base64url encoding. - /// - /// The binary input to encode. - /// The offset into at which to begin encoding. - /// - /// Buffer to receive the base64url-encoded form of . Array must be large enough to - /// hold characters and the full base64-encoded form of - /// , including padding characters. - /// - /// - /// The offset into at which to begin writing the base64url-encoded form of - /// . - /// - /// The number of bytes from to encode. - /// - /// The number of characters written to , less any padding characters. - /// - public static int Base64UrlEncode(byte[] input, int offset, char[] output, int outputOffset, int count) - { - if (input == null) - { - throw new ArgumentNullException(nameof(input)); - } - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - ValidateParameters(input.Length, nameof(input), offset, count); - if (outputOffset < 0) - { - throw new ArgumentOutOfRangeException(nameof(outputOffset)); - } - - var arraySizeRequired = GetArraySizeRequiredToEncode(count); - if (output.Length - outputOffset < arraySizeRequired) - { - throw new ArgumentException( - string.Format( - CultureInfo.CurrentCulture, - Resources.WebEncoders_InvalidCountOffsetOrLength, - nameof(count), - nameof(outputOffset), - nameof(output)), - nameof(count)); - } - - // Special-case empty input. - if (count == 0) - { - return 0; - } - - // Use base64url encoding with no padding characters. See RFC 4648, Sec. 5. - - // Start with default Base64 encoding. - var numBase64Chars = Convert.ToBase64CharArray(input, offset, count, output, outputOffset); - - // Fix up '+' -> '-' and '/' -> '_'. Drop padding characters. - for (var i = outputOffset; i - outputOffset < numBase64Chars; i++) - { - var ch = output[i]; - if (ch == '+') - { - output[i] = '-'; - } - else if (ch == '/') - { - output[i] = '_'; - } - else if (ch == '=') - { - // We've reached a padding character; truncate the remainder. - return i - outputOffset; - } - } - - return numBase64Chars; - } - - /// - /// Get the minimum output char[] size required for encoding - /// s with the method. - /// - /// The number of characters to encode. - /// - /// The minimum output char[] size required for encoding s. - /// - public static int GetArraySizeRequiredToEncode(int count) - { - var numWholeOrPartialInputBlocks = checked(count + 2) / 3; - return checked(numWholeOrPartialInputBlocks * 4); - } - - private static int GetNumBase64PaddingCharsInString(string str) - { - // Assumption: input contains a well-formed base64 string with no whitespace. - - // base64 guaranteed have 0 - 2 padding characters. - if (str[str.Length - 1] == '=') - { - if (str[str.Length - 2] == '=') - { - return 2; - } - return 1; - } - return 0; - } - - private static int GetNumBase64PaddingCharsToAddForDecode(int inputLength) - { - switch (inputLength % 4) - { - case 0: - return 0; - case 2: - return 2; - case 3: - return 1; - default: - throw new FormatException("TODO: Malformed input."); - } - } - - private static void ValidateParameters(int bufferLength, string inputName, int offset, int count) - { - if (offset < 0) - { - throw new ArgumentOutOfRangeException(nameof(offset)); - } - if (count < 0) - { - throw new ArgumentOutOfRangeException(nameof(count)); - } - if (bufferLength - offset < count) - { - throw new ArgumentException( - string.Format( - CultureInfo.CurrentCulture, - Resources.WebEncoders_InvalidCountOffsetOrLength, - nameof(count), - nameof(offset), - inputName), - nameof(count)); - } - } - } -} diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index fbf32d145c..043063c90a 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -11,15 +11,20 @@ ] }, "buildOptions": { - "warningsAsErrors": true, + "define": [ "WebEncoders_In_WebUtilities" ], "keyFile": "../../tools/Key.snk", "nowarn": [ "CS1591" ], + "warningsAsErrors": true, "xmlDoc": true }, "dependencies": { "Microsoft.Extensions.Primitives": "1.1.0-*", + "Microsoft.Extensions.WebEncoders.Sources": { + "type": "build", + "version": "1.1.0-*" + }, "System.Buffers": "4.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs index c781805fcc..a4c4d15571 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs @@ -24,74 +24,6 @@ namespace Microsoft.AspNetCore.WebUtilities }); } - [Theory] - [InlineData("x")] - [InlineData("(x)")] - public void Base64UrlDecode_MalformedInput(string input) - { - // Act & assert - Assert.Throws(() => - { - var retVal = WebEncoders.Base64UrlDecode(input); - }); - } - - [Theory] - [InlineData("", "")] - [InlineData("123456qwerty++//X+/x", "123456qwerty--__X-_x")] - [InlineData("123456qwerty++//X+/xxw==", "123456qwerty--__X-_xxw")] - [InlineData("123456qwerty++//X+/xxw0=", "123456qwerty--__X-_xxw0")] - public void Base64UrlEncode_And_Decode(string base64Input, string expectedBase64Url) - { - // Arrange - byte[] input = new byte[3].Concat(Convert.FromBase64String(base64Input)).Concat(new byte[2]).ToArray(); - - // Act & assert - 1 - string actualBase64Url = WebEncoders.Base64UrlEncode(input, 3, input.Length - 5); // also helps test offsets - Assert.Equal(expectedBase64Url, actualBase64Url); - - // Act & assert - 2 - // Verify that values round-trip - byte[] roundTripped = WebEncoders.Base64UrlDecode("xx" + actualBase64Url + "yyy", 2, actualBase64Url.Length); // also helps test offsets - string roundTrippedAsBase64 = Convert.ToBase64String(roundTripped); - Assert.Equal(roundTrippedAsBase64, base64Input); - } - - [Theory] - [InlineData("", "")] - [InlineData("123456qwerty++//X+/x", "123456qwerty--__X-_x")] - [InlineData("123456qwerty++//X+/xxw==", "123456qwerty--__X-_xxw")] - [InlineData("123456qwerty++//X+/xxw0=", "123456qwerty--__X-_xxw0")] - public void Base64UrlEncode_And_Decode_WithBufferOffsets(string base64Input, string expectedBase64Url) - { - // Arrange - var input = new byte[3].Concat(Convert.FromBase64String(base64Input)).Concat(new byte[2]).ToArray(); - var buffer = new char[30]; - var output = new char[30]; - for (var i = 0; i < buffer.Length; i++) - { - buffer[i] = '^'; - output[i] = '^'; - } - - // Act 1 - var numEncodedChars = - WebEncoders.Base64UrlEncode(input, offset: 3, output: output, outputOffset: 4, count: input.Length - 5); - - // Assert 1 - var encodedString = new string(output, startIndex: 4, length: numEncodedChars); - Assert.Equal(expectedBase64Url, encodedString); - - // Act 2 - var roundTripInput = new string(output); - var roundTripped = - WebEncoders.Base64UrlDecode(roundTripInput, offset: 4, buffer: buffer, bufferOffset: 5, count: numEncodedChars); - - // Assert 2, verify that values round-trip - var roundTrippedAsBase64 = Convert.ToBase64String(roundTripped); - Assert.Equal(roundTrippedAsBase64, base64Input); - } - [Theory] [InlineData(0, 1, 0)] [InlineData(0, 0, 1)] From e64b8e55e57e18fd6295652f8c845b5143fd69da Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 6 Jul 2016 14:40:48 -0700 Subject: [PATCH 587/846] Add some multipart reader utilities to make reading streams easier --- .../HttpRequestMultipartExtensions.cs | 26 +++++++ .../Features/FormFeature.cs | 38 +++++----- .../FileMultipartSection.cs | 70 ++++++++++++++++++ .../FormMultipartSection.cs | 63 ++++++++++++++++ .../MultipartSectionConverterExtensions.cs | 74 +++++++++++++++++++ .../MultipartSectionStreamExtensions.cs | 49 ++++++++++++ .../project.json | 1 + ...ispositionHeaderValueIdentityExtensions.cs | 45 +++++++++++ 8 files changed, 347 insertions(+), 19 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs create mode 100644 src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs create mode 100644 src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs create mode 100644 src/Microsoft.AspNetCore.WebUtilities/MultipartSectionConverterExtensions.cs create mode 100644 src/Microsoft.AspNetCore.WebUtilities/MultipartSectionStreamExtensions.cs create mode 100644 src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs new file mode 100644 index 0000000000..76770428a0 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNetCore.Http.Extensions +{ + public static class HttpRequestMultipartExtensions + { + public static string GetMultipartBoundary(this HttpRequest request) + { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + + MediaTypeHeaderValue mediaType; + if (!MediaTypeHeaderValue.TryParse(request.ContentType, out mediaType)) + { + return string.Empty; + } + return HeaderUtilities.RemoveQuotes(mediaType.Boundary); + } + } +} diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index ff1fd9ccf3..cd8b491ffd 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -170,20 +170,24 @@ namespace Microsoft.AspNetCore.Http.Features var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { + // Parse the content disposition here and pass it further to avoid reparsings ContentDispositionHeaderValue contentDisposition; ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition); - if (HasFileContentDisposition(contentDisposition)) + + if (contentDisposition.IsFileDisposition()) { + var fileSection = new FileMultipartSection(section, contentDisposition); + // Enable buffering for the file if not already done for the full body - section.EnableRewind(_request.HttpContext.Response.RegisterForDispose, + section.EnableRewind( + _request.HttpContext.Response.RegisterForDispose, _options.MemoryBufferThreshold, _options.MultipartBodyLengthLimit); + // Find the end await section.Body.DrainAsync(cancellationToken); - var name = HeaderUtilities.RemoveQuotes(contentDisposition.Name) ?? string.Empty; - var fileName = HeaderUtilities.RemoveQuotes(contentDisposition.FileNameStar) ?? - HeaderUtilities.RemoveQuotes(contentDisposition.FileName) ?? - string.Empty; + var name = fileSection.Name; + var fileName = fileSection.FileName; FormFile file; if (section.BaseStreamOffset.HasValue) @@ -208,26 +212,22 @@ namespace Microsoft.AspNetCore.Http.Features } files.Add(file); } - else if (HasFormDataContentDisposition(contentDisposition)) + else if (contentDisposition.IsFormDisposition()) { + var formDataSection = new FormMultipartSection(section, contentDisposition); + // Content-Disposition: form-data; name="key" // // value // Do not limit the key name length here because the mulipart headers length limit is already in effect. - var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); - MediaTypeHeaderValue mediaType; - MediaTypeHeaderValue.TryParse(section.ContentType, out mediaType); - var encoding = FilterEncoding(mediaType?.Encoding); - using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) + var key = formDataSection.Name; + var value = await formDataSection.GetValueAsync(); + + formAccumulator.Append(key, value); + if (formAccumulator.ValueCount > _options.ValueCountLimit) { - // The value length limit is enforced by MultipartBodyLengthLimit - var value = await reader.ReadToEndAsync(); - formAccumulator.Append(key, value); - if (formAccumulator.ValueCount > _options.ValueCountLimit) - { - throw new InvalidDataException($"Form value count limit {_options.ValueCountLimit} exceeded."); - } + throw new InvalidDataException($"Form value count limit {_options.ValueCountLimit} exceeded."); } } else diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs new file mode 100644 index 0000000000..b1ba2ff47e --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs @@ -0,0 +1,70 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNetCore.WebUtilities +{ + /// + /// Represents a file multipart section + /// + public class FileMultipartSection + { + private ContentDispositionHeaderValue _contentDispositionHeader; + + /// + /// Creates a new instance of the class + /// + /// The section from which to create the + /// Reparses the content disposition header + public FileMultipartSection(MultipartSection section) + :this(section, section.GetContentDispositionHeader()) + { + } + + /// + /// Creates a new instance of the class + /// + /// The section from which to create the + /// An already parsed content disposition header + public FileMultipartSection(MultipartSection section, ContentDispositionHeaderValue header) + { + if (!header.IsFileDisposition()) + { + throw new ArgumentException($"Argument must be a file section", nameof(section)); + } + + Section = section; + _contentDispositionHeader = header; + + Name = HeaderUtilities.RemoveQuotes(_contentDispositionHeader.Name) ?? string.Empty; + FileName = HeaderUtilities.RemoveQuotes( + _contentDispositionHeader.FileNameStar ?? + _contentDispositionHeader.FileName ?? + string.Empty); + } + + /// + /// Gets the original section from which this object was created + /// + public MultipartSection Section { get; } + + /// + /// Gets the file stream from the section body + /// + public Stream FileStream => Section.Body; + + /// + /// Gets the name of the section + /// + public string Name { get; } + + /// + /// Gets the name of the file from the section + /// + public string FileName { get; } + + } +} diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs new file mode 100644 index 0000000000..652cbdeb12 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs @@ -0,0 +1,63 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNetCore.WebUtilities +{ + /// + /// Represents a form multipart section + /// + public class FormMultipartSection + { + private ContentDispositionHeaderValue _contentDispositionHeader; + + /// + /// Creates a new instance of the class + /// + /// The section from which to create the + /// Reparses the content disposition header + public FormMultipartSection(MultipartSection section) + : this(section, section.GetContentDispositionHeader()) + { + } + + /// + /// Creates a new instance of the class + /// + /// The section from which to create the + /// An already parsed content disposition header + public FormMultipartSection(MultipartSection section, ContentDispositionHeaderValue header) + { + if (header == null || !header.IsFormDisposition()) + { + throw new ArgumentException($"Argument must be a form section", nameof(section)); + } + + Section = section; + _contentDispositionHeader = header; + Name = HeaderUtilities.RemoveQuotes(_contentDispositionHeader.Name); + } + + /// + /// Gets the original section from which this object was created + /// + public MultipartSection Section { get; } + + /// + /// The form name + /// + public string Name { get; } + + /// + /// Gets the form value + /// + /// The form value + public Task GetValueAsync() + { + return Section.ReadAsStringAsync(); + } + } +} diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionConverterExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionConverterExtensions.cs new file mode 100644 index 0000000000..826ced168e --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionConverterExtensions.cs @@ -0,0 +1,74 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNetCore.WebUtilities +{ + /// + /// Various extensions for converting multipart sections + /// + public static class MultipartSectionConverterExtensions + { + /// + /// Converts the section to a file section + /// + /// The section to convert + /// A file section + public static FileMultipartSection AsFileSection(this MultipartSection section) + { + if (section == null) + { + throw new ArgumentNullException(nameof(section)); + } + + try + { + return new FileMultipartSection(section); + } + catch + { + return null; + } + } + + /// + /// Converts the section to a form section + /// + /// The section to convert + /// A form section + public static FormMultipartSection AsFormDataSection(this MultipartSection section) + { + if (section == null) + { + throw new ArgumentNullException(nameof(section)); + } + + try + { + return new FormMultipartSection(section); + } + catch + { + return null; + } + } + + /// + /// Retrieves and parses the content disposition header from a section + /// + /// The section from which to retrieve + /// A if the header was found, null otherwise + public static ContentDispositionHeaderValue GetContentDispositionHeader(this MultipartSection section) + { + ContentDispositionHeaderValue header; + if (!ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out header)) + { + return null; + } + + return header; + } + } +} diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionStreamExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionStreamExtensions.cs new file mode 100644 index 0000000000..463a8d88d6 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionStreamExtensions.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNetCore.WebUtilities +{ + /// + /// Various extension methods for dealing with the section body stream + /// + public static class MultipartSectionStreamExtensions + { + /// + /// Reads the body of the section as a string + /// + /// The section to read from + /// The body steam as string + public static async Task ReadAsStringAsync(this MultipartSection section) + { + if (section == null) + { + throw new ArgumentNullException(nameof(section)); + } + + MediaTypeHeaderValue sectionMediaType; + MediaTypeHeaderValue.TryParse(section.ContentType, out sectionMediaType); + + Encoding streamEncoding = sectionMediaType?.Encoding; + if (streamEncoding == null || streamEncoding == Encoding.UTF7) + { + streamEncoding = Encoding.UTF8; + } + + using (var reader = new StreamReader( + section.Body, + streamEncoding, + detectEncodingFromByteOrderMarks: true, + bufferSize: 1024, + leaveOpen: true)) + { + return await reader.ReadToEndAsync(); + } + } + } +} diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 043063c90a..49d03defca 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -25,6 +25,7 @@ "type": "build", "version": "1.1.0-*" }, + "Microsoft.Net.Http.Headers": "1.1.0-*", "System.Buffers": "4.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs new file mode 100644 index 0000000000..0a275e55b8 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs @@ -0,0 +1,45 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Net.Http.Headers +{ + /// + /// Various extension methods for for identifying the type of the disposition header + /// + public static class ContentDispositionHeaderValueIdentityExtensions + { + /// + /// Checks if the content disposition header is a file disposition + /// + /// The header to check + /// True if the header is file disposition, false otherwise + public static bool IsFileDisposition(this ContentDispositionHeaderValue header) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + return header.DispositionType.Equals("form-data") + && (!string.IsNullOrEmpty(header.FileName) || !string.IsNullOrEmpty(header.FileNameStar)); + } + + /// + /// Checks if the content disposition header is a form disposition + /// + /// The header to check + /// True if the header is form disposition, false otherwise + public static bool IsFormDisposition(this ContentDispositionHeaderValue header) + { + if (header == null) + { + throw new ArgumentNullException(nameof(header)); + } + + return header.DispositionType.Equals("form-data") + && string.IsNullOrEmpty(header.FileName) && string.IsNullOrEmpty(header.FileNameStar); + } + } +} From c5e09b03442aa9419278f41ce2a6c2e3808f760f Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Mon, 18 Jul 2016 14:09:40 -0700 Subject: [PATCH 588/846] Added a HttpResponseStreamWriter test for surrogate pairs --- .../HttpResponseStreamWriterTest.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 7882e6c3a7..67e42ea038 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -13,6 +13,8 @@ namespace Microsoft.AspNetCore.WebUtilities.Test { public class HttpResponseStreamWriterTest { + private const int DefaultCharacterChunkSize = HttpResponseStreamWriter.DefaultBufferSize; + [Fact] public async Task DoesNotWriteBOM() { @@ -428,6 +430,30 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(expectedBytes, stream.ToArray()); } + [Theory] + [InlineData(DefaultCharacterChunkSize)] + [InlineData(DefaultCharacterChunkSize * 2)] + [InlineData(DefaultCharacterChunkSize * 3)] + public async Task HttpResponseStreamWriter_WritesDataCorrectly_ForCharactersHavingSurrogatePairs(int characterSize) + { + // Arrange + // Here "𐐀" (called Deseret Long I) actually represents 2 characters. Try to make this character split across + // the boundary + var content = new string('a', characterSize - 1) + "𐐀"; + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.Unicode); + + // Act + await writer.WriteAsync(content); + await writer.FlushAsync(); + + // Assert + stream.Seek(0, SeekOrigin.Begin); + var streamReader = new StreamReader(stream, Encoding.Unicode); + var actualContent = await streamReader.ReadToEndAsync(); + Assert.Equal(content, actualContent); + } + private class TestMemoryStream : MemoryStream { public int FlushCallCount { get; private set; } From b4b2dd6bf22c9e234022d8675e0e7a34c373cbb1 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 21 Jul 2016 16:40:48 -0700 Subject: [PATCH 589/846] Add buffer size parameter to CopyTo method (#674) --- .../StreamCopyOperation.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs index ef81ac3baf..12067fef65 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs @@ -15,11 +15,29 @@ namespace Microsoft.AspNetCore.Http.Extensions { private const int DefaultBufferSize = 4096; - public static async Task CopyToAsync(Stream source, Stream destination, long? count, CancellationToken cancel) + /// Asynchronously reads the bytes from the source stream and writes them to another stream. + /// A task that represents the asynchronous copy operation. + /// The stream from which the contents will be copied. + /// The stream to which the contents of the current stream will be copied. + /// The count of bytes to be copied. + /// The token to monitor for cancellation requests. The default value is . + public static Task CopyToAsync(Stream source, Stream destination, long? count, CancellationToken cancel) + { + return CopyToAsync(source, destination, count, DefaultBufferSize, cancel); + } + + /// Asynchronously reads the bytes from the source stream and writes them to another stream, using a specified buffer size. + /// A task that represents the asynchronous copy operation. + /// The stream from which the contents will be copied. + /// The stream to which the contents of the current stream will be copied. + /// The count of bytes to be copied. + /// The size, in bytes, of the buffer. This value must be greater than zero. The default size is 4096. + /// The token to monitor for cancellation requests. The default value is . + public static async Task CopyToAsync(Stream source, Stream destination, long? count, int bufferSize, CancellationToken cancel) { long? bytesRemaining = count; - var buffer = ArrayPool.Shared.Rent(DefaultBufferSize); + var buffer = ArrayPool.Shared.Rent(bufferSize); try { Debug.Assert(source != null); From 9a0ea424eaef57f105983231455f233a5c065b41 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 19 Jul 2016 08:47:01 -0700 Subject: [PATCH 590/846] Fix cross appdomain exception --- .../HttpContextAccessor.cs | 3 ++- .../HttpContextFactoryTests.cs | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs index 9bb3dc375a..99be5929b6 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #if NET451 +using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Messaging; #elif NETSTANDARD1_3 @@ -13,7 +14,7 @@ namespace Microsoft.AspNetCore.Http public class HttpContextAccessor : IHttpContextAccessor { #if NET451 - private const string LogicalDataKey = "__HttpContext_Current__"; + private static readonly string LogicalDataKey = "__HttpContext_Current__" + AppDomain.CurrentDomain.Id; public HttpContext HttpContext { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index 40d3fa8935..5f5b86e4b1 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Options; @@ -34,5 +35,31 @@ namespace Microsoft.AspNetCore.Http var context = contextFactory.Create(new FeatureCollection()); contextFactory.Dispose(context); } + +#if NET451 + private static void DomainFunc() + { + var accessor = new HttpContextAccessor(); + Assert.Equal(null, accessor.HttpContext); + accessor.HttpContext = new DefaultHttpContext(); + } + + [Fact] + public void ChangingAppDomainsDoesNotBreak() + { + // Arrange + var accessor = new HttpContextAccessor(); + var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions()), accessor); + var domain = AppDomain.CreateDomain("newDomain"); + + // Act + var context = contextFactory.Create(new FeatureCollection()); + domain.DoCallBack(DomainFunc); + AppDomain.Unload(domain); + + // Assert + Assert.True(ReferenceEquals(context, accessor.HttpContext)); + } +#endif } } \ No newline at end of file From 6c56f1df2870c3fa9e4ec8741447d9b18dd1426e Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 2 Aug 2016 13:09:06 -0700 Subject: [PATCH 591/846] Update .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 60138360be..f0b5ec2a1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ branches: - dev - /^(.*\/)?ci-.*$/ before_install: - - if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; brew link --force openssl; fi + - if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/; fi script: - ./build.sh --quiet verify notifications: @@ -31,4 +31,4 @@ notifications: secure: "XshregcmoXywFrrlIk7MLluUV2Pd8Z/VftrviVZjRL5+3akix2QnP15eT2E13yNtyS1yIc3lWfrVrLLf+H5bN9dUSzxIMNoJQ/S18F/AO5VD5ewd6pLC0uYhUcHdTRQuzjLGVPlt2suKpPllV2SsGlAdGatdCfj5zM6eOG31jaA=" on_success: always on_failure: always - on_start: always \ No newline at end of file + on_start: always From e3207557342f514deea4618f595a049bfbd7a024 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 2 Aug 2016 19:40:30 -0700 Subject: [PATCH 592/846] Do not run custom header parsers on null header values (#678) --- .../HeaderDictionaryTypeExtensions.cs | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 2f9c570d67..29e4a0efee 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -176,18 +176,19 @@ namespace Microsoft.AspNetCore.Http } object temp; - if (KnownParsers.TryGetValue(typeof(T), out temp)) - { - var func = (Func)temp; - return func(headers[name]); - } - var value = headers[name]; + if (StringValues.IsNullOrEmpty(value)) { return default(T); } + if (KnownParsers.TryGetValue(typeof(T), out temp)) + { + var func = (Func)temp; + return func(value); + } + return GetViaReflection(value.ToString()); } @@ -199,18 +200,19 @@ namespace Microsoft.AspNetCore.Http } object temp; - if (KnownListParsers.TryGetValue(typeof(T), out temp)) - { - var func = (Func, IList>)temp; - return func(headers[name]); - } - var values = headers[name]; + if (StringValues.IsNullOrEmpty(values)) { return null; } + if (KnownListParsers.TryGetValue(typeof(T), out temp)) + { + var func = (Func, IList>)temp; + return func(values); + } + return GetListViaReflection(values); } From a4a4e490c5de8b84c229702d5a47ed5115abead3 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 3 Aug 2016 14:38:54 -0700 Subject: [PATCH 593/846] Addresses #678 and #679 --- .../FragmentString.cs | 10 ++- .../HostString.cs | 8 ++- .../QueryString.cs | 10 ++- .../UriHelper.cs | 64 +++++++++++++++++++ .../FragmentStringTests.cs | 41 ++++++++++++ .../HostStringTest.cs | 31 +++++++++ .../QueryStringTests.cs | 31 +++++++++ .../UriHelperTests.cs | 63 ++++++++++++++++++ 8 files changed, 250 insertions(+), 8 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs index 3131191a1e..c1cb306149 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs @@ -107,21 +107,25 @@ namespace Microsoft.AspNetCore.Http public bool Equals(FragmentString other) { - return string.Equals(_value, other._value); + if (!HasValue && !other.HasValue) + { + return true; + } + return string.Equals(_value, other._value, StringComparison.Ordinal); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) { - return false; + return !HasValue; } return obj is FragmentString && Equals((FragmentString)obj); } public override int GetHashCode() { - return (_value != null ? _value.GetHashCode() : 0); + return (HasValue ? _value.GetHashCode() : 0); } public static bool operator ==(FragmentString left, FragmentString right) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs index 2641f33540..e8c6ac3b35 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs @@ -205,6 +205,10 @@ namespace Microsoft.AspNetCore.Http /// public bool Equals(HostString other) { + if (!HasValue && !other.HasValue) + { + return true; + } return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); } @@ -217,7 +221,7 @@ namespace Microsoft.AspNetCore.Http { if (ReferenceEquals(null, obj)) { - return false; + return !HasValue; } return obj is HostString && Equals((HostString)obj); } @@ -228,7 +232,7 @@ namespace Microsoft.AspNetCore.Http /// public override int GetHashCode() { - return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); + return (HasValue ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); } /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs index 9b2fe702d0..cc779ab1b9 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs @@ -215,21 +215,25 @@ namespace Microsoft.AspNetCore.Http public bool Equals(QueryString other) { - return string.Equals(_value, other._value); + if (!HasValue && !other.HasValue) + { + return true; + } + return string.Equals(_value, other._value, StringComparison.Ordinal); } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) { - return false; + return !HasValue; } return obj is QueryString && Equals((QueryString)obj); } public override int GetHashCode() { - return _value?.GetHashCode() ?? 0; + return (HasValue ? _value.GetHashCode() : 0); } public static bool operator ==(QueryString left, QueryString right) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index 2c8c0f6840..b31be611e3 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -11,6 +11,9 @@ namespace Microsoft.AspNetCore.Http.Extensions /// public static class UriHelper { + private const string ForwardSlash = "/"; + private const string Pound = "#"; + private const string QuestionMark = "?"; private const string SchemeDelimiter = "://"; /// @@ -70,6 +73,67 @@ namespace Microsoft.AspNetCore.Http.Extensions .ToString(); } + /// + /// Seperates the given absolute URI string into components. Assumes no PathBase. + /// + /// A string representation of the uri. + /// http, https, etc. + /// The host portion of the uri normally included in the Host header. This may include the port. + /// The portion of the request path that identifies the requested resource. + /// The query, if any. + /// The fragment, if any. + public static void FromAbsolute( + string uri, + out string scheme, + out HostString host, + out PathString path, + out QueryString query, + out FragmentString fragment) + { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + // Satisfy the out parameters + path = new PathString(); + query = new QueryString(); + fragment = new FragmentString(); + var startIndex = uri.IndexOf(SchemeDelimiter); + + if (startIndex < 0) + { + throw new FormatException("No scheme delimiter in uri."); + } + + scheme = uri.Substring(0, startIndex); + + // PERF: Calculate the end of the scheme for next IndexOf + startIndex += SchemeDelimiter.Length; + + var searchIndex = -1; + var limit = uri.Length; + + if ((searchIndex = uri.IndexOf(Pound, startIndex)) >= 0 && searchIndex < limit) + { + fragment = FragmentString.FromUriComponent(uri.Substring(searchIndex)); + limit = searchIndex; + } + + if ((searchIndex = uri.IndexOf(QuestionMark, startIndex)) >= 0 && searchIndex < limit) + { + query = QueryString.FromUriComponent(uri.Substring(searchIndex, limit - searchIndex)); + limit = searchIndex; + } + + if ((searchIndex = uri.IndexOf(ForwardSlash, startIndex)) >= 0 && searchIndex < limit) + { + path = PathString.FromUriComponent(uri.Substring(searchIndex, limit - searchIndex)); + limit = searchIndex; + } + + host = HostString.FromUriComponent(uri.Substring(startIndex, limit - startIndex)); + } + /// /// Generates a string from the given absolute or relative Uri that is appropriately encoded for use in /// HTTP headers. Note that a unicode host name will be encoded as punycode. diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs new file mode 100644 index 0000000000..eb0c955e3d --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs @@ -0,0 +1,41 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.AspNetCore.Http.Abstractions.Tests +{ + public class FragmentStringTests + { + [Fact] + public void Equals_EmptyFragmentStringAndDefaultFragmentString() + { + // Act and Assert + Assert.Equal(FragmentString.Empty, default(FragmentString)); + Assert.Equal(default(FragmentString), FragmentString.Empty); + // explicitly checking == operator + Assert.True(FragmentString.Empty == default(FragmentString)); + Assert.True(default(FragmentString) == FragmentString.Empty); + } + + [Fact] + public void NotEquals_DefaultFragmentStringAndNonNullFragmentString() + { + // Arrange + var fragmentString = new FragmentString("#col=1"); + + // Act and Assert + Assert.NotEqual(fragmentString, default(FragmentString)); + } + + [Fact] + public void NotEquals_EmptyFragmentStringAndNonNullFragmentString() + { + // Arrange + var fragmentString = new FragmentString("#col=1"); + + // Act and Assert + Assert.NotEqual(fragmentString, FragmentString.Empty); + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs index 6e5a684e0b..b5d5f3e392 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs @@ -92,5 +92,36 @@ namespace Microsoft.AspNetCore.Http Assert.Equal(expectedHost, host); Assert.Equal(expectedPort, port); } + + [Fact] + public void Equals_EmptyHostStringAndDefaultHostString() + { + // Act and Assert + Assert.Equal(new HostString(string.Empty), default(HostString)); + Assert.Equal(default(HostString), new HostString(string.Empty)); + // explicitly checking == operator + Assert.True(new HostString(string.Empty) == default(HostString)); + Assert.True(default(HostString) == new HostString(string.Empty)); + } + + [Fact] + public void NotEquals_DefaultHostStringAndNonNullHostString() + { + // Arrange + var hostString = new HostString("example.com"); + + // Act and Assert + Assert.NotEqual(hostString, default(HostString)); + } + + [Fact] + public void NotEquals_EmptyHostStringAndNonNullHostString() + { + // Arrange + var hostString = new HostString("example.com"); + + // Act and Assert + Assert.NotEqual(hostString, new HostString(string.Empty)); + } } } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs index 6caa872e00..ec3a36cbe2 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs @@ -105,5 +105,36 @@ namespace Microsoft.AspNetCore.Http.Abstractions var q2 = q1.Add(name2, value2); Assert.Equal(expected, q2.Value); } + + [Fact] + public void Equals_EmptyQueryStringAndDefaultQueryString() + { + // Act and Assert + Assert.Equal(QueryString.Empty, default(QueryString)); + Assert.Equal(default(QueryString), QueryString.Empty); + // explicitly checking == operator + Assert.True(QueryString.Empty == default(QueryString)); + Assert.True(default(QueryString) == QueryString.Empty); + } + + [Fact] + public void NotEquals_DefaultQueryStringAndNonNullQueryString() + { + // Arrange + var queryString = new QueryString("?foo=1"); + + // Act and Assert + Assert.NotEqual(queryString, default(QueryString)); + } + + [Fact] + public void NotEquals_EmptyQueryStringAndNonNullQueryString() + { + // Arrange + var queryString = new QueryString("?foo=1"); + + // Act and Assert + Assert.NotEqual(queryString, QueryString.Empty); + } } } diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index 0b0aeda6e1..90cd27a948 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -66,5 +66,68 @@ namespace Microsoft.AspNetCore.Http.Extensions Assert.Equal("http://my.hoψst:80/un?escaped/base/un?escaped?name=val%23ue", request.GetDisplayUrl()); } + + [Theory] + [InlineData("http://example.com", "http", "example.com", "", "", "")] + [InlineData("https://example.com", "https", "example.com", "", "", "")] + [InlineData("http://example.com/foo/bar", "http", "example.com", "/foo/bar", "", "")] + [InlineData("http://example.com/foo/bar?baz=1", "http", "example.com", "/foo/bar", "?baz=1", "")] + [InlineData("http://example.com/foo#col=2", "http", "example.com", "/foo", "", "#col=2")] + [InlineData("http://example.com/foo?bar=1#col=2", "http", "example.com", "/foo", "?bar=1", "#col=2")] + [InlineData("http://example.com?bar=1#col=2", "http", "example.com", "", "?bar=1", "#col=2")] + [InlineData("http://example.com#frag?stillfrag/stillfrag", "http", "example.com", "", "", "#frag?stillfrag/stillfrag")] + [InlineData("http://example.com?q/stillq#frag?stillfrag/stillfrag", "http", "example.com", "", "?q/stillq", "#frag?stillfrag/stillfrag")] + [InlineData("http://example.com/fo%23o#col=2", "http", "example.com", "/fo#o", "", "#col=2")] + [InlineData("http://example.com/fo%3Fo#col=2", "http", "example.com", "/fo?o", "", "#col=2")] + [InlineData("ftp://example.com/", "ftp", "example.com", "/", "", "")] + [InlineData("https://127.0.0.0:80/bar", "https", "127.0.0.0:80", "/bar", "", "")] + [InlineData("http://[1080:0:0:0:8:800:200C:417A]/index.html", "http", "[1080:0:0:0:8:800:200C:417A]", "/index.html", "", "")] + [InlineData("http://example.com///", "http", "example.com", "///", "", "")] + [InlineData("http://example.com///", "http", "example.com", "///", "", "")] + public void FromAbsoluteUriParsingChecks( + string uri, + string expectedScheme, + string expectedHost, + string expectedPath, + string expectedQuery, + string expectedFragment) + { + string scheme = null; + var host = new HostString(); + var path = new PathString(); + var query = new QueryString(); + var fragment = new FragmentString(); + UriHelper.FromAbsolute(uri, out scheme, out host, out path, out query, out fragment); + + Assert.Equal(scheme, expectedScheme); + Assert.Equal(host, new HostString(expectedHost)); + Assert.Equal(path, new PathString(expectedPath)); + Assert.Equal(query, new QueryString(expectedQuery)); + Assert.Equal(fragment, new FragmentString(expectedFragment)); + } + + [Fact] + public void FromAbsoluteToBuildAbsolute() + { + var scheme = "http"; + var host = new HostString("example.com"); + var path = new PathString("/index.html"); + var query = new QueryString("?foo=1"); + var fragment = new FragmentString("#col=1"); + var request = UriHelper.BuildAbsolute(scheme, host, path:path, query:query, fragment:fragment); + + string resScheme = null; + var resHost = new HostString(); + var resPath = new PathString(); + var resQuery = new QueryString(); + var resFragment = new FragmentString(); + UriHelper.FromAbsolute(request, out resScheme, out resHost, out resPath, out resQuery, out resFragment); + + Assert.Equal(scheme, resScheme); + Assert.Equal(host, resHost); + Assert.Equal(path, resPath); + Assert.Equal(query, resQuery); + Assert.Equal(fragment, resFragment); + } } } From d16614a65332f19764b303920fdf3f85dec4dfed Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 9 Aug 2016 15:03:15 -0700 Subject: [PATCH 594/846] Switching to dotnet.myget.org feed --- NuGet.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..826a1f9035 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@  - + \ No newline at end of file From 69729bc75bfc3386f6dd77ef3e19a5b72d8749ff Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 10 Aug 2016 15:50:58 -0700 Subject: [PATCH 595/846] Perf to ToUriComponent --- .../HostString.cs | 34 +++++++++++------- .../Internal/HostStringHelper.cs | 36 +++++++++++++++++++ 2 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Internal/HostStringHelper.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs index e8c6ac3b35..4b4b24f7e5 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs @@ -4,6 +4,7 @@ using System; using System.Globalization; using Microsoft.AspNetCore.Http.Abstractions; +using Microsoft.AspNetCore.Http.Internal; namespace Microsoft.AspNetCore.Http { @@ -123,20 +124,29 @@ namespace Microsoft.AspNetCore.Http return string.Empty; } - string host, port; - - GetParts(out host, out port); - - if (host.IndexOf('[') == -1) - { - var mapping = new IdnMapping(); - host = mapping.GetAscii(host); + int i; + for (i = 0; i < _value.Length; ++i) + { + if (!HostStringHelper.IsSafeHostStringChar(_value[i])) + { + break; + } } - return string.IsNullOrEmpty(port) - ? host - : string.Concat(host, ":", port); - + if (i != _value.Length) + { + string host, port; + GetParts(out host, out port); + + var mapping = new IdnMapping(); + host = mapping.GetAscii(host); + + return string.IsNullOrEmpty(port) + ? host + : string.Concat(host, ":", port); + } + + return _value; } /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HostStringHelper.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HostStringHelper.cs new file mode 100644 index 0000000000..f4cfac52af --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HostStringHelper.cs @@ -0,0 +1,36 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Http.Internal +{ + internal class HostStringHelper + { + // Allowed Characters: + // A-Z, a-z, 0-9, ., + // -, %, [, ], : + // Above for IPV6 + private static bool[] SafeHostStringChars = { + false, false, false, false, false, false, false, false, // 0x00 - 0x07 + false, false, false, false, false, false, false, false, // 0x08 - 0x0F + false, false, false, false, false, false, false, false, // 0x10 - 0x17 + false, false, false, false, false, false, false, false, // 0x18 - 0x1F + false, false, false, false, false, true, false, false, // 0x20 - 0x27 + false, false, false, false, false, true, true, false, // 0x28 - 0x2F + true, true, true, true, true, true, true, true, // 0x30 - 0x37 + true, true, true, false, false, false, false, false, // 0x38 - 0x3F + false, true, true, true, true, true, true, true, // 0x40 - 0x47 + true, true, true, true, true, true, true, true, // 0x48 - 0x4F + true, true, true, true, true, true, true, true, // 0x50 - 0x57 + true, true, true, true, false, true, false, false, // 0x58 - 0x5F + false, true, true, true, true, true, true, true, // 0x60 - 0x67 + true, true, true, true, true, true, true, true, // 0x68 - 0x6F + true, true, true, true, true, true, true, true, // 0x70 - 0x77 + true, true, true, false, false, false, false, false, // 0x78 - 0x7F + }; + + public static bool IsSafeHostStringChar(char c) + { + return c < SafeHostStringChars.Length && SafeHostStringChars[c]; + } + } +} From e2a0e887af17ff7c784149d4b36bf861705fdf31 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 15 Aug 2016 18:52:19 -0700 Subject: [PATCH 596/846] Add UsePathBase middleware --- .../Extensions/MapMiddleware.cs | 10 +- .../Extensions/UsePathBaseExtensions.cs | 38 ++++ .../Extensions/UsePathBaseMiddleware.cs | 77 ++++++++ .../PathString.cs | 48 ++++- .../MapPathMiddlewareTests.cs | 9 +- .../UsePathBaseExtensionsTests.cs | 168 ++++++++++++++++++ 6 files changed, 341 insertions(+), 9 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseExtensions.cs create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseMiddleware.cs create mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/UsePathBaseExtensionsTests.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs index 9d286d39d4..a4f67ce4a2 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs @@ -48,13 +48,15 @@ namespace Microsoft.AspNetCore.Builder.Extensions throw new ArgumentNullException(nameof(context)); } - PathString path = context.Request.Path; + PathString matchedPath; PathString remainingPath; - if (path.StartsWithSegments(_options.PathMatch, out remainingPath)) + + if (context.Request.Path.StartsWithSegments(_options.PathMatch, out matchedPath, out remainingPath)) { // Update the path - PathString pathBase = context.Request.PathBase; - context.Request.PathBase = pathBase + _options.PathMatch; + var path = context.Request.Path; + var pathBase = context.Request.PathBase; + context.Request.PathBase = pathBase.Add(matchedPath); context.Request.Path = remainingPath; try diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseExtensions.cs new file mode 100644 index 0000000000..482f2f481f --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseExtensions.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Builder.Extensions; + +namespace Microsoft.AspNetCore.Builder +{ + /// + /// Extension methods for . + /// + public static class UsePathBaseExtensions + { + /// + /// Adds a middleware that extracts the specified path base from request path and postpend it to the request path base. + /// + /// The instance. + /// The path base to extract. + /// The instance. + public static IApplicationBuilder UsePathBase(this IApplicationBuilder app, PathString pathBase) + { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + // Strip trailing slashes + pathBase = pathBase.Value?.TrimEnd('/'); + if (!pathBase.HasValue) + { + return app; + } + + return app.UseMiddleware(pathBase); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseMiddleware.cs new file mode 100644 index 0000000000..6474aeda58 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseMiddleware.cs @@ -0,0 +1,77 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Builder.Extensions +{ + /// + /// Represents a middleware that extracts the specified path base from request path and postpend it to the request path base. + /// + public class UsePathBaseMiddleware + { + private readonly RequestDelegate _next; + private readonly PathString _pathBase; + + /// + /// Creates a new instace of . + /// + /// The delegate representing the next middleware in the request pipeline. + /// The path base to extract. + public UsePathBaseMiddleware(RequestDelegate next, PathString pathBase) + { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + + if (!pathBase.HasValue) + { + throw new ArgumentException($"{nameof(pathBase)} cannot be null or empty."); + } + + _next = next; + _pathBase = pathBase; + } + + /// + /// Executes the middleware. + /// + /// The for the current request. + /// A task that represents the execution of this middleware. + public async Task Invoke(HttpContext context) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + PathString matchedPath; + PathString remainingPath; + + if (context.Request.Path.StartsWithSegments(_pathBase, out matchedPath, out remainingPath)) + { + var originalPath = context.Request.Path; + var originalPathBase = context.Request.PathBase; + context.Request.Path = remainingPath; + context.Request.PathBase = originalPathBase.Add(matchedPath); + + try + { + await _next(context); + } + finally + { + context.Request.Path = originalPath; + context.Request.PathBase = originalPathBase; + } + } + else + { + await _next(context); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 0b56e46292..a211d2737c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -203,8 +203,8 @@ namespace Microsoft.AspNetCore.Http } /// - /// Determines whether the beginning of this PathString instance matches the specified when compared - /// using the specified comparison option and returns the remaining segments. + /// Determines whether the beginning of this instance matches the specified and returns + /// the remaining segments. /// /// The to compare. /// The remaining segments after the match. @@ -215,8 +215,8 @@ namespace Microsoft.AspNetCore.Http } /// - /// Determines whether the beginning of this instance matches the specified and returns - /// the remaining segments. + /// Determines whether the beginning of this instance matches the specified when compared + /// using the specified comparison option and returns the remaining segments. /// /// The to compare. /// One of the enumeration values that determines how this and value are compared. @@ -238,6 +238,46 @@ namespace Microsoft.AspNetCore.Http return false; } + /// + /// Determines whether the beginning of this instance matches the specified and returns + /// the matched and remaining segments. + /// + /// The to compare. + /// The matched segments with the original casing in the source value. + /// The remaining segments after the match. + /// true if value matches the beginning of this string; otherwise, false. + public bool StartsWithSegments(PathString other, out PathString matched, out PathString remaining) + { + return StartsWithSegments(other, StringComparison.OrdinalIgnoreCase, out matched, out remaining); + } + + /// + /// Determines whether the beginning of this instance matches the specified when compared + /// using the specified comparison option and returns the matched and remaining segments. + /// + /// The to compare. + /// One of the enumeration values that determines how this and value are compared. + /// The matched segments with the original casing in the source value. + /// The remaining segments after the match. + /// true if value matches the beginning of this string; otherwise, false. + public bool StartsWithSegments(PathString other, StringComparison comparisonType, out PathString matched, out PathString remaining) + { + var value1 = Value ?? string.Empty; + var value2 = other.Value ?? string.Empty; + if (value1.StartsWith(value2, comparisonType)) + { + if (value1.Length == value2.Length || value1[value2.Length] == '/') + { + matched = new PathString(value1.Substring(0, value2.Length)); + remaining = new PathString(value1.Substring(value2.Length)); + return true; + } + } + remaining = Empty; + matched = Empty; + return false; + } + /// /// Adds two PathString instances into a combined PathString value. /// diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index aaee3cc318..a30e99603c 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -75,6 +75,13 @@ namespace Microsoft.AspNetCore.Builder.Extensions [InlineData("/foo", "/Bar", "/foo/cho/")] [InlineData("/foo/cho", "/Bar", "/foo/cho")] [InlineData("/foo/cho", "/Bar", "/foo/cho/do")] + [InlineData("/foo", "", "/Foo")] + [InlineData("/foo", "", "/Foo/")] + [InlineData("/foo", "/Bar", "/Foo")] + [InlineData("/foo", "/Bar", "/Foo/Cho")] + [InlineData("/foo", "/Bar", "/Foo/Cho/")] + [InlineData("/foo/cho", "/Bar", "/Foo/Cho")] + [InlineData("/foo/cho", "/Bar", "/Foo/Cho/do")] public void PathMatchAction_BranchTaken(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); @@ -84,7 +91,7 @@ namespace Microsoft.AspNetCore.Builder.Extensions app.Invoke(context).Wait(); Assert.Equal(200, context.Response.StatusCode); - Assert.Equal(basePath + matchPath, context.Items["test.PathBase"]); + Assert.Equal(basePath + requestPath.Substring(0, matchPath.Length), (string)context.Items["test.PathBase"]); Assert.Equal(requestPath.Substring(matchPath.Length), context.Items["test.Path"]); } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UsePathBaseExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UsePathBaseExtensionsTests.cs new file mode 100644 index 0000000000..4b8e9d71cb --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UsePathBaseExtensionsTests.cs @@ -0,0 +1,168 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Xunit; + +namespace Microsoft.AspNetCore.Builder.Extensions +{ + public class UsePathBaseExtensionsTests + { + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData("/")] + public void EmptyOrNullPathBase_DoNotAddMiddleware(string pathBase) + { + // Arrange + var useCalled = false; + var builder = new ApplicationBuilderWrapper(CreateBuilder(), () => useCalled = true) + .UsePathBase(pathBase); + + // Act + builder.Build(); + + // Assert + Assert.False(useCalled); + } + + private class ApplicationBuilderWrapper : IApplicationBuilder + { + private readonly IApplicationBuilder _wrappedBuilder; + private readonly Action _useCallback; + + public ApplicationBuilderWrapper(IApplicationBuilder applicationBuilder, Action useCallback) + { + _wrappedBuilder = applicationBuilder; + _useCallback = useCallback; + } + + public IApplicationBuilder Use(Func middleware) + { + _useCallback(); + return _wrappedBuilder.Use(middleware); + } + + public IServiceProvider ApplicationServices + { + get { return _wrappedBuilder.ApplicationServices; } + set { _wrappedBuilder.ApplicationServices = value; } + } + + public IDictionary Properties => _wrappedBuilder.Properties; + public IFeatureCollection ServerFeatures => _wrappedBuilder.ServerFeatures; + public RequestDelegate Build() => _wrappedBuilder.Build(); + public IApplicationBuilder New() => _wrappedBuilder.New(); + + } + + [Theory] + [InlineData("/base", "", "/base", "/base", "")] + [InlineData("/base", "", "/base/", "/base", "/")] + [InlineData("/base", "", "/base/something", "/base", "/something")] + [InlineData("/base", "", "/base/something/", "/base", "/something/")] + [InlineData("/base/more", "", "/base/more", "/base/more", "")] + [InlineData("/base/more", "", "/base/more/something", "/base/more", "/something")] + [InlineData("/base/more", "", "/base/more/something/", "/base/more", "/something/")] + [InlineData("/base", "/oldbase", "/base", "/oldbase/base", "")] + [InlineData("/base", "/oldbase", "/base/", "/oldbase/base", "/")] + [InlineData("/base", "/oldbase", "/base/something", "/oldbase/base", "/something")] + [InlineData("/base", "/oldbase", "/base/something/", "/oldbase/base", "/something/")] + [InlineData("/base/more", "/oldbase", "/base/more", "/oldbase/base/more", "")] + [InlineData("/base/more", "/oldbase", "/base/more/something", "/oldbase/base/more", "/something")] + [InlineData("/base/more", "/oldbase", "/base/more/something/", "/oldbase/base/more", "/something/")] + public void RequestPathBaseContainingPathBase_IsSplit(string registeredPathBase, string pathBase, string requestPath, string expectedPathBase, string expectedPath) + { + TestPathBase(registeredPathBase, pathBase, requestPath, expectedPathBase, expectedPath); + } + + [Theory] + [InlineData("/base", "", "/something", "", "/something")] + [InlineData("/base", "", "/baseandsomething", "", "/baseandsomething")] + [InlineData("/base", "", "/ba", "", "/ba")] + [InlineData("/base", "", "/ba/se", "", "/ba/se")] + [InlineData("/base", "/oldbase", "/something", "/oldbase", "/something")] + [InlineData("/base", "/oldbase", "/baseandsomething", "/oldbase", "/baseandsomething")] + [InlineData("/base", "/oldbase", "/ba", "/oldbase", "/ba")] + [InlineData("/base", "/oldbase", "/ba/se", "/oldbase", "/ba/se")] + public void RequestPathBaseNotContainingPathBase_IsNotSplit(string registeredPathBase, string pathBase, string requestPath, string expectedPathBase, string expectedPath) + { + TestPathBase(registeredPathBase, pathBase, requestPath, expectedPathBase, expectedPath); + } + + [Theory] + [InlineData("", "", "/", "", "/")] + [InlineData("/", "", "/", "", "/")] + [InlineData("/base", "", "/base/", "/base", "/")] + [InlineData("/base/", "", "/base", "/base", "")] + [InlineData("/base/", "", "/base/", "/base", "/")] + [InlineData("", "/oldbase", "/", "/oldbase", "/")] + [InlineData("/", "/oldbase", "/", "/oldbase", "/")] + [InlineData("/base", "/oldbase", "/base/", "/oldbase/base", "/")] + [InlineData("/base/", "/oldbase", "/base", "/oldbase/base", "")] + [InlineData("/base/", "/oldbase", "/base/", "/oldbase/base", "/")] + public void PathBaseNeverEndsWithSlash(string registeredPathBase, string pathBase, string requestPath, string expectedPathBase, string expectedPath) + { + TestPathBase(registeredPathBase, pathBase, requestPath, expectedPathBase, expectedPath); + } + + [Theory] + [InlineData("/base", "", "/Base/Something", "/Base", "/Something")] + [InlineData("/base", "/OldBase", "/Base/Something", "/OldBase/Base", "/Something")] + public void PathBaseAndPathPreserveRequestCasing(string registeredPathBase, string pathBase, string requestPath, string expectedPathBase, string expectedPath) + { + TestPathBase(registeredPathBase, pathBase, requestPath, expectedPathBase, expectedPath); + } + + [Theory] + [InlineData("/b♫se", "", "/b♫se/something", "/b♫se", "/something")] + [InlineData("/b♫se", "", "/B♫se/something", "/B♫se", "/something")] + [InlineData("/b♫se", "", "/b♫se/Something", "/b♫se", "/Something")] + [InlineData("/b♫se", "/oldb♫se", "/b♫se/something", "/oldb♫se/b♫se", "/something")] + [InlineData("/b♫se", "/oldb♫se", "/b♫se/Something", "/oldb♫se/b♫se", "/Something")] + [InlineData("/b♫se", "/oldb♫se", "/B♫se/something", "/oldb♫se/B♫se", "/something")] + public void PathBaseCanHaveUnicodeCharacters(string registeredPathBase, string pathBase, string requestPath, string expectedPathBase, string expectedPath) + { + TestPathBase(registeredPathBase, pathBase, requestPath, expectedPathBase, expectedPath); + } + + private static void TestPathBase(string registeredPathBase, string pathBase, string requestPath, string expectedPathBase, string expectedPath) + { + HttpContext requestContext = CreateRequest(pathBase, requestPath); + var builder = CreateBuilder() + .UsePathBase(registeredPathBase); + builder.Run(context => + { + context.Items["test.Path"] = context.Request.Path; + context.Items["test.PathBase"] = context.Request.PathBase; + return Task.FromResult(0); + }); + builder.Build().Invoke(requestContext).Wait(); + + // Assert path and pathBase are split after middleware + Assert.Equal(expectedPath, ((PathString)requestContext.Items["test.Path"]).Value); + Assert.Equal(expectedPathBase, ((PathString)requestContext.Items["test.PathBase"]).Value); + // Assert path and pathBase are reset after request + Assert.Equal(pathBase, requestContext.Request.PathBase.Value); + Assert.Equal(requestPath, requestContext.Request.Path.Value); + } + + private static HttpContext CreateRequest(string pathBase, string requestPath) + { + HttpContext context = new DefaultHttpContext(); + context.Request.PathBase = new PathString(pathBase); + context.Request.Path = new PathString(requestPath); + return context; + } + + private static ApplicationBuilder CreateBuilder() + { + return new ApplicationBuilder(serviceProvider: null); + } + } +} From e4afd782e8e5c7e8624abc8b0343d79d3bde8836 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 29 Aug 2016 17:55:20 -0700 Subject: [PATCH 597/846] Add strong and weak ETag comparisons --- .../EntityTagHeaderValue.cs | 37 +++++++- .../EntityTagHeaderValueTest.cs | 91 +++++++++++++++++++ 2 files changed, 127 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs index 7f89a3e113..7d09920c77 100644 --- a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -93,6 +93,15 @@ namespace Microsoft.Net.Http.Headers return _tag; } + /// + /// Check against another for equality. + /// This equality check should not be used to determine if two values match under the RFC specifications (https://tools.ietf.org/html/rfc7232#section-2.3.2). + /// + /// The other value to check against for equality. + /// + /// true if the strength and tag of the two values match, + /// false if the other value is null, is not an , or if there is a mismatch of strength or tag between the two values. + /// public override bool Equals(object obj) { var other = obj as EntityTagHeaderValue; @@ -103,7 +112,7 @@ namespace Microsoft.Net.Http.Headers } // Since the tag is a quoted-string we treat it case-sensitive. - return ((_isWeak == other._isWeak) && (string.CompareOrdinal(_tag, other._tag) == 0)); + return _isWeak == other._isWeak && string.Equals(_tag, other._tag, StringComparison.Ordinal); } public override int GetHashCode() @@ -112,6 +121,32 @@ namespace Microsoft.Net.Http.Headers return _tag.GetHashCode() ^ _isWeak.GetHashCode(); } + /// + /// Compares against another to see if they match under the RFC specifications (https://tools.ietf.org/html/rfc7232#section-2.3.2). + /// + /// The other to compare against. + /// true to use a strong comparison, false to use a weak comparison + /// + /// true if the match for the given comparison type, + /// false if the other value is null or the comparison failed. + /// + public bool Compare(EntityTagHeaderValue other, bool useStrongComparison) + { + if (other == null) + { + return false; + } + + if (useStrongComparison) + { + return !IsWeak && !other.IsWeak && string.Equals(Tag, other.Tag, StringComparison.Ordinal); + } + else + { + return string.Equals(Tag, other.Tag, StringComparison.Ordinal); + } + } + public static EntityTagHeaderValue Parse(string input) { var index = 0; diff --git a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs index c17c9baa06..f633fec226 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs @@ -99,6 +99,97 @@ namespace Microsoft.Net.Http.Headers Assert.True(etag1.Equals(etag5), "tag vs. tag.."); } + [Fact] + public void Compare_WithNull_ReturnsFalse() + { + Assert.False(EntityTagHeaderValue.Any.Compare(null, useStrongComparison: true)); + Assert.False(EntityTagHeaderValue.Any.Compare(null, useStrongComparison: false)); + } + + public static TheoryData NotEquivalentUnderStrongComparison + { + get + { + return new TheoryData + { + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"TAG\"") }, + { new EntityTagHeaderValue("\"tag\"", true), new EntityTagHeaderValue("\"tag\"", true) }, + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag\"", true) }, + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag1\"") }, + { new EntityTagHeaderValue("\"tag\""), EntityTagHeaderValue.Any }, + }; + } + } + + [Theory] + [MemberData(nameof(NotEquivalentUnderStrongComparison))] + public void CompareUsingStrongComparison_NonEquivalentPairs_ReturnFalse(EntityTagHeaderValue left, EntityTagHeaderValue right) + { + Assert.False(left.Compare(right, useStrongComparison: true)); + Assert.False(right.Compare(left, useStrongComparison: true)); + } + + public static TheoryData EquivalentUnderStrongComparison + { + get + { + return new TheoryData + { + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag\"") }, + }; + } + } + + [Theory] + [MemberData(nameof(EquivalentUnderStrongComparison))] + public void CompareUsingStrongComparison_EquivalentPairs_ReturnTrue(EntityTagHeaderValue left, EntityTagHeaderValue right) + { + Assert.True(left.Compare(right, useStrongComparison: true)); + Assert.True(right.Compare(left, useStrongComparison: true)); + } + + public static TheoryData NotEquivalentUnderWeakComparison + { + get + { + return new TheoryData + { + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"TAG\"") }, + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag1\"") }, + { new EntityTagHeaderValue("\"tag\""), EntityTagHeaderValue.Any }, + }; + } + } + + [Theory] + [MemberData(nameof(NotEquivalentUnderWeakComparison))] + public void CompareUsingWeakComparison_NonEquivalentPairs_ReturnFalse(EntityTagHeaderValue left, EntityTagHeaderValue right) + { + Assert.False(left.Compare(right, useStrongComparison: false)); + Assert.False(right.Compare(left, useStrongComparison: false)); + } + + public static TheoryData EquivalentUnderWeakComparison + { + get + { + return new TheoryData + { + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag\"") }, + { new EntityTagHeaderValue("\"tag\"", true), new EntityTagHeaderValue("\"tag\"", true) }, + { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag\"", true) }, + }; + } + } + + [Theory] + [MemberData(nameof(EquivalentUnderWeakComparison))] + public void CompareUsingWeakComparison_EquivalentPairs_ReturnTrue(EntityTagHeaderValue left, EntityTagHeaderValue right) + { + Assert.True(left.Compare(right, useStrongComparison: false)); + Assert.True(right.Compare(left, useStrongComparison: false)); + } + [Fact] public void Parse_SetOfValidValueStrings_ParsedCorrectly() { From 30a4b09d9fc859757ffecb08ce07c2c2cd8a3e9f Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Thu, 1 Sep 2016 10:16:18 -0700 Subject: [PATCH 598/846] Fix CookieOptions.HttpOnly doc comment --- src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs index 50604ae8a7..2c48cea430 100644 --- a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs @@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Http /// /// Gets or sets a value that indicates whether a cookie is accessible by client-side script. /// - /// true if a cookie is accessible by client-side script; otherwise, false. + /// true if a cookie must not be accessible by client-side script; otherwise, false. public bool HttpOnly { get; set; } } } From 22e5dfd8df20815ca7bc9a12ce9dbd155c7e3740 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Sun, 4 Sep 2016 15:43:49 -0700 Subject: [PATCH 599/846] Increase .travis.yml consistency between repos - aspnet/Universe#349 - minimize `dotnet` setup time; no need for caching --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index f0b5ec2a1e..a6d73375dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,10 @@ addons: - libssl-dev - libunwind8 - zlib1g +env: + global: + - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + - DOTNET_CLI_TELEMETRY_OPTOUT: 1 mono: - 4.0.5 os: From 18f08fdb2f38c43505de94a335e817db1fb57274 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 7 Sep 2016 10:40:13 -0700 Subject: [PATCH 600/846] Use TaskCache class from Microsoft.Extensions.TaskCache.Sources (#705) Instead of Task.FromResult(0) --- src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs | 3 ++- src/Microsoft.AspNetCore.Http.Abstractions/project.json | 4 ++++ .../Internal/ApplicationBuilder.cs | 4 ++-- src/Microsoft.AspNetCore.Http/project.json | 4 ++++ src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs | 3 ++- .../WebSockets/WebSocketAdapter.cs | 3 ++- src/Microsoft.AspNetCore.Owin/project.json | 6 +++++- 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs index 0276fb626c..9bccf26976 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs @@ -4,6 +4,7 @@ using System; using System.IO; using System.Threading.Tasks; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Http { @@ -16,7 +17,7 @@ namespace Microsoft.AspNetCore.Http private static readonly Func _disposeDelegate = disposable => { ((IDisposable)disposable).Dispose(); - return Task.FromResult(0); + return TaskCache.CompletedTask; }; /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 1353449366..f67a51ea1d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -24,6 +24,10 @@ "type": "build", "version": "1.1.0-*" }, + "Microsoft.Extensions.TaskCache.Sources": { + "version": "1.1.0-*", + "type": "build" + }, "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs index a0315ee539..6b36842fbb 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs @@ -4,10 +4,10 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Internal; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Builder.Internal { @@ -81,7 +81,7 @@ namespace Microsoft.AspNetCore.Builder.Internal RequestDelegate app = context => { context.Response.StatusCode = 404; - return Task.FromResult(0); + return TaskCache.CompletedTask; }; foreach (var component in _components.Reverse()) diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 079d9b853e..792c59899d 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -24,6 +24,10 @@ "Microsoft.AspNetCore.WebUtilities": "1.1.0-*", "Microsoft.Extensions.ObjectPool": "1.1.0-*", "Microsoft.Extensions.Options": "1.1.0-*", + "Microsoft.Extensions.TaskCache.Sources": { + "version": "1.1.0-*", + "type": "build" + }, "Microsoft.Net.Http.Headers": "1.1.0-*", "System.Buffers": "4.0.0-*" }, diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index 45bd5884aa..4d30f52cec 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -17,6 +17,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Owin { @@ -67,7 +68,7 @@ namespace Microsoft.AspNetCore.Owin feature.OnStarting(s => { cb(s); - return Task.FromResult(0); + return TaskCache.CompletedTask; }, state); })) }, diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs index be5020c47e..45bb017925 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs @@ -7,6 +7,7 @@ using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Owin { @@ -68,7 +69,7 @@ namespace Microsoft.AspNetCore.Owin else if (messageType == 0x9 || messageType == 0xA) { // Ping & Pong, not allowed by the underlying APIs, silently discard. - return Task.FromResult(0); + return TaskCache.CompletedTask; } return _webSocket.SendAsync(buffer, OpCodeToEnum(messageType), endOfMessage, cancel); diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 2c22181651..66160588c2 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -21,7 +21,11 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http": "1.1.0-*" + "Microsoft.AspNetCore.Http": "1.1.0-*", + "Microsoft.Extensions.TaskCache.Sources": { + "version": "1.1.0-*", + "type": "build" + } }, "frameworks": { "net451": {}, From 87cd79d6fc54bb4abf07c1e380cd7a9498a78612 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 7 Sep 2016 22:02:07 -0700 Subject: [PATCH 601/846] Added decoding tests for the FormReader - This is the first step in work to remove char[] allocations from the FormReader --- .../FormReaderTests.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs index fbe6af6cce..134efbb515 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs @@ -189,6 +189,23 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.Null(await ReadPair(reader)); } + // https://en.wikipedia.org/wiki/Percent-encoding + [Theory] + [InlineData("++=hello", " ", "hello")] + [InlineData("a=1+1", "a", "1 1")] + [InlineData("%22%25%2D%2E%3C%3E%5C%5E%5F%60%7B%7C%7D%7E=%22%25%2D%2E%3C%3E%5C%5E%5F%60%7B%7C%7D%7E", "\"%-.<>\\^_`{|}~", "\"%-.<>\\^_`{|}~")] + [InlineData("a=%41", "a", "A")] // ascii encoded hex + [InlineData("a=%C3%A1", "a", "\u00e1")] // utf8 code points + [InlineData("a=%u20AC", "a", "%u20AC")] // utf16 not supported + public async Task ReadForm_Decoding(string formData, string key, string expectedValue) + { + var body = MakeStream(bufferRequest: false, text: formData); + + var form = await ReadFormAsync(new FormReader(body)); + + Assert.Equal(expectedValue, form[key]); + } + protected virtual Task> ReadFormAsync(FormReader reader) { return Task.FromResult(reader.ReadForm()); From 626332c5dbf31261e58787429f411e30cc7c79f0 Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Mon, 26 Sep 2016 23:09:08 -0700 Subject: [PATCH 602/846] Adding HTTP method constants --- .../HttpMethod.cs | 65 +++++++++++++++++++ .../OwinFeatureCollectionTests.cs | 5 +- 2 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/HttpMethod.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethod.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethod.cs new file mode 100644 index 0000000000..45ac317a2a --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethod.cs @@ -0,0 +1,65 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNetCore.Http +{ + public static class HttpMethod + { + public static readonly string Connect = "CONNECT"; + public static readonly string Delete = "DELETE"; + public static readonly string Get = "GET"; + public static readonly string Head = "HEAD"; + public static readonly string Options = "OPTIONS"; + public static readonly string Patch = "PATCH"; + public static readonly string Post = "POST"; + public static readonly string Put = "PUT"; + public static readonly string Trace = "TRACE"; + + public static bool IsConnect(string method) + { + return object.ReferenceEquals(Connect, method) || StringComparer.OrdinalIgnoreCase.Equals(Connect, method); + } + + public static bool IsDelete(string method) + { + return object.ReferenceEquals(Delete, method) || StringComparer.OrdinalIgnoreCase.Equals(Delete, method); + } + + public static bool IsGet(string method) + { + return object.ReferenceEquals(Get, method) || StringComparer.OrdinalIgnoreCase.Equals(Get, method); + } + + public static bool IsHead(string method) + { + return object.ReferenceEquals(Head, method) || StringComparer.OrdinalIgnoreCase.Equals(Head, method); + } + + public static bool IsOptions(string method) + { + return object.ReferenceEquals(Options, method) || StringComparer.OrdinalIgnoreCase.Equals(Options, method); + } + + public static bool IsPatch(string method) + { + return object.ReferenceEquals(Patch, method) || StringComparer.OrdinalIgnoreCase.Equals(Patch, method); + } + + public static bool IsPost(string method) + { + return object.ReferenceEquals(Post, method) || StringComparer.OrdinalIgnoreCase.Equals(Post, method); + } + + public static bool IsPut(string method) + { + return object.ReferenceEquals(Put, method) || StringComparer.OrdinalIgnoreCase.Equals(Put, method); + } + + public static bool IsTrace(string method) + { + return object.ReferenceEquals(Trace, method) || StringComparer.OrdinalIgnoreCase.Equals(Trace, method); + } + } +} diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs index 4203337366..4bd6679db1 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Xunit; @@ -25,7 +26,7 @@ namespace Microsoft.AspNetCore.Owin { var env = new Dictionary { - { "owin.RequestMethod", "POST" }, + { "owin.RequestMethod", HttpMethod.Post }, { "owin.RequestPath", "/path" }, { "owin.RequestPathBase", "/pathBase" }, { "owin.RequestQueryString", "name=value" }, @@ -33,7 +34,7 @@ namespace Microsoft.AspNetCore.Owin var features = new OwinFeatureCollection(env); var requestFeature = Get(features); - Assert.Equal(requestFeature.Method, "POST"); + Assert.Equal(requestFeature.Method, HttpMethod.Post); Assert.Equal(requestFeature.Path, "/path"); Assert.Equal(requestFeature.PathBase, "/pathBase"); Assert.Equal(requestFeature.QueryString, "?name=value"); From 35cde79e46ec77c60f7546009ecf78c67b9b849a Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Tue, 27 Sep 2016 14:26:36 -0700 Subject: [PATCH 603/846] Renamed HttpMethod class to HttpMethods to avoid conflicts --- .../{HttpMethod.cs => HttpMethods.cs} | 2 +- .../OwinFeatureCollectionTests.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) rename src/Microsoft.AspNetCore.Http.Abstractions/{HttpMethod.cs => HttpMethods.cs} (98%) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethod.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethods.cs similarity index 98% rename from src/Microsoft.AspNetCore.Http.Abstractions/HttpMethod.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HttpMethods.cs index 45ac317a2a..1ccee896e7 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethod.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethods.cs @@ -5,7 +5,7 @@ using System; namespace Microsoft.AspNetCore.Http { - public static class HttpMethod + public static class HttpMethods { public static readonly string Connect = "CONNECT"; public static readonly string Delete = "DELETE"; diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs index 4bd6679db1..792d854854 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Owin { var env = new Dictionary { - { "owin.RequestMethod", HttpMethod.Post }, + { "owin.RequestMethod", HttpMethods.Post }, { "owin.RequestPath", "/path" }, { "owin.RequestPathBase", "/pathBase" }, { "owin.RequestQueryString", "name=value" }, @@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.Owin var features = new OwinFeatureCollection(env); var requestFeature = Get(features); - Assert.Equal(requestFeature.Method, HttpMethod.Post); + Assert.Equal(requestFeature.Method, HttpMethods.Post); Assert.Equal(requestFeature.Path, "/path"); Assert.Equal(requestFeature.PathBase, "/pathBase"); Assert.Equal(requestFeature.QueryString, "?name=value"); @@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Owin { var env = new Dictionary { - { "owin.RequestMethod", "POST" }, + { "owin.RequestMethod", HttpMethods.Post }, { "owin.RequestPath", "/path" }, { "owin.RequestPathBase", "/pathBase" }, { "owin.RequestQueryString", "name=value" }, @@ -53,12 +53,12 @@ namespace Microsoft.AspNetCore.Owin var features = new OwinFeatureCollection(env); var requestFeature = Get(features); - requestFeature.Method = "GET"; + requestFeature.Method = HttpMethods.Get; requestFeature.Path = "/path2"; requestFeature.PathBase = "/pathBase2"; requestFeature.QueryString = "?name=value2"; - Assert.Equal("GET", Get(env, "owin.RequestMethod")); + Assert.Equal(HttpMethods.Get, Get(env, "owin.RequestMethod")); Assert.Equal("/path2", Get(env, "owin.RequestPath")); Assert.Equal("/pathBase2", Get(env, "owin.RequestPathBase")); Assert.Equal("name=value2", Get(env, "owin.RequestQueryString")); From 067eb9c6f80cd2e50fdf3b3d1af0fbd94ac7bc33 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 28 Sep 2016 19:35:04 +0100 Subject: [PATCH 604/846] Make FeatureReferences.Fetch inlineable (#704) --- .../FeatureReferences.cs | 60 +++++++++++++++---- .../DefaultAuthenticationManager.cs | 5 +- .../DefaultHttpContext.cs | 23 ++++--- .../Features/QueryFeature.cs | 5 +- .../Features/RequestCookiesFeature.cs | 5 +- .../Features/ResponseCookiesFeature.cs | 5 +- .../Internal/DefaultConnectionInfo.cs | 9 ++- .../Internal/DefaultHttpRequest.cs | 14 +++-- .../Internal/DefaultHttpResponse.cs | 8 ++- .../Internal/DefaultWebSocketManager.cs | 8 ++- 10 files changed, 108 insertions(+), 34 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs index adc10b3add..38bd2ec27a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Runtime.CompilerServices; namespace Microsoft.AspNetCore.Http.Features { @@ -21,39 +22,72 @@ namespace Microsoft.AspNetCore.Http.Features // be able to pass ref values that "dot through" the TCache struct memory, // if it was a Property then that getter would return a copy of the memory // preventing the use of "ref" - public TCache Cache; + public TCache Cache; + // Careful with modifications to the Fetch method; it is carefully constructed for inlining + // See: https://github.com/aspnet/HttpAbstractions/pull/704 + // This method is 59 IL bytes and at inline call depth 3 from accessing a property. + // This combination is enough for the jit to consider it an "unprofitable inline" + // Aggressively inlining it causes the entire call chain to dissolve: + // + // This means this call graph: + // + // HttpResponse.Headers -> Response.HttpResponseFeature -> Fetch -> Fetch -> Revision + // -> Collection -> Collection + // -> Collection.Revision + // Has 6 calls eliminated and becomes just: -> UpdateCached + // + // HttpResponse.Headers -> Collection.Revision + // -> UpdateCached (not called on fast path) + // + // As this is inlined at the callsite we want to keep the method small, so it only detects + // if a reset or update is required and all the reset and update logic is pushed to UpdateCached. + // + // Generally Fetch is called at a ratio > x4 of UpdateCached so this is a large gain + [MethodImpl(MethodImplOptions.AggressiveInlining)] public TFeature Fetch( ref TFeature cached, TState state, Func factory) where TFeature : class { + var flush = false; var revision = Collection.Revision; - if (Revision == revision) + if (Revision != revision) { - // collection unchanged, use cached - return cached ?? UpdateCached(ref cached, state, factory); + // Clear cached value to force call to UpdateCached + cached = null; + // Collection changed, clear whole feature cache + flush = true; } - // collection changed, clear cache - Cache = default(TCache); - // empty cache is current revision - Revision = revision; - - return UpdateCached(ref cached, state, factory); + return cached ?? UpdateCached(ref cached, state, factory, revision, flush); } - private TFeature UpdateCached(ref TFeature cached, TState state, Func factory) where TFeature : class + // Update and cache clearing logic, when the fast-path in Fetch isn't applicable + private TFeature UpdateCached(ref TFeature cached, TState state, Func factory, int revision, bool flush) where TFeature : class { + if (flush) + { + // Collection detected as changed, clear cache + Cache = default(TCache); + } + cached = Collection.Get(); if (cached == null) { - // create if item not in collection + // Item not in collection, create it with factory cached = factory(state); + // Add item to IFeatureCollection Collection.Set(cached); - // Revision changed by .Set, update revision + // Revision changed by .Set, update revision to new value Revision = Collection.Revision; } + else if (flush) + { + // Cache was cleared, but item retrived from current Collection for version + // so use passed in revision rather than making another virtual call + Revision = revision; + } return cached; } diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index e6540d2b7d..666e2179e1 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -13,6 +13,9 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager { + // Lambda hoisted to static readonly field to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _newAuthenticationFeature = f => new HttpAuthenticationFeature(); + private HttpContext _context; private FeatureReferences _features; @@ -35,7 +38,7 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal public override HttpContext HttpContext => _context; private IHttpAuthenticationFeature HttpAuthenticationFeature => - _features.Fetch(ref _features.Cache, f => new HttpAuthenticationFeature()); + _features.Fetch(ref _features.Cache, _newAuthenticationFeature); public override IEnumerable GetAuthenticationSchemes() { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs index 7feb5324a6..d1e431c7fa 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs @@ -15,6 +15,15 @@ namespace Microsoft.AspNetCore.Http { public class DefaultHttpContext : HttpContext { + // Lambdas hoisted to static readonly fields to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _newItemsFeature = f => new ItemsFeature(); + private readonly static Func _newServiceProvidersFeature = f => new ServiceProvidersFeature(); + private readonly static Func _newHttpAuthenticationFeature = f => new HttpAuthenticationFeature(); + private readonly static Func _newHttpRequestLifetimeFeature = f => new HttpRequestLifetimeFeature(); + private readonly static Func _newSessionFeature = f => new DefaultSessionFeature(); + private readonly static Func _nullSessionFeature = f => null; + private readonly static Func _newHttpRequestIdentifierFeature = f => new HttpRequestIdentifierFeature(); + private FeatureReferences _features; private HttpRequest _request; @@ -73,26 +82,26 @@ namespace Microsoft.AspNetCore.Http } private IItemsFeature ItemsFeature => - _features.Fetch(ref _features.Cache.Items, f => new ItemsFeature()); + _features.Fetch(ref _features.Cache.Items, _newItemsFeature); private IServiceProvidersFeature ServiceProvidersFeature => - _features.Fetch(ref _features.Cache.ServiceProviders, f => new ServiceProvidersFeature()); + _features.Fetch(ref _features.Cache.ServiceProviders, _newServiceProvidersFeature); private IHttpAuthenticationFeature HttpAuthenticationFeature => - _features.Fetch(ref _features.Cache.Authentication, f => new HttpAuthenticationFeature()); + _features.Fetch(ref _features.Cache.Authentication, _newHttpAuthenticationFeature); private IHttpRequestLifetimeFeature LifetimeFeature => - _features.Fetch(ref _features.Cache.Lifetime, f => new HttpRequestLifetimeFeature()); + _features.Fetch(ref _features.Cache.Lifetime, _newHttpRequestLifetimeFeature); private ISessionFeature SessionFeature => - _features.Fetch(ref _features.Cache.Session, f => new DefaultSessionFeature()); + _features.Fetch(ref _features.Cache.Session, _newSessionFeature); private ISessionFeature SessionFeatureOrNull => - _features.Fetch(ref _features.Cache.Session, f => null); + _features.Fetch(ref _features.Cache.Session, _nullSessionFeature); private IHttpRequestIdentifierFeature RequestIdentifierFeature => - _features.Fetch(ref _features.Cache.RequestIdentifier, f => new HttpRequestIdentifierFeature()); + _features.Fetch(ref _features.Cache.RequestIdentifier, _newHttpRequestIdentifierFeature); public override IFeatureCollection Features => _features.Collection; diff --git a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs index 92d9aaa342..36781ef16e 100644 --- a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs @@ -9,6 +9,9 @@ namespace Microsoft.AspNetCore.Http.Features { public class QueryFeature : IQueryFeature { + // Lambda hoisted to static readonly field to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _nullRequestFeature = f => null; + private FeatureReferences _features; private string _original; @@ -35,7 +38,7 @@ namespace Microsoft.AspNetCore.Http.Features } private IHttpRequestFeature HttpRequestFeature => - _features.Fetch(ref _features.Cache, f => null); + _features.Fetch(ref _features.Cache, _nullRequestFeature); public IQueryCollection Query { diff --git a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs index 49ae550676..cd37b360a4 100644 --- a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs @@ -11,6 +11,9 @@ namespace Microsoft.AspNetCore.Http.Features { public class RequestCookiesFeature : IRequestCookiesFeature { + // Lambda hoisted to static readonly field to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _nullRequestFeature = f => null; + private FeatureReferences _features; private StringValues _original; private IRequestCookieCollection _parsedValues; @@ -36,7 +39,7 @@ namespace Microsoft.AspNetCore.Http.Features } private IHttpRequestFeature HttpRequestFeature => - _features.Fetch(ref _features.Cache, f => null); + _features.Fetch(ref _features.Cache, _nullRequestFeature); public IRequestCookieCollection Cookies { diff --git a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs index 59b8f68bb8..a62a02f4dc 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs @@ -13,6 +13,9 @@ namespace Microsoft.AspNetCore.Http.Features /// public class ResponseCookiesFeature : IResponseCookiesFeature { + // Lambda hoisted to static readonly field to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _nullResponseFeature = f => null; + // Object pool will be null only in test scenarios e.g. if code news up a DefaultHttpContext. private readonly ObjectPool _builderPool; @@ -50,7 +53,7 @@ namespace Microsoft.AspNetCore.Http.Features _builderPool = builderPool; } - private IHttpResponseFeature HttpResponseFeature => _features.Fetch(ref _features.Cache, f => null); + private IHttpResponseFeature HttpResponseFeature => _features.Fetch(ref _features.Cache, _nullResponseFeature); /// public IResponseCookies Cookies diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs index 02db70767e..496df69654 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; @@ -11,6 +12,10 @@ namespace Microsoft.AspNetCore.Http.Internal { public class DefaultConnectionInfo : ConnectionInfo { + // Lambdas hoisted to static readonly fields to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _newHttpConnectionFeature = f => new HttpConnectionFeature(); + private readonly static Func _newTlsConnectionFeature = f => new TlsConnectionFeature(); + private FeatureReferences _features; public DefaultConnectionInfo(IFeatureCollection features) @@ -29,10 +34,10 @@ namespace Microsoft.AspNetCore.Http.Internal } private IHttpConnectionFeature HttpConnectionFeature => - _features.Fetch(ref _features.Cache.Connection, f => new HttpConnectionFeature()); + _features.Fetch(ref _features.Cache.Connection, _newHttpConnectionFeature); private ITlsConnectionFeature TlsConnectionFeature=> - _features.Fetch(ref _features.Cache.TlsConnection, f => new TlsConnectionFeature()); + _features.Fetch(ref _features.Cache.TlsConnection, _newTlsConnectionFeature); public override IPAddress RemoteIpAddress { diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs index f761cec1ae..c20164ad9c 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs @@ -12,6 +12,12 @@ namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpRequest : HttpRequest { + // Lambdas hoisted to static readonly fields to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _nullRequestFeature = f => null; + private readonly static Func _newQueryFeature = f => new QueryFeature(f); + private readonly static Func _newFormFeature = r => new FormFeature(r); + private readonly static Func _newRequestCookiesFeature = f => new RequestCookiesFeature(f); + private HttpContext _context; private FeatureReferences _features; @@ -35,16 +41,16 @@ namespace Microsoft.AspNetCore.Http.Internal public override HttpContext HttpContext => _context; private IHttpRequestFeature HttpRequestFeature => - _features.Fetch(ref _features.Cache.Request, f => null); + _features.Fetch(ref _features.Cache.Request, _nullRequestFeature); private IQueryFeature QueryFeature => - _features.Fetch(ref _features.Cache.Query, f => new QueryFeature(f)); + _features.Fetch(ref _features.Cache.Query, _newQueryFeature); private IFormFeature FormFeature => - _features.Fetch(ref _features.Cache.Form, this, f => new FormFeature(f)); + _features.Fetch(ref _features.Cache.Form, this, _newFormFeature); private IRequestCookiesFeature RequestCookiesFeature => - _features.Fetch(ref _features.Cache.Cookies, f => new RequestCookiesFeature(f)); + _features.Fetch(ref _features.Cache.Cookies, _newRequestCookiesFeature); public override PathString PathBase { diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs index 2073f8255e..9b664111cd 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs @@ -11,6 +11,10 @@ namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpResponse : HttpResponse { + // Lambdas hoisted to static readonly fields to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _nullResponseFeature = f => null; + private readonly static Func _newResponseCookiesFeature = f => new ResponseCookiesFeature(f); + private HttpContext _context; private FeatureReferences _features; @@ -32,10 +36,10 @@ namespace Microsoft.AspNetCore.Http.Internal } private IHttpResponseFeature HttpResponseFeature => - _features.Fetch(ref _features.Cache.Response, f => null); + _features.Fetch(ref _features.Cache.Response, _nullResponseFeature); private IResponseCookiesFeature ResponseCookiesFeature => - _features.Fetch(ref _features.Cache.Cookies, f => new ResponseCookiesFeature(f)); + _features.Fetch(ref _features.Cache.Cookies, _newResponseCookiesFeature); public override HttpContext HttpContext { get { return _context; } } diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs index fe5f859dc4..477282408d 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs @@ -12,6 +12,10 @@ namespace Microsoft.AspNetCore.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { + // Lambdas hoisted to static readonly fields to improve inlining https://github.com/dotnet/roslyn/issues/13624 + private readonly static Func _nullRequestFeature = f => null; + private readonly static Func _nullWebSocketFeature = f => null; + private FeatureReferences _features; public DefaultWebSocketManager(IFeatureCollection features) @@ -30,10 +34,10 @@ namespace Microsoft.AspNetCore.Http.Internal } private IHttpRequestFeature HttpRequestFeature => - _features.Fetch(ref _features.Cache.Request, f => null); + _features.Fetch(ref _features.Cache.Request, _nullRequestFeature); private IHttpWebSocketFeature WebSocketFeature => - _features.Fetch(ref _features.Cache.WebSockets, f => null); + _features.Fetch(ref _features.Cache.WebSockets, _nullWebSocketFeature); public override bool IsWebSocketRequest { From 874dcebbcb5cb41b75a7e555a622590e568b6d1c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 28 Sep 2016 11:50:48 -0700 Subject: [PATCH 605/846] Updating partner package versions --- samples/SampleApp/project.json | 2 +- .../project.json | 9 ++++----- .../project.json | 9 +++------ .../project.json | 16 ++++++---------- src/Microsoft.AspNetCore.Http/project.json | 9 +++------ src/Microsoft.AspNetCore.Owin/project.json | 3 ++- .../project.json | 17 +++++++---------- src/Microsoft.Net.Http.Headers/project.json | 14 +++++--------- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 5 ++--- .../project.json | 2 +- 15 files changed, 39 insertions(+), 57 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 0795191078..b4602a1370 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -9,7 +9,7 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" } } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index f67a51ea1d..620aec35eb 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -28,7 +28,8 @@ "version": "1.1.0-*", "type": "build" }, - "System.Text.Encodings.Web": "4.0.0-*" + "NETStandard.Library": "1.6.1-*", + "System.Text.Encodings.Web": "4.3.0-*" }, "frameworks": { "net451": { @@ -40,10 +41,8 @@ }, "netstandard1.3": { "dependencies": { - "System.Globalization.Extensions": "4.0.1-*", - "System.Linq.Expressions": "4.1.0-*", - "System.Reflection.TypeExtensions": "4.1.0-*", - "System.Runtime.InteropServices": "4.1.0-*" + "System.Globalization.Extensions": "4.3.0-*", + "System.Reflection.TypeExtensions": "4.3.0-*" } } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index d37c25798a..f639c17057 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -22,14 +22,11 @@ "Microsoft.AspNetCore.Http.Abstractions": "1.1.0-*", "Microsoft.Extensions.FileProviders.Abstractions": "1.1.0-*", "Microsoft.Net.Http.Headers": "1.1.0-*", - "System.Buffers": "4.0.0-*" + "NETStandard.Library": "1.6.1-*", + "System.Buffers": "4.3.0-*" }, "frameworks": { "net451": {}, - "netstandard1.3": { - "dependencies": { - "System.IO.FileSystem": "4.0.1-*" - } - } + "netstandard1.3": {} } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index acd20aef2e..71f2f1a7a0 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -19,21 +19,17 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.1.0-*" + "Microsoft.Extensions.Primitives": "1.1.0-*", + "NETStandard.Library": "1.6.1-*" }, "frameworks": { "net451": {}, "netstandard1.3": { "dependencies": { - "System.Collections": "4.0.11-*", - "System.ComponentModel": "4.0.1-*", - "System.Linq": "4.1.0-*", - "System.Net.Primitives": "4.0.11-*", - "System.Net.WebSockets": "4.0.0-*", - "System.Runtime.Extensions": "4.1.0-*", - "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.1.0-*", - "System.Security.Principal": "4.0.1-*" + "System.ComponentModel": "4.3.0-*", + "System.Net.WebSockets": "4.3.0-*", + "System.Security.Claims": "4.3.0-*", + "System.Security.Principal": "4.3.0-*" } } } diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 792c59899d..f6004ce25c 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -29,14 +29,11 @@ "type": "build" }, "Microsoft.Net.Http.Headers": "1.1.0-*", - "System.Buffers": "4.0.0-*" + "NETStandard.Library": "1.6.1-*", + "System.Buffers": "4.3.0-*" }, "frameworks": { "net451": {}, - "netstandard1.3": { - "dependencies": { - "System.Threading": "4.0.11-*" - } - } + "netstandard1.3": {} } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 66160588c2..8f7b98d876 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -25,7 +25,8 @@ "Microsoft.Extensions.TaskCache.Sources": { "version": "1.1.0-*", "type": "build" - } + }, + "NETStandard.Library": "1.6.1-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index 49d03defca..bac509bd61 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -11,7 +11,9 @@ ] }, "buildOptions": { - "define": [ "WebEncoders_In_WebUtilities" ], + "define": [ + "WebEncoders_In_WebUtilities" + ], "keyFile": "../../tools/Key.snk", "nowarn": [ "CS1591" @@ -26,8 +28,9 @@ "version": "1.1.0-*" }, "Microsoft.Net.Http.Headers": "1.1.0-*", - "System.Buffers": "4.0.0-*", - "System.Text.Encodings.Web": "4.0.0-*" + "NETStandard.Library": "1.6.1-*", + "System.Buffers": "4.3.0-*", + "System.Text.Encodings.Web": "4.3.0-*" }, "frameworks": { "net451": { @@ -37,12 +40,6 @@ } } }, - "netstandard1.3": { - "dependencies": { - "System.Collections": "4.0.11-*", - "System.IO": "4.1.0-*", - "System.IO.FileSystem": "4.0.1-*" - } - } + "netstandard1.3": {} } } \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index af1a98f866..4f3a4ed848 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -18,18 +18,14 @@ ], "xmlDoc": true }, - "dependencies": {}, + "dependencies": { + "NETStandard.Library": "1.6.1-*" + }, "frameworks": { "netstandard1.1": { "dependencies": { - "System.Collections": "4.0.11-*", - "System.Diagnostics.Contracts": "4.0.1-*", - "System.Globalization": "4.0.11-*", - "System.Linq": "4.1.0-*", - "System.Resources.ResourceManager": "4.0.1-*", - "System.Runtime.Extensions": "4.1.0-*", - "System.Text.Encoding": "4.0.11-*", - "System.Buffers": "4.0.0-*" + "System.Buffers": "4.3.0-*", + "System.Diagnostics.Contracts": "4.3.0-*" } } } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 962a99e2fb..84754903d3 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -13,7 +13,7 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index e238763f98..aee78aef75 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -10,7 +10,7 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 01ae630ab4..f534b6675f 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -8,7 +8,7 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index fb5875eb55..53031a17f8 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -8,7 +8,7 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 473d83b60e..de84445e0b 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -10,7 +10,7 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 5735268ac3..8cfc45ec36 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -12,10 +12,9 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" - }, - "System.Text.Encoding.Extensions": "4.0.11-*" + } } }, "net451": {} diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 293b526faf..3d2129131d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -9,7 +9,7 @@ "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0-*", + "version": "1.1.0-*", "type": "platform" } } From 063d6eca0f9cc62066f0dd5b808c15b2d7ca6c97 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Wed, 5 Oct 2016 21:19:15 +0200 Subject: [PATCH 606/846] Added custom RFC 1123 DateTimeFormatter to improve allocation profile (#716) --- .../ContentDispositionHeaderValue.cs | 2 +- .../DateTimeFormatter.cs | 100 ++++++++++++++++++ .../HeaderUtilities.cs | 7 +- .../HttpRuleParser.cs | 6 -- .../RangeConditionHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/project.json | 12 +-- .../HeaderUtilitiesTest.cs | 48 +++++++++ 7 files changed, 161 insertions(+), 16 deletions(-) create mode 100644 src/Microsoft.Net.Http.Headers/DateTimeFormatter.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index 7ceb8728d4..b7a2253ac9 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -321,7 +321,7 @@ namespace Microsoft.Net.Http.Headers else { // Must always be quoted - var dateString = string.Format(CultureInfo.InvariantCulture, "\"{0}\"", HttpRuleParser.DateToString(date.Value)); + var dateString = HeaderUtilities.FormatDate(date.Value, quoted: true); if (dateParameter != null) { dateParameter.Value = dateString; diff --git a/src/Microsoft.Net.Http.Headers/DateTimeFormatter.cs b/src/Microsoft.Net.Http.Headers/DateTimeFormatter.cs new file mode 100644 index 0000000000..06893155bd --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/DateTimeFormatter.cs @@ -0,0 +1,100 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.Runtime.CompilerServices; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.Net.Http.Headers +{ + internal static class DateTimeFormatter + { + private static readonly DateTimeFormatInfo FormatInfo = CultureInfo.InvariantCulture.DateTimeFormat; + + private static readonly string[] MonthNames = FormatInfo.AbbreviatedMonthNames; + private static readonly string[] DayNames = FormatInfo.AbbreviatedDayNames; + + private static readonly int Rfc1123DateLength = "ddd, dd MMM yyyy HH:mm:ss GMT".Length; + private static readonly int QuotedRfc1123DateLength = Rfc1123DateLength + 2; + + // ASCII numbers are in the range 48 - 57. + private const int AsciiNumberOffset = 0x30; + + private const string Gmt = "GMT"; + private const char Comma = ','; + private const char Space = ' '; + private const char Colon = ':'; + private const char Quote = '"'; + + public static string ToRfc1123String(this DateTimeOffset dateTime) + { + return ToRfc1123String(dateTime, false); + } + + public static string ToRfc1123String(this DateTimeOffset dateTime, bool quoted) + { + var universal = dateTime.UtcDateTime; + + var length = quoted ? QuotedRfc1123DateLength : Rfc1123DateLength; + var target = new InplaceStringBuilder(length); + + if (quoted) + { + target.Append(Quote); + } + + target.Append(DayNames[(int)universal.DayOfWeek]); + target.Append(Comma); + target.Append(Space); + AppendNumber(ref target, universal.Day); + target.Append(Space); + target.Append(MonthNames[universal.Month - 1]); + target.Append(Space); + AppendYear(ref target, universal.Year); + target.Append(Space); + AppendTimeOfDay(ref target, universal.TimeOfDay); + target.Append(Space); + target.Append(Gmt); + + if (quoted) + { + target.Append(Quote); + } + + return target.ToString(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void AppendYear(ref InplaceStringBuilder target, int year) + { + target.Append(GetAsciiChar(year / 1000)); + target.Append(GetAsciiChar(year % 1000 / 100)); + target.Append(GetAsciiChar(year % 100 / 10)); + target.Append(GetAsciiChar(year % 10)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void AppendTimeOfDay(ref InplaceStringBuilder target, TimeSpan timeOfDay) + { + AppendNumber(ref target, timeOfDay.Hours); + target.Append(Colon); + AppendNumber(ref target, timeOfDay.Minutes); + target.Append(Colon); + AppendNumber(ref target, timeOfDay.Seconds); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void AppendNumber(ref InplaceStringBuilder target, int number) + { + target.Append(GetAsciiChar(number / 10)); + target.Append(GetAsciiChar(number % 10)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static char GetAsciiChar(int value) + { + return (char)(AsciiNumberOffset + value); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index eee2ea9c7d..786b54ddb9 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -220,7 +220,12 @@ namespace Microsoft.Net.Http.Headers public static string FormatDate(DateTimeOffset dateTime) { - return HttpRuleParser.DateToString(dateTime); + return FormatDate(dateTime, false); + } + + public static string FormatDate(DateTimeOffset dateTime, bool quoted) + { + return dateTime.ToRfc1123String(quoted); } public static string RemoveQuotes(string input) diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index e30465bd4f..637835996c 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -233,12 +233,6 @@ namespace Microsoft.Net.Http.Headers return HttpParseResult.Parsed; } - internal static string DateToString(DateTimeOffset dateTime) - { - // Format according to RFC1123; 'r' uses invariant info (DateTimeFormatInfo.InvariantInfo) - return dateTime.ToUniversalTime().ToString("r", CultureInfo.InvariantCulture); - } - internal static bool TryStringToDate(string input, out DateTimeOffset result) { // Try the various date formats in the order listed above. diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs index c564722d51..4960e4beab 100644 --- a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -53,7 +53,7 @@ namespace Microsoft.Net.Http.Headers { if (_entityTag == null) { - return HttpRuleParser.DateToString(_lastModified.Value); + return HeaderUtilities.FormatDate(_lastModified.Value); } return _entityTag.ToString(); } diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 4f3a4ed848..703cf5151c 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -19,14 +19,12 @@ "xmlDoc": true }, "dependencies": { - "NETStandard.Library": "1.6.1-*" + "Microsoft.Extensions.Primitives": "1.1.0-*", + "NETStandard.Library": "1.6.1-*", + "System.Buffers": "4.3.0-*", + "System.Diagnostics.Contracts": "4.3.0-*" }, "frameworks": { - "netstandard1.1": { - "dependencies": { - "System.Buffers": "4.3.0-*", - "System.Diagnostics.Contracts": "4.3.0-*" - } - } + "netstandard1.1": {} } } \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs new file mode 100644 index 0000000000..ccae6e577f --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -0,0 +1,48 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public static class HeaderUtilitiesTest + { + private const string Rfc1123Format = "r"; + + [Theory] + [MemberData(nameof(TestValues))] + public static void ReturnsSameResultAsRfc1123String(DateTimeOffset dateTime, bool quoted) + { + var formatted = dateTime.ToString(Rfc1123Format); + var expected = quoted ? $"\"{formatted}\"" : formatted; + var actual = HeaderUtilities.FormatDate(dateTime, quoted); + + Assert.Equal(expected, actual); + } + + public static TheoryData TestValues + { + get + { + var data = new TheoryData(); + + var now = DateTimeOffset.Now; + + foreach (var quoted in new[] { true, false }) + { + for (var i = 0; i < 60; i++) + { + data.Add(now.AddSeconds(i), quoted); + data.Add(now.AddMinutes(i), quoted); + data.Add(now.AddDays(i), quoted); + data.Add(now.AddMonths(i), quoted); + data.Add(now.AddYears(i), quoted); + } + } + + return data; + } + } + } +} From 45696535048559188dce8b38a9fde82baa88893c Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 7 Oct 2016 04:22:33 +0100 Subject: [PATCH 607/846] Don't allocate for ResponseCookiesFeature --- samples/SampleApp/PooledHttpContextFactory.cs | 5 -- .../project.json | 3 +- .../Features/ResponseCookiesFeature.cs | 6 +- .../HttpContextFactory.cs | 6 -- .../Internal/ResponseCookies.cs | 42 +-------- .../SetCookieHeaderValue.cs | 90 ++++++++++++++++++- .../ResponseCookiesTest.cs | 48 ++++------ 7 files changed, 107 insertions(+), 93 deletions(-) diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/samples/SampleApp/PooledHttpContextFactory.cs index 6743336466..c61e139ac3 100644 --- a/samples/SampleApp/PooledHttpContextFactory.cs +++ b/samples/SampleApp/PooledHttpContextFactory.cs @@ -12,7 +12,6 @@ namespace SampleApp { public class PooledHttpContextFactory : IHttpContextFactory { - private readonly ObjectPool _builderPool; private readonly IHttpContextAccessor _httpContextAccessor; private readonly Stack _pool = new Stack(); @@ -28,7 +27,6 @@ namespace SampleApp throw new ArgumentNullException(nameof(poolProvider)); } - _builderPool = poolProvider.CreateStringBuilderPool(); _httpContextAccessor = httpContextAccessor; } @@ -39,9 +37,6 @@ namespace SampleApp throw new ArgumentNullException(nameof(featureCollection)); } - var responseCookiesFeature = new ResponseCookiesFeature(featureCollection, _builderPool); - featureCollection.Set(responseCookiesFeature); - PooledHttpContext httpContext = null; lock (_pool) { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 620aec35eb..9b73f97bab 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -29,7 +29,8 @@ "type": "build" }, "NETStandard.Library": "1.6.1-*", - "System.Text.Encodings.Web": "4.3.0-*" + "System.Text.Encodings.Web": "4.3.0-*", + "Microsoft.Extensions.Primitives": "1.1.0-*" }, "frameworks": { "net451": { diff --git a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs index a62a02f4dc..0d9444b0f5 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs @@ -16,9 +16,6 @@ namespace Microsoft.AspNetCore.Http.Features // Lambda hoisted to static readonly field to improve inlining https://github.com/dotnet/roslyn/issues/13624 private readonly static Func _nullResponseFeature = f => null; - // Object pool will be null only in test scenarios e.g. if code news up a DefaultHttpContext. - private readonly ObjectPool _builderPool; - private FeatureReferences _features; private IResponseCookies _cookiesCollection; @@ -50,7 +47,6 @@ namespace Microsoft.AspNetCore.Http.Features } _features = new FeatureReferences(features); - _builderPool = builderPool; } private IHttpResponseFeature HttpResponseFeature => _features.Fetch(ref _features.Cache, _nullResponseFeature); @@ -63,7 +59,7 @@ namespace Microsoft.AspNetCore.Http.Features if (_cookiesCollection == null) { var headers = HttpResponseFeature.Headers; - _cookiesCollection = new ResponseCookies(headers, _builderPool); + _cookiesCollection = new ResponseCookies(headers, null); } return _cookiesCollection; diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs index f2abfa8188..80619206a3 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Text; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Options; @@ -11,7 +10,6 @@ namespace Microsoft.AspNetCore.Http { public class HttpContextFactory : IHttpContextFactory { - private readonly ObjectPool _builderPool; private readonly IHttpContextAccessor _httpContextAccessor; private readonly FormOptions _formOptions; @@ -31,7 +29,6 @@ namespace Microsoft.AspNetCore.Http throw new ArgumentNullException(nameof(formOptions)); } - _builderPool = poolProvider.CreateStringBuilderPool(); _formOptions = formOptions.Value; _httpContextAccessor = httpContextAccessor; } @@ -43,9 +40,6 @@ namespace Microsoft.AspNetCore.Http throw new ArgumentNullException(nameof(featureCollection)); } - var responseCookiesFeature = new ResponseCookiesFeature(featureCollection, _builderPool); - featureCollection.Set(responseCookiesFeature); - var httpContext = new DefaultHttpContext(featureCollection); if (_httpContextAccessor != null) { diff --git a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs index 4a8538371b..e7f2d12039 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs @@ -15,8 +15,6 @@ namespace Microsoft.AspNetCore.Http.Internal /// public class ResponseCookies : IResponseCookies { - private readonly ObjectPool _builderPool; - /// /// Create a new wrapper. /// @@ -30,7 +28,6 @@ namespace Microsoft.AspNetCore.Http.Internal } Headers = headers; - _builderPool = builderPool; } private IHeaderDictionary Headers { get; set; } @@ -44,25 +41,7 @@ namespace Microsoft.AspNetCore.Http.Internal { Path = "/" }; - - string cookieValue; - if (_builderPool == null) - { - cookieValue = setCookieHeaderValue.ToString(); - } - else - { - var stringBuilder = _builderPool.Get(); - try - { - setCookieHeaderValue.AppendToStringBuilder(stringBuilder); - cookieValue = stringBuilder.ToString(); - } - finally - { - _builderPool.Return(stringBuilder); - } - } + var cookieValue = setCookieHeaderValue.ToString(); Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], cookieValue); } @@ -86,24 +65,7 @@ namespace Microsoft.AspNetCore.Http.Internal HttpOnly = options.HttpOnly, }; - string cookieValue; - if (_builderPool == null) - { - cookieValue = setCookieHeaderValue.ToString(); - } - else - { - var stringBuilder = _builderPool.Get(); - try - { - setCookieHeaderValue.AppendToStringBuilder(stringBuilder); - cookieValue = stringBuilder.ToString(); - } - finally - { - _builderPool.Return(stringBuilder); - } - } + var cookieValue = setCookieHeaderValue.ToString(); Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], cookieValue); } diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 7f790d6617..7fda7571a3 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -17,6 +18,8 @@ namespace Microsoft.Net.Http.Headers private const string PathToken = "path"; private const string SecureToken = "secure"; private const string HttpOnlyToken = "httponly"; + private const string SeparatorToken = "; "; + private const string EqualsToken = "="; private const string DefaultPath = "/"; // TODO: Used? private static readonly HttpHeaderParser SingleValueParser @@ -89,10 +92,91 @@ namespace Microsoft.Net.Http.Headers // name="val ue"; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly public override string ToString() { - StringBuilder header = new StringBuilder(); - AppendToStringBuilder(header); + var length = _name.Length + EqualsToken.Length + _value.Length; - return header.ToString(); + string expires = null; + string maxAge = null; + + if (Expires.HasValue) + { + expires = HeaderUtilities.FormatDate(Expires.Value); + length += SeparatorToken.Length + ExpiresToken.Length + EqualsToken.Length + expires.Length; + } + + if (MaxAge.HasValue) + { + maxAge = HeaderUtilities.FormatInt64((long)MaxAge.Value.TotalSeconds); + length += SeparatorToken.Length + MaxAgeToken.Length + EqualsToken.Length + maxAge.Length; + } + + if (Domain != null) + { + length += SeparatorToken.Length + DomainToken.Length + EqualsToken.Length + Domain.Length; + } + + if (Path != null) + { + length += SeparatorToken.Length + PathToken.Length + EqualsToken.Length + Path.Length; + } + + if (Secure) + { + length += SeparatorToken.Length + SecureToken.Length; + } + + if (HttpOnly) + { + length += SeparatorToken.Length + HttpOnlyToken.Length; + } + + var sb = new InplaceStringBuilder(length); + + sb.Append(_name); + sb.Append(EqualsToken); + sb.Append(_value); + + if (expires != null) + { + AppendSegment(ref sb, ExpiresToken, expires); + } + + if (maxAge != null) + { + AppendSegment(ref sb, MaxAgeToken, maxAge); + } + + if (Domain != null) + { + AppendSegment(ref sb, DomainToken, Domain); + } + + if (Path != null) + { + AppendSegment(ref sb, PathToken, Path); + } + + if (Secure) + { + AppendSegment(ref sb, SecureToken, null); + } + + if (HttpOnly) + { + AppendSegment(ref sb, HttpOnlyToken, null); + } + + return sb.ToString(); + } + + private static void AppendSegment(ref InplaceStringBuilder builder, string name, string value) + { + builder.Append(SeparatorToken); + builder.Append(name); + if (value != null) + { + builder.Append(EqualsToken); + builder.Append(value); + } } /// diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index f5625f0fc6..77c7697c82 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -11,27 +11,11 @@ namespace Microsoft.AspNetCore.Http.Tests { public class ResponseCookiesTest { - private static readonly ObjectPool _builderPool = - new DefaultObjectPoolProvider().Create(new StringBuilderPooledObjectPolicy()); - - public static TheoryData BuilderPoolData - { - get - { - return new TheoryData> - { - null, - _builderPool, - }; - } - } - - [Theory] - [MemberData(nameof(BuilderPoolData))] - public void DeleteCookieShouldSetDefaultPath(ObjectPool builderPool) + [Fact] + public void DeleteCookieShouldSetDefaultPath() { var headers = new HeaderDictionary(); - var cookies = new ResponseCookies(headers, builderPool); + var cookies = new ResponseCookies(headers, null); var testcookie = "TestCookie"; cookies.Delete(testcookie); @@ -43,12 +27,11 @@ namespace Microsoft.AspNetCore.Http.Tests Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); } - [Theory] - [MemberData(nameof(BuilderPoolData))] - public void NoParamsDeleteRemovesCookieCreatedByAdd(ObjectPool builderPool) + [Fact] + public void NoParamsDeleteRemovesCookieCreatedByAdd() { var headers = new HeaderDictionary(); - var cookies = new ResponseCookies(headers, builderPool); + var cookies = new ResponseCookies(headers, null); var testcookie = "TestCookie"; cookies.Append(testcookie, testcookie); @@ -66,15 +49,15 @@ namespace Microsoft.AspNetCore.Http.Tests get { // key, value, object pool, expected - return new TheoryData, string> + return new TheoryData { - { "key", "value", null, "key=value" }, - { "key,", "!value", null, "key%2C=%21value" }, - { "ke#y,", "val^ue", null, "ke%23y%2C=val%5Eue" }, - { "key", "value", _builderPool, "key=value" }, - { "key,", "!value", _builderPool, "key%2C=%21value" }, - { "ke#y,", "val^ue", _builderPool, "ke%23y%2C=val%5Eue" }, - { "base64", "QUI+REU/Rw==", _builderPool, "base64=QUI%2BREU%2FRw%3D%3D" }, + { "key", "value", "key=value" }, + { "key,", "!value", "key%2C=%21value" }, + { "ke#y,", "val^ue", "ke%23y%2C=val%5Eue" }, + { "key", "value", "key=value" }, + { "key,", "!value", "key%2C=%21value" }, + { "ke#y,", "val^ue", "ke%23y%2C=val%5Eue" }, + { "base64", "QUI+REU/Rw==", "base64=QUI%2BREU%2FRw%3D%3D" }, }; } } @@ -84,11 +67,10 @@ namespace Microsoft.AspNetCore.Http.Tests public void EscapesKeyValuesBeforeSettingCookie( string key, string value, - ObjectPool builderPool, string expected) { var headers = new HeaderDictionary(); - var cookies = new ResponseCookies(headers, builderPool); + var cookies = new ResponseCookies(headers, null); cookies.Append(key, value); From 6d5cd28e9b3757b1be1bdeb15f64c32dfb66bdb3 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 12 Oct 2016 13:45:30 -0700 Subject: [PATCH 608/846] Updating to netcoreapp1.1 --- samples/SampleApp/project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../HttpResponseStreamWriterTest.cs | 46 +++++++++---------- .../project.json | 2 +- .../project.json | 2 +- 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index b4602a1370..8deed583f2 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -6,7 +6,7 @@ }, "frameworks": { "net451": {}, - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 84754903d3..49264209e6 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -10,7 +10,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index aee78aef75..15bffa1e68 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -7,7 +7,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index f534b6675f..76304be5ff 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -5,7 +5,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 53031a17f8..fe093b87b3 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -5,7 +5,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index de84445e0b..f6759ed2f0 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -7,7 +7,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 67e42ea038..307cabbf02 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -336,13 +336,13 @@ namespace Microsoft.AspNetCore.WebUtilities.Test } [Theory] - [InlineData("你好世界", "utf-16")] -#if !NETCOREAPP1_0 + [InlineData("你好世界", "utf-16")] +#if !NETCOREAPP1_1 // CoreCLR does not like shift_jis as an encoding. - [InlineData("こんにちは世界", "shift_jis")] + [InlineData("こんにちは世界", "shift_jis")] #endif - [InlineData("హలో ప్రపంచ", "iso-8859-1")] - [InlineData("வணக்கம் உலக", "utf-32")] + [InlineData("హలో ప్రపంచ", "iso-8859-1")] + [InlineData("வணக்கம் உலக", "utf-32")] public async Task WritesData_InExpectedEncoding(string data, string encodingName) { // Arrange @@ -362,24 +362,24 @@ namespace Microsoft.AspNetCore.WebUtilities.Test } [Theory] - [InlineData('ん', 1023, "utf-8")] - [InlineData('ん', 1024, "utf-8")] - [InlineData('ん', 1050, "utf-8")] - [InlineData('你', 1023, "utf-16")] - [InlineData('你', 1024, "utf-16")] - [InlineData('你', 1050, "utf-16")] -#if !NETCOREAPP1_0 + [InlineData('ã‚“', 1023, "utf-8")] + [InlineData('ã‚“', 1024, "utf-8")] + [InlineData('ã‚“', 1050, "utf-8")] + [InlineData('ä½ ', 1023, "utf-16")] + [InlineData('ä½ ', 1024, "utf-16")] + [InlineData('ä½ ', 1050, "utf-16")] +#if !NETCOREAPP1_1 // CoreCLR does not like shift_jis as an encoding. - [InlineData('こ', 1023, "shift_jis")] - [InlineData('こ', 1024, "shift_jis")] - [InlineData('こ', 1050, "shift_jis")] + [InlineData('こ', 1023, "shift_jis")] + [InlineData('こ', 1024, "shift_jis")] + [InlineData('こ', 1050, "shift_jis")] #endif - [InlineData('హ', 1023, "iso-8859-1")] - [InlineData('హ', 1024, "iso-8859-1")] - [InlineData('హ', 1050, "iso-8859-1")] - [InlineData('வ', 1023, "utf-32")] - [InlineData('வ', 1024, "utf-32")] - [InlineData('வ', 1050, "utf-32")] + [InlineData('à°¹', 1023, "iso-8859-1")] + [InlineData('à°¹', 1024, "iso-8859-1")] + [InlineData('à°¹', 1050, "iso-8859-1")] + [InlineData('வ', 1023, "utf-32")] + [InlineData('வ', 1024, "utf-32")] + [InlineData('வ', 1050, "utf-32")] public async Task WritesData_OfDifferentLength_InExpectedEncoding( char character, int charCount, @@ -437,9 +437,9 @@ namespace Microsoft.AspNetCore.WebUtilities.Test public async Task HttpResponseStreamWriter_WritesDataCorrectly_ForCharactersHavingSurrogatePairs(int characterSize) { // Arrange - // Here "𐐀" (called Deseret Long I) actually represents 2 characters. Try to make this character split across + // Here "𐐀" (called Deseret Long I) actually represents 2 characters. Try to make this character split across // the boundary - var content = new string('a', characterSize - 1) + "𐐀"; + var content = new string('a', characterSize - 1) + "𐐀"; var stream = new TestMemoryStream(); var writer = new HttpResponseStreamWriter(stream, Encoding.Unicode); diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 8cfc45ec36..64495c2e19 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -9,7 +9,7 @@ }, "testRunner": "xunit", "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 3d2129131d..9a4bc65376 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -6,7 +6,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", From 11a67b8f55abf9f4636ead1f0d2893a6263e2e99 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 12 Oct 2016 16:08:46 -0700 Subject: [PATCH 609/846] Revert "Updating to netcoreapp1.1" This reverts commit 6d5cd28e9b3757b1be1bdeb15f64c32dfb66bdb3. --- samples/SampleApp/project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- .../HttpResponseStreamWriterTest.cs | 46 +++++++++---------- .../project.json | 2 +- .../project.json | 2 +- 9 files changed, 31 insertions(+), 31 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 8deed583f2..b4602a1370 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -6,7 +6,7 @@ }, "frameworks": { "net451": {}, - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 49264209e6..84754903d3 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -10,7 +10,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 15bffa1e68..aee78aef75 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -7,7 +7,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 76304be5ff..f534b6675f 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -5,7 +5,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index fe093b87b3..53031a17f8 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -5,7 +5,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index f6759ed2f0..de84445e0b 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -7,7 +7,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 307cabbf02..67e42ea038 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -336,13 +336,13 @@ namespace Microsoft.AspNetCore.WebUtilities.Test } [Theory] - [InlineData("你好世界", "utf-16")] -#if !NETCOREAPP1_1 + [InlineData("你好世界", "utf-16")] +#if !NETCOREAPP1_0 // CoreCLR does not like shift_jis as an encoding. - [InlineData("こんにちは世界", "shift_jis")] + [InlineData("こんにちは世界", "shift_jis")] #endif - [InlineData("హలో ప్రపంచ", "iso-8859-1")] - [InlineData("வணக்கம் உலக", "utf-32")] + [InlineData("హలో ప్రపంచ", "iso-8859-1")] + [InlineData("வணக்கம் உலக", "utf-32")] public async Task WritesData_InExpectedEncoding(string data, string encodingName) { // Arrange @@ -362,24 +362,24 @@ namespace Microsoft.AspNetCore.WebUtilities.Test } [Theory] - [InlineData('ã‚“', 1023, "utf-8")] - [InlineData('ã‚“', 1024, "utf-8")] - [InlineData('ã‚“', 1050, "utf-8")] - [InlineData('ä½ ', 1023, "utf-16")] - [InlineData('ä½ ', 1024, "utf-16")] - [InlineData('ä½ ', 1050, "utf-16")] -#if !NETCOREAPP1_1 + [InlineData('ん', 1023, "utf-8")] + [InlineData('ん', 1024, "utf-8")] + [InlineData('ん', 1050, "utf-8")] + [InlineData('你', 1023, "utf-16")] + [InlineData('你', 1024, "utf-16")] + [InlineData('你', 1050, "utf-16")] +#if !NETCOREAPP1_0 // CoreCLR does not like shift_jis as an encoding. - [InlineData('こ', 1023, "shift_jis")] - [InlineData('こ', 1024, "shift_jis")] - [InlineData('こ', 1050, "shift_jis")] + [InlineData('こ', 1023, "shift_jis")] + [InlineData('こ', 1024, "shift_jis")] + [InlineData('こ', 1050, "shift_jis")] #endif - [InlineData('à°¹', 1023, "iso-8859-1")] - [InlineData('à°¹', 1024, "iso-8859-1")] - [InlineData('à°¹', 1050, "iso-8859-1")] - [InlineData('வ', 1023, "utf-32")] - [InlineData('வ', 1024, "utf-32")] - [InlineData('வ', 1050, "utf-32")] + [InlineData('హ', 1023, "iso-8859-1")] + [InlineData('హ', 1024, "iso-8859-1")] + [InlineData('హ', 1050, "iso-8859-1")] + [InlineData('வ', 1023, "utf-32")] + [InlineData('வ', 1024, "utf-32")] + [InlineData('வ', 1050, "utf-32")] public async Task WritesData_OfDifferentLength_InExpectedEncoding( char character, int charCount, @@ -437,9 +437,9 @@ namespace Microsoft.AspNetCore.WebUtilities.Test public async Task HttpResponseStreamWriter_WritesDataCorrectly_ForCharactersHavingSurrogatePairs(int characterSize) { // Arrange - // Here "𐐀" (called Deseret Long I) actually represents 2 characters. Try to make this character split across + // Here "𐐀" (called Deseret Long I) actually represents 2 characters. Try to make this character split across // the boundary - var content = new string('a', characterSize - 1) + "𐐀"; + var content = new string('a', characterSize - 1) + "𐐀"; var stream = new TestMemoryStream(); var writer = new HttpResponseStreamWriter(stream, Encoding.Unicode); diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 64495c2e19..8cfc45ec36 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -9,7 +9,7 @@ }, "testRunner": "xunit", "frameworks": { - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 9a4bc65376..3d2129131d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -6,7 +6,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.1": { + "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", From cdbd9ffa7482606326d05d37a11e349102c65d1d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 13 Oct 2016 11:18:10 -0700 Subject: [PATCH 610/846] Updating to netcoreapp1.1 --- samples/SampleApp/project.json | 2 +- .../Microsoft.AspNetCore.Http.Abstractions.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Features.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Http.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Owin.Tests/project.json | 2 +- .../HttpResponseStreamWriterTest.cs | 4 ++-- test/Microsoft.AspNetCore.WebUtilities.Tests/project.json | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index b4602a1370..8deed583f2 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -6,7 +6,7 @@ }, "frameworks": { "net451": {}, - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 84754903d3..49264209e6 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -10,7 +10,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index aee78aef75..15bffa1e68 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -7,7 +7,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index f534b6675f..76304be5ff 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -5,7 +5,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 53031a17f8..fe093b87b3 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -5,7 +5,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index de84445e0b..f6759ed2f0 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -7,7 +7,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 67e42ea038..7f4c54b5a3 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -337,7 +337,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [Theory] [InlineData("你好世界", "utf-16")] -#if !NETCOREAPP1_0 +#if !NETCOREAPP1_1 // CoreCLR does not like shift_jis as an encoding. [InlineData("こんにちは世界", "shift_jis")] #endif @@ -368,7 +368,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [InlineData('你', 1023, "utf-16")] [InlineData('你', 1024, "utf-16")] [InlineData('你', 1050, "utf-16")] -#if !NETCOREAPP1_0 +#if !NETCOREAPP1_1 // CoreCLR does not like shift_jis as an encoding. [InlineData('こ', 1023, "shift_jis")] [InlineData('こ', 1024, "shift_jis")] diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 8cfc45ec36..64495c2e19 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -9,7 +9,7 @@ }, "testRunner": "xunit", "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 3d2129131d..9a4bc65376 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -6,7 +6,7 @@ "xunit": "2.2.0-*" }, "frameworks": { - "netcoreapp1.0": { + "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.1.0-*", From a8fcba4e561dec9cb1533dedd68e4af417aa0822 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 17 Oct 2016 09:49:12 -0700 Subject: [PATCH 611/846] Branching for 1.1.0-preview1 --- NuGet.config | 4 ++-- build.ps1 | 2 +- build.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NuGet.config b/NuGet.config index 826a1f9035..6197c93176 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index 8f2f99691a..787f63ac02 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.0-preview1.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index f4208100eb..355c682856 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.0-preview1.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi From 4dcde8a32990561495de188622973b9e540a41e9 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Fri, 28 Oct 2016 12:13:45 -0700 Subject: [PATCH 612/846] Added Base64UrlTextEncoder utility from Security repo --- .../Base64UrlTextEncoder.cs | 42 +++++++++++++++++++ .../Base64UrlTextEncoderTests.cs | 30 +++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs create mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs b/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs new file mode 100644 index 0000000000..0402429878 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs @@ -0,0 +1,42 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNetCore.WebUtilities +{ + public static class Base64UrlTextEncoder + { + /// + /// Encodes supplied data into Base64 and replaces any URL encodable characters into non-URL encodable + /// characters. + /// + /// Data to be encoded. + /// Base64 encoded string modified with non-URL encodable characters + public static string Encode(byte[] data) + { + return Convert.ToBase64String(data).TrimEnd('=').Replace('+', '-').Replace('/', '_'); + } + + /// + /// Decodes supplied string by replacing the non-URL encodable characters with URL encodable characters and + /// then decodes the Base64 string. + /// + /// The string to be decoded. + /// The decoded data. + public static byte[] Decode(string text) + { + return Convert.FromBase64String(Pad(text.Replace('-', '+').Replace('_', '/'))); + } + + private static string Pad(string text) + { + var padding = 3 - ((text.Length + 3) % 4); + if (padding == 0) + { + return text; + } + return text + new string('=', padding); + } + } +} diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs new file mode 100644 index 0000000000..2034ea33d7 --- /dev/null +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.AspNetCore.WebUtilities +{ + public class Base64UrlTextEncoderTests + { + [Fact] + public void DataOfVariousLengthRoundTripCorrectly() + { + for (int length = 0; length != 256; ++length) + { + var data = new byte[length]; + for (int index = 0; index != length; ++index) + { + data[index] = (byte)(5 + length + (index * 23)); + } + string text = Base64UrlTextEncoder.Encode(data); + byte[] result = Base64UrlTextEncoder.Decode(text); + + for (int index = 0; index != length; ++index) + { + Assert.Equal(data[index], result[index]); + } + } + } + } +} \ No newline at end of file From db677639c30372dce922787e6cd7238d2e00da20 Mon Sep 17 00:00:00 2001 From: jacalvar Date: Fri, 4 Nov 2016 16:30:49 -0700 Subject: [PATCH 613/846] Created public API baselines --- .../baseline.net45.json | 4028 ++++++++++++++ .../baseline.netcore.json | 4028 ++++++++++++++ .../baseline.net45.json | 1567 ++++++ .../baseline.netcore.json | 1567 ++++++ .../baseline.net45.json | 2485 +++++++++ .../baseline.netcore.json | 2485 +++++++++ .../baseline.net45.json | 4691 +++++++++++++++++ .../baseline.netcore.json | 4691 +++++++++++++++++ .../baseline.net45.json | 999 ++++ .../baseline.netcore.json | 999 ++++ .../baseline.net45.json | 1747 ++++++ .../baseline.netcore.json | 1645 ++++++ .../baseline.netcore.json | 3519 +++++++++++++ 13 files changed, 34451 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json create mode 100644 src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json create mode 100644 src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json create mode 100644 src/Microsoft.AspNetCore.Http.Features/baseline.net45.json create mode 100644 src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json create mode 100644 src/Microsoft.AspNetCore.Http/baseline.net45.json create mode 100644 src/Microsoft.AspNetCore.Http/baseline.netcore.json create mode 100644 src/Microsoft.AspNetCore.Owin/baseline.net45.json create mode 100644 src/Microsoft.AspNetCore.Owin/baseline.netcore.json create mode 100644 src/Microsoft.AspNetCore.WebUtilities/baseline.net45.json create mode 100644 src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json create mode 100644 src/Microsoft.Net.Http.Headers/baseline.netcore.json diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json new file mode 100644 index 0000000000..4814d96431 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json @@ -0,0 +1,4028 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ApplicationServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ApplicationServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ServerFeatures", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Use", + "Parameters": [ + { + "Name": "middleware", + "Type": "System.Func" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "New", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.MapExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Map", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "pathMatch", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "configuration", + "Type": "System.Action" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.MapWhenExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "MapWhen", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "predicate", + "Type": "System.Func" + }, + { + "Name": "configuration", + "Type": "System.Action" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.RunExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Run", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "handler", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.UseExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Use", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "middleware", + "Type": "System.Func, System.Threading.Tasks.Task>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.UseMiddlewareExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "UseMiddleware", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "args", + "Type": "System.Object[]", + "IsParams": true + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TMiddleware", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "UseMiddleware", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "middleware", + "Type": "System.Type" + }, + { + "Name": "args", + "Type": "System.Object[]", + "IsParams": true + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapMiddleware", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Invoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "next", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Builder.Extensions.MapOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_PathMatch", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathMatch", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Branch", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Branch", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Invoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "next", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Builder.Extensions.MapWhenOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapWhenOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Predicate", + "Parameters": [], + "ReturnType": "System.Func", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Predicate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Func" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Branch", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Branch", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.CookieSecurePolicy", + "Visibility": "Public", + "Kind": "Enumeration", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "SameAsRequest", + "Parameters": [], + "GenericParameter": [], + "Literal": "0" + }, + { + "Kind": "Field", + "Name": "Always", + "Parameters": [], + "GenericParameter": [], + "Literal": "1" + }, + { + "Kind": "Field", + "Name": "None", + "Parameters": [], + "GenericParameter": [], + "Literal": "2" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.FragmentString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HostString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Port", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.HostString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.HostString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "host", + "Type": "System.String" + }, + { + "Name": "port", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpContext", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Features", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Request", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Response", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Connection", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSockets", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Authentication", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpRequest", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsHttps", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsHttps", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Host", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpResponse", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "RegisterForDispose", + "Parameters": [ + { + "Name": "disposable", + "Type": "System.IDisposable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Redirect", + "Parameters": [ + { + "Name": "location", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Redirect", + "Parameters": [ + { + "Name": "location", + "Type": "System.String" + }, + { + "Name": "permanent", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IHttpContextAccessor", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpContext", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IHttpContextFactory", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "featureCollection", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "httpContext", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.PathString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "comparisonType", + "Type": "System.StringComparison" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "remaining", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "comparisonType", + "Type": "System.StringComparison" + }, + { + "Name": "remaining", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "comparisonType", + "Type": "System.StringComparison" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "System.String" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Implicit", + "Parameters": [ + { + "Name": "s", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Implicit", + "Parameters": [ + { + "Name": "path", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "parameters", + "Type": "System.Collections.Generic.IEnumerable>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "parameters", + "Type": "System.Collections.Generic.IEnumerable>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.QueryString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.QueryString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.QueryString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.RequestDelegate", + "Visibility": "Public", + "Kind": "Class", + "Sealed": true, + "BaseType": "System.MulticastDelegate", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Invoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "BeginInvoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "callback", + "Type": "System.AsyncCallback" + }, + { + "Name": "object", + "Type": "System.Object" + } + ], + "ReturnType": "System.IAsyncResult", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EndInvoke", + "Parameters": [ + { + "Name": "result", + "Type": "System.IAsyncResult" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "object", + "Type": "System.Object" + }, + { + "Name": "method", + "Type": "System.IntPtr" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.StatusCodes", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "Status200OK", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "200" + }, + { + "Kind": "Field", + "Name": "Status201Created", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "201" + }, + { + "Kind": "Field", + "Name": "Status202Accepted", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "202" + }, + { + "Kind": "Field", + "Name": "Status203NonAuthoritative", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "203" + }, + { + "Kind": "Field", + "Name": "Status204NoContent", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "204" + }, + { + "Kind": "Field", + "Name": "Status205ResetContent", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "205" + }, + { + "Kind": "Field", + "Name": "Status206PartialContent", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "206" + }, + { + "Kind": "Field", + "Name": "Status300MultipleChoices", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "300" + }, + { + "Kind": "Field", + "Name": "Status301MovedPermanently", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "301" + }, + { + "Kind": "Field", + "Name": "Status302Found", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "302" + }, + { + "Kind": "Field", + "Name": "Status303SeeOther", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "303" + }, + { + "Kind": "Field", + "Name": "Status304NotModified", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "304" + }, + { + "Kind": "Field", + "Name": "Status305UseProxy", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "305" + }, + { + "Kind": "Field", + "Name": "Status306SwitchProxy", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "306" + }, + { + "Kind": "Field", + "Name": "Status307TemporaryRedirect", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "307" + }, + { + "Kind": "Field", + "Name": "Status400BadRequest", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "400" + }, + { + "Kind": "Field", + "Name": "Status401Unauthorized", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "401" + }, + { + "Kind": "Field", + "Name": "Status402PaymentRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "402" + }, + { + "Kind": "Field", + "Name": "Status403Forbidden", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "403" + }, + { + "Kind": "Field", + "Name": "Status404NotFound", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "404" + }, + { + "Kind": "Field", + "Name": "Status405MethodNotAllowed", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "405" + }, + { + "Kind": "Field", + "Name": "Status406NotAcceptable", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "406" + }, + { + "Kind": "Field", + "Name": "Status407ProxyAuthenticationRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "407" + }, + { + "Kind": "Field", + "Name": "Status408RequestTimeout", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "408" + }, + { + "Kind": "Field", + "Name": "Status409Conflict", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "409" + }, + { + "Kind": "Field", + "Name": "Status410Gone", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "410" + }, + { + "Kind": "Field", + "Name": "Status411LengthRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "411" + }, + { + "Kind": "Field", + "Name": "Status412PreconditionFailed", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "412" + }, + { + "Kind": "Field", + "Name": "Status413RequestEntityTooLarge", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "413" + }, + { + "Kind": "Field", + "Name": "Status414RequestUriTooLong", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "414" + }, + { + "Kind": "Field", + "Name": "Status415UnsupportedMediaType", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "415" + }, + { + "Kind": "Field", + "Name": "Status416RequestedRangeNotSatisfiable", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "416" + }, + { + "Kind": "Field", + "Name": "Status417ExpectationFailed", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "417" + }, + { + "Kind": "Field", + "Name": "Status418ImATeapot", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "418" + }, + { + "Kind": "Field", + "Name": "Status419AuthenticationTimeout", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "419" + }, + { + "Kind": "Field", + "Name": "Status500InternalServerError", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "500" + }, + { + "Kind": "Field", + "Name": "Status501NotImplemented", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "501" + }, + { + "Kind": "Field", + "Name": "Status502BadGateway", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "502" + }, + { + "Kind": "Field", + "Name": "Status503ServiceUnavailable", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "503" + }, + { + "Kind": "Field", + "Name": "Status504GatewayTimeout", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "504" + }, + { + "Kind": "Field", + "Name": "Status505HttpVersionNotsupported", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "505" + }, + { + "Kind": "Field", + "Name": "Status506VariantAlsoNegotiates", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "506" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.WebSocketManager", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsWebSocketRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSocketRequestedProtocols", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptWebSocketAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptWebSocketAsync", + "Parameters": [ + { + "Name": "subProtocol", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.String[]", + "IsParams": true + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String[]", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.String[]", + "IsParams": true + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpResponseWritingExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "text", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "text", + "Type": "System.String" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticateInfo", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Principal", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Properties", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Description", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Description", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AuthenticationScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DisplayName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DisplayName", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "items", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticationSchemes", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticateInfoAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + }, + { + "Name": "behavior", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "AutomaticScheme", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Automatic\"" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsPersistent", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsPersistent", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RedirectUri", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RedirectUri", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IssuedUtc", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IssuedUtc", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ExpiresUtc", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ExpiresUtc", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AllowRefresh", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AllowRefresh", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "items", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json new file mode 100644 index 0000000000..4814d96431 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json @@ -0,0 +1,4028 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ApplicationServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ApplicationServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ServerFeatures", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Use", + "Parameters": [ + { + "Name": "middleware", + "Type": "System.Func" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "New", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.MapExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Map", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "pathMatch", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "configuration", + "Type": "System.Action" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.MapWhenExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "MapWhen", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "predicate", + "Type": "System.Func" + }, + { + "Name": "configuration", + "Type": "System.Action" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.RunExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Run", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "handler", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.UseExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Use", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "middleware", + "Type": "System.Func, System.Threading.Tasks.Task>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.UseMiddlewareExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "UseMiddleware", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "args", + "Type": "System.Object[]", + "IsParams": true + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TMiddleware", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "UseMiddleware", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "middleware", + "Type": "System.Type" + }, + { + "Name": "args", + "Type": "System.Object[]", + "IsParams": true + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapMiddleware", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Invoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "next", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Builder.Extensions.MapOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_PathMatch", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathMatch", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Branch", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Branch", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Invoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "next", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Builder.Extensions.MapWhenOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.MapWhenOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Predicate", + "Parameters": [], + "ReturnType": "System.Func", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Predicate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Func" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Branch", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Branch", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.CookieSecurePolicy", + "Visibility": "Public", + "Kind": "Enumeration", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "SameAsRequest", + "Parameters": [], + "GenericParameter": [], + "Literal": "0" + }, + { + "Kind": "Field", + "Name": "Always", + "Parameters": [], + "GenericParameter": [], + "Literal": "1" + }, + { + "Kind": "Field", + "Name": "None", + "Parameters": [], + "GenericParameter": [], + "Literal": "2" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.FragmentString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.FragmentString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HostString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Port", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.HostString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.HostString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "host", + "Type": "System.String" + }, + { + "Name": "port", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpContext", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Features", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Request", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Response", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Connection", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSockets", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Authentication", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpRequest", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsHttps", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsHttps", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Host", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpResponse", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "RegisterForDispose", + "Parameters": [ + { + "Name": "disposable", + "Type": "System.IDisposable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Redirect", + "Parameters": [ + { + "Name": "location", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Redirect", + "Parameters": [ + { + "Name": "location", + "Type": "System.String" + }, + { + "Name": "permanent", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IHttpContextAccessor", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpContext", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IHttpContextFactory", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "featureCollection", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "httpContext", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.PathString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "comparisonType", + "Type": "System.StringComparison" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "remaining", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "comparisonType", + "Type": "System.StringComparison" + }, + { + "Name": "remaining", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "comparisonType", + "Type": "System.StringComparison" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "System.String" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Implicit", + "Parameters": [ + { + "Name": "s", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Implicit", + "Parameters": [ + { + "Name": "path", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValue", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToUriComponent", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uriComponent", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FromUriComponent", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "parameters", + "Type": "System.Collections.Generic.IEnumerable>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "parameters", + "Type": "System.Collections.Generic.IEnumerable>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.QueryString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.QueryString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Addition", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.QueryString" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.RequestDelegate", + "Visibility": "Public", + "Kind": "Class", + "Sealed": true, + "BaseType": "System.MulticastDelegate", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Invoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "BeginInvoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "callback", + "Type": "System.AsyncCallback" + }, + { + "Name": "object", + "Type": "System.Object" + } + ], + "ReturnType": "System.IAsyncResult", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EndInvoke", + "Parameters": [ + { + "Name": "result", + "Type": "System.IAsyncResult" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "object", + "Type": "System.Object" + }, + { + "Name": "method", + "Type": "System.IntPtr" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.StatusCodes", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "Status200OK", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "200" + }, + { + "Kind": "Field", + "Name": "Status201Created", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "201" + }, + { + "Kind": "Field", + "Name": "Status202Accepted", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "202" + }, + { + "Kind": "Field", + "Name": "Status203NonAuthoritative", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "203" + }, + { + "Kind": "Field", + "Name": "Status204NoContent", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "204" + }, + { + "Kind": "Field", + "Name": "Status205ResetContent", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "205" + }, + { + "Kind": "Field", + "Name": "Status206PartialContent", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "206" + }, + { + "Kind": "Field", + "Name": "Status300MultipleChoices", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "300" + }, + { + "Kind": "Field", + "Name": "Status301MovedPermanently", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "301" + }, + { + "Kind": "Field", + "Name": "Status302Found", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "302" + }, + { + "Kind": "Field", + "Name": "Status303SeeOther", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "303" + }, + { + "Kind": "Field", + "Name": "Status304NotModified", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "304" + }, + { + "Kind": "Field", + "Name": "Status305UseProxy", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "305" + }, + { + "Kind": "Field", + "Name": "Status306SwitchProxy", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "306" + }, + { + "Kind": "Field", + "Name": "Status307TemporaryRedirect", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "307" + }, + { + "Kind": "Field", + "Name": "Status400BadRequest", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "400" + }, + { + "Kind": "Field", + "Name": "Status401Unauthorized", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "401" + }, + { + "Kind": "Field", + "Name": "Status402PaymentRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "402" + }, + { + "Kind": "Field", + "Name": "Status403Forbidden", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "403" + }, + { + "Kind": "Field", + "Name": "Status404NotFound", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "404" + }, + { + "Kind": "Field", + "Name": "Status405MethodNotAllowed", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "405" + }, + { + "Kind": "Field", + "Name": "Status406NotAcceptable", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "406" + }, + { + "Kind": "Field", + "Name": "Status407ProxyAuthenticationRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "407" + }, + { + "Kind": "Field", + "Name": "Status408RequestTimeout", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "408" + }, + { + "Kind": "Field", + "Name": "Status409Conflict", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "409" + }, + { + "Kind": "Field", + "Name": "Status410Gone", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "410" + }, + { + "Kind": "Field", + "Name": "Status411LengthRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "411" + }, + { + "Kind": "Field", + "Name": "Status412PreconditionFailed", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "412" + }, + { + "Kind": "Field", + "Name": "Status413RequestEntityTooLarge", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "413" + }, + { + "Kind": "Field", + "Name": "Status414RequestUriTooLong", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "414" + }, + { + "Kind": "Field", + "Name": "Status415UnsupportedMediaType", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "415" + }, + { + "Kind": "Field", + "Name": "Status416RequestedRangeNotSatisfiable", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "416" + }, + { + "Kind": "Field", + "Name": "Status417ExpectationFailed", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "417" + }, + { + "Kind": "Field", + "Name": "Status418ImATeapot", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "418" + }, + { + "Kind": "Field", + "Name": "Status419AuthenticationTimeout", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "419" + }, + { + "Kind": "Field", + "Name": "Status500InternalServerError", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "500" + }, + { + "Kind": "Field", + "Name": "Status501NotImplemented", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "501" + }, + { + "Kind": "Field", + "Name": "Status502BadGateway", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "502" + }, + { + "Kind": "Field", + "Name": "Status503ServiceUnavailable", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "503" + }, + { + "Kind": "Field", + "Name": "Status504GatewayTimeout", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "504" + }, + { + "Kind": "Field", + "Name": "Status505HttpVersionNotsupported", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "505" + }, + { + "Kind": "Field", + "Name": "Status506VariantAlsoNegotiates", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "506" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.WebSocketManager", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsWebSocketRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSocketRequestedProtocols", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptWebSocketAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptWebSocketAsync", + "Parameters": [ + { + "Name": "subProtocol", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.String[]", + "IsParams": true + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String[]", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.String[]", + "IsParams": true + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpResponseWritingExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "text", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "text", + "Type": "System.String" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticateInfo", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Principal", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Properties", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Description", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Description", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AuthenticationScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DisplayName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DisplayName", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "items", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticationSchemes", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticateInfoAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + }, + { + "Name": "behavior", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "AutomaticScheme", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Automatic\"" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsPersistent", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsPersistent", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RedirectUri", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RedirectUri", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IssuedUtc", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IssuedUtc", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ExpiresUtc", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ExpiresUtc", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AllowRefresh", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AllowRefresh", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "items", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json b/src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json new file mode 100644 index 0000000000..9b55f4ed4d --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json @@ -0,0 +1,1567 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryTypeExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetTypedHeaders", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.Headers.RequestHeaders", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTypedHeaders", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.Headers.ResponseHeaders", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendList", + "Parameters": [ + { + "Name": "Headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.ResponseExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Clear", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.SendFileResponseExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "file", + "Type": "Microsoft.Extensions.FileProviders.IFileInfo" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "file", + "Type": "Microsoft.Extensions.FileProviders.IFileInfo" + }, + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "fileName", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "fileName", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.SessionExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "SetInt32", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetInt32", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Nullable", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetString", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetString", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Headers.RequestHeaders", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accept", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Accept", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AcceptCharset", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AcceptCharset", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AcceptEncoding", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AcceptEncoding", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AcceptLanguage", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AcceptLanguage", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CacheControl", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_CacheControl", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.CacheControlHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentDisposition", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentRange", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentRange", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookie", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookie", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Date", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Date", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expires", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expires", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Host", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfMatch", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfMatch", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfModifiedSince", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfModifiedSince", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfNoneMatch", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfNoneMatch", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfRange", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfRange", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfUnmodifiedSince", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfUnmodifiedSince", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LastModified", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LastModified", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Range", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.RangeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Range", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.RangeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "GetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Headers.ResponseHeaders", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CacheControl", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_CacheControl", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.CacheControlHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentDisposition", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentRange", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentRange", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Date", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Date", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ETag", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ETag", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.EntityTagHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expires", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expires", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LastModified", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LastModified", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Location", + "Parameters": [], + "ReturnType": "System.Uri", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Location", + "Parameters": [ + { + "Name": "value", + "Type": "System.Uri" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SetCookie", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SetCookie", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "GetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Extensions.QueryBuilder", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IEnumerable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToQueryString", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "parameters", + "Type": "System.Collections.Generic.IEnumerable>" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Extensions.StreamCopyOperation", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "CopyToAsync", + "Parameters": [ + { + "Name": "source", + "Type": "System.IO.Stream" + }, + { + "Name": "destination", + "Type": "System.IO.Stream" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancel", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Extensions.UriHelper", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "BuildRelative", + "Parameters": [ + { + "Name": "pathBase", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "path", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "query", + "Type": "Microsoft.AspNetCore.Http.QueryString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.QueryString)" + }, + { + "Name": "fragment", + "Type": "Microsoft.AspNetCore.Http.FragmentString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.FragmentString)" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "BuildAbsolute", + "Parameters": [ + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "host", + "Type": "Microsoft.AspNetCore.Http.HostString" + }, + { + "Name": "pathBase", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "path", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "query", + "Type": "Microsoft.AspNetCore.Http.QueryString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.QueryString)" + }, + { + "Name": "fragment", + "Type": "Microsoft.AspNetCore.Http.FragmentString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.FragmentString)" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Encode", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEncodedUrl", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDisplayUrl", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json new file mode 100644 index 0000000000..9b55f4ed4d --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json @@ -0,0 +1,1567 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryTypeExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetTypedHeaders", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.Headers.RequestHeaders", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTypedHeaders", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.Headers.ResponseHeaders", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendList", + "Parameters": [ + { + "Name": "Headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.ResponseExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Clear", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.SendFileResponseExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "file", + "Type": "Microsoft.Extensions.FileProviders.IFileInfo" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "file", + "Type": "Microsoft.Extensions.FileProviders.IFileInfo" + }, + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "fileName", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "fileName", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.SessionExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "SetInt32", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetInt32", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Nullable", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetString", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetString", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "session", + "Type": "Microsoft.AspNetCore.Http.ISession" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Headers.RequestHeaders", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accept", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Accept", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AcceptCharset", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AcceptCharset", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AcceptEncoding", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AcceptEncoding", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AcceptLanguage", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AcceptLanguage", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CacheControl", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_CacheControl", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.CacheControlHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentDisposition", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentRange", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentRange", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookie", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookie", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Date", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Date", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expires", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expires", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Host", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfMatch", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfMatch", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfModifiedSince", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfModifiedSince", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfNoneMatch", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfNoneMatch", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfRange", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfRange", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IfUnmodifiedSince", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IfUnmodifiedSince", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LastModified", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LastModified", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Range", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.RangeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Range", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.RangeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "GetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Headers.ResponseHeaders", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CacheControl", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_CacheControl", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.CacheControlHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentDisposition", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentRange", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentRange", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Date", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Date", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ETag", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ETag", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.EntityTagHeaderValue" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expires", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expires", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LastModified", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LastModified", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Location", + "Parameters": [], + "ReturnType": "System.Uri", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Location", + "Parameters": [ + { + "Name": "value", + "Type": "System.Uri" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SetCookie", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SetCookie", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "GetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendList", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Extensions.QueryBuilder", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Collections.Generic.IEnumerable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToQueryString", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "parameters", + "Type": "System.Collections.Generic.IEnumerable>" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Extensions.StreamCopyOperation", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "CopyToAsync", + "Parameters": [ + { + "Name": "source", + "Type": "System.IO.Stream" + }, + { + "Name": "destination", + "Type": "System.IO.Stream" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancel", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Extensions.UriHelper", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "BuildRelative", + "Parameters": [ + { + "Name": "pathBase", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "path", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "query", + "Type": "Microsoft.AspNetCore.Http.QueryString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.QueryString)" + }, + { + "Name": "fragment", + "Type": "Microsoft.AspNetCore.Http.FragmentString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.FragmentString)" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "BuildAbsolute", + "Parameters": [ + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "host", + "Type": "Microsoft.AspNetCore.Http.HostString" + }, + { + "Name": "pathBase", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "path", + "Type": "Microsoft.AspNetCore.Http.PathString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" + }, + { + "Name": "query", + "Type": "Microsoft.AspNetCore.Http.QueryString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.QueryString)" + }, + { + "Name": "fragment", + "Type": "Microsoft.AspNetCore.Http.FragmentString", + "DefaultValue": "default(Microsoft.AspNetCore.Http.FragmentString)" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Encode", + "Parameters": [ + { + "Name": "uri", + "Type": "System.Uri" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEncodedUrl", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDisplayUrl", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/baseline.net45.json b/src/Microsoft.AspNetCore.Http.Features/baseline.net45.json new file mode 100644 index 0000000000..d209ce2ee1 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/baseline.net45.json @@ -0,0 +1,2485 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Http.CookieOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Domain", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Domain", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expires", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expires", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Secure", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Secure", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpOnly", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Files", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFileCollection", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Int64", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileName", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OpenReadStream", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyTo", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyToAsync", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IReadOnlyList" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFile", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFiles", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IReadOnlyList", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.ISession", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsAvailable", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Id", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "LoadAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CommitAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Byte[]", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Byte[]" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Clear", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.WebSocketAcceptContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_SubProtocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SubProtocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FeatureCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [], + "ReturnType": "T0", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "instance", + "Type": "T0" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "defaults", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FeatureReference", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Fetch", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Update", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + }, + { + "Name": "feature", + "Type": "T0" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Default", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.FeatureReference", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FeatureReferences", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Collection", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Fetch", + "Parameters": [ + { + "Name": "cached", + "Type": "T0", + "Direction": "Ref" + }, + { + "Name": "state", + "Type": "T1" + }, + { + "Name": "factory", + "Type": "System.Func" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "Class": true, + "BaseTypeOrInterfaces": [] + }, + { + "ParameterName": "TState", + "ParameterPosition": 1, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Fetch", + "Parameters": [ + { + "Name": "cached", + "Type": "T0", + "Direction": "Ref" + }, + { + "Name": "factory", + "Type": "System.Func" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "Class": true, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "collection", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Cache", + "Parameters": [], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [ + { + "ParameterName": "TCache", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [], + "ReturnType": "T0", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "instance", + "Type": "T0" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadForm", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "DisableRequestBuffering", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "DisableResponseBuffering", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ConnectionId", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ConnectionId", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RawTarget", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RawTarget", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ReasonPhrase", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ReasonPhrase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "path", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancellation", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpUpgradeFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsUpgradableRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UpgradeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpWebSocketFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsWebSocketRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.WebSocketAcceptContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IItemsFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IQueryFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ISessionFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ITlsTokenBindingFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetProvidedTokenBindingId", + "Parameters": [], + "ReturnType": "System.Byte[]", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetReferredTokenBindingId", + "Parameters": [], + "ReturnType": "System.Byte[]", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Description", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Error", + "Parameters": [], + "ReturnType": "System.Exception", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Authenticated", + "Parameters": [ + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "description", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "NotAuthenticated", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Failed", + "Parameters": [ + { + "Name": "error", + "Type": "System.Exception" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior", + "Visibility": "Public", + "Kind": "Enumeration", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "Automatic", + "Parameters": [], + "GenericParameter": [], + "Literal": "0" + }, + { + "Kind": "Field", + "Name": "Unauthorized", + "Parameters": [], + "GenericParameter": [], + "Literal": "1" + }, + { + "Kind": "Field", + "Name": "Forbidden", + "Parameters": [], + "GenericParameter": [], + "Literal": "2" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Behavior", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "behavior", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Results", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [ + { + "Name": "description", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetDescriptions", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.SignInContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Handler", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Handler", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.SignInContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json new file mode 100644 index 0000000000..d209ce2ee1 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json @@ -0,0 +1,2485 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Http.CookieOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Domain", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Domain", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expires", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expires", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Secure", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Secure", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpOnly", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Files", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFileCollection", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Int64", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileName", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OpenReadStream", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyTo", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyToAsync", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IReadOnlyList" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFile", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFiles", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IReadOnlyList", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.ISession", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsAvailable", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Id", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "LoadAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CommitAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Byte[]", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Byte[]" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Clear", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.WebSocketAcceptContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_SubProtocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SubProtocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FeatureCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [], + "ReturnType": "T0", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "instance", + "Type": "T0" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "defaults", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FeatureReference", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Fetch", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Update", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + }, + { + "Name": "feature", + "Type": "T0" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Default", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.FeatureReference", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [ + { + "ParameterName": "T", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FeatureReferences", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Collection", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Fetch", + "Parameters": [ + { + "Name": "cached", + "Type": "T0", + "Direction": "Ref" + }, + { + "Name": "state", + "Type": "T1" + }, + { + "Name": "factory", + "Type": "System.Func" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "Class": true, + "BaseTypeOrInterfaces": [] + }, + { + "ParameterName": "TState", + "ParameterPosition": 1, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Fetch", + "Parameters": [ + { + "Name": "cached", + "Type": "T0", + "Direction": "Ref" + }, + { + "Name": "factory", + "Type": "System.Func" + } + ], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "Class": true, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "collection", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Cache", + "Parameters": [], + "ReturnType": "T0", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [ + { + "ParameterName": "TCache", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [], + "ReturnType": "T0", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "instance", + "Type": "T0" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadForm", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "DisableRequestBuffering", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "DisableResponseBuffering", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ConnectionId", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ConnectionId", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RawTarget", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RawTarget", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ReasonPhrase", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ReasonPhrase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "SendFileAsync", + "Parameters": [ + { + "Name": "path", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "cancellation", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpUpgradeFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsUpgradableRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UpgradeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpWebSocketFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsWebSocketRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.WebSocketAcceptContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IItemsFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IQueryFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ISessionFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ITlsTokenBindingFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetProvidedTokenBindingId", + "Parameters": [], + "ReturnType": "System.Byte[]", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetReferredTokenBindingId", + "Parameters": [], + "ReturnType": "System.Byte[]", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Description", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Error", + "Parameters": [], + "ReturnType": "System.Exception", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Authenticated", + "Parameters": [ + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "description", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "NotAuthenticated", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Failed", + "Parameters": [ + { + "Name": "error", + "Type": "System.Exception" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior", + "Visibility": "Public", + "Kind": "Enumeration", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "Automatic", + "Parameters": [], + "GenericParameter": [], + "Literal": "0" + }, + { + "Kind": "Field", + "Name": "Unauthorized", + "Parameters": [], + "GenericParameter": [], + "Literal": "1" + }, + { + "Kind": "Field", + "Name": "Forbidden", + "Parameters": [], + "GenericParameter": [], + "Literal": "2" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Behavior", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "behavior", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Results", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [ + { + "Name": "description", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetDescriptions", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.SignInContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Handler", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Handler", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.SignInContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Accepted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Accept", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/baseline.net45.json b/src/Microsoft.AspNetCore.Http/baseline.net45.json new file mode 100644 index 0000000000..a7bc95d6cb --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/baseline.net45.json @@ -0,0 +1,4691 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Builder.IApplicationBuilder" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ApplicationServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ApplicationServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ServerFeatures", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Use", + "Parameters": [ + { + "Name": "middleware", + "Type": "System.Func" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "New", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + }, + { + "Name": "server", + "Type": "System.Object" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.DefaultHttpContext", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.HttpContext", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Features", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Request", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Response", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Connection", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Authentication", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSockets", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeHttpRequest", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeHttpRequest", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeHttpResponse", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeHttpResponse", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeConnectionInfo", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeConnectionInfo", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.ConnectionInfo" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeAuthenticationManager", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeAuthenticationManager", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeWebSocketManager", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeWebSocketManager", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.WebSocketManager" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.FormCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IFormCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Files", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "fields", + "Type": "System.Collections.Generic.Dictionary" + }, + { + "Name": "files", + "Type": "Microsoft.AspNetCore.Http.IFormFileCollection", + "DefaultValue": "null" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.FormCollection", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionary", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IHeaderDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Values", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Clear", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Contains", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyTo", + "Parameters": [ + { + "Name": "array", + "Type": "System.Collections.Generic.KeyValuePair[]" + }, + { + "Name": "arrayIndex", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HeaderDictionary+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "capacity", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpContextAccessor", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IHttpContextAccessor" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextAccessor", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpContext", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextAccessor", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpContextFactory", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IHttpContextFactory" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "featureCollection", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextFactory", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "httpContext", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextFactory", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "poolProvider", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" + }, + { + "Name": "formOptions", + "Type": "Microsoft.Extensions.Options.IOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "poolProvider", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" + }, + { + "Name": "formOptions", + "Type": "Microsoft.Extensions.Options.IOptions" + }, + { + "Name": "httpContextAccessor", + "Type": "Microsoft.AspNetCore.Http.IHttpContextAccessor" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.RequestFormReaderExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.Features.FormOptions" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.BufferingHelper", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_TempDirectory", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnableRewind", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "bufferThreshold", + "Type": "System.Int32", + "DefaultValue": "30720" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable", + "DefaultValue": "default(System.Nullable)" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnableRewind", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + }, + { + "Name": "registerForDispose", + "Type": "System.Action" + }, + { + "Name": "bufferThreshold", + "Type": "System.Int32", + "DefaultValue": "30720" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable", + "DefaultValue": "default(System.Nullable)" + } + ], + "ReturnType": "Microsoft.AspNetCore.WebUtilities.MultipartSection", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultConnectionInfo", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.HttpRequest", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsHttps", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsHttps", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Host", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.HttpResponse", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Redirect", + "Parameters": [ + { + "Name": "location", + "Type": "System.String" + }, + { + "Name": "permanent", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultWebSocketManager", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.WebSocketManager", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsWebSocketRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSocketRequestedProtocols", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptWebSocketAsync", + "Parameters": [ + { + "Name": "subProtocol", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.FormFile", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IFormFile" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentDisposition", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Int64", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileName", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OpenReadStream", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyTo", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyToAsync", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "baseStream", + "Type": "System.IO.Stream" + }, + { + "Name": "baseStreamOffset", + "Type": "System.Int64" + }, + { + "Name": "length", + "Type": "System.Int64" + }, + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "fileName", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.FormFileCollection", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.Collections.Generic.List", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IFormFileCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFile", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFiles", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IReadOnlyList", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.ItemsDictionary", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "items", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IQueryCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "Microsoft.AspNetCore.Http.Internal.QueryCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "capacity", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IRequestCookieCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "capacity", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.ResponseCookies", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IResponseCookies" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "builderPool", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.DefaultSessionFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.ISessionFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ISessionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ISessionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FormFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IFormFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadForm", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "form", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.Features.FormOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FormOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_BufferBody", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BufferBody", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MemoryBufferThreshold", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MemoryBufferThreshold", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_BufferBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int64", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BufferBodyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_KeyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_KeyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartBoundaryLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartBoundaryLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartHeadersCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartHeadersCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartHeadersLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartHeadersLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int64", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartBodyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultMemoryBufferThreshold", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "65536" + }, + { + "Kind": "Field", + "Name": "DefaultBufferBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "134217728" + }, + { + "Kind": "Field", + "Name": "DefaultMultipartBoundaryLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "128" + }, + { + "Kind": "Field", + "Name": "DefaultMultipartBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int64", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "134217728" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpConnectionFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ConnectionId", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ConnectionId", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RawTarget", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RawTarget", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestIdentifierFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestLifetimeFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpResponseFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ReasonPhrase", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ReasonPhrase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ItemsFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IItemsFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IItemsFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IItemsFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.QueryFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IQueryFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IQueryFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IQueryFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "query", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.RequestCookiesFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "cookies", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ResponseCookiesFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + }, + { + "Name": "builderPool", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ServiceProvidersFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.TlsConnectionFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.HttpAuthenticationFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Handler", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Handler", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticationSchemes", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticateInfoAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + }, + { + "Name": "behavior", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionary+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Reset", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/baseline.netcore.json b/src/Microsoft.AspNetCore.Http/baseline.netcore.json new file mode 100644 index 0000000000..a7bc95d6cb --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/baseline.netcore.json @@ -0,0 +1,4691 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Builder.IApplicationBuilder" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ApplicationServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ApplicationServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ServerFeatures", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Use", + "Parameters": [ + { + "Name": "middleware", + "Type": "System.Func" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "New", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + }, + { + "Name": "server", + "Type": "System.Object" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.DefaultHttpContext", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.HttpContext", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Features", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Request", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Response", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Connection", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Authentication", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSockets", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeHttpRequest", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeHttpRequest", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeHttpResponse", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeHttpResponse", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeConnectionInfo", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeConnectionInfo", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.ConnectionInfo" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeAuthenticationManager", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeAuthenticationManager", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "InitializeWebSocketManager", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UninitializeWebSocketManager", + "Parameters": [ + { + "Name": "instance", + "Type": "Microsoft.AspNetCore.Http.WebSocketManager" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.FormCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IFormCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Files", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "fields", + "Type": "System.Collections.Generic.Dictionary" + }, + { + "Name": "files", + "Type": "Microsoft.AspNetCore.Http.IFormFileCollection", + "DefaultValue": "null" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.FormCollection", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionary", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IHeaderDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Values", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Clear", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Contains", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyTo", + "Parameters": [ + { + "Name": "array", + "Type": "System.Collections.Generic.KeyValuePair[]" + }, + { + "Name": "arrayIndex", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HeaderDictionary+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "capacity", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpContextAccessor", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IHttpContextAccessor" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextAccessor", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpContext", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextAccessor", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpContextFactory", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IHttpContextFactory" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "featureCollection", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextFactory", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "httpContext", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextFactory", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "poolProvider", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" + }, + { + "Name": "formOptions", + "Type": "Microsoft.Extensions.Options.IOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "poolProvider", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" + }, + { + "Name": "formOptions", + "Type": "Microsoft.Extensions.Options.IOptions" + }, + { + "Name": "httpContextAccessor", + "Type": "Microsoft.AspNetCore.Http.IHttpContextAccessor" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.RequestFormReaderExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.Features.FormOptions" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.BufferingHelper", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_TempDirectory", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnableRewind", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "bufferThreshold", + "Type": "System.Int32", + "DefaultValue": "30720" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable", + "DefaultValue": "default(System.Nullable)" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnableRewind", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + }, + { + "Name": "registerForDispose", + "Type": "System.Action" + }, + { + "Name": "bufferThreshold", + "Type": "System.Int32", + "DefaultValue": "30720" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable", + "DefaultValue": "default(System.Nullable)" + } + ], + "ReturnType": "Microsoft.AspNetCore.WebUtilities.MultipartSection", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultConnectionInfo", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.ConnectionInfo", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.HttpRequest", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.QueryString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.QueryString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsHttps", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsHttps", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Host", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HostString", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Host", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.HostString" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.HttpResponse", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Redirect", + "Parameters": [ + { + "Name": "location", + "Type": "System.String" + }, + { + "Name": "permanent", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.DefaultWebSocketManager", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.WebSocketManager", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsWebSocketRequest", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_WebSocketRequestedProtocols", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AcceptWebSocketAsync", + "Parameters": [ + { + "Name": "subProtocol", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.FormFile", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IFormFile" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentDisposition", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Int64", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileName", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OpenReadStream", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyTo", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyToAsync", + "Parameters": [ + { + "Name": "target", + "Type": "System.IO.Stream" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "baseStream", + "Type": "System.IO.Stream" + }, + { + "Name": "baseStreamOffset", + "Type": "System.Int64" + }, + { + "Name": "length", + "Type": "System.Int64" + }, + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "fileName", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.FormFileCollection", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.Collections.Generic.List", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IFormFileCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFile", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetFiles", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.IReadOnlyList", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.ItemsDictionary", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "items", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IQueryCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "Microsoft.AspNetCore.Http.Internal.QueryCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "capacity", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IRequestCookieCollection" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "store", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "capacity", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Empty", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.ResponseCookies", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IResponseCookies" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Delete", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.CookieOptions" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "builderPool", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.DefaultSessionFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.ISessionFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Session", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.ISession", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ISessionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Session", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.ISession" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ISessionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FormFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IFormFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_HasFormContentType", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Form", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Form", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadForm", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "form", + "Type": "Microsoft.AspNetCore.Http.IFormCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "options", + "Type": "Microsoft.AspNetCore.Http.Features.FormOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.FormOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_BufferBody", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BufferBody", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MemoryBufferThreshold", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MemoryBufferThreshold", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_BufferBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int64", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BufferBodyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_KeyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_KeyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartBoundaryLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartBoundaryLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartHeadersCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartHeadersCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartHeadersLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartHeadersLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MultipartBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int64", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MultipartBodyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultMemoryBufferThreshold", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "65536" + }, + { + "Kind": "Field", + "Name": "DefaultBufferBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "134217728" + }, + { + "Kind": "Field", + "Name": "DefaultMultipartBoundaryLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "128" + }, + { + "Kind": "Field", + "Name": "DefaultMultipartBodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int64", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "134217728" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpConnectionFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ConnectionId", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ConnectionId", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_LocalPort", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_LocalPort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemoteIpAddress", + "Parameters": [], + "ReturnType": "System.Net.IPAddress", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemoteIpAddress", + "Parameters": [ + { + "Name": "value", + "Type": "System.Net.IPAddress" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RemotePort", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RemotePort", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Protocol", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Protocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Scheme", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Scheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Method", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Method", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PathBase", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_PathBase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_QueryString", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_QueryString", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RawTarget", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RawTarget", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestIdentifierFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_TraceIdentifier", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_TraceIdentifier", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestLifetimeFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestAborted", + "Parameters": [], + "ReturnType": "System.Threading.CancellationToken", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestAborted", + "Parameters": [ + { + "Name": "value", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.HttpResponseFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_StatusCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_StatusCode", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ReasonPhrase", + "Parameters": [], + "ReturnType": "System.String", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ReasonPhrase", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasStarted", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnStarting", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "OnCompleted", + "Parameters": [ + { + "Name": "callback", + "Type": "System.Func" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ItemsFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IItemsFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IItemsFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Items", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IItemsFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.QueryFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IQueryFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Query", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IQueryFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Query", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IQueryFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "query", + "Type": "Microsoft.AspNetCore.Http.IQueryCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.RequestCookiesFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Cookies", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "cookies", + "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ResponseCookiesFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Cookies", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "features", + "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" + }, + { + "Name": "builderPool", + "Type": "Microsoft.Extensions.ObjectPool.ObjectPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ServiceProvidersFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_RequestServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RequestServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.TlsConnectionFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ClientCertificate", + "Parameters": [], + "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ClientCertificate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetClientCertificateAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Features.Authentication.HttpAuthenticationFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_User", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_User", + "Parameters": [ + { + "Name": "value", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Handler", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Handler", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Initialize", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Uninitialize", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpContext", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticationSchemes", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAuthenticateInfoAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + }, + { + "Name": "behavior", + "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "authenticationScheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionary+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator>" + ], + "Members": [ + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "System.Collections.Generic.KeyValuePair", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Reset", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/baseline.net45.json b/src/Microsoft.AspNetCore.Owin/baseline.net45.json new file mode 100644 index 0000000000..ec8635bdd3 --- /dev/null +++ b/src/Microsoft.AspNetCore.Owin/baseline.net45.json @@ -0,0 +1,999 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Builder.OwinExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "UseOwin", + "Parameters": [ + { + "Name": "builder", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + } + ], + "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseOwin", + "Parameters": [ + { + "Name": "builder", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "pipeline", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + }, + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + }, + { + "Name": "pipeline", + "Type": "System.Action" + } + ], + "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + }, + { + "Name": "pipeline", + "Type": "System.Action" + }, + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Environment", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Environment", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_FeatureMaps", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironmentFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Environment", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Environment", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinFeatureCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature", + "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Microsoft.AspNetCore.Http.Features.IHttpWebSocketFeature", + "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Environment", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Environment", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SupportsWebSockets", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SupportsWebSockets", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [], + "ReturnType": "T0", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "instance", + "Type": "T0" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "environment", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAcceptAdapter", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AdaptWebSockets", + "Parameters": [ + { + "Name": "next", + "Type": "System.Func, System.Threading.Tasks.Task>" + } + ], + "ReturnType": "System.Func, System.Threading.Tasks.Task>", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAcceptContext", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.WebSocketAcceptContext", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_SubProtocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SubProtocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Options", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "options", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAdapter", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.Net.WebSockets.WebSocket", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_CloseStatus", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CloseStatusDescription", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SubProtocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_State", + "Parameters": [], + "ReturnType": "System.Net.WebSockets.WebSocketState", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReceiveAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.ArraySegment" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.ArraySegment" + }, + { + "Name": "messageType", + "Type": "System.Net.WebSockets.WebSocketMessageType" + }, + { + "Name": "endOfMessage", + "Type": "System.Boolean" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CloseAsync", + "Parameters": [ + { + "Name": "closeStatus", + "Type": "System.Net.WebSockets.WebSocketCloseStatus" + }, + { + "Name": "statusDescription", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CloseOutputAsync", + "Parameters": [ + { + "Name": "closeStatus", + "Type": "System.Net.WebSockets.WebSocketCloseStatus" + }, + { + "Name": "statusDescription", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "websocketContext", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "subProtocol", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.WebSocketAcceptAdapter", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AdaptWebSockets", + "Parameters": [ + { + "Name": "next", + "Type": "System.Func, System.Threading.Tasks.Task>" + } + ], + "ReturnType": "System.Func, System.Threading.Tasks.Task>", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "env", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "accept", + "Type": "System.Func>" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.WebSocketAdapter", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_CanSet", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + }, + { + "Name": "featureFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + }, + { + "Name": "featureFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json new file mode 100644 index 0000000000..ec8635bdd3 --- /dev/null +++ b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json @@ -0,0 +1,999 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Builder.OwinExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "UseOwin", + "Parameters": [ + { + "Name": "builder", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + } + ], + "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseOwin", + "Parameters": [ + { + "Name": "builder", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "pipeline", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + }, + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + }, + { + "Name": "pipeline", + "Type": "System.Action" + } + ], + "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UseBuilder", + "Parameters": [ + { + "Name": "app", + "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" + }, + { + "Name": "pipeline", + "Type": "System.Action" + }, + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Environment", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Environment", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IDictionary" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_FeatureMaps", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironmentFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Environment", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Environment", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinFeatureCollection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", + "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", + "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", + "Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature", + "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", + "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", + "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", + "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", + "Microsoft.AspNetCore.Http.Features.IHttpWebSocketFeature", + "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Environment", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Environment", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SupportsWebSockets", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SupportsWebSockets", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Revision", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Item", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + } + ], + "ReturnType": "System.Object", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "key", + "Type": "System.Type" + }, + { + "Name": "value", + "Type": "System.Object" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Get", + "Parameters": [], + "ReturnType": "T0", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "Set", + "Parameters": [ + { + "Name": "instance", + "Type": "T0" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "environment", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAcceptAdapter", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AdaptWebSockets", + "Parameters": [ + { + "Name": "next", + "Type": "System.Func, System.Threading.Tasks.Task>" + } + ], + "ReturnType": "System.Func, System.Threading.Tasks.Task>", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAcceptContext", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Http.WebSocketAcceptContext", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_SubProtocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SubProtocol", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Options", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "options", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAdapter", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.Net.WebSockets.WebSocket", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_CloseStatus", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CloseStatusDescription", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SubProtocol", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_State", + "Parameters": [], + "ReturnType": "System.Net.WebSockets.WebSocketState", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReceiveAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.ArraySegment" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SendAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.ArraySegment" + }, + { + "Name": "messageType", + "Type": "System.Net.WebSockets.WebSocketMessageType" + }, + { + "Name": "endOfMessage", + "Type": "System.Boolean" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CloseAsync", + "Parameters": [ + { + "Name": "closeStatus", + "Type": "System.Net.WebSockets.WebSocketCloseStatus" + }, + { + "Name": "statusDescription", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CloseOutputAsync", + "Parameters": [ + { + "Name": "closeStatus", + "Type": "System.Net.WebSockets.WebSocketCloseStatus" + }, + { + "Name": "statusDescription", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Abort", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "websocketContext", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "subProtocol", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.WebSocketAcceptAdapter", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AdaptWebSockets", + "Parameters": [ + { + "Name": "next", + "Type": "System.Func, System.Threading.Tasks.Task>" + } + ], + "ReturnType": "System.Func, System.Threading.Tasks.Task>", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "env", + "Type": "System.Collections.Generic.IDictionary" + }, + { + "Name": "accept", + "Type": "System.Func>" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.WebSocketAdapter", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_CanSet", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "featureInterface", + "Type": "System.Type" + }, + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + }, + { + "Name": "featureFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "getter", + "Type": "System.Func" + }, + { + "Name": "defaultFactory", + "Type": "System.Func" + }, + { + "Name": "setter", + "Type": "System.Action" + }, + { + "Name": "featureFactory", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [ + { + "ParameterName": "TFeature", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.net45.json b/src/Microsoft.AspNetCore.WebUtilities/baseline.net45.json new file mode 100644 index 0000000000..fd99a279f6 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/baseline.net45.json @@ -0,0 +1,1747 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.IO.Stream", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_InMemory", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_TempFileName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanRead", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanSeek", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanWrite", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Position", + "Parameters": [], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Position", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Seek", + "Parameters": [ + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "origin", + "Type": "System.IO.SeekOrigin" + } + ], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Read", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "BeginRead", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "callback", + "Type": "System.AsyncCallback" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.IAsyncResult", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EndRead", + "Parameters": [ + { + "Name": "asyncResult", + "Type": "System.IAsyncResult" + } + ], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "BeginWrite", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "callback", + "Type": "System.AsyncCallback" + }, + { + "Name": "state", + "Type": "System.Object" + } + ], + "ReturnType": "System.IAsyncResult", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EndWrite", + "Parameters": [ + { + "Name": "asyncResult", + "Type": "System.IAsyncResult" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Flush", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "disposing", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectoryAccessor", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectoryAccessor", + "Type": "System.Func" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectory", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectory", + "Type": "System.String" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.FormReader", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.IDisposable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ValueCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_KeyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_KeyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadNextPair", + "Parameters": [], + "ReturnType": "System.Nullable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadNextPairAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task>>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadForm", + "Parameters": [], + "ReturnType": "System.Collections.Generic.Dictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "data", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "data", + "Type": "System.String" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultValueCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "1024" + }, + { + "Kind": "Field", + "Name": "DefaultKeyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "2048" + }, + { + "Kind": "Field", + "Name": "DefaultValueLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "4194304" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.HttpRequestStreamReader", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.IO.TextReader", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Close", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "disposing", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Peek", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Read", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Read", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.IO.TextWriter", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Encoding", + "Parameters": [], + "ReturnType": "System.Text.Encoding", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "value", + "Type": "System.Char" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "values", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "value", + "Type": "System.Char" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "values", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Flush", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FlushAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "disposing", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultBufferSize", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "1024" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.KeyValueAccumulator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValues", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_KeyCount", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueCount", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetResults", + "Parameters": [], + "ReturnType": "System.Collections.Generic.Dictionary", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.MultipartReader", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HeadersCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HeadersCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HeadersLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HeadersLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_BodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BodyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadNextSectionAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "boundary", + "Type": "System.String" + }, + { + "Name": "stream", + "Type": "System.IO.Stream" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "boundary", + "Type": "System.String" + }, + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultHeadersCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "16" + }, + { + "Kind": "Field", + "Name": "DefaultHeadersLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "16384" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.MultipartSection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "System.Collections.Generic.Dictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_BaseStreamOffset", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BaseStreamOffset", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.QueryHelpers", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AddQueryString", + "Parameters": [ + { + "Name": "uri", + "Type": "System.String" + }, + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AddQueryString", + "Parameters": [ + { + "Name": "uri", + "Type": "System.String" + }, + { + "Name": "queryString", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseQuery", + "Parameters": [ + { + "Name": "queryString", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.Dictionary", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseNullableQuery", + "Parameters": [ + { + "Name": "queryString", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.Dictionary", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.ReasonPhrases", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetReasonPhrase", + "Parameters": [ + { + "Name": "statusCode", + "Type": "System.Int32" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "DrainAsync", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "DrainAsync", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "limit", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "DrainAsync", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + }, + { + "Name": "limit", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.WebEncoders", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "buffer", + "Type": "System.Char[]" + }, + { + "Name": "bufferOffset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetArraySizeRequiredToDecode", + "Parameters": [ + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "output", + "Type": "System.Char[]" + }, + { + "Name": "outputOffset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetArraySizeRequiredToEncode", + "Parameters": [ + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json new file mode 100644 index 0000000000..3cdbdbb3e6 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json @@ -0,0 +1,1645 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.IO.Stream", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_InMemory", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_TempFileName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanRead", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanSeek", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanWrite", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Position", + "Parameters": [], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Position", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Seek", + "Parameters": [ + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "origin", + "Type": "System.IO.SeekOrigin" + } + ], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Read", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Flush", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "disposing", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectoryAccessor", + "Type": "System.Func" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectoryAccessor", + "Type": "System.Func" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectory", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "memoryThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Nullable" + }, + { + "Name": "tempFileDirectory", + "Type": "System.String" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.FormReader", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.IDisposable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_ValueCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_KeyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_KeyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ValueLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadNextPair", + "Parameters": [], + "ReturnType": "System.Nullable>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadNextPairAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task>>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadForm", + "Parameters": [], + "ReturnType": "System.Collections.Generic.Dictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadFormAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "data", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "data", + "Type": "System.String" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultValueCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "1024" + }, + { + "Kind": "Field", + "Name": "DefaultKeyLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "2048" + }, + { + "Kind": "Field", + "Name": "DefaultValueLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "4194304" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.HttpRequestStreamReader", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.IO.TextReader", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "disposing", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Peek", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Read", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Read", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.IO.TextWriter", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Encoding", + "Parameters": [], + "ReturnType": "System.Text.Encoding", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "value", + "Type": "System.Char" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "values", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "value", + "Type": "System.Char" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "values", + "Type": "System.Char[]" + }, + { + "Name": "index", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Flush", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FlushAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "disposing", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + }, + { + "Name": "charPool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultBufferSize", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "1024" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.KeyValueAccumulator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasValues", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_KeyCount", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ValueCount", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetResults", + "Parameters": [], + "ReturnType": "System.Collections.Generic.Dictionary", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.MultipartReader", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_HeadersCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HeadersCountLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HeadersLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HeadersLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_BodyLengthLimit", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BodyLengthLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadNextSectionAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "boundary", + "Type": "System.String" + }, + { + "Name": "stream", + "Type": "System.IO.Stream" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "boundary", + "Type": "System.String" + }, + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "DefaultHeadersCountLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "16" + }, + { + "Kind": "Field", + "Name": "DefaultHeadersLengthLimit", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "16384" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.MultipartSection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentDisposition", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Headers", + "Parameters": [], + "ReturnType": "System.Collections.Generic.Dictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Headers", + "Parameters": [ + { + "Name": "value", + "Type": "System.Collections.Generic.Dictionary" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Body", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Body", + "Parameters": [ + { + "Name": "value", + "Type": "System.IO.Stream" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_BaseStreamOffset", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_BaseStreamOffset", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.QueryHelpers", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AddQueryString", + "Parameters": [ + { + "Name": "uri", + "Type": "System.String" + }, + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AddQueryString", + "Parameters": [ + { + "Name": "uri", + "Type": "System.String" + }, + { + "Name": "queryString", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseQuery", + "Parameters": [ + { + "Name": "queryString", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.Dictionary", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseNullableQuery", + "Parameters": [ + { + "Name": "queryString", + "Type": "System.String" + } + ], + "ReturnType": "System.Collections.Generic.Dictionary", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.ReasonPhrases", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetReasonPhrase", + "Parameters": [ + { + "Name": "statusCode", + "Type": "System.Int32" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "DrainAsync", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "DrainAsync", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "limit", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "DrainAsync", + "Parameters": [ + { + "Name": "stream", + "Type": "System.IO.Stream" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + }, + { + "Name": "limit", + "Type": "System.Nullable" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.WebEncoders", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "buffer", + "Type": "System.Char[]" + }, + { + "Name": "bufferOffset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetArraySizeRequiredToDecode", + "Parameters": [ + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "output", + "Type": "System.Char[]" + }, + { + "Name": "outputOffset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetArraySizeRequiredToEncode", + "Parameters": [ + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/baseline.netcore.json b/src/Microsoft.Net.Http.Headers/baseline.netcore.json new file mode 100644 index 0000000000..71355f27a7 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/baseline.netcore.json @@ -0,0 +1,3519 @@ +{ + "AssemblyIdentity": "Microsoft.Net.Http.Headers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_NoCache", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_NoCache", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_NoCacheHeaders", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_NoStore", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_NoStore", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MaxAge", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MaxAge", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SharedMaxAge", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SharedMaxAge", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MaxStale", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MaxStale", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MaxStaleLimit", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MaxStaleLimit", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MinFresh", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MinFresh", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_NoTransform", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_NoTransform", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_OnlyIfCached", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_OnlyIfCached", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Public", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Public", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Private", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Private", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_PrivateHeaders", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MustRevalidate", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MustRevalidate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ProxyRevalidate", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ProxyRevalidate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Extensions", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_DispositionType", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DispositionType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Parameters", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Name", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_FileName", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileNameStar", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_FileNameStar", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CreationDate", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_CreationDate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ModificationDate", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ModificationDate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ReadDate", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ReadDate", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Size", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Size", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetHttpFileName", + "Parameters": [ + { + "Name": "fileName", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetMimeFileName", + "Parameters": [ + { + "Name": "fileName", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "dispositionType", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Unit", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Unit", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_From", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_To", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasLength", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasRange", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "from", + "Type": "System.Int64" + }, + { + "Name": "to", + "Type": "System.Int64" + }, + { + "Name": "length", + "Type": "System.Int64" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "length", + "Type": "System.Int64" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "from", + "Type": "System.Int64" + }, + { + "Name": "to", + "Type": "System.Int64" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.CookieHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Name", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Value", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.CookieHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.CookieHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Any", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Tag", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsWeak", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "tag", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "tag", + "Type": "System.String" + }, + { + "Name": "isWeak", + "Type": "System.Boolean" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.HeaderNames", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "Accept", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Accept\"" + }, + { + "Kind": "Field", + "Name": "AcceptCharset", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Accept-Charset\"" + }, + { + "Kind": "Field", + "Name": "AcceptEncoding", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Accept-Encoding\"" + }, + { + "Kind": "Field", + "Name": "AcceptLanguage", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Accept-Language\"" + }, + { + "Kind": "Field", + "Name": "AcceptRanges", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Accept-Ranges\"" + }, + { + "Kind": "Field", + "Name": "Age", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Age\"" + }, + { + "Kind": "Field", + "Name": "Allow", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Allow\"" + }, + { + "Kind": "Field", + "Name": "Authorization", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Authorization\"" + }, + { + "Kind": "Field", + "Name": "CacheControl", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Cache-Control\"" + }, + { + "Kind": "Field", + "Name": "Connection", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Connection\"" + }, + { + "Kind": "Field", + "Name": "ContentDisposition", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Disposition\"" + }, + { + "Kind": "Field", + "Name": "ContentEncoding", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Encoding\"" + }, + { + "Kind": "Field", + "Name": "ContentLanguage", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Language\"" + }, + { + "Kind": "Field", + "Name": "ContentLength", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Length\"" + }, + { + "Kind": "Field", + "Name": "ContentLocation", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Location\"" + }, + { + "Kind": "Field", + "Name": "ContentMD5", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"ContentMD5\"" + }, + { + "Kind": "Field", + "Name": "ContentRange", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Range\"" + }, + { + "Kind": "Field", + "Name": "ContentType", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Type\"" + }, + { + "Kind": "Field", + "Name": "Cookie", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Cookie\"" + }, + { + "Kind": "Field", + "Name": "Date", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Date\"" + }, + { + "Kind": "Field", + "Name": "ETag", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"ETag\"" + }, + { + "Kind": "Field", + "Name": "Expires", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Expires\"" + }, + { + "Kind": "Field", + "Name": "Expect", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Expect\"" + }, + { + "Kind": "Field", + "Name": "From", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"From\"" + }, + { + "Kind": "Field", + "Name": "Host", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Host\"" + }, + { + "Kind": "Field", + "Name": "IfMatch", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"If-Match\"" + }, + { + "Kind": "Field", + "Name": "IfModifiedSince", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"If-Modified-Since\"" + }, + { + "Kind": "Field", + "Name": "IfNoneMatch", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"If-None-Match\"" + }, + { + "Kind": "Field", + "Name": "IfRange", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"If-Range\"" + }, + { + "Kind": "Field", + "Name": "IfUnmodifiedSince", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"If-Unmodified-Since\"" + }, + { + "Kind": "Field", + "Name": "LastModified", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Last-Modified\"" + }, + { + "Kind": "Field", + "Name": "Location", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Location\"" + }, + { + "Kind": "Field", + "Name": "MaxForwards", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Max-Forwards\"" + }, + { + "Kind": "Field", + "Name": "Pragma", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Pragma\"" + }, + { + "Kind": "Field", + "Name": "ProxyAuthenticate", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Proxy-Authenticate\"" + }, + { + "Kind": "Field", + "Name": "ProxyAuthorization", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Proxy-Authorization\"" + }, + { + "Kind": "Field", + "Name": "Range", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Range\"" + }, + { + "Kind": "Field", + "Name": "Referer", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Referer\"" + }, + { + "Kind": "Field", + "Name": "RetryAfter", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Retry-After\"" + }, + { + "Kind": "Field", + "Name": "Server", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Server\"" + }, + { + "Kind": "Field", + "Name": "SetCookie", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Set-Cookie\"" + }, + { + "Kind": "Field", + "Name": "TE", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"TE\"" + }, + { + "Kind": "Field", + "Name": "Trailer", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Trailer\"" + }, + { + "Kind": "Field", + "Name": "TransferEncoding", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Transfer-Encoding\"" + }, + { + "Kind": "Field", + "Name": "Upgrade", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Upgrade\"" + }, + { + "Kind": "Field", + "Name": "UserAgent", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"User-Agent\"" + }, + { + "Kind": "Field", + "Name": "Vary", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Vary\"" + }, + { + "Kind": "Field", + "Name": "Via", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Via\"" + }, + { + "Kind": "Field", + "Name": "Warning", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Warning\"" + }, + { + "Kind": "Field", + "Name": "WebSocketSubProtocols", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Sec-WebSocket-Protocol\"" + }, + { + "Kind": "Field", + "Name": "WWWAuthenticate", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"WWW-Authenticate\"" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.HeaderQuality", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "Match", + "Parameters": [], + "ReturnType": "System.Double", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "1" + }, + { + "Kind": "Field", + "Name": "NoMatch", + "Parameters": [], + "ReturnType": "System.Double", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "0" + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.HeaderUtilities", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "TryParseInt64", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + }, + { + "Name": "result", + "Type": "System.Int64", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FormatInt64", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseDate", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "result", + "Type": "System.DateTimeOffset", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FormatDate", + "Parameters": [ + { + "Name": "dateTime", + "Type": "System.DateTimeOffset" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "RemoveQuotes", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Charset", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Charset", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Encoding", + "Parameters": [], + "ReturnType": "System.Text.Encoding", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Encoding", + "Parameters": [ + { + "Name": "value", + "Type": "System.Text.Encoding" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Boundary", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Boundary", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Parameters", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IList", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Quality", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Quality", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MediaType", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MediaType", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Type", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SubType", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MatchesAllTypes", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MatchesAllSubTypes", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsSubsetOf", + "Parameters": [ + { + "Name": "otherMediaType", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Copy", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyAsReadOnly", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "mediaType", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "mediaType", + "Type": "System.String" + }, + { + "Name": "quality", + "Type": "System.Double" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.MediaTypeHeaderValueComparer", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IComparer" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_QualityComparer", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValueComparer", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Compare", + "Parameters": [ + { + "Name": "mediaType1", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" + }, + { + "Name": "mediaType2", + "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" + } + ], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IComparer", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.NameValueHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Value", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Copy", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.NameValueHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyAsReadOnly", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.NameValueHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.NameValueHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.NameValueHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseStrictList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseStrictList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Find", + "Parameters": [ + { + "Name": "values", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.NameValueHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_LastModified", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_EntityTag", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "lastModified", + "Type": "System.DateTimeOffset" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "entityTag", + "Type": "Microsoft.Net.Http.Headers.EntityTagHeaderValue" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "entityTag", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.RangeHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Unit", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Unit", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Ranges", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.RangeHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.RangeHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "from", + "Type": "System.Nullable" + }, + { + "Name": "to", + "Type": "System.Nullable" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.RangeItemHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_From", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_To", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "from", + "Type": "System.Nullable" + }, + { + "Name": "to", + "Type": "System.Nullable" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Name", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Value", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expires", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expires", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MaxAge", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MaxAge", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Domain", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Domain", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Secure", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Secure", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpOnly", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendToStringBuilder", + "Parameters": [ + { + "Name": "builder", + "Type": "System.Text.StringBuilder" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseStrictList", + "Parameters": [ + { + "Name": "inputs", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Quality", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ToString", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Parse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParse", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "parsedValue", + "Type": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ParseStrictList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Collections.Generic.IList", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseStrictList", + "Parameters": [ + { + "Name": "input", + "Type": "System.Collections.Generic.IList" + }, + { + "Name": "parsedValues", + "Type": "System.Collections.Generic.IList", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + }, + { + "Name": "quality", + "Type": "System.Double" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValueComparer", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "System.Collections.Generic.IComparer" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_QualityComparer", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValueComparer", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Compare", + "Parameters": [ + { + "Name": "stringWithQuality1", + "Type": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValue" + }, + { + "Name": "stringWithQuality2", + "Type": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValue" + } + ], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IComparer", + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file From 74677b6a608ae7e30ae9394cd27527d3517512db Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 9 Nov 2016 11:31:08 -0800 Subject: [PATCH 614/846] Branching for 1.1.0 --- NuGet.config | 4 ++-- build.ps1 | 2 +- build.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NuGet.config b/NuGet.config index 826a1f9035..6197c93176 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index 8f2f99691a..24ca167cf6 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.0.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index f4208100eb..fea9ac64ad 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.0.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi From 4fbb0b01fc30256677a2373d1a5c1e387ef9a3c0 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 9 Nov 2016 14:17:55 -0800 Subject: [PATCH 615/846] Updating versions to 1.2.0-* --- samples/SampleApp/project.json | 4 ++-- .../project.json | 12 ++++++----- .../project.json | 12 +++++++---- .../project.json | 4 ++-- src/Microsoft.AspNetCore.Http/project.json | 20 ++++++++++++------- src/Microsoft.AspNetCore.Owin/project.json | 8 +++++--- .../project.json | 10 ++++++---- src/Microsoft.Net.Http.Headers/project.json | 4 ++-- .../project.json | 4 ++-- .../project.json | 6 +++--- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 6 +++--- .../project.json | 2 +- .../project.json | 2 +- 15 files changed, 57 insertions(+), 41 deletions(-) diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 8deed583f2..415439e0b3 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,8 +1,8 @@ { "version": "1.1.0-*", "dependencies": { - "Microsoft.AspNetCore.Http": "1.1.0-*", - "Microsoft.AspNetCore.Http.Extensions": "1.1.0-*" + "Microsoft.AspNetCore.Http": "1.2.0-*", + "Microsoft.AspNetCore.Http.Extensions": "1.2.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index 9b73f97bab..e72b4b7f61 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -1,5 +1,5 @@ { - "version": "1.1.0-*", + "version": "1.2.0-*", "description": "ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder.\r\nCommonly used types:\r\nMicrosoft.AspNetCore.Builder.IApplicationBuilder\r\nMicrosoft.AspNetCore.Http.HttpContext\r\nMicrosoft.AspNetCore.Http.HttpRequest\r\nMicrosoft.AspNetCore.Http.HttpResponse", "packOptions": { "repository": { @@ -19,18 +19,20 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http.Features": "1.1.0-*", + "Microsoft.AspNetCore.Http.Features": { + "target": "project" + }, "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", - "version": "1.1.0-*" + "version": "1.2.0-*" }, "Microsoft.Extensions.TaskCache.Sources": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "build" }, "NETStandard.Library": "1.6.1-*", "System.Text.Encodings.Web": "4.3.0-*", - "Microsoft.Extensions.Primitives": "1.1.0-*" + "Microsoft.Extensions.Primitives": "1.2.0-*" }, "frameworks": { "net451": { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index f639c17057..8e9cc29a69 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -1,5 +1,5 @@ { - "version": "1.1.0-*", + "version": "1.2.0-*", "description": "ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state.", "packOptions": { "repository": { @@ -19,9 +19,13 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "1.1.0-*", - "Microsoft.Extensions.FileProviders.Abstractions": "1.1.0-*", - "Microsoft.Net.Http.Headers": "1.1.0-*", + "Microsoft.AspNetCore.Http.Abstractions": { + "target": "project" + }, + "Microsoft.Extensions.FileProviders.Abstractions": "1.2.0-*", + "Microsoft.Net.Http.Headers": { + "target": "project" + }, "NETStandard.Library": "1.6.1-*", "System.Buffers": "4.3.0-*" }, diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 71f2f1a7a0..7f09a0a2a0 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -1,5 +1,5 @@ { - "version": "1.1.0-*", + "version": "1.2.0-*", "description": "ASP.NET Core HTTP feature interface definitions.", "packOptions": { "repository": { @@ -19,7 +19,7 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.1.0-*", + "Microsoft.Extensions.Primitives": "1.2.0-*", "NETStandard.Library": "1.6.1-*" }, "frameworks": { diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index f6004ce25c..3c36871001 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -1,5 +1,5 @@ { - "version": "1.1.0-*", + "version": "1.2.0-*", "description": "ASP.NET Core default HTTP feature implementations.", "packOptions": { "repository": { @@ -20,15 +20,21 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": "1.1.0-*", - "Microsoft.AspNetCore.WebUtilities": "1.1.0-*", - "Microsoft.Extensions.ObjectPool": "1.1.0-*", - "Microsoft.Extensions.Options": "1.1.0-*", + "Microsoft.AspNetCore.Http.Abstractions": { + "target": "project" + }, + "Microsoft.AspNetCore.WebUtilities": { + "target": "project" + }, + "Microsoft.Extensions.ObjectPool": "1.2.0-*", + "Microsoft.Extensions.Options": "1.2.0-*", "Microsoft.Extensions.TaskCache.Sources": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "build" }, - "Microsoft.Net.Http.Headers": "1.1.0-*", + "Microsoft.Net.Http.Headers": { + "target": "project" + }, "NETStandard.Library": "1.6.1-*", "System.Buffers": "4.3.0-*" }, diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index 8f7b98d876..d749c8739c 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -1,5 +1,5 @@ { - "version": "1.1.0-*", + "version": "1.2.0-*", "description": "ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application.", "packOptions": { "repository": { @@ -21,9 +21,11 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.AspNetCore.Http": "1.1.0-*", + "Microsoft.AspNetCore.Http": { + "target": "project" + }, "Microsoft.Extensions.TaskCache.Sources": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "build" }, "NETStandard.Library": "1.6.1-*" diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index bac509bd61..cf5b70e810 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -1,5 +1,5 @@ { - "version": "1.1.0-*", + "version": "1.2.0-*", "description": "ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings.", "packOptions": { "repository": { @@ -22,12 +22,14 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.1.0-*", + "Microsoft.Extensions.Primitives": "1.2.0-*", "Microsoft.Extensions.WebEncoders.Sources": { "type": "build", - "version": "1.1.0-*" + "version": "1.2.0-*" + }, + "Microsoft.Net.Http.Headers": { + "target": "project" }, - "Microsoft.Net.Http.Headers": "1.1.0-*", "NETStandard.Library": "1.6.1-*", "System.Buffers": "4.3.0-*", "System.Text.Encodings.Web": "4.3.0-*" diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 703cf5151c..2423b806d3 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,5 +1,5 @@ { - "version": "1.1.0-*", + "version": "1.2.0-*", "description": "HTTP header parser implementations.", "packOptions": { "repository": { @@ -19,7 +19,7 @@ "xmlDoc": true }, "dependencies": { - "Microsoft.Extensions.Primitives": "1.1.0-*", + "Microsoft.Extensions.Primitives": "1.2.0-*", "NETStandard.Library": "1.6.1-*", "System.Buffers": "4.3.0-*", "System.Diagnostics.Contracts": "4.3.0-*" diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 49264209e6..922292074b 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -5,8 +5,8 @@ }, "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.1.0-*", - "Microsoft.AspNetCore.Testing": "1.1.0-*", + "Microsoft.AspNetCore.Http": "1.2.0-*", + "Microsoft.AspNetCore.Testing": "1.2.0-*", "xunit": "2.2.0-*" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 15bffa1e68..93595a7521 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,9 +1,9 @@ { "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.1.0-*", - "Microsoft.AspNetCore.Http.Extensions": "1.1.0-*", - "Microsoft.Extensions.DependencyInjection": "1.1.0-*", + "Microsoft.AspNetCore.Http": "1.2.0-*", + "Microsoft.AspNetCore.Http.Extensions": "1.2.0-*", + "Microsoft.Extensions.DependencyInjection": "1.2.0-*", "xunit": "2.2.0-*" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 76304be5ff..2895cb3426 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http.Features": "1.1.0-*", + "Microsoft.AspNetCore.Http.Features": "1.2.0-*", "xunit": "2.2.0-*" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index fe093b87b3..0ca5f4fe50 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.1.0-*", + "Microsoft.AspNetCore.Http": "1.2.0-*", "xunit": "2.2.0-*" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index f6759ed2f0..d14e3e3174 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,9 +1,9 @@ { "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.1.0-*", - "Microsoft.AspNetCore.Owin": "1.1.0-*", - "Microsoft.Extensions.DependencyInjection": "1.1.0-*", + "Microsoft.AspNetCore.Http": "1.2.0-*", + "Microsoft.AspNetCore.Owin": "1.2.0-*", + "Microsoft.Extensions.DependencyInjection": "1.2.0-*", "xunit": "2.2.0-*" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 64495c2e19..f2ed6e6ce4 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.WebUtilities": "1.1.0-*", + "Microsoft.AspNetCore.WebUtilities": "1.2.0-*", "xunit": "2.2.0-*" }, "buildOptions": { diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 9a4bc65376..74f2ccc37c 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -2,7 +2,7 @@ "version": "1.1.0-*", "dependencies": { "dotnet-test-xunit": "2.2.0-*", - "Microsoft.Net.Http.Headers": "1.1.0-*", + "Microsoft.Net.Http.Headers": "1.2.0-*", "xunit": "2.2.0-*" }, "frameworks": { From aa158f5d2522949cc9566b060411ead324f6a943 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Wed, 2 Nov 2016 17:32:22 -0700 Subject: [PATCH 616/846] Modified Base64UrlTextEncoder to reduce string allocations. --- .../Base64UrlTextEncoder.cs | 74 +++++++++++++++++-- .../Properties/AssemblyInfo.cs | 4 +- .../Base64UrlTextEncoderTests.cs | 39 ++++++++++ .../project.json | 3 +- 4 files changed, 112 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs b/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs index 0402429878..a972fa8b9c 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.WebUtilities { @@ -15,7 +17,8 @@ namespace Microsoft.AspNetCore.WebUtilities /// Base64 encoded string modified with non-URL encodable characters public static string Encode(byte[] data) { - return Convert.ToBase64String(data).TrimEnd('=').Replace('+', '-').Replace('/', '_'); + var encodedValue = Convert.ToBase64String(data); + return EncodeInternal(encodedValue); } /// @@ -26,17 +29,76 @@ namespace Microsoft.AspNetCore.WebUtilities /// The decoded data. public static byte[] Decode(string text) { - return Convert.FromBase64String(Pad(text.Replace('-', '+').Replace('_', '/'))); + return Convert.FromBase64String(DecodeToBase64String(text)); } - private static string Pad(string text) + // To enable unit testing + internal static string EncodeInternal(string base64EncodedString) { - var padding = 3 - ((text.Length + 3) % 4); - if (padding == 0) + var length = base64EncodedString.Length; + while (length > 0 && base64EncodedString[length - 1] == '=') + { + length--; + } + + if (length == 0) + { + return string.Empty; + } + + var inplaceStringBuilder = new InplaceStringBuilder(length); + for (var i = 0; i < length; i++) + { + if (base64EncodedString[i] == '+') + { + inplaceStringBuilder.Append('-'); + } + else if (base64EncodedString[i] == '/') + { + inplaceStringBuilder.Append('_'); + } + else + { + inplaceStringBuilder.Append(base64EncodedString[i]); + } + } + + return inplaceStringBuilder.ToString(); + } + + // To enable unit testing + internal static string DecodeToBase64String(string text) + { + if (string.IsNullOrEmpty(text)) { return text; } - return text + new string('=', padding); + + var padLength = 3 - ((text.Length + 3) % 4); + var inplaceStringBuilder = new InplaceStringBuilder(capacity: text.Length + padLength); + + for (var i = 0; i < text.Length; i++) + { + if (text[i] == '-') + { + inplaceStringBuilder.Append('+'); + } + else if (text[i] == '_') + { + inplaceStringBuilder.Append('/'); + } + else + { + inplaceStringBuilder.Append(text[i]); + } + } + + for (var i = 0; i < padLength; i++) + { + inplaceStringBuilder.Append('='); + } + + return inplaceStringBuilder.ToString(); } } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs index 76feceeff0..0ebd229a18 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs @@ -3,9 +3,11 @@ using System.Reflection; using System.Resources; +using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] [assembly: AssemblyCompany("Microsoft Corporation.")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyProduct("Microsoft ASP.NET Core")] +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.WebUtilities.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] +[assembly: NeutralResourcesLanguage("en-us")] diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs index 2034ea33d7..7a5701cc85 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Xunit; namespace Microsoft.AspNetCore.WebUtilities @@ -26,5 +27,43 @@ namespace Microsoft.AspNetCore.WebUtilities } } } + + [Theory] + [InlineData("", "")] + [InlineData("+", "-")] + [InlineData("/", "_")] + [InlineData("=", "")] + [InlineData("==", "")] + [InlineData("a+b+c+==", "a-b-c-")] + [InlineData("a/b/c==", "a_b_c")] + [InlineData("a+b/c==", "a-b_c")] + [InlineData("a+b/c", "a-b_c")] + [InlineData("abcd", "abcd")] + public void EncodeInternal_Replaces_UrlEncodableCharacters(string base64EncodedValue, string expectedValue) + { + // Arrange & Act + var result = Base64UrlTextEncoder.EncodeInternal(base64EncodedValue); + + // Assert + Assert.Equal(expectedValue, result); + } + + [Theory] + [InlineData("_", "/===")] + [InlineData("-", "+===")] + [InlineData("a-b-c", "a+b+c===")] + [InlineData("a_b_c_d", "a/b/c/d=")] + [InlineData("a-b_c", "a+b/c===")] + [InlineData("a-b_c-d", "a+b/c+d=")] + [InlineData("a-b_c", "a+b/c===")] + [InlineData("abcd", "abcd")] + public void DecodeToBase64String_ReturnsValid_Base64String(string text, string expectedValue) + { + // Arrange & Act + var actual = Base64UrlTextEncoder.DecodeToBase64String(text); + + // Assert + Assert.Equal(expectedValue, actual); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index f2ed6e6ce4..4975197e7f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -5,7 +5,8 @@ "xunit": "2.2.0-*" }, "buildOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "testRunner": "xunit", "frameworks": { From d95f32219af4673320a5a16d9ccc5cdd83ebef7f Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 18 Nov 2016 10:56:54 -0800 Subject: [PATCH 617/846] Clean tmp folder after unzipping KoreBuild --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index f4208100eb..4fd7ede788 100755 --- a/build.sh +++ b/build.sh @@ -38,7 +38,7 @@ if test ! -d $buildFolder; then chmod +x $buildFile # Cleanup - if test ! -d $tempFolder; then + if test -d $tempFolder; then rm -rf $tempFolder fi fi From 156c0ef35a6b301097e8a3162934ae6253bb6ee1 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 23 Nov 2016 15:58:10 -0800 Subject: [PATCH 618/846] Pin global.json SDK to 1.0.0-preview2-1-003177. --- global.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 983ba0401e..f45e8cc925 100644 --- a/global.json +++ b/global.json @@ -1,3 +1,8 @@ { - "projects": ["src"] -} + "projects": [ + "src" + ], + "sdk": { + "version": "1.0.0-preview2-1-003177" + } +} \ No newline at end of file From b727f0e1ac1b7c7c3cf355e5104768380db16819 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 8 Dec 2016 10:02:40 -0800 Subject: [PATCH 619/846] Update .travis.yml osx image to xcode7.3. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a6d73375dd..eccfa34907 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ mono: os: - linux - osx -osx_image: xcode7.1 +osx_image: xcode7.3 branches: only: - master From d50a24145d15ac0e9f6d7ed919ae975a9ed9a646 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 8 Dec 2016 17:19:33 -0800 Subject: [PATCH 620/846] Add functionalities to HeaderUtilities - Add allocation free parsing of int32, int64 - Improve performance of converting int64 to string - Add parsing of seconds from header values - Add check for existence of cache directives - Expose CacheControlHeaderValue constants --- .../HostString.cs | 2 +- .../Internal/ParsingHelpers.cs | 8 +- .../Internal/ParsingHelpers.cs | 5 +- .../CacheControlHeaderValue.cs | 155 ++++++--- .../ContentDispositionHeaderValue.cs | 8 +- .../HeaderUtilities.cs | 313 +++++++++++++++++- .../HttpRuleParser.cs | 17 +- .../Properties/AssemblyInfo.cs | 2 + src/Microsoft.Net.Http.Headers/project.json | 1 + .../HeaderUtilitiesTest.cs | 137 +++++++- .../project.json | 5 +- 11 files changed, 573 insertions(+), 80 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs index 4b4b24f7e5..3ac23d9c40 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs @@ -98,7 +98,7 @@ namespace Microsoft.AspNetCore.Http { return null; } - + return p; } } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs index 7cac98cf3d..fb6af992ce 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs @@ -68,10 +68,10 @@ namespace Microsoft.AspNetCore.Http.Internal // Quote items that contain comas and are not already quoted. private static string QuoteIfNeeded(string value) { - if (!string.IsNullOrWhiteSpace(value) && - value.Contains(',') && + if (!string.IsNullOrWhiteSpace(value) && + value.Contains(',') && (value[0] != '"' || value[value.Length - 1] != '"')) - { + { return $"\"{value}\""; } return value; @@ -79,7 +79,7 @@ namespace Microsoft.AspNetCore.Http.Internal private static string DeQuote(string value) { - if (!string.IsNullOrWhiteSpace(value) && + if (!string.IsNullOrWhiteSpace(value) && (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"')) { value = value.Substring(1, value.Length - 2); diff --git a/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs index 5e406d8513..57b1a7a911 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs @@ -411,12 +411,11 @@ namespace Microsoft.AspNetCore.Http.Internal throw new ArgumentNullException(nameof(headers)); } - const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; var rawValue = headers[HeaderNames.ContentLength]; if (rawValue.Count == 1 && !string.IsNullOrWhiteSpace(rawValue[0]) && - long.TryParse(rawValue[0], styles, CultureInfo.InvariantCulture, out value)) + HeaderUtilities.TryParseInt64(new StringSegment(rawValue[0]).Trim(), out value)) { return value; } @@ -433,7 +432,7 @@ namespace Microsoft.AspNetCore.Http.Internal if (value.HasValue) { - headers[HeaderNames.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); + headers[HeaderNames.ContentLength] = HeaderUtilities.FormatInt64(value.Value); } else { diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index 7ad65ac3bc..c0d28bdc9a 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -11,18 +11,18 @@ namespace Microsoft.Net.Http.Headers { public class CacheControlHeaderValue { - private const string MaxAgeString = "max-age"; - private const string MaxStaleString = "max-stale"; - private const string MinFreshString = "min-fresh"; - private const string MustRevalidateString = "must-revalidate"; - private const string NoCacheString = "no-cache"; - private const string NoStoreString = "no-store"; - private const string NoTransformString = "no-transform"; - private const string OnlyIfCachedString = "only-if-cached"; - private const string PrivateString = "private"; - private const string ProxyRevalidateString = "proxy-revalidate"; - private const string PublicString = "public"; - private const string SharedMaxAgeString = "s-maxage"; + public static readonly string PublicString = "public"; + public static readonly string PrivateString = "private"; + public static readonly string MaxAgeString = "max-age"; + public static readonly string SharedMaxAgeString = "s-maxage"; + public static readonly string NoCacheString = "no-cache"; + public static readonly string NoStoreString = "no-store"; + public static readonly string MaxStaleString = "max-stale"; + public static readonly string MinFreshString = "min-fresh"; + public static readonly string NoTransformString = "no-transform"; + public static readonly string OnlyIfCachedString = "only-if-cached"; + public static readonly string MustRevalidateString = "must-revalidate"; + public static readonly string ProxyRevalidateString = "proxy-revalidate"; // The Cache-Control header is special: It is a header supporting a list of values, but we represent the list // as _one_ instance of CacheControlHeaderValue. I.e we set 'SupportsMultipleValues' to 'true' since it is @@ -394,63 +394,120 @@ namespace Microsoft.Net.Http.Headers CacheControlHeaderValue cc, List nameValueList) { - foreach (NameValueHeaderValue nameValue in nameValueList) + for (var i = 0; i < nameValueList.Count; i++) { + var nameValue = nameValueList[i]; + var name = nameValue.Name; var success = true; - string name = nameValue.Name.ToLowerInvariant(); - switch (name) + switch (name.Length) { - case NoCacheString: - success = TrySetOptionalTokenList(nameValue, ref cc._noCache, ref cc._noCacheHeaders); - break; - - case NoStoreString: - success = TrySetTokenOnlyValue(nameValue, ref cc._noStore); - break; - - case MaxAgeString: - success = TrySetTimeSpan(nameValue, ref cc._maxAge); - break; - - case MaxStaleString: - success = ((nameValue.Value == null) || TrySetTimeSpan(nameValue, ref cc._maxStaleLimit)); - if (success) + case 6: + if (string.Equals(PublicString, name, StringComparison.OrdinalIgnoreCase)) { - cc._maxStale = true; + success = TrySetTokenOnlyValue(nameValue, ref cc._public); + } + else + { + goto default; } break; - case MinFreshString: - success = TrySetTimeSpan(nameValue, ref cc._minFresh); + case 7: + if (string.Equals(MaxAgeString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTimeSpan(nameValue, ref cc._maxAge); + } + else if(string.Equals(PrivateString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetOptionalTokenList(nameValue, ref cc._private, ref cc._privateHeaders); + } + else + { + goto default; + } break; - case NoTransformString: - success = TrySetTokenOnlyValue(nameValue, ref cc._noTransform); + case 8: + if (string.Equals(NoCacheString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetOptionalTokenList(nameValue, ref cc._noCache, ref cc._noCacheHeaders); + } + else if (string.Equals(NoStoreString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTokenOnlyValue(nameValue, ref cc._noStore); + } + else if (string.Equals(SharedMaxAgeString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTimeSpan(nameValue, ref cc._sharedMaxAge); + } + else + { + goto default; + } break; - case OnlyIfCachedString: - success = TrySetTokenOnlyValue(nameValue, ref cc._onlyIfCached); + case 9: + if (string.Equals(MaxStaleString, name, StringComparison.OrdinalIgnoreCase)) + { + success = ((nameValue.Value == null) || TrySetTimeSpan(nameValue, ref cc._maxStaleLimit)); + if (success) + { + cc._maxStale = true; + } + } + else if (string.Equals(MinFreshString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTimeSpan(nameValue, ref cc._minFresh); + } + else + { + goto default; + } break; - case PublicString: - success = TrySetTokenOnlyValue(nameValue, ref cc._public); + case 12: + if (string.Equals(NoTransformString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTokenOnlyValue(nameValue, ref cc._noTransform); + } + else + { + goto default; + } break; - case PrivateString: - success = TrySetOptionalTokenList(nameValue, ref cc._private, ref cc._privateHeaders); + case 14: + if (string.Equals(OnlyIfCachedString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTokenOnlyValue(nameValue, ref cc._onlyIfCached); + } + else + { + goto default; + } break; - case MustRevalidateString: - success = TrySetTokenOnlyValue(nameValue, ref cc._mustRevalidate); + case 15: + if (string.Equals(MustRevalidateString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTokenOnlyValue(nameValue, ref cc._mustRevalidate); + } + else + { + goto default; + } break; - case ProxyRevalidateString: - success = TrySetTokenOnlyValue(nameValue, ref cc._proxyRevalidate); - break; - - case SharedMaxAgeString: - success = TrySetTimeSpan(nameValue, ref cc._sharedMaxAge); + case 16: + if (string.Equals(ProxyRevalidateString, name, StringComparison.OrdinalIgnoreCase)) + { + success = TrySetTokenOnlyValue(nameValue, ref cc._proxyRevalidate); + } + else + { + goto default; + } break; default: diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index b7a2253ac9..e3542480ba 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -104,13 +104,13 @@ namespace Microsoft.Net.Http.Headers get { var sizeParameter = NameValueHeaderValue.Find(_parameters, SizeString); - ulong value; + long value; if (sizeParameter != null) { - string sizeString = sizeParameter.Value; - if (UInt64.TryParse(sizeString, NumberStyles.Integer, CultureInfo.InvariantCulture, out value)) + var sizeString = sizeParameter.Value; + if (HeaderUtilities.TryParseInt64(sizeString, out value)) { - return (long)value; + return value; } } return null; diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 786b54ddb9..4dd1081be9 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -5,11 +5,13 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { public static class HeaderUtilities { + private static readonly int _int64MaxStringLength = 20; private const string QualityName = "q"; internal const string BytesUnit = "bytes"; @@ -198,19 +200,322 @@ namespace Microsoft.Net.Http.Headers return current; } + /// + /// Try to find a target header value among the set of given header values and parse it as a + /// . + /// + /// + /// The containing the set of header values to search. + /// + /// + /// The target header value to look for. + /// + /// + /// When this method returns, contains the parsed , if the parsing succeeded, or + /// null if the parsing failed. The conversion fails if the was not + /// found or could not be parsed as a . This parameter is passed uninitialized; + /// any value originally supplied in result will be overwritten. + /// + /// + /// true if is found and successfully parsed; otherwise, + /// false. + /// + // e.g. { "headerValue=10, targetHeaderValue=30" } + public static bool TryParseSeconds(StringValues headerValues, string targetValue, out TimeSpan? value) + { + if (StringValues.IsNullOrEmpty(headerValues) || string.IsNullOrEmpty(targetValue)) + { + value = null; + return false; + } + + for (var i = 0; i < headerValues.Count; i++) + { + // Trim leading white space + var current = HttpRuleParser.GetWhitespaceLength(headerValues[i], 0); + + while (current < headerValues[i].Length) + { + long seconds; + var tokenLength = HttpRuleParser.GetTokenLength(headerValues[i], current); + if (tokenLength == targetValue.Length + && string.Compare(headerValues[i], current, targetValue, 0, tokenLength, StringComparison.OrdinalIgnoreCase) == 0 + && TryParseInt64FromHeaderValue(current + tokenLength, headerValues[i], out seconds)) + { + // Token matches target value and seconds were parsed + value = TimeSpan.FromSeconds(seconds); + return true; + } + else + { + // Skip until the next potential name + current += tokenLength; + current += HttpRuleParser.GetWhitespaceLength(headerValues[i], current); + + // Skip the value if present + if (current < headerValues[i].Length && headerValues[i][current] == '=') + { + current++; // skip '=' + current += NameValueHeaderValue.GetValueLength(headerValues[i], current); + current += HttpRuleParser.GetWhitespaceLength(headerValues[i], current); + } + + // Skip the delimiter + if (current < headerValues[i].Length && headerValues[i][current] == ',') + { + current++; // skip ',' + current += HttpRuleParser.GetWhitespaceLength(headerValues[i], current); + } + } + } + } + value = null; + return false; + } + + /// + /// Check if a target directive exists among the set of given cache control directives. + /// + /// + /// The containing the set of cache control directives. + /// + /// + /// The target cache control directives to look for. + /// + /// + /// true if is contained in ; + /// otherwise, false. + /// + public static bool ContainsCacheDirective(StringValues cacheControlDirectives, string targetDirectives) + { + if (StringValues.IsNullOrEmpty(cacheControlDirectives) || string.IsNullOrEmpty(targetDirectives)) + { + return false; + } + + + for (var i = 0; i < cacheControlDirectives.Count; i++) + { + // Trim leading white space + var current = HttpRuleParser.GetWhitespaceLength(cacheControlDirectives[i], 0); + + while (current < cacheControlDirectives[i].Length) + { + var tokenLength = HttpRuleParser.GetTokenLength(cacheControlDirectives[i], current); + if (tokenLength == targetDirectives.Length + && string.Compare(cacheControlDirectives[i], current, targetDirectives, 0, tokenLength, StringComparison.OrdinalIgnoreCase) == 0) + { + // Token matches target value + return true; + } + else + { + // Skip until the next potential name + current += tokenLength; + current += HttpRuleParser.GetWhitespaceLength(cacheControlDirectives[i], current); + + // Skip the value if present + if (current < cacheControlDirectives[i].Length && cacheControlDirectives[i][current] == '=') + { + current++; // skip '=' + current += NameValueHeaderValue.GetValueLength(cacheControlDirectives[i], current); + current += HttpRuleParser.GetWhitespaceLength(cacheControlDirectives[i], current); + } + + // Skip the delimiter + if (current < cacheControlDirectives[i].Length && cacheControlDirectives[i][current] == ',') + { + current++; // skip ',' + current += HttpRuleParser.GetWhitespaceLength(cacheControlDirectives[i], current); + } + } + } + } + + return false; + } + + private static unsafe bool TryParseInt64FromHeaderValue(int startIndex, string headerValue, out long result) + { + // Trim leading whitespace + startIndex += HttpRuleParser.GetWhitespaceLength(headerValue, startIndex); + + // Match and skip '=', it also can't be the last character in the headerValue + if (startIndex >= headerValue.Length - 1 || headerValue[startIndex] != '=') + { + result = 0; + return false; + } + startIndex++; + + // Trim trailing whitespace + startIndex += HttpRuleParser.GetWhitespaceLength(headerValue, startIndex); + + // Try parse the number + if (TryParseInt64(new StringSegment(headerValue, startIndex, HttpRuleParser.GetNumberLength(headerValue, startIndex, false)), out result)) + { + return true; + } + + result = 0; + return false; + } + internal static bool TryParseInt32(string value, out int result) { - return int.TryParse(value, NumberStyles.None, NumberFormatInfo.InvariantInfo, out result); + return TryParseInt32(new StringSegment(value), out result); } + /// + /// Try to convert a string representation of a positive number to its 64-bit signed integer equivalent. + /// A return value indicates whether the conversion succeeded or failed. + /// + /// + /// A string containing a number to convert. + /// + /// + /// When this method returns, contains the 64-bit signed integer value equivalent of the number contained + /// in the string, if the conversion succeeded, or zero if the conversion failed. The conversion fails if + /// the string is null or String.Empty, is not of the correct format, is negative, or represents a number + /// greater than Int64.MaxValue. This parameter is passed uninitialized; any value originally supplied in + /// result will be overwritten. + /// + /// true if parsing succeeded; otherwise, false. public static bool TryParseInt64(string value, out long result) { - return long.TryParse(value, NumberStyles.None, NumberFormatInfo.InvariantInfo, out result); + return TryParseInt64(new StringSegment(value), out result); } - public static string FormatInt64(long value) + internal static unsafe bool TryParseInt32(StringSegment value, out int result) { - return value.ToString(CultureInfo.InvariantCulture); + if (string.IsNullOrEmpty(value.Buffer) || value.Length == 0) + { + result = 0; + return false; + } + + result = 0; + fixed (char* ptr = value.Buffer) + { + var ch = (ushort*)ptr + value.Offset; + var end = ch + value.Length; + + ushort digit = 0; + while (ch < end && (digit = (ushort)(*ch - 0x30)) <= 9) + { + // Check for overflow + if ((result = result * 10 + digit) < 0) + { + result = 0; + return false; + } + + ch++; + } + + if (ch != end) + { + result = 0; + return false; + } + return true; + } + } + + /// + /// Try to convert a representation of a positive number to its 64-bit signed + /// integer equivalent. A return value indicates whether the conversion succeeded or failed. + /// + /// + /// A containing a number to convert. + /// + /// + /// When this method returns, contains the 64-bit signed integer value equivalent of the number contained + /// in the string, if the conversion succeeded, or zero if the conversion failed. The conversion fails if + /// the is null or String.Empty, is not of the correct format, is negative, or + /// represents a number greater than Int64.MaxValue. This parameter is passed uninitialized; any value + /// originally supplied in result will be overwritten. + /// + /// true if parsing succeeded; otherwise, false. + public static unsafe bool TryParseInt64(StringSegment value, out long result) + { + if (string.IsNullOrEmpty(value.Buffer) || value.Length == 0) + { + result = 0; + return false; + } + + result = 0; + fixed (char* ptr = value.Buffer) + { + var ch = (ushort*)ptr + value.Offset; + var end = ch + value.Length; + + ushort digit = 0; + while (ch < end && (digit = (ushort)(*ch - 0x30)) <= 9) + { + // Check for overflow + if ((result = result * 10 + digit) < 0) + { + result = 0; + return false; + } + + ch++; + } + + if (ch != end) + { + result = 0; + return false; + } + return true; + } + } + + /// + /// Converts the signed 64-bit numeric value to its equivalent string representation. + /// + /// + /// The number to convert. + /// + /// + /// The string representation of the value of this instance, consisting of a minus sign if the value is + /// negative, and a sequence of digits ranging from 0 to 9 with no leading zeroes. + /// + public unsafe static string FormatInt64(long value) + { + var position = _int64MaxStringLength; + var negative = false; + + if (value < 0) + { + // Not possible to compute absolute value of MinValue, return the exact string instead. + if (value == long.MinValue) + { + return "-9223372036854775808"; + } + negative = true; + value = -value; + } + + char* charBuffer = stackalloc char[_int64MaxStringLength]; + + do + { + // Consider using Math.DivRem() if available + var quotient = value / 10; + charBuffer[--position] = (char)(0x30 + (value - quotient * 10)); // 0x30 = '0' + value = quotient; + } + while (value != 0); + + if (negative) + { + charBuffer[--position] = '-'; + } + + return new string(charBuffer, position, _int64MaxStringLength - position); } public static bool TryParseDate(string input, out DateTimeOffset result) diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 637835996c..835a2f35bb 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -233,18 +233,11 @@ namespace Microsoft.Net.Http.Headers return HttpParseResult.Parsed; } - internal static bool TryStringToDate(string input, out DateTimeOffset result) - { - // Try the various date formats in the order listed above. - // We should accept a wide verity of common formats, but only output RFC 1123 style dates. - if (DateTimeOffset.TryParseExact(input, DateFormats, DateTimeFormatInfo.InvariantInfo, - DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, out result)) - { - return true; - } - - return false; - } + // Try the various date formats in the order listed above. + // We should accept a wide verity of common formats, but only output RFC 1123 style dates. + internal static bool TryStringToDate(string input, out DateTimeOffset result) => + DateTimeOffset.TryParseExact(input, DateFormats, DateTimeFormatInfo.InvariantInfo, + DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, out result); // TEXT = // LWS = [CRLF] 1*( SP | HT ) diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index 76feceeff0..538f508dce 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -3,9 +3,11 @@ using System.Reflection; using System.Resources; +using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: NeutralResourcesLanguage("en-us")] [assembly: AssemblyCompany("Microsoft Corporation.")] [assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] [assembly: AssemblyProduct("Microsoft ASP.NET Core")] +[assembly: InternalsVisibleTo("Microsoft.Net.Http.Headers.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 2423b806d3..f6dbda4ef5 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -11,6 +11,7 @@ ] }, "buildOptions": { + "allowUnsafe": true, "warningsAsErrors": true, "keyFile": "../../tools/Key.snk", "nowarn": [ diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs index ccae6e577f..cde811a082 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -2,17 +2,19 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Globalization; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.Net.Http.Headers { - public static class HeaderUtilitiesTest + public class HeaderUtilitiesTest { private const string Rfc1123Format = "r"; [Theory] [MemberData(nameof(TestValues))] - public static void ReturnsSameResultAsRfc1123String(DateTimeOffset dateTime, bool quoted) + public void ReturnsSameResultAsRfc1123String(DateTimeOffset dateTime, bool quoted) { var formatted = dateTime.ToString(Rfc1123Format); var expected = quoted ? $"\"{formatted}\"" : formatted; @@ -44,5 +46,136 @@ namespace Microsoft.Net.Http.Headers return data; } } + + [Theory] + [InlineData("h=1", "h", 1)] + [InlineData("directive1=3, directive2=10", "directive1", 3)] + [InlineData("directive1 =45, directive2=80", "directive1", 45)] + [InlineData("directive1= 89 , directive2=22", "directive1", 89)] + [InlineData("directive1= 89 , directive2= 42", "directive2", 42)] + [InlineData("directive1= 89 , directive= 42", "directive", 42)] + public void TryParseSeconds_Succeeds(string headerValues, string targetValue, int expectedValue) + { + TimeSpan? value; + Assert.True(HeaderUtilities.TryParseSeconds(new StringValues(headerValues), targetValue, out value)); + Assert.Equal(TimeSpan.FromSeconds(expectedValue), value); + } + + [Theory] + [InlineData("", "")] + [InlineData(null, null)] + [InlineData("h=", "h")] + [InlineData("directive1=, directive2=10", "directive1")] + [InlineData("directive1 , directive2=80", "directive1")] + [InlineData("h=10", "directive")] + [InlineData("directive1", "directive")] + [InlineData("h=directive", "directive")] + [InlineData("directive1, directive2=80", "directive")] + public void TryParseSeconds_Fails(string headerValues, string targetValue) + { + TimeSpan? value; + Assert.False(HeaderUtilities.TryParseSeconds(new StringValues(headerValues), targetValue, out value)); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(-1)] + [InlineData(1234567890)] + [InlineData(-1234567890)] + [InlineData(long.MaxValue)] + [InlineData(long.MinValue)] + [InlineData(long.MinValue + 1)] + public void FormatInt64_MatchesToString(long value) + { + Assert.Equal(value.ToString(CultureInfo.InvariantCulture), HeaderUtilities.FormatInt64(value)); + } + + [Theory] + [InlineData("h", "h", true)] + [InlineData("h=", "h", true)] + [InlineData("h=1", "h", true)] + [InlineData("H", "h", true)] + [InlineData("H=", "h", true)] + [InlineData("H=1", "h", true)] + [InlineData("h", "H", true)] + [InlineData("h=", "H", true)] + [InlineData("h=1", "H", true)] + [InlineData("directive1, directive=10", "directive1", true)] + [InlineData("directive1=, directive=10", "directive1", true)] + [InlineData("directive1=3, directive=10", "directive1", true)] + [InlineData("directive1 , directive=80", "directive1", true)] + [InlineData(" directive1, directive=80", "directive1", true)] + [InlineData("directive1 =45, directive=80", "directive1", true)] + [InlineData("directive1= 89 , directive=22", "directive1", true)] + [InlineData("directive1, directive", "directive", true)] + [InlineData("directive1, directive=", "directive", true)] + [InlineData("directive1, directive=10", "directive", true)] + [InlineData("directive1=3, directive", "directive", true)] + [InlineData("directive1=3, directive=", "directive", true)] + [InlineData("directive1=3, directive=10", "directive", true)] + [InlineData("directive1= 89 , directive= 42", "directive", true)] + [InlineData("directive1= 89 , directive = 42", "directive", true)] + [InlineData(null, null, false)] + [InlineData(null, "", false)] + [InlineData("", null, false)] + [InlineData("", "", false)] + [InlineData("h=10", "directive", false)] + [InlineData("directive1", "directive", false)] + [InlineData("h=directive", "directive", false)] + [InlineData("directive1, directive2=80", "directive", false)] + public void ContainsCacheDirective_MatchesExactValue(string headerValues, string targetValue, bool contains) + { + Assert.Equal(contains, HeaderUtilities.ContainsCacheDirective(new StringValues(headerValues), targetValue)); + } + + [Theory] + [InlineData("")] + [InlineData(null)] + [InlineData("-1")] + [InlineData("a")] + [InlineData("1.1")] + [InlineData("9223372036854775808")] // long.MaxValue + 1 + public void TryParseInt64_Fails(string valueString) + { + long value = 1; + Assert.False(HeaderUtilities.TryParseInt64(valueString, out value)); + Assert.Equal(0, value); + } + + [Theory] + [InlineData("0", 0)] + [InlineData("9223372036854775807", 9223372036854775807)] // long.MaxValue + public void TryParseInt64_Succeeds(string valueString, long expected) + { + long value = 1; + Assert.True(HeaderUtilities.TryParseInt64(valueString, out value)); + Assert.Equal(expected, value); + } + + [Theory] + [InlineData("")] + [InlineData(null)] + [InlineData("-1")] + [InlineData("a")] + [InlineData("1.1")] + [InlineData("1,000")] + [InlineData("2147483648")] // int.MaxValue + 1 + public void TryParseInt32_Fails(string valueString) + { + int value = 1; + Assert.False(HeaderUtilities.TryParseInt32(valueString, out value)); + Assert.Equal(0, value); + } + + [Theory] + [InlineData("0", 0)] + [InlineData("2147483647", 2147483647)] // int.MaxValue + public void TryParseInt32_Succeeds(string valueString, long expected) + { + int value = 1; + Assert.True(HeaderUtilities.TryParseInt32(valueString, out value)); + Assert.Equal(expected, value); + } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 74f2ccc37c..ca1768246b 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,10 +1,13 @@ { - "version": "1.1.0-*", "dependencies": { "dotnet-test-xunit": "2.2.0-*", "Microsoft.Net.Http.Headers": "1.2.0-*", "xunit": "2.2.0-*" }, + "buildOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "frameworks": { "netcoreapp1.1": { "dependencies": { From a12de2cfd94737b51e22f75a910928f2cdd5e47e Mon Sep 17 00:00:00 2001 From: Andrius Bentkus Date: Wed, 30 Nov 2016 15:46:52 +0200 Subject: [PATCH 621/846] Small typo fix --- src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs | 2 +- src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs index 7dd22d19f2..8df33f62ad 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Http public abstract class HttpRequest { /// - /// Gets the this request; + /// Gets the for this request. /// public abstract HttpContext HttpContext { get; } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs index 9bccf26976..b34df35a4e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Http }; /// - /// Gets the for this request. + /// Gets the for this response. /// public abstract HttpContext HttpContext { get; } From 15d05c2e3ddae01941db9e98767ddf4613c950b0 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Mon, 12 Dec 2016 00:40:09 -0800 Subject: [PATCH 622/846] Removed packages list in NuGetPackageVerifier.json --- NuGetPackageVerifier.json | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 9b4aae6984..b153ab1515 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -1,19 +1,5 @@ { - "adx": { // Packages written by the ADX team and that ship on NuGet.org - "rules": [ - "AdxVerificationCompositeRule" - ], - "packages": { - "Microsoft.AspNetCore.Http": { }, - "Microsoft.AspNetCore.Http.Abstractions": { }, - "Microsoft.AspNetCore.Http.Extensions": { }, - "Microsoft.AspNetCore.Http.Features": { }, - "Microsoft.AspNetCore.Owin": { }, - "Microsoft.AspNetCore.WebUtilities": { }, - "Microsoft.Net.Http.Headers": { } - } - }, - "Default": { // Rules to run for packages not listed in any other set. + "Default": { "rules": [ "DefaultCompositeRule" ] From 991fbb08bc3e0d076fc4e49d72a80a93bab0b789 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 5 Dec 2016 09:02:44 -0800 Subject: [PATCH 623/846] Updating to 4.4 CoreFx packages --- global.json | 2 +- samples/SampleApp/project.json | 2 +- .../project.json | 8 ++++---- src/Microsoft.AspNetCore.Http.Extensions/project.json | 4 ++-- src/Microsoft.AspNetCore.Http.Features/project.json | 10 +++++----- src/Microsoft.AspNetCore.Http/project.json | 4 ++-- src/Microsoft.AspNetCore.Owin/project.json | 2 +- src/Microsoft.AspNetCore.WebUtilities/project.json | 6 +++--- src/Microsoft.Net.Http.Headers/project.json | 6 +++--- .../project.json | 2 +- .../project.json | 2 +- .../project.json | 2 +- test/Microsoft.AspNetCore.Http.Tests/project.json | 2 +- test/Microsoft.AspNetCore.Owin.Tests/project.json | 2 +- .../project.json | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 2 +- 16 files changed, 29 insertions(+), 29 deletions(-) diff --git a/global.json b/global.json index f45e8cc925..0ad1995dd2 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "src" ], "sdk": { - "version": "1.0.0-preview2-1-003177" + "version": "1.0.0-preview2-1-003180" } } \ No newline at end of file diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 415439e0b3..04e1eb1724 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -9,7 +9,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index e72b4b7f61..30271f7b2b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -30,8 +30,8 @@ "version": "1.2.0-*", "type": "build" }, - "NETStandard.Library": "1.6.1-*", - "System.Text.Encodings.Web": "4.3.0-*", + "NETStandard.Library": "1.6.2-*", + "System.Text.Encodings.Web": "4.4.0-*", "Microsoft.Extensions.Primitives": "1.2.0-*" }, "frameworks": { @@ -44,8 +44,8 @@ }, "netstandard1.3": { "dependencies": { - "System.Globalization.Extensions": "4.3.0-*", - "System.Reflection.TypeExtensions": "4.3.0-*" + "System.Globalization.Extensions": "4.4.0-*", + "System.Reflection.TypeExtensions": "4.4.0-*" } } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 8e9cc29a69..83c8c55005 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -26,8 +26,8 @@ "Microsoft.Net.Http.Headers": { "target": "project" }, - "NETStandard.Library": "1.6.1-*", - "System.Buffers": "4.3.0-*" + "NETStandard.Library": "1.6.2-*", + "System.Buffers": "4.4.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json index 7f09a0a2a0..f3ffbab19e 100644 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ b/src/Microsoft.AspNetCore.Http.Features/project.json @@ -20,16 +20,16 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.2.0-*", - "NETStandard.Library": "1.6.1-*" + "NETStandard.Library": "1.6.2-*" }, "frameworks": { "net451": {}, "netstandard1.3": { "dependencies": { - "System.ComponentModel": "4.3.0-*", - "System.Net.WebSockets": "4.3.0-*", - "System.Security.Claims": "4.3.0-*", - "System.Security.Principal": "4.3.0-*" + "System.ComponentModel": "4.4.0-*", + "System.Net.WebSockets": "4.4.0-*", + "System.Security.Claims": "4.4.0-*", + "System.Security.Principal": "4.4.0-*" } } } diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 3c36871001..fcd3470326 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -35,8 +35,8 @@ "Microsoft.Net.Http.Headers": { "target": "project" }, - "NETStandard.Library": "1.6.1-*", - "System.Buffers": "4.3.0-*" + "NETStandard.Library": "1.6.2-*", + "System.Buffers": "4.4.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json index d749c8739c..9b0cbc2431 100644 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ b/src/Microsoft.AspNetCore.Owin/project.json @@ -28,7 +28,7 @@ "version": "1.2.0-*", "type": "build" }, - "NETStandard.Library": "1.6.1-*" + "NETStandard.Library": "1.6.2-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json index cf5b70e810..7d77e14ec5 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ b/src/Microsoft.AspNetCore.WebUtilities/project.json @@ -30,9 +30,9 @@ "Microsoft.Net.Http.Headers": { "target": "project" }, - "NETStandard.Library": "1.6.1-*", - "System.Buffers": "4.3.0-*", - "System.Text.Encodings.Web": "4.3.0-*" + "NETStandard.Library": "1.6.2-*", + "System.Buffers": "4.4.0-*", + "System.Text.Encodings.Web": "4.4.0-*" }, "frameworks": { "net451": { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index f6dbda4ef5..a8056cfa12 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -21,9 +21,9 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.2.0-*", - "NETStandard.Library": "1.6.1-*", - "System.Buffers": "4.3.0-*", - "System.Diagnostics.Contracts": "4.3.0-*" + "NETStandard.Library": "1.6.2-*", + "System.Buffers": "4.4.0-*", + "System.Diagnostics.Contracts": "4.4.0-*" }, "frameworks": { "netstandard1.1": {} diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 922292074b..675f58de39 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -13,7 +13,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 93595a7521..c6773f1c42 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -10,7 +10,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 2895cb3426..ba4aa736ec 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -8,7 +8,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index 0ca5f4fe50..8c94549ec7 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -8,7 +8,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index d14e3e3174..b3e3d40a57 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -10,7 +10,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 4975197e7f..374f049dd2 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -13,7 +13,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index ca1768246b..db80e9686f 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -12,7 +12,7 @@ "netcoreapp1.1": { "dependencies": { "Microsoft.NETCore.App": { - "version": "1.1.0-*", + "version": "1.2.0-*", "type": "platform" } } From b34bfdd92d3ad888f85e8963c1d2532772867328 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 28 Dec 2016 15:08:15 -0800 Subject: [PATCH 624/846] Add 101 status code --- src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs | 2 ++ src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index 0d169b1982..bcc8487826 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -5,6 +5,8 @@ namespace Microsoft.AspNetCore.Http { public static class StatusCodes { + public const int Status101SwitchingProtocols = 101; + public const int Status200OK = 200; public const int Status201Created = 201; public const int Status202Accepted = 202; diff --git a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs index 07d5b4212f..eb6aa120e7 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs @@ -9,6 +9,8 @@ namespace Microsoft.AspNetCore.WebUtilities { private static IDictionary Phrases = new Dictionary() { + { 101, "Switching Protocols" }, + { 200, "OK" }, { 201, "Created" }, { 202, "Accepted" }, From 7d20ae215695fa6fae2e79cca1f806a8209c6d7e Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 5 Jan 2017 13:45:49 -0800 Subject: [PATCH 625/846] Add more status codes and reason phrases --- .../StatusCodes.cs | 9 +++++++++ .../ReasonPhrases.cs | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index bcc8487826..2efccfc518 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -3,8 +3,10 @@ namespace Microsoft.AspNetCore.Http { + // Status Codes listed at http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml public static class StatusCodes { + public const int Status100Continue = 100; public const int Status101SwitchingProtocols = 101; public const int Status200OK = 200; @@ -46,9 +48,14 @@ namespace Microsoft.AspNetCore.Http public const int Status417ExpectationFailed = 417; public const int Status418ImATeapot = 418; public const int Status419AuthenticationTimeout = 419; + public const int Status421MisdirectedRequest = 421; public const int Status422UnprocessableEntity = 422; public const int Status423Locked = 423; public const int Status424FailedDependency = 424; + public const int Status426UpgradeRequired = 426; + public const int Status428PreconditionRequired = 428; + public const int Status429TooManyRequests = 429; + public const int Status431RequestHeaderFieldsTooLarge = 431; public const int Status451UnavailableForLegalReasons = 451; public const int Status500InternalServerError = 500; @@ -59,5 +66,7 @@ namespace Microsoft.AspNetCore.Http public const int Status505HttpVersionNotsupported = 505; public const int Status506VariantAlsoNegotiates = 506; public const int Status507InsufficientStorage = 507; + public const int Status510NotExtended = 510; + public const int Status511NetworkAuthenticationRequired = 511; } } diff --git a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs index eb6aa120e7..8d6cf0b8f8 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs @@ -7,8 +7,10 @@ namespace Microsoft.AspNetCore.WebUtilities { public static class ReasonPhrases { + // Status Codes listed at http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml private static IDictionary Phrases = new Dictionary() { + { 100, "Continue" }, { 101, "Switching Protocols" }, { 200, "OK" }, @@ -18,6 +20,7 @@ namespace Microsoft.AspNetCore.WebUtilities { 204, "No Content" }, { 205, "Reset Content" }, { 206, "Partial Content" }, + { 207, "Multi-Status" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, @@ -27,6 +30,7 @@ namespace Microsoft.AspNetCore.WebUtilities { 305, "Use Proxy" }, { 306, "Switch Proxy" }, { 307, "Temporary Redirect" }, + { 308, "Permanent Redirect" }, { 400, "Bad Request" }, { 401, "Unauthorized" }, @@ -48,6 +52,15 @@ namespace Microsoft.AspNetCore.WebUtilities { 417, "Expectation Failed" }, { 418, "I'm a teapot" }, { 419, "Authentication Timeout" }, + { 421, "Misdirected Request" }, + { 422, "Unprocessable Entity" }, + { 423, "Locked" }, + { 424, "Failed Dependency" }, + { 426, "Upgrade Required" }, + { 428, "Precondition Required" }, + { 429, "Too Many Requests" }, + { 431, "Request Header Fields Too Large" }, + { 451, "Unavailable For Legal Reasons" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, @@ -56,6 +69,9 @@ namespace Microsoft.AspNetCore.WebUtilities { 504, "Gateway Timeout" }, { 505, "HTTP Version Not Supported" }, { 506, "Variant Also Negotiates" }, + { 507, "Insufficient Storage" }, + { 510, "Not Extended" }, + { 511, "Network Authentication Required" }, }; public static string GetReasonPhrase(int statusCode) From 33dd1d965fb3715c0302ed6e4219ca424d8af6d3 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 6 Jan 2017 12:25:43 -0800 Subject: [PATCH 626/846] Add all status codes in IANA list and update reason phrases --- .../StatusCodes.cs | 17 ++++++++++++----- .../ReasonPhrases.cs | 10 +++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index 2efccfc518..3261bce2f2 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -8,6 +8,7 @@ namespace Microsoft.AspNetCore.Http { public const int Status100Continue = 100; public const int Status101SwitchingProtocols = 101; + public const int Status102Processing = 102; public const int Status200OK = 200; public const int Status201Created = 201; @@ -17,6 +18,8 @@ namespace Microsoft.AspNetCore.Http public const int Status205ResetContent = 205; public const int Status206PartialContent = 206; public const int Status207MultiStatus = 207; + public const int Status208AlreadyReported = 208; + public const int Status226IMUsed = 226; public const int Status300MultipleChoices = 300; public const int Status301MovedPermanently = 301; @@ -24,7 +27,7 @@ namespace Microsoft.AspNetCore.Http public const int Status303SeeOther = 303; public const int Status304NotModified = 304; public const int Status305UseProxy = 305; - public const int Status306SwitchProxy = 306; + public const int Status306SwitchProxy = 306; // RFC 2616, removed public const int Status307TemporaryRedirect = 307; public const int Status308PermanentRedirect = 308; @@ -41,13 +44,16 @@ namespace Microsoft.AspNetCore.Http public const int Status410Gone = 410; public const int Status411LengthRequired = 411; public const int Status412PreconditionFailed = 412; - public const int Status413RequestEntityTooLarge = 413; - public const int Status414RequestUriTooLong = 414; + public const int Status413RequestEntityTooLarge = 413; // RFC 2616, renamed + public const int Status413PayloadTooLarge = 413; // RFC 7231 + public const int Status414RequestUriTooLong = 414; // RFC 2616, renamed + public const int Status414UriTooLong = 414; // RFC 7231 public const int Status415UnsupportedMediaType = 415; - public const int Status416RequestedRangeNotSatisfiable = 416; + public const int Status416RequestedRangeNotSatisfiable = 416; // RFC 2616, renamed + public const int Status416RangeNotSatisfiable = 416; // RFC 7233 public const int Status417ExpectationFailed = 417; public const int Status418ImATeapot = 418; - public const int Status419AuthenticationTimeout = 419; + public const int Status419AuthenticationTimeout = 419; // Not defined in any RFC public const int Status421MisdirectedRequest = 421; public const int Status422UnprocessableEntity = 422; public const int Status423Locked = 423; @@ -66,6 +72,7 @@ namespace Microsoft.AspNetCore.Http public const int Status505HttpVersionNotsupported = 505; public const int Status506VariantAlsoNegotiates = 506; public const int Status507InsufficientStorage = 507; + public const int Status508LoopDetected = 508; public const int Status510NotExtended = 510; public const int Status511NetworkAuthenticationRequired = 511; } diff --git a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs index 8d6cf0b8f8..f84f762475 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs @@ -12,6 +12,7 @@ namespace Microsoft.AspNetCore.WebUtilities { { 100, "Continue" }, { 101, "Switching Protocols" }, + { 102, "Processing" }, { 200, "OK" }, { 201, "Created" }, @@ -21,6 +22,8 @@ namespace Microsoft.AspNetCore.WebUtilities { 205, "Reset Content" }, { 206, "Partial Content" }, { 207, "Multi-Status" }, + { 208, "Already Reported" }, + { 226, "IM Used" }, { 300, "Multiple Choices" }, { 301, "Moved Permanently" }, @@ -45,10 +48,10 @@ namespace Microsoft.AspNetCore.WebUtilities { 410, "Gone" }, { 411, "Length Required" }, { 412, "Precondition Failed" }, - { 413, "Request Entity Too Large" }, - { 414, "Request-URI Too Long" }, + { 413, "Payload Too Large" }, + { 414, "URI Too Long" }, { 415, "Unsupported Media Type" }, - { 416, "Requested Range Not Satisfiable" }, + { 416, "Range Not Satisfiable" }, { 417, "Expectation Failed" }, { 418, "I'm a teapot" }, { 419, "Authentication Timeout" }, @@ -70,6 +73,7 @@ namespace Microsoft.AspNetCore.WebUtilities { 505, "HTTP Version Not Supported" }, { 506, "Variant Also Negotiates" }, { 507, "Insufficient Storage" }, + { 507, "Loop Detected" }, { 510, "Not Extended" }, { 511, "Network Authentication Required" }, }; From 3ea2f36449c779a668c0e605e80633ad60113c02 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 6 Jan 2017 15:46:00 -0800 Subject: [PATCH 627/846] Fix wrong status code --- src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs index f84f762475..3aab17079d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs @@ -73,7 +73,7 @@ namespace Microsoft.AspNetCore.WebUtilities { 505, "HTTP Version Not Supported" }, { 506, "Variant Also Negotiates" }, { 507, "Insufficient Storage" }, - { 507, "Loop Detected" }, + { 508, "Loop Detected" }, { 510, "Not Extended" }, { 511, "Network Authentication Required" }, }; From 3b25acd4ad8835866e31c61b379e327a4fc137a4 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sun, 8 Jan 2017 12:33:38 +0000 Subject: [PATCH 628/846] ContentType.IsNullOrEmpty --- src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs index 9b664111cd..e4cdf24184 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs @@ -81,7 +81,7 @@ namespace Microsoft.AspNetCore.Http.Internal } set { - if (string.IsNullOrWhiteSpace(value)) + if (string.IsNullOrEmpty(value)) { HttpResponseFeature.Headers.Remove(HeaderNames.ContentType); } From 622d112372ed11075af160b1fb5a11a7637ff516 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 9 Jan 2017 14:49:35 -0800 Subject: [PATCH 629/846] #723 Make HttpContextAccessor static AsyncLocal --- src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs index 99be5929b6..324eb8ad97 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs @@ -30,7 +30,8 @@ namespace Microsoft.AspNetCore.Http } #elif NETSTANDARD1_3 - private AsyncLocal _httpContextCurrent = new AsyncLocal(); + private static AsyncLocal _httpContextCurrent = new AsyncLocal(); + public HttpContext HttpContext { get From 51f6415ea1066636d1b0af9b70e206371eccbfa1 Mon Sep 17 00:00:00 2001 From: john Date: Fri, 13 Jan 2017 10:07:02 +0800 Subject: [PATCH 630/846] let UriHelper.GetEncodedUrl can get relative url --- src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index b31be611e3..869a55f63d 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -163,9 +163,16 @@ namespace Microsoft.AspNetCore.Http.Extensions /// /// The request to assemble the uri pieces from. /// - public static string GetEncodedUrl(this HttpRequest request) + public static string GetEncodedUrl(this HttpRequest request,bool relative = false) { - return BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); + if(relative) + { + return BuildRelative(request.PathBase, request.Path, request.QueryString); + } + else + { + return BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); + } } /// From 6ac245223143be1dbc9ed04ca83fe34448321732 Mon Sep 17 00:00:00 2001 From: john Date: Fri, 13 Jan 2017 10:16:47 +0800 Subject: [PATCH 631/846] update xml doc --- src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index 869a55f63d..8372e8bc4a 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -162,6 +162,7 @@ namespace Microsoft.AspNetCore.Http.Extensions /// and other HTTP operations. /// /// The request to assemble the uri pieces from. + /// Build relative url or not /// public static string GetEncodedUrl(this HttpRequest request,bool relative = false) { From b7d2f8c905e712051c676ea2c207d445eace5d47 Mon Sep 17 00:00:00 2001 From: john Date: Fri, 13 Jan 2017 10:32:14 +0800 Subject: [PATCH 632/846] separate GetEncodedUrl and GetEncodedPathAndQuery --- .../UriHelper.cs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index 8372e8bc4a..2b423b5dbb 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -162,18 +162,19 @@ namespace Microsoft.AspNetCore.Http.Extensions /// and other HTTP operations. /// /// The request to assemble the uri pieces from. - /// Build relative url or not /// - public static string GetEncodedUrl(this HttpRequest request,bool relative = false) + public static string GetEncodedUrl(this HttpRequest request) { - if(relative) - { - return BuildRelative(request.PathBase, request.Path, request.QueryString); - } - else - { - return BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); - } + return BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); + } + /// + /// Returns the relative url + /// + /// The request to assemble the uri pieces from. + /// + public static string GetEncodedPathAndQuery(this HttpRequest request) + { + return BuildRelative(request.PathBase, request.Path, request.QueryString); } /// From 779115b1ad0e3199c6d7ca0e9ed344d6f9f00c91 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 17 Jan 2017 13:27:21 -0800 Subject: [PATCH 633/846] #407 Add ContentLength to IHeaderDictionary --- .../IHeaderDictionary.cs | 5 +++ .../exceptions.net45.json | 14 ++++++++ .../exceptions.netcore.json | 14 ++++++++ .../HeaderDictionary.cs | 29 +++++++++++++++ .../Internal/DefaultHttpRequest.cs | 10 ++---- .../Internal/DefaultHttpResponse.cs | 10 ++---- .../Internal/ParsingHelpers.cs | 36 ------------------- .../DictionaryStringValuesWrapper.cs | 35 ++++++++++++++++++ 8 files changed, 101 insertions(+), 52 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json create mode 100644 src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json diff --git a/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs index 674e2bda94..dfde3f33e3 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs @@ -17,5 +17,10 @@ namespace Microsoft.AspNetCore.Http /// /// The stored value, or StringValues.Empty if the key is not present. new StringValues this[string key] { get; set; } + + /// + /// Strongly typed access to the Content-Length header. Implementations must keep this in sync with the string representation. + /// + long? ContentLength { get; set; } } } diff --git a/src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json b/src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json new file mode 100644 index 0000000000..e312fab8bd --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json @@ -0,0 +1,14 @@ +[ + { + "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewMemberId": "System.Nullable get_ContentLength()", + "Kind": "Addition" + }, + { + "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewMemberId": "System.Void set_ContentLength(System.Nullable value)", + "Kind": "Addition" + } +] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json b/src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json new file mode 100644 index 0000000000..e312fab8bd --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json @@ -0,0 +1,14 @@ +[ + { + "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewMemberId": "System.Nullable get_ContentLength()", + "Kind": "Addition" + }, + { + "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "NewMemberId": "System.Void set_ContentLength(System.Nullable value)", + "Kind": "Addition" + } +] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 6fc02201ba..5e52b1285d 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Http { @@ -97,6 +98,34 @@ namespace Microsoft.AspNetCore.Http set { this[key] = value; } } + public long? ContentLength + { + get + { + long value; + var rawValue = this[HeaderNames.ContentLength]; + if (rawValue.Count == 1 && + !string.IsNullOrWhiteSpace(rawValue[0]) && + HeaderUtilities.TryParseInt64(new StringSegment(rawValue[0]).Trim(), out value)) + { + return value; + } + + return null; + } + set + { + if (value.HasValue) + { + this[HeaderNames.ContentLength] = HeaderUtilities.FormatInt64(value.Value); + } + else + { + this.Remove(HeaderNames.ContentLength); + } + } + } + /// /// Gets the number of elements contained in the ;. /// diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs index c20164ad9c..f216475db6 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs @@ -72,14 +72,8 @@ namespace Microsoft.AspNetCore.Http.Internal public override long? ContentLength { - get - { - return ParsingHelpers.GetContentLength(Headers); - } - set - { - ParsingHelpers.SetContentLength(Headers, value); - } + get { return Headers.ContentLength; } + set { Headers.ContentLength = value; } } public override Stream Body diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs index e4cdf24184..3ca05035f5 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs @@ -63,14 +63,8 @@ namespace Microsoft.AspNetCore.Http.Internal public override long? ContentLength { - get - { - return ParsingHelpers.GetContentLength(Headers); - } - set - { - ParsingHelpers.SetContentLength(Headers, value); - } + get { return Headers.ContentLength; } + set { Headers.ContentLength = value; } } public override string ContentType diff --git a/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs index 57b1a7a911..1f4d713098 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs @@ -403,41 +403,5 @@ namespace Microsoft.AspNetCore.Http.Internal return value; } - - public static long? GetContentLength(IHeaderDictionary headers) - { - if (headers == null) - { - throw new ArgumentNullException(nameof(headers)); - } - - long value; - var rawValue = headers[HeaderNames.ContentLength]; - if (rawValue.Count == 1 && - !string.IsNullOrWhiteSpace(rawValue[0]) && - HeaderUtilities.TryParseInt64(new StringSegment(rawValue[0]).Trim(), out value)) - { - return value; - } - - return null; - } - - public static void SetContentLength(IHeaderDictionary headers, long? value) - { - if (headers == null) - { - throw new ArgumentNullException(nameof(headers)); - } - - if (value.HasValue) - { - headers[HeaderNames.ContentLength] = HeaderUtilities.FormatInt64(value.Value); - } - else - { - headers.Remove(HeaderNames.ContentLength); - } - } } } diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs index 2517f556c6..d88b2b9544 100644 --- a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Owin { @@ -42,6 +43,40 @@ namespace Microsoft.AspNetCore.Owin set { Inner[key] = value; } } + public long? ContentLength + { + get + { + long value; + + string[] rawValue; + if (!Inner.TryGetValue(HeaderNames.ContentLength, out rawValue)) + { + return null; + } + + if (rawValue.Length == 1 && + !string.IsNullOrWhiteSpace(rawValue[0]) && + HeaderUtilities.TryParseInt64(new StringSegment(rawValue[0]).Trim(), out value)) + { + return value; + } + + return null; + } + set + { + if (value.HasValue) + { + Inner[HeaderNames.ContentLength] = (StringValues)HeaderUtilities.FormatInt64(value.Value); + } + else + { + Inner.Remove(HeaderNames.ContentLength); + } + } + } + int ICollection>.Count => Inner.Count; bool ICollection>.IsReadOnly => Inner.IsReadOnly; From 3289afe007643853de6688f5b94d0f0a0993c659 Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 31 Jan 2017 11:03:20 -0800 Subject: [PATCH 634/846] Add check for index advance during parsing --- .../HeaderUtilities.cs | 85 ++++++++++--------- .../HeaderUtilitiesTest.cs | 2 + 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 4dd1081be9..827a99b437 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Diagnostics.Contracts; using System.Globalization; using Microsoft.Extensions.Primitives; @@ -200,6 +201,33 @@ namespace Microsoft.Net.Http.Headers return current; } + private static int AdvanceCacheDirectiveIndex(int current, string headerValue) + { + // Skip until the next potential name + current += HttpRuleParser.GetWhitespaceLength(headerValue, current); + + // Skip the value if present + if (current < headerValue.Length && headerValue[current] == '=') + { + current++; // skip '=' + current += NameValueHeaderValue.GetValueLength(headerValue, current); + } + + // Find the next delimiter + current = headerValue.IndexOf(',', current); + + if (current == -1) + { + // If no delimiter found, skip to the end + return headerValue.Length; + } + + current++; // skip ',' + current += HttpRuleParser.GetWhitespaceLength(headerValue, current); + + return current; + } + /// /// Try to find a target header value among the set of given header values and parse it as a /// . @@ -237,6 +265,7 @@ namespace Microsoft.Net.Http.Headers while (current < headerValues[i].Length) { long seconds; + var initial = current; var tokenLength = HttpRuleParser.GetTokenLength(headerValues[i], current); if (tokenLength == targetValue.Length && string.Compare(headerValues[i], current, targetValue, 0, tokenLength, StringComparison.OrdinalIgnoreCase) == 0 @@ -246,26 +275,15 @@ namespace Microsoft.Net.Http.Headers value = TimeSpan.FromSeconds(seconds); return true; } - else + + current = AdvanceCacheDirectiveIndex(current + tokenLength, headerValues[i]); + + // Ensure index was advanced + if (current <= initial) { - // Skip until the next potential name - current += tokenLength; - current += HttpRuleParser.GetWhitespaceLength(headerValues[i], current); - - // Skip the value if present - if (current < headerValues[i].Length && headerValues[i][current] == '=') - { - current++; // skip '=' - current += NameValueHeaderValue.GetValueLength(headerValues[i], current); - current += HttpRuleParser.GetWhitespaceLength(headerValues[i], current); - } - - // Skip the delimiter - if (current < headerValues[i].Length && headerValues[i][current] == ',') - { - current++; // skip ',' - current += HttpRuleParser.GetWhitespaceLength(headerValues[i], current); - } + Debug.Assert(false, $"Index '{nameof(current)}' not advanced, this is a bug."); + value = null; + return false; } } } @@ -293,7 +311,6 @@ namespace Microsoft.Net.Http.Headers return false; } - for (var i = 0; i < cacheControlDirectives.Count; i++) { // Trim leading white space @@ -301,6 +318,8 @@ namespace Microsoft.Net.Http.Headers while (current < cacheControlDirectives[i].Length) { + var initial = current; + var tokenLength = HttpRuleParser.GetTokenLength(cacheControlDirectives[i], current); if (tokenLength == targetDirectives.Length && string.Compare(cacheControlDirectives[i], current, targetDirectives, 0, tokenLength, StringComparison.OrdinalIgnoreCase) == 0) @@ -308,26 +327,14 @@ namespace Microsoft.Net.Http.Headers // Token matches target value return true; } - else + + current = AdvanceCacheDirectiveIndex(current + tokenLength, cacheControlDirectives[i]); + + // Ensure index was advanced + if (current <= initial) { - // Skip until the next potential name - current += tokenLength; - current += HttpRuleParser.GetWhitespaceLength(cacheControlDirectives[i], current); - - // Skip the value if present - if (current < cacheControlDirectives[i].Length && cacheControlDirectives[i][current] == '=') - { - current++; // skip '=' - current += NameValueHeaderValue.GetValueLength(cacheControlDirectives[i], current); - current += HttpRuleParser.GetWhitespaceLength(cacheControlDirectives[i], current); - } - - // Skip the delimiter - if (current < cacheControlDirectives[i].Length && cacheControlDirectives[i][current] == ',') - { - current++; // skip ',' - current += HttpRuleParser.GetWhitespaceLength(cacheControlDirectives[i], current); - } + Debug.Assert(false, $"Index '{nameof(current)}' not advanced, this is a bug."); + return false; } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs index cde811a082..62917ffc90 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -71,6 +71,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("directive1", "directive")] [InlineData("h=directive", "directive")] [InlineData("directive1, directive2=80", "directive")] + [InlineData("directive1=;, directive2=10", "directive1")] public void TryParseSeconds_Fails(string headerValues, string targetValue) { TimeSpan? value; @@ -124,6 +125,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("directive1", "directive", false)] [InlineData("h=directive", "directive", false)] [InlineData("directive1, directive2=80", "directive", false)] + [InlineData("directive1;, directive2=80", "directive", false)] public void ContainsCacheDirective_MatchesExactValue(string headerValues, string targetValue, bool contains) { Assert.Equal(contains, HeaderUtilities.ContainsCacheDirective(new StringValues(headerValues), targetValue)); From 2e2b54a507d261cbd6a2172d79b47718b234227d Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 31 Jan 2017 12:02:01 -0800 Subject: [PATCH 635/846] Add more cache control header parsing tests --- .../HeaderUtilitiesTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs index 62917ffc90..97b342264a 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -54,6 +54,10 @@ namespace Microsoft.Net.Http.Headers [InlineData("directive1= 89 , directive2=22", "directive1", 89)] [InlineData("directive1= 89 , directive2= 42", "directive2", 42)] [InlineData("directive1= 89 , directive= 42", "directive", 42)] + [InlineData("directive1,,,,,directive2 = 42 ", "directive2", 42)] + [InlineData("directive1=;,directive2 = 42 ", "directive2", 42)] + [InlineData("directive1;;,;;,directive2 = 42 ", "directive2", 42)] + [InlineData("directive1=value;q=0.6,directive2 = 42 ", "directive2", 42)] public void TryParseSeconds_Succeeds(string headerValues, string targetValue, int expectedValue) { TimeSpan? value; @@ -69,9 +73,11 @@ namespace Microsoft.Net.Http.Headers [InlineData("directive1 , directive2=80", "directive1")] [InlineData("h=10", "directive")] [InlineData("directive1", "directive")] + [InlineData("directive1,,,,,,,", "directive")] [InlineData("h=directive", "directive")] [InlineData("directive1, directive2=80", "directive")] [InlineData("directive1=;, directive2=10", "directive1")] + [InlineData("directive1;directive2=10", "directive2")] public void TryParseSeconds_Fails(string headerValues, string targetValue) { TimeSpan? value; @@ -117,15 +123,21 @@ namespace Microsoft.Net.Http.Headers [InlineData("directive1=3, directive=10", "directive", true)] [InlineData("directive1= 89 , directive= 42", "directive", true)] [InlineData("directive1= 89 , directive = 42", "directive", true)] + [InlineData("directive1,,,,,directive2 = 42 ", "directive2", true)] + [InlineData("directive1;;,;;,directive2 = 42 ", "directive2", true)] + [InlineData("directive1=;,directive2 = 42 ", "directive2", true)] + [InlineData("directive1=value;q=0.6,directive2 = 42 ", "directive2", true)] [InlineData(null, null, false)] [InlineData(null, "", false)] [InlineData("", null, false)] [InlineData("", "", false)] [InlineData("h=10", "directive", false)] [InlineData("directive1", "directive", false)] + [InlineData("directive1,,,,,,,", "directive", false)] [InlineData("h=directive", "directive", false)] [InlineData("directive1, directive2=80", "directive", false)] [InlineData("directive1;, directive2=80", "directive", false)] + [InlineData("directive1=value;q=0.6;directive2 = 42 ", "directive2", false)] public void ContainsCacheDirective_MatchesExactValue(string headerValues, string targetValue, bool contains) { Assert.Equal(contains, HeaderUtilities.ContainsCacheDirective(new StringValues(headerValues), targetValue)); From 270383535209ea53b9fe9a1df36c5f9088f18bc5 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Wed, 1 Feb 2017 06:36:45 -0800 Subject: [PATCH 636/846] Fix doc comment typo --- .../Extensions/UseMiddlewareExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 75f61ce5d4..b9f1d36064 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -13,7 +13,7 @@ using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Builder { /// - /// Extension methods for adding typed middlware. + /// Extension methods for adding typed middleware. /// public static class UseMiddlewareExtensions { @@ -172,4 +172,4 @@ namespace Microsoft.AspNetCore.Builder return service; } } -} \ No newline at end of file +} From 96f33b27d43a7062e68da630f59d9eae5de97a73 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 1 Feb 2017 16:23:09 -0800 Subject: [PATCH 637/846] Migrate from xproj to csproj --- HttpAbstractions.sln | 81 +++++++++++------- NuGet.config | 1 + appveyor.yml | 3 +- build.ps1 | 2 +- build.sh | 2 +- {tools => build}/Key.snk | Bin build/common.props | 24 ++++++ global.json | 8 -- samples/SampleApp/SampleApp.csproj | 12 +++ samples/SampleApp/SampleApp.xproj | 17 ---- samples/SampleApp/project.json | 21 ----- ...rosoft.AspNetCore.Http.Abstractions.csproj | 25 ++++++ ...crosoft.AspNetCore.Http.Abstractions.xproj | 17 ---- .../Properties/AssemblyInfo.cs | 9 +- .../project.json | 52 ----------- ...icrosoft.AspNetCore.Http.Extensions.csproj | 16 ++++ ...Microsoft.AspNetCore.Http.Extensions.xproj | 17 ---- .../Properties/AssemblyInfo.cs | 11 --- .../project.json | 36 -------- .../Microsoft.AspNetCore.Http.Features.csproj | 19 ++++ .../Microsoft.AspNetCore.Http.Features.xproj | 17 ---- .../Properties/AssemblyInfo.cs | 11 --- .../project.json | 36 -------- .../Microsoft.AspNetCore.Http.csproj | 20 +++++ .../Microsoft.AspNetCore.Http.xproj | 17 ---- .../Properties/AssemblyInfo.cs | 11 --- src/Microsoft.AspNetCore.Http/project.json | 45 ---------- .../Microsoft.AspNetCore.Owin.csproj | 14 +++ .../Microsoft.AspNetCore.Owin.xproj | 17 ---- .../Properties/AssemblyInfo.cs | 11 --- src/Microsoft.AspNetCore.Owin/project.json | 37 -------- .../Microsoft.AspNetCore.WebUtilities.csproj | 16 ++++ .../Microsoft.AspNetCore.WebUtilities.xproj | 17 ---- .../Properties/AssemblyInfo.cs | 7 -- .../project.json | 47 ---------- .../Microsoft.Net.Http.Headers.csproj | 16 ++++ .../Microsoft.Net.Http.Headers.xproj | 17 ---- .../Properties/AssemblyInfo.cs | 7 -- src/Microsoft.Net.Http.Headers/project.json | 31 ------- ....AspNetCore.Http.Abstractions.Tests.csproj | 16 ++++ ...t.AspNetCore.Http.Abstractions.Tests.xproj | 20 ----- .../project.json | 24 ------ ...ft.AspNetCore.Http.Extensions.Tests.csproj | 17 ++++ ...oft.AspNetCore.Http.Extensions.Tests.xproj | 20 ----- .../project.json | 21 ----- ...soft.AspNetCore.Http.Features.Tests.csproj | 15 ++++ ...osoft.AspNetCore.Http.Features.Tests.xproj | 20 ----- .../Properties/AssemblyInfo.cs | 39 --------- .../project.json | 19 ---- .../HttpContextFactoryTests.cs | 6 +- .../Microsoft.AspNetCore.Http.Tests.csproj | 15 ++++ .../Microsoft.AspNetCore.Http.Tests.xproj | 20 ----- .../project.json | 19 ---- .../Microsoft.AspNetCore.Owin.Tests.csproj | 17 ++++ .../Microsoft.AspNetCore.Owin.Tests.xproj | 20 ----- .../project.json | 21 ----- .../FileBufferingReadStreamTests.cs | 17 +++- ...osoft.AspNetCore.WebUtilities.Tests.csproj | 15 ++++ ...rosoft.AspNetCore.WebUtilities.Tests.xproj | 20 ----- .../project.json | 23 ----- .../Microsoft.Net.Http.Headers.Tests.csproj | 15 ++++ .../Microsoft.Net.Http.Headers.Tests.xproj | 20 ----- .../project.json | 23 ----- version.props | 7 ++ 64 files changed, 353 insertions(+), 883 deletions(-) rename {tools => build}/Key.snk (100%) create mode 100644 build/common.props delete mode 100644 global.json create mode 100644 samples/SampleApp/SampleApp.csproj delete mode 100644 samples/SampleApp/SampleApp.xproj delete mode 100644 samples/SampleApp/project.json create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj delete mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj delete mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/project.json create mode 100644 src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj delete mode 100644 src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj delete mode 100644 src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNetCore.Http.Extensions/project.json create mode 100644 src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj delete mode 100644 src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj delete mode 100644 src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNetCore.Http.Features/project.json create mode 100644 src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj delete mode 100644 src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj delete mode 100644 src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNetCore.Http/project.json create mode 100644 src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj delete mode 100644 src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj delete mode 100644 src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNetCore.Owin/project.json create mode 100644 src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj delete mode 100644 src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj delete mode 100644 src/Microsoft.AspNetCore.WebUtilities/project.json create mode 100644 src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj delete mode 100644 src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj delete mode 100644 src/Microsoft.Net.Http.Headers/project.json create mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj delete mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json create mode 100644 test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj delete mode 100644 test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json create mode 100644 test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj delete mode 100644 test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs delete mode 100644 test/Microsoft.AspNetCore.Http.Features.Tests/project.json create mode 100644 test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj delete mode 100644 test/Microsoft.AspNetCore.Http.Tests/project.json create mode 100644 test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj delete mode 100644 test/Microsoft.AspNetCore.Owin.Tests/project.json create mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj delete mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/project.json create mode 100644 test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj delete mode 100644 test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj delete mode 100644 test/Microsoft.Net.Http.Headers.Tests/project.json create mode 100644 version.props diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 49ac64ba4f..684bc312f2 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,42 +1,60 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.24711.0 +# Visual Studio 15 +VisualStudioVersion = 15.0.26120.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http", "src\Microsoft.AspNetCore.Http\Microsoft.AspNetCore.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Abstractions", "src\Microsoft.AspNetCore.Http.Abstractions\Microsoft.AspNetCore.Http.Abstractions.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Features", "src\Microsoft.AspNetCore.Http.Features\Microsoft.AspNetCore.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Tests", "test\Microsoft.AspNetCore.Http.Tests\Microsoft.AspNetCore.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Features.Tests", "test\Microsoft.AspNetCore.Http.Features.Tests\Microsoft.AspNetCore.Http.Features.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Abstractions.Tests", "test\Microsoft.AspNetCore.Http.Abstractions.Tests\Microsoft.AspNetCore.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Owin", "src\Microsoft.AspNetCore.Owin\Microsoft.AspNetCore.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Owin.Tests", "test\Microsoft.AspNetCore.Owin.Tests\Microsoft.AspNetCore.Owin.Tests.xproj", "{16219571-3268-4D12-8689-12B7163DBA13}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Extensions", "src\Microsoft.AspNetCore.Http.Extensions\Microsoft.AspNetCore.Http.Extensions.xproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Extensions.Tests", "test\Microsoft.AspNetCore.Http.Extensions.Tests\Microsoft.AspNetCore.Http.Extensions.Tests.xproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebUtilities", "src\Microsoft.AspNetCore.WebUtilities\Microsoft.AspNetCore.WebUtilities.xproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebUtilities.Tests", "test\Microsoft.AspNetCore.WebUtilities.Tests\Microsoft.AspNetCore.WebUtilities.Tests.xproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.xproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.xproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http", "src\Microsoft.AspNetCore.Http\Microsoft.AspNetCore.Http.csproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Abstractions", "src\Microsoft.AspNetCore.Http.Abstractions\Microsoft.AspNetCore.Http.Abstractions.csproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Features", "src\Microsoft.AspNetCore.Http.Features\Microsoft.AspNetCore.Http.Features.csproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Tests", "test\Microsoft.AspNetCore.Http.Tests\Microsoft.AspNetCore.Http.Tests.csproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Features.Tests", "test\Microsoft.AspNetCore.Http.Features.Tests\Microsoft.AspNetCore.Http.Features.Tests.csproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Abstractions.Tests", "test\Microsoft.AspNetCore.Http.Abstractions.Tests\Microsoft.AspNetCore.Http.Abstractions.Tests.csproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Owin", "src\Microsoft.AspNetCore.Owin\Microsoft.AspNetCore.Owin.csproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Owin.Tests", "test\Microsoft.AspNetCore.Owin.Tests\Microsoft.AspNetCore.Owin.Tests.csproj", "{16219571-3268-4D12-8689-12B7163DBA13}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Extensions", "src\Microsoft.AspNetCore.Http.Extensions\Microsoft.AspNetCore.Http.Extensions.csproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Extensions.Tests", "test\Microsoft.AspNetCore.Http.Extensions.Tests\Microsoft.AspNetCore.Http.Extensions.Tests.csproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities", "src\Microsoft.AspNetCore.WebUtilities\Microsoft.AspNetCore.WebUtilities.csproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities.Tests", "test\Microsoft.AspNetCore.WebUtilities.Tests\Microsoft.AspNetCore.WebUtilities.Tests.csproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.csproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.csproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleApp", "samples\SampleApp\SampleApp.csproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C6C48D5F-B289-4150-A6FC-77A5C7064BCE}" + ProjectSection(SolutionItems) = preProject + .travis.yml = .travis.yml + appveyor.yml = appveyor.yml + build.cmd = build.cmd + build.ps1 = build.ps1 + build.sh = build.sh + NuGet.config = NuGet.config + README.md = README.md + version.props = version.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{ED7BCAC5-2796-44BD-9954-7C248263BC8B}" + ProjectSection(SolutionItems) = preProject + build\common.props = build\common.props + build\Key.snk = build\Key.snk + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -224,5 +242,6 @@ Global {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} + {ED7BCAC5-2796-44BD-9954-7C248263BC8B} = {C6C48D5F-B289-4150-A6FC-77A5C7064BCE} EndGlobalSection EndGlobal diff --git a/NuGet.config b/NuGet.config index 826a1f9035..6f9f028ca1 100644 --- a/NuGet.config +++ b/NuGet.config @@ -2,6 +2,7 @@ + \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index be95b88d6f..7617e58a1e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,4 +10,5 @@ build_script: - build.cmd --quiet verify clone_depth: 1 test: off -deploy: off \ No newline at end of file +deploy: off +os: Visual Studio 2017 RC \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index 8f2f99691a..0605b59c01 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/feature/msbuild.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index 4fd7ede788..07997d6c83 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/feature/msbuild.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi diff --git a/tools/Key.snk b/build/Key.snk similarity index 100% rename from tools/Key.snk rename to build/Key.snk diff --git a/build/common.props b/build/common.props new file mode 100644 index 0000000000..2bd16a7b97 --- /dev/null +++ b/build/common.props @@ -0,0 +1,24 @@ + + + + + Microsoft ASP.NET Core + https://github.com/aspnet/HttpAbstractions + git + $(MSBuildThisFileDirectory)Key.snk + true + true + 1.2.0-* + 1.6.2-* + $(VersionSuffix)-$(BuildNumber) + + + + + + + + + + + \ No newline at end of file diff --git a/global.json b/global.json deleted file mode 100644 index 0ad1995dd2..0000000000 --- a/global.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "projects": [ - "src" - ], - "sdk": { - "version": "1.0.0-preview2-1-003180" - } -} \ No newline at end of file diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj new file mode 100644 index 0000000000..a27d73d6b0 --- /dev/null +++ b/samples/SampleApp/SampleApp.csproj @@ -0,0 +1,12 @@ + + + net451;netcoreapp1.1 + + win7-x64 + Exe + + + + + + \ No newline at end of file diff --git a/samples/SampleApp/SampleApp.xproj b/samples/SampleApp/SampleApp.xproj deleted file mode 100644 index 7b7ac55328..0000000000 --- a/samples/SampleApp/SampleApp.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 1d0764b4-1deb-4232-a714-d4b7e846918a - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json deleted file mode 100644 index 04e1eb1724..0000000000 --- a/samples/SampleApp/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "version": "1.1.0-*", - "dependencies": { - "Microsoft.AspNetCore.Http": "1.2.0-*", - "Microsoft.AspNetCore.Http.Extensions": "1.2.0-*" - }, - "frameworks": { - "net451": {}, - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - } - }, - "buildOptions": { - "emitEntryPoint": true - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj new file mode 100644 index 0000000000..b8ab908f72 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -0,0 +1,25 @@ + + + + ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder. +Commonly used types: +Microsoft.AspNetCore.Builder.IApplicationBuilder +Microsoft.AspNetCore.Http.HttpContext +Microsoft.AspNetCore.Http.HttpRequest +Microsoft.AspNetCore.Http.HttpResponse + net451;netstandard1.3 + true + aspnetcore + $(NoWarn);CS1591 + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj deleted file mode 100644 index a8b6b1f83b..0000000000 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 22071333-15ba-4d16-a1d5-4d5b1a83fbdd - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs index 0510a6409b..2bdc2a912f 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs @@ -1,13 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Reflection; -using System.Resources; using System.Runtime.CompilerServices; -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json deleted file mode 100644 index 30271f7b2b..0000000000 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": "1.2.0-*", - "description": "ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder.\r\nCommonly used types:\r\nMicrosoft.AspNetCore.Builder.IApplicationBuilder\r\nMicrosoft.AspNetCore.Http.HttpContext\r\nMicrosoft.AspNetCore.Http.HttpRequest\r\nMicrosoft.AspNetCore.Http.HttpResponse", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "tags": [ - "aspnetcore" - ] - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "xmlDoc": true - }, - "dependencies": { - "Microsoft.AspNetCore.Http.Features": { - "target": "project" - }, - "Microsoft.Extensions.ActivatorUtilities.Sources": { - "type": "build", - "version": "1.2.0-*" - }, - "Microsoft.Extensions.TaskCache.Sources": { - "version": "1.2.0-*", - "type": "build" - }, - "NETStandard.Library": "1.6.2-*", - "System.Text.Encodings.Web": "4.4.0-*", - "Microsoft.Extensions.Primitives": "1.2.0-*" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.Runtime": { - "type": "build" - } - } - }, - "netstandard1.3": { - "dependencies": { - "System.Globalization.Extensions": "4.4.0-*", - "System.Reflection.TypeExtensions": "4.4.0-*" - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj new file mode 100644 index 0000000000..f5cee38563 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -0,0 +1,16 @@ + + + + ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. + net451;netstandard1.3 + $(NoWarn);CS1591 + true + aspnetcore + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj deleted file mode 100644 index 883e22ae6e..0000000000 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - ccc4363e-81e2-4058-94dd-00494e9e992a - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs deleted file mode 100644 index 76feceeff0..0000000000 --- a/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json deleted file mode 100644 index 83c8c55005..0000000000 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "version": "1.2.0-*", - "description": "ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "tags": [ - "aspnetcore" - ] - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "xmlDoc": true - }, - "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": { - "target": "project" - }, - "Microsoft.Extensions.FileProviders.Abstractions": "1.2.0-*", - "Microsoft.Net.Http.Headers": { - "target": "project" - }, - "NETStandard.Library": "1.6.2-*", - "System.Buffers": "4.4.0-*" - }, - "frameworks": { - "net451": {}, - "netstandard1.3": {} - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj new file mode 100644 index 0000000000..d5077d39f6 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -0,0 +1,19 @@ + + + + ASP.NET Core HTTP feature interface definitions. + net451;netstandard1.3 + $(NoWarn);CS1591 + true + aspnetcore + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj deleted file mode 100644 index 7024f5bbbb..0000000000 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - d9128247-8f97-48b8-a863-f1f21a029fce - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs deleted file mode 100644 index 76feceeff0..0000000000 --- a/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json deleted file mode 100644 index f3ffbab19e..0000000000 --- a/src/Microsoft.AspNetCore.Http.Features/project.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "version": "1.2.0-*", - "description": "ASP.NET Core HTTP feature interface definitions.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "tags": [ - "aspnetcore" - ] - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "xmlDoc": true - }, - "dependencies": { - "Microsoft.Extensions.Primitives": "1.2.0-*", - "NETStandard.Library": "1.6.2-*" - }, - "frameworks": { - "net451": {}, - "netstandard1.3": { - "dependencies": { - "System.ComponentModel": "4.4.0-*", - "System.Net.WebSockets": "4.4.0-*", - "System.Security.Claims": "4.4.0-*", - "System.Security.Principal": "4.4.0-*" - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj new file mode 100644 index 0000000000..c3cf6b7e5d --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -0,0 +1,20 @@ + + + + ASP.NET Core default HTTP feature implementations. + net451;netstandard1.3 + $(NoWarn);CS1591 + true + true + aspnetcore + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj deleted file mode 100644 index 905047ba45..0000000000 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - bcf0f967-8753-4438-bd07-aadca9ce509a - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs deleted file mode 100644 index 76feceeff0..0000000000 --- a/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json deleted file mode 100644 index fcd3470326..0000000000 --- a/src/Microsoft.AspNetCore.Http/project.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "version": "1.2.0-*", - "description": "ASP.NET Core default HTTP feature implementations.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "tags": [ - "aspnetcore" - ] - }, - "buildOptions": { - "warningsAsErrors": true, - "allowUnsafe": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "xmlDoc": true - }, - "dependencies": { - "Microsoft.AspNetCore.Http.Abstractions": { - "target": "project" - }, - "Microsoft.AspNetCore.WebUtilities": { - "target": "project" - }, - "Microsoft.Extensions.ObjectPool": "1.2.0-*", - "Microsoft.Extensions.Options": "1.2.0-*", - "Microsoft.Extensions.TaskCache.Sources": { - "version": "1.2.0-*", - "type": "build" - }, - "Microsoft.Net.Http.Headers": { - "target": "project" - }, - "NETStandard.Library": "1.6.2-*", - "System.Buffers": "4.4.0-*" - }, - "frameworks": { - "net451": {}, - "netstandard1.3": {} - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj new file mode 100644 index 0000000000..9f03032a06 --- /dev/null +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj @@ -0,0 +1,14 @@ + + + + ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application. + net451;netstandard1.3 + $(NoWarn);CS1591 + true + aspnetcore;owin + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj deleted file mode 100644 index 5eee22decd..0000000000 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 59bed991-f207-48ed-b24c-0a1d9c986c01 - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs deleted file mode 100644 index 76feceeff0..0000000000 --- a/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] diff --git a/src/Microsoft.AspNetCore.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json deleted file mode 100644 index 9b0cbc2431..0000000000 --- a/src/Microsoft.AspNetCore.Owin/project.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "version": "1.2.0-*", - "description": "ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "tags": [ - "aspnetcore", - "katana", - "owin" - ] - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "xmlDoc": true - }, - "dependencies": { - "Microsoft.AspNetCore.Http": { - "target": "project" - }, - "Microsoft.Extensions.TaskCache.Sources": { - "version": "1.2.0-*", - "type": "build" - }, - "NETStandard.Library": "1.6.2-*" - }, - "frameworks": { - "net451": {}, - "netstandard1.3": {} - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj new file mode 100644 index 0000000000..3a67092d21 --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -0,0 +1,16 @@ + + + + ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings. + net451;netstandard1.3 + $(DefineConstants);WebEncoders_In_WebUtilities + $(NoWarn);CS1591 + true + aspnetcore + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj deleted file mode 100644 index 3785e08db8..0000000000 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - a2fb7838-0031-4fad-ba3e-83c30b3af406 - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs index 0ebd229a18..aa80ef1d7e 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs @@ -1,13 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Reflection; -using System.Resources; using System.Runtime.CompilerServices; -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] [assembly: InternalsVisibleTo("Microsoft.AspNetCore.WebUtilities.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] -[assembly: NeutralResourcesLanguage("en-us")] diff --git a/src/Microsoft.AspNetCore.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json deleted file mode 100644 index 7d77e14ec5..0000000000 --- a/src/Microsoft.AspNetCore.WebUtilities/project.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "version": "1.2.0-*", - "description": "ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "tags": [ - "aspnetcore" - ] - }, - "buildOptions": { - "define": [ - "WebEncoders_In_WebUtilities" - ], - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "warningsAsErrors": true, - "xmlDoc": true - }, - "dependencies": { - "Microsoft.Extensions.Primitives": "1.2.0-*", - "Microsoft.Extensions.WebEncoders.Sources": { - "type": "build", - "version": "1.2.0-*" - }, - "Microsoft.Net.Http.Headers": { - "target": "project" - }, - "NETStandard.Library": "1.6.2-*", - "System.Buffers": "4.4.0-*", - "System.Text.Encodings.Web": "4.4.0-*" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.Runtime": { - "type": "build" - } - } - }, - "netstandard1.3": {} - } -} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj new file mode 100644 index 0000000000..1a632944aa --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -0,0 +1,16 @@ + + + + HTTP header parser implementations. + net451;netstandard1.1 + $(NoWarn);CS1591 + true + true + http + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj deleted file mode 100644 index fe0f8915df..0000000000 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 60aa2fdb-8121-4826-8d00-9a143fefaf66 - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index 538f508dce..c876def487 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -1,13 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Reflection; -using System.Resources; using System.Runtime.CompilerServices; -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: AssemblyCompany("Microsoft Corporation.")] -[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")] -[assembly: AssemblyProduct("Microsoft ASP.NET Core")] [assembly: InternalsVisibleTo("Microsoft.Net.Http.Headers.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json deleted file mode 100644 index a8056cfa12..0000000000 --- a/src/Microsoft.Net.Http.Headers/project.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "version": "1.2.0-*", - "description": "HTTP header parser implementations.", - "packOptions": { - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "tags": [ - "http" - ] - }, - "buildOptions": { - "allowUnsafe": true, - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk", - "nowarn": [ - "CS1591" - ], - "xmlDoc": true - }, - "dependencies": { - "Microsoft.Extensions.Primitives": "1.2.0-*", - "NETStandard.Library": "1.6.2-*", - "System.Buffers": "4.4.0-*", - "System.Diagnostics.Contracts": "4.4.0-*" - }, - "frameworks": { - "netstandard1.1": {} - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj new file mode 100644 index 0000000000..fcef246218 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -0,0 +1,16 @@ + + + + netcoreapp1.1;net451 + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj deleted file mode 100644 index 277ff2e03d..0000000000 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - f16692b8-9f38-4dca-a582-e43172b989c6 - .\obj - .\bin\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json deleted file mode 100644 index 675f58de39..0000000000 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.2.0-*", - "Microsoft.AspNetCore.Testing": "1.2.0-*", - "xunit": "2.2.0-*" - }, - "frameworks": { - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - }, - "net451": {} - }, - "testRunner": "xunit" -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj new file mode 100644 index 0000000000..81f3d395b8 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -0,0 +1,17 @@ + + + + netcoreapp1.1;net451 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj deleted file mode 100644 index 2174e09495..0000000000 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - ae25ef21-7f91-4b86-b73e-af746821d339 - .\obj - .\bin\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json deleted file mode 100644 index c6773f1c42..0000000000 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.2.0-*", - "Microsoft.AspNetCore.Http.Extensions": "1.2.0-*", - "Microsoft.Extensions.DependencyInjection": "1.2.0-*", - "xunit": "2.2.0-*" - }, - "frameworks": { - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - }, - "net451": {} - }, - "testRunner": "xunit" -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj new file mode 100644 index 0000000000..014ee7ea8f --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp1.1;net451 + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj deleted file mode 100644 index bbff3d9959..0000000000 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - c5d2bae1-e182-48a0-aa74-1af14b782bf7 - .\obj - .\bin\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 60667e0f6e..0000000000 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Runtime.CompilerServices; -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: AssemblyTitle("Microsoft.AspNetCore.Http.Features.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNetCore.Http.Features.Tests")] -[assembly: AssemblyCopyright("Copyright © 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a780740b-8831-40e0-a084-489d738dfef5")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json deleted file mode 100644 index ba4aa736ec..0000000000 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http.Features": "1.2.0-*", - "xunit": "2.2.0-*" - }, - "frameworks": { - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - }, - "net451": {} - }, - "testRunner": "xunit" -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index 5f5b86e4b1..0fa3247dae 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -50,7 +50,11 @@ namespace Microsoft.AspNetCore.Http // Arrange var accessor = new HttpContextAccessor(); var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions()), accessor); - var domain = AppDomain.CreateDomain("newDomain"); + var setupInfo = new AppDomainSetup + { + ApplicationBase = AppDomain.CurrentDomain.BaseDirectory + }; + var domain = AppDomain.CreateDomain("newDomain", null, setupInfo); // Act var context = contextFactory.Create(new FeatureCollection()); diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj new file mode 100644 index 0000000000..12697fb894 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp1.1;net451 + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj deleted file mode 100644 index dbf688786f..0000000000 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - aa99af26-f7b1-4a6b-a922-5c25539f6391 - .\obj - .\bin\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json deleted file mode 100644 index 8c94549ec7..0000000000 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.2.0-*", - "xunit": "2.2.0-*" - }, - "frameworks": { - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - }, - "net451": {} - }, - "testRunner": "xunit" -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj new file mode 100644 index 0000000000..1c673f5f04 --- /dev/null +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -0,0 +1,17 @@ + + + + netcoreapp1.1;net451 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj deleted file mode 100644 index 0fd152ad0c..0000000000 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 16219571-3268-4d12-8689-12b7163dba13 - .\obj - .\bin\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json deleted file mode 100644 index b3e3d40a57..0000000000 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.Http": "1.2.0-*", - "Microsoft.AspNetCore.Owin": "1.2.0-*", - "Microsoft.Extensions.DependencyInjection": "1.2.0-*", - "xunit": "2.2.0-*" - }, - "frameworks": { - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - }, - "net451": {} - }, - "testRunner": "xunit" -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs index 51e7a987ad..cdb368e6e3 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs @@ -71,7 +71,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var inner = MakeStream(1024 * 2); string tempFileName; - using (var stream = new FileBufferingReadStream(inner, 1024, null, Directory.GetCurrentDirectory())) + using (var stream = new FileBufferingReadStream(inner, 1024, null, GetCurrentDirectory())) { var bytes = new byte[1000]; var read0 = stream.Read(bytes, 0, bytes.Length); @@ -132,7 +132,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var inner = MakeStream(1024 * 2); string tempFileName; - using (var stream = new FileBufferingReadStream(inner, 512, 1024, Directory.GetCurrentDirectory())) + using (var stream = new FileBufferingReadStream(inner, 512, 1024, GetCurrentDirectory())) { var bytes = new byte[500]; var read0 = stream.Read(bytes, 0, bytes.Length); @@ -201,7 +201,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var inner = MakeStream(1024 * 2); string tempFileName; - using (var stream = new FileBufferingReadStream(inner, 1024, null, Directory.GetCurrentDirectory())) + using (var stream = new FileBufferingReadStream(inner, 1024, null, GetCurrentDirectory())) { var bytes = new byte[1000]; var read0 = await stream.ReadAsync(bytes, 0, bytes.Length); @@ -262,7 +262,7 @@ namespace Microsoft.AspNetCore.WebUtilities { var inner = MakeStream(1024 * 2); string tempFileName; - using (var stream = new FileBufferingReadStream(inner, 512, 1024, Directory.GetCurrentDirectory())) + using (var stream = new FileBufferingReadStream(inner, 512, 1024, GetCurrentDirectory())) { var bytes = new byte[500]; var read0 = await stream.ReadAsync(bytes, 0, bytes.Length); @@ -290,5 +290,14 @@ namespace Microsoft.AspNetCore.WebUtilities Assert.False(File.Exists(tempFileName)); } + + private static string GetCurrentDirectory() + { +#if NET451 + return AppDomain.CurrentDomain.BaseDirectory; +#else + return AppContext.BaseDirectory; +#endif + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj new file mode 100644 index 0000000000..ed91a7b52f --- /dev/null +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp1.1;net451 + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj deleted file mode 100644 index fae7a5dd1c..0000000000 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 93c10e50-bcbb-4d8e-9492-d46e1396225b - .\obj - .\bin\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json deleted file mode 100644 index 374f049dd2..0000000000 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.AspNetCore.WebUtilities": "1.2.0-*", - "xunit": "2.2.0-*" - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "testRunner": "xunit", - "frameworks": { - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - }, - "net451": {} - } -} \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj new file mode 100644 index 0000000000..8c7f068a04 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp1.1;net451 + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj deleted file mode 100644 index c887d6a957..0000000000 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 - .\obj - .\bin\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json deleted file mode 100644 index db80e9686f..0000000000 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "Microsoft.Net.Http.Headers": "1.2.0-*", - "xunit": "2.2.0-*" - }, - "buildOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "frameworks": { - "netcoreapp1.1": { - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.2.0-*", - "type": "platform" - } - } - }, - "net451": {} - }, - "testRunner": "xunit" -} \ No newline at end of file diff --git a/version.props b/version.props new file mode 100644 index 0000000000..38c93687ab --- /dev/null +++ b/version.props @@ -0,0 +1,7 @@ + + + + 1.2.0 + preview1 + + \ No newline at end of file From 6e01e642cbd7c46d0a9e418c3d8bfb8d492c430e Mon Sep 17 00:00:00 2001 From: Brian Chavez Date: Wed, 8 Feb 2017 20:00:08 -0800 Subject: [PATCH 638/846] Fixed typo in HttpContext.User XML doc. (#771) --- src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs index 4aeac2be9c..7f72dcd8bb 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs @@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Http public abstract AuthenticationManager Authentication { get; } /// - /// Gets or sets the the user for this request. + /// Gets or sets the user for this request. /// public abstract ClaimsPrincipal User { get; set; } From 945b4e63de17173b3c3ef6ca5aa240f03c159bda Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 13 Feb 2017 18:53:10 -0800 Subject: [PATCH 639/846] Added support for middleware activation via IMiddlewareFactory (#773) * Added support for middleware activation via IMiddlewareFactory - IMiddlewareFactory and IMiddleware are new extensiblity points for activating and authoring middleware. Under the covers, middleware is still very much just a function. This just provides a nice way to get a per request activated middleware instance that is created and released via the IMiddlewareFactory. The caveats are that middleware needs to be registered in the container (by default) and that not possible to explicitly pass arguments directly via UseMiddleware. - Added tests --- .../Extensions/UseMiddlewareExtensions.cs | 44 +++++++ .../IMiddleware.cs | 25 ++++ .../IMiddlewareFactory.cs | 30 +++++ .../Properties/Resources.Designer.cs | 48 +++++++ .../Resources.resx | 9 ++ .../MiddlewareFactory.cs | 35 ++++++ .../UseMiddlewareTest.cs | 117 ++++++++++++++++++ 7 files changed, 308 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs create mode 100644 src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index b9f1d36064..71677c0582 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -42,6 +42,18 @@ namespace Microsoft.AspNetCore.Builder /// The instance. public static IApplicationBuilder UseMiddleware(this IApplicationBuilder app, Type middleware, params object[] args) { + if (typeof(IMiddleware).GetTypeInfo().IsAssignableFrom(middleware.GetTypeInfo())) + { + // IMiddleware doesn't support passing args directly since it's + // activated from the container + if (args.Length > 0) + { + throw new NotSupportedException(Resources.FormatException_UseMiddlewareExplicitArgumentsNotSupported(typeof(IMiddleware))); + } + + return UseMiddlewareInterface(app, middleware); + } + var applicationServices = app.ApplicationServices; return app.Use(next => { @@ -93,6 +105,38 @@ namespace Microsoft.AspNetCore.Builder }); } + private static IApplicationBuilder UseMiddlewareInterface(IApplicationBuilder app, Type middlewareType) + { + return app.Use(next => + { + return async context => + { + var middlewareFactory = (IMiddlewareFactory)context.RequestServices.GetService(typeof(IMiddlewareFactory)); + if (middlewareFactory == null) + { + // No middleware factory + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoMiddlewareFactory(typeof(IMiddlewareFactory))); + } + + var middleware = middlewareFactory.Create(middlewareType); + if (middleware == null) + { + // The factory returned null, it's a broken implementation + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareUnableToCreateMiddleware(middlewareFactory.GetType(), middlewareType)); + } + + try + { + await middleware.Invoke(context, next); + } + finally + { + middlewareFactory.Release(middleware); + } + }; + }); + } + private static Func Compile(MethodInfo methodinfo, ParameterInfo[] parameters) { // If we call something like diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs new file mode 100644 index 0000000000..53d549833b --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs @@ -0,0 +1,25 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Http +{ + /// + /// Defines middleware that can be added to the application's request pipeline. + /// + public interface IMiddleware + { + /// + /// Request handling method. + /// + /// The for the current request. + /// The delegate representing the remaining middleware in the request pipeline. + /// A that represents the execution of this middleware. + Task Invoke(HttpContext context, RequestDelegate next); + } +} diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs new file mode 100644 index 0000000000..be5af344f2 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Http +{ + /// + /// Provides methods to create middlware. + /// + public interface IMiddlewareFactory + { + /// + /// Creates a middleware instance for each request. + /// + /// The concrete of the . + /// The instance. + IMiddleware Create(Type middlewareType); + + /// + /// Releases a instance at the end of each request. + /// + /// The instance to release. + void Release(IMiddleware middleware); + } +} diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs index 40e4255667..c91b54e3aa 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs @@ -154,6 +154,54 @@ namespace Microsoft.AspNetCore.Http.Abstractions return GetString("Exception_PortMustBeGreaterThanZero"); } + /// + /// No service for type '{0}' has been registered. + /// + internal static string Exception_UseMiddlewareNoMiddlewareFactory + { + get { return GetString("Exception_UseMiddlewareNoMiddlewareFactory"); } + } + + /// + /// No service for type '{0}' has been registered. + /// + internal static string FormatException_UseMiddlewareNoMiddlewareFactory(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoMiddlewareFactory"), p0); + } + + /// + /// '{0}' failed to create middleware of type '{1}'. + /// + internal static string Exception_UseMiddlewareUnableToCreateMiddleware + { + get { return GetString("Exception_UseMiddlewareUnableToCreateMiddleware"); } + } + + /// + /// '{0}' failed to create middleware of type '{1}'. + /// + internal static string FormatException_UseMiddlewareUnableToCreateMiddleware(object p0, object p1) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareUnableToCreateMiddleware"), p0, p1); + } + + /// + /// Types that implement '{0}' do not support explicit arguments. + /// + internal static string Exception_UseMiddlewareExplicitArgumentsNotSupported + { + get { return GetString("Exception_UseMiddlewareExplicitArgumentsNotSupported"); } + } + + /// + /// Types that implement '{0}' do not support explicit arguments. + /// + internal static string FormatException_UseMiddlewareExplicitArgumentsNotSupported(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareExplicitArgumentsNotSupported"), p0); + } + private static string GetString(string name, params string[] formatterNames) { var value = _resourceManager.GetString(name); diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx index 19ce173d19..b37e46a114 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx @@ -144,4 +144,13 @@ The value must be greater than zero. + + No service for type '{0}' has been registered. + + + '{0}' failed to create middleware of type '{1}'. + + + Types that implement '{0}' do not support explicit arguments. + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs new file mode 100644 index 0000000000..5e5cd285f4 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs @@ -0,0 +1,35 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Http +{ + public class MiddlewareFactory : IMiddlewareFactory + { + // The default middleware factory is just an IServiceProvider proxy. + // This should be registered as a scoped service so that the middleware instances + // don't end up being singletons. + private readonly IServiceProvider _serviceProvider; + + public MiddlewareFactory(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public IMiddleware Create(Type middlewareType) + { + return _serviceProvider.GetRequiredService(middlewareType) as IMiddleware; + } + + public void Release(IMiddleware middleware) + { + // The container owns the lifetime of the service + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index ce197e0c17..8f0446ce35 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder.Internal; @@ -83,14 +84,130 @@ namespace Microsoft.AspNetCore.Http var exception = Assert.Throws(() => builder.Build()); } + [Fact] + public void UseMiddlewareWithIMiddlewareThrowsIfParametersSpecified() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + var exception = Assert.Throws(() => builder.UseMiddleware(typeof(Middleware), "arg")); + Assert.Equal(Resources.FormatException_UseMiddlewareExplicitArgumentsNotSupported(typeof(IMiddleware)), exception.Message); + } + + [Fact] + public async Task UseMiddlewareWithIMiddlewareThrowsIfNoIMiddlewareFactoryRegistered() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(Middleware)); + var app = builder.Build(); + var exception = await Assert.ThrowsAsync(async () => + { + var context = new DefaultHttpContext(); + var sp = new DummyServiceProvider(); + context.RequestServices = sp; + await app(context); + }); + Assert.Equal(Resources.FormatException_UseMiddlewareNoMiddlewareFactory(typeof(IMiddlewareFactory)), exception.Message); + } + + [Fact] + public async Task UseMiddlewareWithIMiddlewareThrowsIfMiddlewareFactoryCreateReturnsNull() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(Middleware)); + var app = builder.Build(); + var exception = await Assert.ThrowsAsync(async () => + { + var context = new DefaultHttpContext(); + var sp = new DummyServiceProvider(); + sp.AddService(typeof(IMiddlewareFactory), new BadMiddlewareFactory()); + context.RequestServices = sp; + await app(context); + }); + + Assert.Equal(Resources.FormatException_UseMiddlewareUnableToCreateMiddleware(typeof(BadMiddlewareFactory), typeof(Middleware)), exception.Message); + } + + [Fact] + public async Task UseMiddlewareWithIMiddlewareWorks() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(Middleware)); + var app = builder.Build(); + var context = new DefaultHttpContext(); + var sp = new DummyServiceProvider(); + var middlewareFactory = new BasicMiddlewareFactory(); + sp.AddService(typeof(IMiddlewareFactory), middlewareFactory); + context.RequestServices = sp; + await app(context); + Assert.Equal(true, context.Items["before"]); + Assert.Equal(true, context.Items["after"]); + Assert.NotNull(middlewareFactory.Created); + Assert.NotNull(middlewareFactory.Released); + Assert.IsType(typeof(Middleware), middlewareFactory.Created); + Assert.IsType(typeof(Middleware), middlewareFactory.Released); + Assert.Same(middlewareFactory.Created, middlewareFactory.Released); + } + + public class Middleware : IMiddleware + { + public async Task Invoke(HttpContext context, RequestDelegate next) + { + context.Items["before"] = true; + await next(context); + context.Items["after"] = true; + } + } + + public class BasicMiddlewareFactory : IMiddlewareFactory + { + public IMiddleware Created { get; private set; } + public IMiddleware Released { get; private set; } + + public IMiddleware Create(Type middlewareType) + { + Created = Activator.CreateInstance(middlewareType) as IMiddleware; + return Created; + } + + public void Release(IMiddleware middleware) + { + Released = middleware; + } + } + + public class BadMiddlewareFactory : IMiddlewareFactory + { + public IMiddleware Create(Type middlewareType) + { + return null; + } + + public void Release(IMiddleware middleware) + { + + } + } + private class DummyServiceProvider : IServiceProvider { + private Dictionary _services = new Dictionary(); + + public void AddService(Type type, object value) => _services[type] = value; + public object GetService(Type serviceType) { if (serviceType == typeof(IServiceProvider)) { return this; } + + if (_services.TryGetValue(serviceType, out object value)) + { + return value; + } return null; } } From d4800d188ad261258bb3bf83a112c23fcda71f54 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 14 Feb 2017 08:37:12 -0800 Subject: [PATCH 640/846] Bump test projects up to .NET 4.5.2 - aspnet/Testing#248 - xUnit no longer supports .NET 4.5.1 - build tests for desktop .NET only on Windows --- .../Microsoft.AspNetCore.Http.Abstractions.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.Http.Extensions.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.Http.Features.Tests.csproj | 3 ++- .../HttpContextFactoryTests.cs | 2 +- .../Microsoft.AspNetCore.Http.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.Owin.Tests.csproj | 3 ++- .../FileBufferingReadStreamTests.cs | 2 +- .../HttpResponseStreamWriterTest.cs | 8 ++++---- .../Microsoft.AspNetCore.WebUtilities.Tests.csproj | 3 ++- .../Microsoft.Net.Http.Headers.Tests.csproj | 3 ++- 10 files changed, 20 insertions(+), 13 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index fcef246218..bfa23bee84 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp1.1;net451 + netcoreapp1.1;net452 + netcoreapp1.1 diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 81f3d395b8..5c45065ffc 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp1.1;net451 + netcoreapp1.1;net452 + netcoreapp1.1 diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index 014ee7ea8f..c516e5c729 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp1.1;net451 + netcoreapp1.1;net452 + netcoreapp1.1 diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index 0fa3247dae..fc5c5386fa 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Http contextFactory.Dispose(context); } -#if NET451 +#if NET452 private static void DomainFunc() { var accessor = new HttpContextAccessor(); diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 12697fb894..174d688198 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp1.1;net451 + netcoreapp1.1;net452 + netcoreapp1.1 diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 1c673f5f04..06b291e3bd 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp1.1;net451 + netcoreapp1.1;net452 + netcoreapp1.1 diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs index cdb368e6e3..2a96d197da 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs @@ -293,7 +293,7 @@ namespace Microsoft.AspNetCore.WebUtilities private static string GetCurrentDirectory() { -#if NET451 +#if NET452 return AppDomain.CurrentDomain.BaseDirectory; #else return AppContext.BaseDirectory; diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 7f4c54b5a3..7b68cfbe23 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(expectedData, memoryStream.ToArray()); } -#if NET451 +#if NET452 [Fact] public async Task DoesNotFlush_UnderlyingStream_OnClosingWriter() { @@ -68,7 +68,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(0, stream.FlushAsyncCallCount); } -#if NET451 +#if NET452 [Fact] public async Task DoesNotClose_UnderlyingStream_OnDisposingWriter() { @@ -113,7 +113,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test await writer.WriteAsync(new string('a', byteLength)); // Act -#if NET451 +#if NET452 writer.Close(); #else writer.Dispose(); @@ -502,7 +502,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test return base.WriteAsync(buffer, offset, count, cancellationToken); } -#if NET451 +#if NET452 public override void Close() { CloseCallCount++; diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index ed91a7b52f..11a622c9c2 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp1.1;net451 + netcoreapp1.1;net452 + netcoreapp1.1 diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 8c7f068a04..1cc3fb5cad 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -1,7 +1,8 @@  - netcoreapp1.1;net451 + netcoreapp1.1;net452 + netcoreapp1.1 From b9bba9cbb149e5760349b854605e26a09bc67fd1 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 14 Feb 2017 16:03:54 -0800 Subject: [PATCH 641/846] Downgrade to stable packages --- build/common.props | 5 ++--- build/dependencies.props | 6 ++++++ .../Microsoft.AspNetCore.Http.Abstractions.csproj | 8 ++++---- .../Microsoft.AspNetCore.Http.Extensions.csproj | 4 ++-- .../Microsoft.AspNetCore.Http.Features.csproj | 10 +++++----- .../Microsoft.AspNetCore.Http.csproj | 4 ++-- .../Microsoft.AspNetCore.WebUtilities.csproj | 4 ++-- .../Microsoft.Net.Http.Headers.csproj | 6 +++--- 8 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 build/dependencies.props diff --git a/build/common.props b/build/common.props index 2bd16a7b97..e9fa82d8ef 100644 --- a/build/common.props +++ b/build/common.props @@ -1,4 +1,5 @@ + @@ -8,8 +9,6 @@ $(MSBuildThisFileDirectory)Key.snk true true - 1.2.0-* - 1.6.2-* $(VersionSuffix)-$(BuildNumber) @@ -21,4 +20,4 @@ - \ No newline at end of file + diff --git a/build/dependencies.props b/build/dependencies.props new file mode 100644 index 0000000000..e704edaec0 --- /dev/null +++ b/build/dependencies.props @@ -0,0 +1,6 @@ + + + 1.6.1 + 4.3.0 + + diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index b8ab908f72..46ec27b4f7 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -16,10 +16,10 @@ Microsoft.AspNetCore.Http.HttpResponse - + - - + + - \ No newline at end of file + diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index f5cee38563..b5b52b4694 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -11,6 +11,6 @@ - + - \ No newline at end of file + diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index d5077d39f6..7774fd2b34 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -9,11 +9,11 @@ - - + + - - + + - \ No newline at end of file + diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index c3cf6b7e5d..2b41f9cd4c 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -15,6 +15,6 @@ - + - \ No newline at end of file + diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index 3a67092d21..7c069cbd84 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -11,6 +11,6 @@ - + - \ No newline at end of file + diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 1a632944aa..358bcbf3e4 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -10,7 +10,7 @@ - - + + - \ No newline at end of file + From 15adff943336bd2c5c3b805f571953a3536caba3 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 24 Feb 2017 14:17:12 -0800 Subject: [PATCH 642/846] Only format non-negative int64 #760 --- .../HeaderDictionaryTypeExtensions.cs | 2 +- .../RequestHeaders.cs | 4 +- .../ResponseHeaders.cs | 4 +- .../HeaderDictionary.cs | 4 +- .../DictionaryStringValuesWrapper.cs | 4 +- .../CacheControlHeaderValue.cs | 2 +- .../ContentDispositionHeaderValue.cs | 2 +- .../ContentRangeHeaderValue.cs | 6 +-- .../HeaderUtilities.cs | 44 +++++++------------ .../RangeItemHeaderValue.cs | 4 +- .../SetCookieHeaderValue.cs | 6 +-- .../HeaderUtilitiesTest.cs | 33 ++++++++------ 12 files changed, 53 insertions(+), 62 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 29e4a0efee..6863d61e0e 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -156,7 +156,7 @@ namespace Microsoft.AspNetCore.Http { typeof(RangeHeaderValue), new Func(value => { RangeHeaderValue result; return RangeHeaderValue.TryParse(value, out result) ? result : null; }) }, { typeof(EntityTagHeaderValue), new Func(value => { EntityTagHeaderValue result; return EntityTagHeaderValue.TryParse(value, out result) ? result : null; }) }, { typeof(DateTimeOffset?), new Func(value => { DateTimeOffset result; return HeaderUtilities.TryParseDate(value, out result) ? result : (DateTimeOffset?)null; }) }, - { typeof(long?), new Func(value => { long result; return HeaderUtilities.TryParseInt64(value, out result) ? result : (long?)null; }) }, + { typeof(long?), new Func(value => { long result; return HeaderUtilities.TryParseNonNegativeInt64(value, out result) ? result : (long?)null; }) }, }; private static IDictionary KnownListParsers = new Dictionary() diff --git a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs index 2830e6147d..ddd125985e 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs @@ -97,11 +97,11 @@ namespace Microsoft.AspNetCore.Http.Headers { get { - return Headers.Get(HeaderNames.ContentLength); + return Headers.ContentLength; } set { - Headers.Set(HeaderNames.ContentLength, value.HasValue ? HeaderUtilities.FormatInt64(value.Value) : null); + Headers.ContentLength = value; } } diff --git a/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs index acdd662d2f..87e3c0318c 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs @@ -50,11 +50,11 @@ namespace Microsoft.AspNetCore.Http.Headers { get { - return Headers.Get(HeaderNames.ContentLength); + return Headers.ContentLength; } set { - Headers.Set(HeaderNames.ContentLength, value.HasValue ? HeaderUtilities.FormatInt64(value.Value) : null); + Headers.ContentLength = value; } } diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 5e52b1285d..61c307a64e 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -106,7 +106,7 @@ namespace Microsoft.AspNetCore.Http var rawValue = this[HeaderNames.ContentLength]; if (rawValue.Count == 1 && !string.IsNullOrWhiteSpace(rawValue[0]) && - HeaderUtilities.TryParseInt64(new StringSegment(rawValue[0]).Trim(), out value)) + HeaderUtilities.TryParseNonNegativeInt64(new StringSegment(rawValue[0]).Trim(), out value)) { return value; } @@ -117,7 +117,7 @@ namespace Microsoft.AspNetCore.Http { if (value.HasValue) { - this[HeaderNames.ContentLength] = HeaderUtilities.FormatInt64(value.Value); + this[HeaderNames.ContentLength] = HeaderUtilities.FormatNonNegativeInt64(value.Value); } else { diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs index d88b2b9544..bef2a0e27c 100644 --- a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNetCore.Owin if (rawValue.Length == 1 && !string.IsNullOrWhiteSpace(rawValue[0]) && - HeaderUtilities.TryParseInt64(new StringSegment(rawValue[0]).Trim(), out value)) + HeaderUtilities.TryParseNonNegativeInt64(new StringSegment(rawValue[0]).Trim(), out value)) { return value; } @@ -68,7 +68,7 @@ namespace Microsoft.AspNetCore.Owin { if (value.HasValue) { - Inner[HeaderNames.ContentLength] = (StringValues)HeaderUtilities.FormatInt64(value.Value); + Inner[HeaderNames.ContentLength] = (StringValues)HeaderUtilities.FormatNonNegativeInt64(value.Value); } else { diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index c0d28bdc9a..af31316667 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -610,7 +610,7 @@ namespace Microsoft.Net.Http.Headers } int seconds; - if (!HeaderUtilities.TryParseInt32(nameValue.Value, out seconds)) + if (!HeaderUtilities.TryParseNonNegativeInt32(nameValue.Value, out seconds)) { return false; } diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index e3542480ba..fbae25b6d1 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -108,7 +108,7 @@ namespace Microsoft.Net.Http.Headers if (sizeParameter != null) { var sizeString = sizeParameter.Value; - if (HeaderUtilities.TryParseInt64(sizeString, out value)) + if (HeaderUtilities.TryParseNonNegativeInt64(sizeString, out value)) { return value; } diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index c24b42758a..c187491dfc 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -354,13 +354,13 @@ namespace Microsoft.Net.Http.Headers parsedValue = null; long from = 0; - if ((fromLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(fromStartIndex, fromLength), out from)) + if ((fromLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(fromStartIndex, fromLength), out from)) { return false; } long to = 0; - if ((toLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(toStartIndex, toLength), out to)) + if ((toLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(toStartIndex, toLength), out to)) { return false; } @@ -372,7 +372,7 @@ namespace Microsoft.Net.Http.Headers } long length = 0; - if ((lengthLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(lengthStartIndex, lengthLength), + if ((lengthLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(lengthStartIndex, lengthLength), out length)) { return false; diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 827a99b437..c6580a56fc 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -12,7 +12,7 @@ namespace Microsoft.Net.Http.Headers { public static class HeaderUtilities { - private static readonly int _int64MaxStringLength = 20; + private static readonly int _int64MaxStringLength = 19; private const string QualityName = "q"; internal const string BytesUnit = "bytes"; @@ -269,7 +269,7 @@ namespace Microsoft.Net.Http.Headers var tokenLength = HttpRuleParser.GetTokenLength(headerValues[i], current); if (tokenLength == targetValue.Length && string.Compare(headerValues[i], current, targetValue, 0, tokenLength, StringComparison.OrdinalIgnoreCase) == 0 - && TryParseInt64FromHeaderValue(current + tokenLength, headerValues[i], out seconds)) + && TryParseNonNegativeInt64FromHeaderValue(current + tokenLength, headerValues[i], out seconds)) { // Token matches target value and seconds were parsed value = TimeSpan.FromSeconds(seconds); @@ -342,7 +342,7 @@ namespace Microsoft.Net.Http.Headers return false; } - private static unsafe bool TryParseInt64FromHeaderValue(int startIndex, string headerValue, out long result) + private static unsafe bool TryParseNonNegativeInt64FromHeaderValue(int startIndex, string headerValue, out long result) { // Trim leading whitespace startIndex += HttpRuleParser.GetWhitespaceLength(headerValue, startIndex); @@ -359,7 +359,7 @@ namespace Microsoft.Net.Http.Headers startIndex += HttpRuleParser.GetWhitespaceLength(headerValue, startIndex); // Try parse the number - if (TryParseInt64(new StringSegment(headerValue, startIndex, HttpRuleParser.GetNumberLength(headerValue, startIndex, false)), out result)) + if (TryParseNonNegativeInt64(new StringSegment(headerValue, startIndex, HttpRuleParser.GetNumberLength(headerValue, startIndex, false)), out result)) { return true; } @@ -368,9 +368,9 @@ namespace Microsoft.Net.Http.Headers return false; } - internal static bool TryParseInt32(string value, out int result) + internal static bool TryParseNonNegativeInt32(string value, out int result) { - return TryParseInt32(new StringSegment(value), out result); + return TryParseNonNegativeInt32(new StringSegment(value), out result); } /// @@ -388,12 +388,12 @@ namespace Microsoft.Net.Http.Headers /// result will be overwritten. /// /// true if parsing succeeded; otherwise, false. - public static bool TryParseInt64(string value, out long result) + public static bool TryParseNonNegativeInt64(string value, out long result) { - return TryParseInt64(new StringSegment(value), out result); + return TryParseNonNegativeInt64(new StringSegment(value), out result); } - internal static unsafe bool TryParseInt32(StringSegment value, out int result) + internal static unsafe bool TryParseNonNegativeInt32(StringSegment value, out int result) { if (string.IsNullOrEmpty(value.Buffer) || value.Length == 0) { @@ -444,7 +444,7 @@ namespace Microsoft.Net.Http.Headers /// originally supplied in result will be overwritten. /// /// true if parsing succeeded; otherwise, false. - public static unsafe bool TryParseInt64(StringSegment value, out long result) + public static unsafe bool TryParseNonNegativeInt64(StringSegment value, out long result) { if (string.IsNullOrEmpty(value.Buffer) || value.Length == 0) { @@ -481,31 +481,22 @@ namespace Microsoft.Net.Http.Headers } /// - /// Converts the signed 64-bit numeric value to its equivalent string representation. + /// Converts the non-negative 64-bit numeric value to its equivalent string representation. /// /// /// The number to convert. /// /// - /// The string representation of the value of this instance, consisting of a minus sign if the value is - /// negative, and a sequence of digits ranging from 0 to 9 with no leading zeroes. + /// The string representation of the value of this instance, consisting of a sequence of digits ranging from 0 to 9 with no leading zeroes. /// - public unsafe static string FormatInt64(long value) + public unsafe static string FormatNonNegativeInt64(long value) { - var position = _int64MaxStringLength; - var negative = false; - if (value < 0) { - // Not possible to compute absolute value of MinValue, return the exact string instead. - if (value == long.MinValue) - { - return "-9223372036854775808"; - } - negative = true; - value = -value; + throw new ArgumentOutOfRangeException(nameof(value), value, "The value to be formatted must be non-negative."); } + var position = _int64MaxStringLength; char* charBuffer = stackalloc char[_int64MaxStringLength]; do @@ -517,11 +508,6 @@ namespace Microsoft.Net.Http.Headers } while (value != 0); - if (negative) - { - charBuffer[--position] = '-'; - } - return new string(charBuffer, position, _int64MaxStringLength - position); } diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index ce62e99f2a..866d4b8e8b 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -202,14 +202,14 @@ namespace Microsoft.Net.Http.Headers // Try convert first value to int64 long from = 0; - if ((fromLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(fromStartIndex, fromLength), out from)) + if ((fromLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(fromStartIndex, fromLength), out from)) { return 0; } // Try convert second value to int64 long to = 0; - if ((toLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(toStartIndex, toLength), out to)) + if ((toLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(toStartIndex, toLength), out to)) { return 0; } diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 7fda7571a3..8c6d9a565d 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -105,7 +105,7 @@ namespace Microsoft.Net.Http.Headers if (MaxAge.HasValue) { - maxAge = HeaderUtilities.FormatInt64((long)MaxAge.Value.TotalSeconds); + maxAge = HeaderUtilities.FormatNonNegativeInt64((long)MaxAge.Value.TotalSeconds); length += SeparatorToken.Length + MaxAgeToken.Length + EqualsToken.Length + maxAge.Length; } @@ -200,7 +200,7 @@ namespace Microsoft.Net.Http.Headers if (MaxAge.HasValue) { - AppendSegment(builder, MaxAgeToken, HeaderUtilities.FormatInt64((long)MaxAge.Value.TotalSeconds)); + AppendSegment(builder, MaxAgeToken, HeaderUtilities.FormatNonNegativeInt64((long)MaxAge.Value.TotalSeconds)); } if (Domain != null) @@ -365,7 +365,7 @@ namespace Microsoft.Net.Http.Headers } var numberString = input.Substring(offset, itemLength); long maxAge; - if (!HeaderUtilities.TryParseInt64(numberString, out maxAge)) + if (!HeaderUtilities.TryParseNonNegativeInt64(numberString, out maxAge)) { // Invalid expiration date, abort return 0; diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs index 97b342264a..807e17cc1e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -87,15 +87,20 @@ namespace Microsoft.Net.Http.Headers [Theory] [InlineData(0)] [InlineData(1)] - [InlineData(-1)] [InlineData(1234567890)] - [InlineData(-1234567890)] [InlineData(long.MaxValue)] - [InlineData(long.MinValue)] - [InlineData(long.MinValue + 1)] - public void FormatInt64_MatchesToString(long value) + public void FormatNonNegativeInt64_MatchesToString(long value) { - Assert.Equal(value.ToString(CultureInfo.InvariantCulture), HeaderUtilities.FormatInt64(value)); + Assert.Equal(value.ToString(CultureInfo.InvariantCulture), HeaderUtilities.FormatNonNegativeInt64(value)); + } + + [Theory] + [InlineData(-1)] + [InlineData(-1234567890)] + [InlineData(long.MinValue)] + public void FormatNonNegativeInt64_Throws_ForNegativeValues(long value) + { + Assert.Throws(() => HeaderUtilities.FormatNonNegativeInt64(value)); } [Theory] @@ -150,20 +155,20 @@ namespace Microsoft.Net.Http.Headers [InlineData("a")] [InlineData("1.1")] [InlineData("9223372036854775808")] // long.MaxValue + 1 - public void TryParseInt64_Fails(string valueString) + public void TryParseNonNegativeInt64_Fails(string valueString) { long value = 1; - Assert.False(HeaderUtilities.TryParseInt64(valueString, out value)); + Assert.False(HeaderUtilities.TryParseNonNegativeInt64(valueString, out value)); Assert.Equal(0, value); } [Theory] [InlineData("0", 0)] [InlineData("9223372036854775807", 9223372036854775807)] // long.MaxValue - public void TryParseInt64_Succeeds(string valueString, long expected) + public void TryParseNonNegativeInt64_Succeeds(string valueString, long expected) { long value = 1; - Assert.True(HeaderUtilities.TryParseInt64(valueString, out value)); + Assert.True(HeaderUtilities.TryParseNonNegativeInt64(valueString, out value)); Assert.Equal(expected, value); } @@ -175,20 +180,20 @@ namespace Microsoft.Net.Http.Headers [InlineData("1.1")] [InlineData("1,000")] [InlineData("2147483648")] // int.MaxValue + 1 - public void TryParseInt32_Fails(string valueString) + public void TryParseNonNegativeInt32_Fails(string valueString) { int value = 1; - Assert.False(HeaderUtilities.TryParseInt32(valueString, out value)); + Assert.False(HeaderUtilities.TryParseNonNegativeInt32(valueString, out value)); Assert.Equal(0, value); } [Theory] [InlineData("0", 0)] [InlineData("2147483647", 2147483647)] // int.MaxValue - public void TryParseInt32_Succeeds(string valueString, long expected) + public void TryParseNonNegativeInt32_Succeeds(string valueString, long expected) { int value = 1; - Assert.True(HeaderUtilities.TryParseInt32(valueString, out value)); + Assert.True(HeaderUtilities.TryParseNonNegativeInt32(valueString, out value)); Assert.Equal(expected, value); } } From fbbcf9ccd27c9292735b5050b8877eecfd9d1992 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 1 Mar 2017 18:14:13 -0800 Subject: [PATCH 643/846] Change korebuild branch and fix argument forwarding in bootstrapper --- build.ps1 | 16 ++++++++-------- build.sh | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.ps1 b/build.ps1 index 0605b59c01..5bf0e2c113 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,6 +1,6 @@ $ErrorActionPreference = "Stop" -function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries) +function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries) { while($true) { @@ -19,7 +19,7 @@ function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $ret Start-Sleep -Seconds 10 } - else + else { $exception = $_.Exception throw $exception @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/feature/msbuild.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP @@ -43,18 +43,18 @@ $buildFolder = ".build" $buildFile="$buildFolder\KoreBuild.ps1" if (!(Test-Path $buildFolder)) { - Write-Host "Downloading KoreBuild from $koreBuildZip" - + Write-Host "Downloading KoreBuild from $koreBuildZip" + $tempFolder=$env:TEMP + "\KoreBuild-" + [guid]::NewGuid() New-Item -Path "$tempFolder" -Type directory | Out-Null $localZipFile="$tempFolder\korebuild.zip" - + DownloadWithRetry -url $koreBuildZip -downloadLocation $localZipFile -retries 6 Add-Type -AssemblyName System.IO.Compression.FileSystem [System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder) - + New-Item -Path "$buildFolder" -Type directory | Out-Null copy-item "$tempFolder\**\build\*" $buildFolder -Recurse @@ -64,4 +64,4 @@ if (!(Test-Path $buildFolder)) { } } -&"$buildFile" $args \ No newline at end of file +&"$buildFile" @args diff --git a/build.sh b/build.sh index 07997d6c83..b0bcadb579 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/feature/msbuild.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi @@ -12,12 +12,12 @@ buildFile="$buildFolder/KoreBuild.sh" if test ! -d $buildFolder; then echo "Downloading KoreBuild from $koreBuildZip" - - tempFolder="/tmp/KoreBuild-$(uuidgen)" + + tempFolder="/tmp/KoreBuild-$(uuidgen)" mkdir $tempFolder - + localZipFile="$tempFolder/korebuild.zip" - + retries=6 until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null) do @@ -29,18 +29,18 @@ if test ! -d $buildFolder; then echo "Waiting 10 seconds before retrying. Retries left: $retries" sleep 10s done - + unzip -q -d $tempFolder $localZipFile - + mkdir $buildFolder cp -r $tempFolder/**/build/** $buildFolder - + chmod +x $buildFile - + # Cleanup if test -d $tempFolder; then - rm -rf $tempFolder + rm -rf $tempFolder fi fi -$buildFile -r $repoFolder "$@" \ No newline at end of file +$buildFile -r $repoFolder "$@" From 81bec95b6a0b45fe990a69ef2ebc1b4025644a61 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 1 Mar 2017 18:25:47 -0800 Subject: [PATCH 644/846] Update AppVeyor and Travis settings --- .travis.yml | 2 +- appveyor.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index eccfa34907..aa78b6f69d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ branches: before_install: - if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/; fi script: - - ./build.sh --quiet verify + - ./build.sh notifications: webhooks: secure: "XshregcmoXywFrrlIk7MLluUV2Pd8Z/VftrviVZjRL5+3akix2QnP15eT2E13yNtyS1yIc3lWfrVrLLf+H5bN9dUSzxIMNoJQ/S18F/AO5VD5ewd6pLC0uYhUcHdTRQuzjLGVPlt2suKpPllV2SsGlAdGatdCfj5zM6eOG31jaA=" diff --git a/appveyor.yml b/appveyor.yml index 7617e58a1e..3f828ce38e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,8 +7,8 @@ branches: - dev - /^(.*\/)?ci-.*$/ build_script: - - build.cmd --quiet verify + - ps: .\build.ps1 clone_depth: 1 test: off deploy: off -os: Visual Studio 2017 RC \ No newline at end of file +os: Visual Studio 2017 RC From 7440d5d29c3814d94c83cdbbea04ee8179e03e64 Mon Sep 17 00:00:00 2001 From: Yves57 Date: Fri, 17 Feb 2017 22:44:38 +0100 Subject: [PATCH 645/846] Remove allocations and improve Header Quality Values parsing performance --- .../HeaderUtilities.cs | 95 ++++++++++++++++++- .../HttpHeaderParser.cs | 11 ++- .../StringWithQualityHeaderValue.cs | 16 +--- .../StringWithQualityHeaderValueTest.cs | 7 ++ 4 files changed, 108 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index c6580a56fc..64cb5d5705 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -13,6 +13,7 @@ namespace Microsoft.Net.Http.Headers public static class HeaderUtilities { private static readonly int _int64MaxStringLength = 19; + private static readonly int _qualityValueMaxCharCount = 10; // Little bit more permissive than RFC7231 5.3.1 private const string QualityName = "q"; internal const string BytesUnit = "bytes"; @@ -62,9 +63,8 @@ namespace Microsoft.Net.Http.Headers { // Note that the RFC requires decimal '.' regardless of the culture. I.e. using ',' as decimal // separator is considered invalid (even if the current culture would allow it). - double qualityValue; - if (double.TryParse(qualityParameter.Value, NumberStyles.AllowDecimalPoint, - NumberFormatInfo.InvariantInfo, out qualityValue)) + if (TryParseQualityDouble(qualityParameter.Value, 0, out var qualityValue, out var length)) + { return qualityValue; } @@ -480,6 +480,95 @@ namespace Microsoft.Net.Http.Headers } } + // Strict and fast RFC7231 5.3.1 Quality value parser (and without memory allocation) + // See https://tools.ietf.org/html/rfc7231#section-5.3.1 + // Check is made to verify if the value is between 0 and 1 (and it returns False if the check fails). + internal static bool TryParseQualityDouble(string input, int startIndex, out double quality, out int length) + { + quality = 0; + length = 0; + + var inputLength = input.Length; + var current = startIndex; + var limit = startIndex + _qualityValueMaxCharCount; + + var intPart = 0; + var decPart = 0; + var decPow = 1; + + if (current >= inputLength) + { + return false; + } + + var ch = input[current]; + + if (ch >= '0' && ch <= '1') // Only values between 0 and 1 are accepted, according to RFC + { + intPart = ch - '0'; + current++; + } + else + { + // The RFC doesn't allow decimal values starting with dot. I.e. value ".123" is invalid. It must be in the + // form "0.123". + return false; + } + + if (current < inputLength) + { + ch = input[current]; + + if (ch >= '0' && ch <= '9') + { + // The RFC accepts only one digit before the dot + return false; + } + + if (ch == '.') + { + current++; + + while (current < inputLength) + { + ch = input[current]; + if (ch >= '0' && ch <= '9') + { + if (current >= limit) + { + return false; + } + + decPart = decPart * 10 + ch - '0'; + decPow *= 10; + current++; + } + else + { + break; + } + } + } + } + + if (decPart != 0) + { + quality = intPart + decPart / (double)decPow; + } + else + { + quality = intPart; + } + + if (quality < 0 || quality > 1) + { + return false; + } + + length = current - startIndex; + return true; + } + /// /// Converts the non-negative 64-bit numeric value to its equivalent string representation. /// diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs index 4fe977ff19..383a304dcf 100644 --- a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -61,13 +61,14 @@ namespace Microsoft.Net.Http.Headers // If a parser returns an empty list, it means there was no value, but that's valid (e.g. "Accept: "). The caller // can ignore the value. parsedValues = null; - var results = new List(); + List results = null; if (values == null) { return false; } - foreach (var value in values) + for (var i = 0; i < values.Count; i++) { + var value = values[i]; int index = 0; while (!string.IsNullOrEmpty(value) && index < value.Length) @@ -78,6 +79,10 @@ namespace Microsoft.Net.Http.Headers // The entry may not contain an actual value, like " , " if (output != null) { + if (results == null) + { + results = new List(); // Allocate it only when used + } results.Add(output); } } @@ -92,7 +97,7 @@ namespace Microsoft.Net.Http.Headers } } } - if (results.Count > 0) + if (results != null) { parsedValues = results; return true; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index 0521c1a000..13ac4fb15c 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -204,21 +204,7 @@ namespace Microsoft.Net.Http.Headers return false; } - int qualityLength = HttpRuleParser.GetNumberLength(input, current, true); - - if (qualityLength == 0) - { - return false; - } - - double quality; - if (!double.TryParse(input.Substring(current, qualityLength), NumberStyles.AllowDecimalPoint, - NumberFormatInfo.InvariantInfo, out quality)) - { - return false; - } - - if ((quality < 0) || (quality > 1)) + if (!HeaderUtilities.TryParseQualityDouble(input, current, out var quality, out var qualityLength)) { return false; } diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs index 2771614c2f..49ee58b93e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs @@ -121,6 +121,8 @@ namespace Microsoft.Net.Http.Headers CheckValidParse(" t", new StringWithQualityHeaderValue("t")); CheckValidParse("t;q=0.", new StringWithQualityHeaderValue("t", 0)); CheckValidParse("t;q=1.", new StringWithQualityHeaderValue("t", 1)); + CheckValidParse("t;q=1.000", new StringWithQualityHeaderValue("t", 1)); + CheckValidParse("t;q=0.12345678", new StringWithQualityHeaderValue("t", 0.12345678)); CheckValidParse("t ; q = 0", new StringWithQualityHeaderValue("t", 0)); CheckValidParse("iso-8859-5", new StringWithQualityHeaderValue("iso-8859-5")); CheckValidParse("unicode-1-1; q=0.8", new StringWithQualityHeaderValue("unicode-1-1", 0.8)); @@ -154,6 +156,11 @@ namespace Microsoft.Net.Http.Headers [InlineData("t;q=a")] [InlineData("t;qa")] [InlineData("t;q1")] + [InlineData("integer_part_too_long;q=01")] + [InlineData("integer_part_too_long;q=01.0")] + [InlineData("decimal_part_too_long;q=0.123456789")] + [InlineData("decimal_part_too_long;q=0.123456789 ")] + [InlineData("no_integer_part;q=.1")] public void Parse_SetOfInvalidValueStrings_Throws(string input) { Assert.Throws(() => StringWithQualityHeaderValue.Parse(input)); From a1f4928ed589541f47ae1daa9b9163a543030d04 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 6 Mar 2017 14:28:04 -0800 Subject: [PATCH 646/846] Clean up Header qvalue parsing --- src/Microsoft.Net.Http.Headers/HeaderUtilities.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 64cb5d5705..9f49ba742c 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -13,7 +13,7 @@ namespace Microsoft.Net.Http.Headers public static class HeaderUtilities { private static readonly int _int64MaxStringLength = 19; - private static readonly int _qualityValueMaxCharCount = 10; // Little bit more permissive than RFC7231 5.3.1 + private static readonly int _qualityValueMaxCharCount = 10; // Little bit more permissive than RFC7231 5.3.1 private const string QualityName = "q"; internal const string BytesUnit = "bytes"; @@ -503,7 +503,7 @@ namespace Microsoft.Net.Http.Headers var ch = input[current]; - if (ch >= '0' && ch <= '1') // Only values between 0 and 1 are accepted, according to RFC + if (ch >= '0' && ch <= '1') // Only values between 0 and 1 are accepted, according to RFC { intPart = ch - '0'; current++; @@ -560,8 +560,10 @@ namespace Microsoft.Net.Http.Headers quality = intPart; } - if (quality < 0 || quality > 1) + if (quality > 1) { + // reset quality + quality = 0; return false; } From 2cafa432e3944aa41ff0e427c3bd5b50f87a96b8 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 9 Mar 2017 11:19:33 -0800 Subject: [PATCH 647/846] Update .travis.yml (#787) --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa78b6f69d..8bbeaef3f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,7 @@ env: global: - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - DOTNET_CLI_TELEMETRY_OPTOUT: 1 -mono: - - 4.0.5 +mono: none os: - linux - osx From fc3af1ecfec1c5cd3f6eb99584ae1793379e9a47 Mon Sep 17 00:00:00 2001 From: Justin Van Patten Date: Sun, 12 Mar 2017 16:29:09 -0700 Subject: [PATCH 648/846] Remove explicit static constructors Explicit static cctors cause the C# compiler to not mark types as beforefieldinit, which means the JIT will add checks to each static method and instance constructors of the type to make sure that the static constructor was previously called. This can be avoided by removing explicit static constructors and initializing static fields inline. --- .../HttpRuleParser.cs | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 835a2f35bb..0ce5833600 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -10,7 +10,7 @@ namespace Microsoft.Net.Http.Headers { internal static class HttpRuleParser { - private static readonly bool[] TokenChars; + private static readonly bool[] TokenChars = CreateTokenChars(); private const int MaxNestedCount = 5; private static readonly string[] DateFormats = new string[] { // "r", // RFC 1123, required output format but too strict for input @@ -43,36 +43,38 @@ namespace Microsoft.Net.Http.Headers // iso-8859-1, Western European (ISO) internal static readonly Encoding DefaultHttpEncoding = Encoding.GetEncoding("iso-8859-1"); - static HttpRuleParser() + private static bool[] CreateTokenChars() { // token = 1* // CTL = - TokenChars = new bool[128]; // everything is false + var tokenChars = new bool[128]; // everything is false for (int i = 33; i < 127; i++) // skip Space (32) & DEL (127) { - TokenChars[i] = true; + tokenChars[i] = true; } // remove separators: these are not valid token characters - TokenChars[(byte)'('] = false; - TokenChars[(byte)')'] = false; - TokenChars[(byte)'<'] = false; - TokenChars[(byte)'>'] = false; - TokenChars[(byte)'@'] = false; - TokenChars[(byte)','] = false; - TokenChars[(byte)';'] = false; - TokenChars[(byte)':'] = false; - TokenChars[(byte)'\\'] = false; - TokenChars[(byte)'"'] = false; - TokenChars[(byte)'/'] = false; - TokenChars[(byte)'['] = false; - TokenChars[(byte)']'] = false; - TokenChars[(byte)'?'] = false; - TokenChars[(byte)'='] = false; - TokenChars[(byte)'{'] = false; - TokenChars[(byte)'}'] = false; + tokenChars[(byte)'('] = false; + tokenChars[(byte)')'] = false; + tokenChars[(byte)'<'] = false; + tokenChars[(byte)'>'] = false; + tokenChars[(byte)'@'] = false; + tokenChars[(byte)','] = false; + tokenChars[(byte)';'] = false; + tokenChars[(byte)':'] = false; + tokenChars[(byte)'\\'] = false; + tokenChars[(byte)'"'] = false; + tokenChars[(byte)'/'] = false; + tokenChars[(byte)'['] = false; + tokenChars[(byte)']'] = false; + tokenChars[(byte)'?'] = false; + tokenChars[(byte)'='] = false; + tokenChars[(byte)'{'] = false; + tokenChars[(byte)'}'] = false; + + return tokenChars; } internal static bool IsTokenChar(char character) From 1b02cd2baf06ddec7ffa030546e709819d8ccfb4 Mon Sep 17 00:00:00 2001 From: kchanlee Date: Mon, 13 Mar 2017 22:54:57 +0800 Subject: [PATCH 649/846] Implement `OwinEnvironment` `IEnumerable.GetEnumerator()` (#789) --- src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs | 4 ++-- .../OwinEnvironmentTests.cs | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index 4d30f52cec..165c3eece4 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -270,7 +270,7 @@ namespace Microsoft.AspNetCore.Owin throw new NotImplementedException(); } - IEnumerator> IEnumerable>.GetEnumerator() + public IEnumerator> GetEnumerator() { foreach (var entryPair in _entries) { @@ -288,7 +288,7 @@ namespace Microsoft.AspNetCore.Owin IEnumerator IEnumerable.GetEnumerator() { - throw new NotImplementedException(); + return GetEnumerator(); } public class FeatureMap diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs index 7cd6ef8826..b728802914 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; @@ -129,6 +130,15 @@ namespace Microsoft.AspNetCore.Owin Assert.Equal("1.0", env["owin.Version"]); } + [Fact] + public void OwinEnvironmentImpelmentsGetEnumerator() + { + var owinEnvironment = new OwinEnvironment(CreateContext()); + + Assert.NotNull(owinEnvironment.GetEnumerator()); + Assert.NotNull(((IEnumerable)owinEnvironment).GetEnumerator()); + } + private HttpContext CreateContext() { var context = new DefaultHttpContext(); From aae85cc5d759af1772c7d3e955598a364660efa3 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 14 Mar 2017 13:40:27 -0700 Subject: [PATCH 650/846] Update appveyor and travis settings --- .travis.yml | 1 - appveyor.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8bbeaef3f2..70480c0847 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,6 @@ mono: none os: - linux - osx -osx_image: xcode7.3 branches: only: - master diff --git a/appveyor.yml b/appveyor.yml index 3f828ce38e..1041615c68 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,4 +11,4 @@ build_script: clone_depth: 1 test: off deploy: off -os: Visual Studio 2017 RC +os: Visual Studio 2017 From 73d58b7a1366cddd52c741a84eb7479cb85575e5 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 15 Mar 2017 13:54:28 -0700 Subject: [PATCH 651/846] Unify dependency versions to one file --- build/dependencies.props | 5 ++++- samples/SampleApp/SampleApp.csproj | 7 ++++--- ...crosoft.AspNetCore.Http.Abstractions.csproj | 13 +++++++++++-- ...Microsoft.AspNetCore.Http.Extensions.csproj | 9 ++++++++- .../Microsoft.AspNetCore.Http.Features.csproj | 7 ++++++- .../Microsoft.AspNetCore.Http.csproj | 13 ++++++++++--- .../Microsoft.AspNetCore.Owin.csproj | 11 +++++++++-- .../Microsoft.AspNetCore.WebUtilities.csproj | 9 ++++++++- .../Microsoft.Net.Http.Headers.csproj | 6 +++++- ...t.AspNetCore.Http.Abstractions.Tests.csproj | 18 +++++++++++++----- ...oft.AspNetCore.Http.Extensions.Tests.csproj | 18 +++++++++++++----- ...osoft.AspNetCore.Http.Features.Tests.csproj | 16 ++++++++++++---- .../Microsoft.AspNetCore.Http.Tests.csproj | 16 ++++++++++++---- .../Microsoft.AspNetCore.Owin.Tests.csproj | 18 +++++++++++++----- ...rosoft.AspNetCore.WebUtilities.Tests.csproj | 16 ++++++++++++---- .../Microsoft.Net.Http.Headers.Tests.csproj | 16 ++++++++++++---- 16 files changed, 152 insertions(+), 46 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index e704edaec0..5a4c06ce33 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,6 +1,9 @@ - 1.6.1 + 1.2.0-* 4.3.0 + 1.6.1 + 15.0.0 + 2.2.0 diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index a27d73d6b0..1ea088220c 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -1,12 +1,13 @@  + net451;netcoreapp1.1 - - win7-x64 Exe + - \ No newline at end of file + + diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index 46ec27b4f7..0f57ef2bba 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -1,6 +1,9 @@  + + + ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder. Commonly used types: Microsoft.AspNetCore.Builder.IApplicationBuilder @@ -12,14 +15,20 @@ Microsoft.AspNetCore.Http.HttpResponse aspnetcore $(NoWarn);CS1591 + - - + + + + + + + diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index b5b52b4694..4f76ac1def 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -1,5 +1,7 @@  + + ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. net451;netstandard1.3 @@ -7,10 +9,15 @@ true aspnetcore + - + + + + + diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index 7774fd2b34..82cbac15b1 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -1,5 +1,7 @@  + + ASP.NET Core HTTP feature interface definitions. net451;netstandard1.3 @@ -7,13 +9,16 @@ true aspnetcore + - + + + diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index 2b41f9cd4c..04e24f5e2c 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -1,5 +1,7 @@  + + ASP.NET Core default HTTP feature implementations. net451;netstandard1.3 @@ -8,13 +10,18 @@ true aspnetcore + - - - + + + + + + + diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj index 9f03032a06..e9af551d5f 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj @@ -1,5 +1,7 @@  + + ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application. net451;netstandard1.3 @@ -7,8 +9,13 @@ true aspnetcore;owin + - - \ No newline at end of file + + + + + + diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index 7c069cbd84..1f900cb99a 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -1,5 +1,7 @@  + + ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings. net451;netstandard1.3 @@ -8,9 +10,14 @@ true aspnetcore + - + + + + + diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 358bcbf3e4..795d2c935f 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -1,5 +1,7 @@  + + HTTP header parser implementations. net451;netstandard1.1 @@ -8,9 +10,11 @@ true http + - + + diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index bfa23bee84..1499a5d2f7 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -1,17 +1,25 @@  + + netcoreapp1.1;net452 netcoreapp1.1 + - - - - + + + + + + + + - \ No newline at end of file + + diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 5c45065ffc..a61de3299b 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -1,18 +1,26 @@  + + netcoreapp1.1;net452 netcoreapp1.1 + - - - - + + + + + + + + - \ No newline at end of file + + diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index c516e5c729..5c3160c0d4 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -1,16 +1,24 @@  + + netcoreapp1.1;net452 netcoreapp1.1 + - - - + + + + + + + - \ No newline at end of file + + diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 174d688198..11802dc165 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -1,16 +1,24 @@  + + netcoreapp1.1;net452 netcoreapp1.1 + - - - + + + + + + + - \ No newline at end of file + + diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 06b291e3bd..72e70f824f 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -1,18 +1,26 @@  + + netcoreapp1.1;net452 netcoreapp1.1 + - - - - + + + + + + + + - \ No newline at end of file + + diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index 11a622c9c2..f9ea3a27ea 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -1,16 +1,24 @@  + + netcoreapp1.1;net452 netcoreapp1.1 + - - - + + + + + + + - \ No newline at end of file + + diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 1cc3fb5cad..4a17c06b84 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -1,16 +1,24 @@  + + netcoreapp1.1;net452 netcoreapp1.1 + - - - + + + + + + + - \ No newline at end of file + + From d30400fe1592b0f81746950d420843e7dfa38756 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 21 Mar 2017 12:14:24 -0700 Subject: [PATCH 652/846] Update Travis to macOS Sierra [skip appveyor] --- .travis.yml | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index 70480c0847..2a46104677 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,6 @@ language: csharp -sudo: required +sudo: false dist: trusty -addons: - apt: - packages: - - gettext - - libcurl4-openssl-dev - - libicu-dev - - libssl-dev - - libunwind8 - - zlib1g env: global: - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true @@ -18,6 +9,7 @@ mono: none os: - linux - osx +osx_image: xcode8.2 branches: only: - master @@ -28,9 +20,3 @@ before_install: - if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/; fi script: - ./build.sh -notifications: - webhooks: - secure: "XshregcmoXywFrrlIk7MLluUV2Pd8Z/VftrviVZjRL5+3akix2QnP15eT2E13yNtyS1yIc3lWfrVrLLf+H5bN9dUSzxIMNoJQ/S18F/AO5VD5ewd6pLC0uYhUcHdTRQuzjLGVPlt2suKpPllV2SsGlAdGatdCfj5zM6eOG31jaA=" - on_success: always - on_failure: always - on_start: always From d89f66f150f7a321895a02f77e4f39b1b2398ce6 Mon Sep 17 00:00:00 2001 From: Derek Gray Date: Tue, 21 Mar 2017 14:31:01 -0500 Subject: [PATCH 653/846] Use a CopyOnWriteDictionary in ApplicationBuilder so branches can set their own properties Fix #783 --- .../Internal/ApplicationBuilder.cs | 2 +- .../Microsoft.AspNetCore.Http.csproj | 1 + .../Internal/ApplicationBuilderTests.cs | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs index 6b36842fbb..c4e6fd7f07 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Builder.Internal private ApplicationBuilder(ApplicationBuilder builder) { - Properties = builder.Properties; + Properties = new CopyOnWriteDictionary(builder.Properties, EqualityComparer.Default); } public IServiceProvider ApplicationServices diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index 04e24f5e2c..f0163c501c 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -18,6 +18,7 @@ + diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs index 3a1a4b1606..976d9bf7e1 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs @@ -19,5 +19,17 @@ namespace Microsoft.AspNetCore.Builder.Internal app.Invoke(httpContext); Assert.Equal(httpContext.Response.StatusCode, 404); } + + [Fact] + public void PropertiesDictionaryIsDistinctAfterNew() + { + var builder1 = new ApplicationBuilder(null); + builder1.Properties["test"] = "value1"; + + var builder2 = builder1.New(); + builder2.Properties["test"] = "value2"; + + Assert.Equal(builder1.Properties["test"], "value1"); + } } } \ No newline at end of file From 50f3cd68771daeec6f6ee9cc3a8e8a4cf77e6f9b Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Mon, 13 Mar 2017 17:28:35 -0700 Subject: [PATCH 654/846] Changed samples and tests to run on netcoreapp2.0 --- HttpAbstractions.sln | 3 ++- build/dependencies.props | 1 + samples/SampleApp/SampleApp.csproj | 4 ++- ....AspNetCore.Http.Abstractions.Tests.csproj | 4 +-- ...ft.AspNetCore.Http.Extensions.Tests.csproj | 4 +-- ...soft.AspNetCore.Http.Features.Tests.csproj | 4 +-- .../HttpContextFactoryTests.cs | 3 +++ .../Microsoft.AspNetCore.Http.Tests.csproj | 4 +-- .../Microsoft.AspNetCore.Owin.Tests.csproj | 4 +-- .../FileBufferingReadStreamTests.cs | 4 ++- .../HttpResponseStreamWriterTest.cs | 25 ++++++++++++++++--- ...osoft.AspNetCore.WebUtilities.Tests.csproj | 4 +-- .../Microsoft.Net.Http.Headers.Tests.csproj | 4 +-- 13 files changed, 47 insertions(+), 21 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 684bc312f2..9525343a98 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26120.4 +VisualStudioVersion = 15.0.26228.9 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -53,6 +53,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{ED7BCAC5-2796-44BD-9954-7C248263BC8B}" ProjectSection(SolutionItems) = preProject build\common.props = build\common.props + build\dependencies.props = build\dependencies.props build\Key.snk = build\Key.snk EndProjectSection EndProject diff --git a/build/dependencies.props b/build/dependencies.props index 5a4c06ce33..12a50aa67f 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,6 +3,7 @@ 1.2.0-* 4.3.0 1.6.1 + 2.0.0-* 15.0.0 2.2.0 diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index 1ea088220c..d496a4e293 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -1,7 +1,9 @@  + + - net451;netcoreapp1.1 + netcoreapp2.0;net451 Exe diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index 1499a5d2f7..ce293532eb 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -3,8 +3,8 @@ - netcoreapp1.1;net452 - netcoreapp1.1 + netcoreapp2.0;net452 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index a61de3299b..d7a065af56 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -3,8 +3,8 @@ - netcoreapp1.1;net452 - netcoreapp1.1 + netcoreapp2.0;net452 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index 5c3160c0d4..fde9ce797e 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -3,8 +3,8 @@ - netcoreapp1.1;net452 - netcoreapp1.1 + netcoreapp2.0;net452 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index fc5c5386fa..c7bb075df9 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -64,6 +64,9 @@ namespace Microsoft.AspNetCore.Http // Assert Assert.True(ReferenceEquals(context, accessor.HttpContext)); } +#elif NETCOREAPP2_0 +#else +#error Target framework needs to be updated #endif } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 11802dc165..9de27f7667 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -3,8 +3,8 @@ - netcoreapp1.1;net452 - netcoreapp1.1 + netcoreapp2.0;net452 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 72e70f824f..30a4721d3c 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -3,8 +3,8 @@ - netcoreapp1.1;net452 - netcoreapp1.1 + netcoreapp2.0;net452 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs index 2a96d197da..ea8e609b49 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs @@ -295,8 +295,10 @@ namespace Microsoft.AspNetCore.WebUtilities { #if NET452 return AppDomain.CurrentDomain.BaseDirectory; -#else +#elif NETCOREAPP2_0 return AppContext.BaseDirectory; +#else +#error Target framework needs to be updated #endif } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 7b68cfbe23..41a73e8876 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -50,6 +50,9 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(0, stream.FlushCallCount); Assert.Equal(0, stream.FlushAsyncCallCount); } +#elif NETCOREAPP2_0 +#else +#error Target framework needs to be updated #endif [Fact] @@ -83,6 +86,9 @@ namespace Microsoft.AspNetCore.WebUtilities.Test // Assert Assert.Equal(0, stream.CloseCallCount); } +#elif NETCOREAPP2_0 +#else +#error Target framework needs to be updated #endif [Fact] @@ -115,8 +121,10 @@ namespace Microsoft.AspNetCore.WebUtilities.Test // Act #if NET452 writer.Close(); -#else +#elif NETCOREAPP2_0 writer.Dispose(); +#else +#error Target framework needs to be updated #endif // Assert @@ -232,7 +240,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); await writer.WriteAsync(new string('a', byteLength)); - await Assert.ThrowsAsync(() => writer.FlushAsync()); + await Assert.ThrowsAsync(() => writer.FlushAsync()); // Act writer.Dispose(); @@ -337,9 +345,12 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [Theory] [InlineData("你好世界", "utf-16")] -#if !NETCOREAPP1_1 +#if NET452 // CoreCLR does not like shift_jis as an encoding. [InlineData("こんにちは世界", "shift_jis")] +#elif NETCOREAPP2_0 +#else +#error Target framework needs to be updated #endif [InlineData("హలో ప్రపంచ", "iso-8859-1")] [InlineData("வணக்கம் உலக", "utf-32")] @@ -368,11 +379,14 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [InlineData('你', 1023, "utf-16")] [InlineData('你', 1024, "utf-16")] [InlineData('你', 1050, "utf-16")] -#if !NETCOREAPP1_1 +#if NET452 // CoreCLR does not like shift_jis as an encoding. [InlineData('こ', 1023, "shift_jis")] [InlineData('こ', 1024, "shift_jis")] [InlineData('こ', 1050, "shift_jis")] +#elif NETCOREAPP2_0 +#else +#error Target framework needs to be updated #endif [InlineData('హ', 1023, "iso-8859-1")] [InlineData('హ', 1024, "iso-8859-1")] @@ -508,6 +522,9 @@ namespace Microsoft.AspNetCore.WebUtilities.Test CloseCallCount++; base.Close(); } +#elif NETCOREAPP2_0 +#else +#error Target framework needs to be updated #endif protected override void Dispose(bool disposing) diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index f9ea3a27ea..c4c0973c46 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -3,8 +3,8 @@ - netcoreapp1.1;net452 - netcoreapp1.1 + netcoreapp2.0;net452 + netcoreapp2.0 diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 4a17c06b84..1996f25c58 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -3,8 +3,8 @@ - netcoreapp1.1;net452 - netcoreapp1.1 + netcoreapp2.0;net452 + netcoreapp2.0 From c9f12a23f837ef3ca8e98e5146b2e282c5d42ade Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 21 Mar 2017 10:55:50 -0700 Subject: [PATCH 655/846] Disable API Check in projects with untracked breaking changes --- .../Microsoft.AspNetCore.Http.Features.csproj | 1 + src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index 82cbac15b1..3974becb6d 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -8,6 +8,7 @@ $(NoWarn);CS1591 true aspnetcore + false diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 795d2c935f..a32841da8e 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -9,6 +9,7 @@ true true http + false From 49daa416ba10198ef394d43b1e93b768fb743481 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 22 Mar 2017 14:45:46 -0700 Subject: [PATCH 656/846] Use StringComparer.Ordinal --- src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs index c4e6fd7f07..86b098aacd 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Builder.Internal public ApplicationBuilder(IServiceProvider serviceProvider) { - Properties = new Dictionary(); + Properties = new Dictionary(StringComparer.Ordinal); ApplicationServices = serviceProvider; } @@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Builder.Internal private ApplicationBuilder(ApplicationBuilder builder) { - Properties = new CopyOnWriteDictionary(builder.Properties, EqualityComparer.Default); + Properties = new CopyOnWriteDictionary(builder.Properties, StringComparer.Ordinal); } public IServiceProvider ApplicationServices From b3b846c27eee1364db416f35dec4556469509fb4 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 12 Mar 2017 14:58:54 -0700 Subject: [PATCH 657/846] Remove net451 as a cross-compile target --- .gitignore | 1 + samples/SampleApp/SampleApp.csproj | 2 +- ...rosoft.AspNetCore.Http.Abstractions.csproj | 2 +- ...icrosoft.AspNetCore.Http.Extensions.csproj | 2 +- .../Microsoft.AspNetCore.Http.Features.csproj | 2 +- .../FormCollection.cs | 5 ---- .../HeaderDictionary.cs | 5 ---- .../HttpContextAccessor.cs | 24 --------------- .../Internal/QueryCollection.cs | 5 ---- .../Internal/ReferenceReadStream.cs | 24 ++++++++------- .../Internal/RequestCookieCollection.cs | 4 --- .../Microsoft.AspNetCore.Http.csproj | 2 +- .../Microsoft.AspNetCore.Owin.csproj | 2 +- .../BufferedReadStream.cs | 25 +++++++++------- .../FileBufferingReadStream.cs | 25 +++++++++------- .../HttpRequestStreamReader.cs | 5 +++- .../Microsoft.AspNetCore.WebUtilities.csproj | 2 +- .../MultipartReaderStream.cs | 29 ++++++++++--------- .../Microsoft.Net.Http.Headers.csproj | 2 +- ....AspNetCore.Http.Abstractions.Tests.csproj | 2 +- ...ft.AspNetCore.Http.Extensions.Tests.csproj | 2 +- ...soft.AspNetCore.Http.Features.Tests.csproj | 2 +- .../HttpContextFactoryTests.cs | 7 +++-- .../Microsoft.AspNetCore.Http.Tests.csproj | 4 ++- .../Microsoft.AspNetCore.Owin.Tests.csproj | 2 +- .../FileBufferingReadStreamTests.cs | 2 +- .../HttpResponseStreamWriterTest.cs | 12 ++++---- ...osoft.AspNetCore.WebUtilities.Tests.csproj | 2 +- .../Microsoft.Net.Http.Headers.Tests.csproj | 2 +- 29 files changed, 90 insertions(+), 115 deletions(-) diff --git a/.gitignore b/.gitignore index 0f91ad1208..bcc811de9a 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ project.lock.json .build/ .testPublish/ /.vs/ +global.json diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index d496a4e293..349d945d26 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0;net451 + netcoreapp2.0;net46 Exe diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index 0f57ef2bba..ab10fcc573 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -10,7 +10,7 @@ Microsoft.AspNetCore.Builder.IApplicationBuilder Microsoft.AspNetCore.Http.HttpContext Microsoft.AspNetCore.Http.HttpRequest Microsoft.AspNetCore.Http.HttpResponse - net451;netstandard1.3 + netstandard1.3 true aspnetcore $(NoWarn);CS1591 diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index 4f76ac1def..9f9a858a8a 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -4,7 +4,7 @@ ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. - net451;netstandard1.3 + netstandard1.3 $(NoWarn);CS1591 true aspnetcore diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index 3974becb6d..e14b016d26 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -4,7 +4,7 @@ ASP.NET Core HTTP feature interface definitions. - net451;netstandard1.3 + netstandard1.3 $(NoWarn);CS1591 true aspnetcore diff --git a/src/Microsoft.AspNetCore.Http/FormCollection.cs b/src/Microsoft.AspNetCore.Http/FormCollection.cs index 564fdcbb29..23709b2bb0 100644 --- a/src/Microsoft.AspNetCore.Http/FormCollection.cs +++ b/src/Microsoft.AspNetCore.Http/FormCollection.cs @@ -15,13 +15,8 @@ namespace Microsoft.AspNetCore.Http public class FormCollection : IFormCollection { public static readonly FormCollection Empty = new FormCollection(); -#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); -#else - private static readonly string[] EmptyKeys = new string[0]; - private static readonly StringValues[] EmptyValues = new StringValues[0]; -#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 61c307a64e..30d338a20b 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -14,13 +14,8 @@ namespace Microsoft.AspNetCore.Http /// public class HeaderDictionary : IHeaderDictionary { -#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); -#else - private static readonly string[] EmptyKeys = new string[0]; - private static readonly StringValues[] EmptyValues = new StringValues[0]; -#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs index 324eb8ad97..5a4676234c 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs @@ -1,35 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#if NET451 -using System; -using System.Runtime.Remoting; -using System.Runtime.Remoting.Messaging; -#elif NETSTANDARD1_3 using System.Threading; -#endif namespace Microsoft.AspNetCore.Http { public class HttpContextAccessor : IHttpContextAccessor { -#if NET451 - private static readonly string LogicalDataKey = "__HttpContext_Current__" + AppDomain.CurrentDomain.Id; - - public HttpContext HttpContext - { - get - { - var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - return handle?.Unwrap() as HttpContext; - } - set - { - CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(value)); - } - } - -#elif NETSTANDARD1_3 private static AsyncLocal _httpContextCurrent = new AsyncLocal(); public HttpContext HttpContext @@ -43,6 +20,5 @@ namespace Microsoft.AspNetCore.Http _httpContextCurrent.Value = value; } } -#endif } } diff --git a/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs index f2db4a874c..643034deaf 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs @@ -14,13 +14,8 @@ namespace Microsoft.AspNetCore.Http.Internal public class QueryCollection : IQueryCollection { public static readonly QueryCollection Empty = new QueryCollection(); -#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); -#else - private static readonly string[] EmptyKeys = new string[0]; - private static readonly StringValues[] EmptyValues = new StringValues[0]; -#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; diff --git a/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs index 8a8c1e95de..fbc435f406 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs @@ -115,7 +115,7 @@ namespace Microsoft.AspNetCore.Http.Internal _position += read; return read; } -#if NET451 +#if NET46 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -164,16 +164,6 @@ namespace Microsoft.AspNetCore.Http.Internal var task = (Task)asyncResult; return task.GetAwaiter().GetResult(); } -#endif - public override void Write(byte[] buffer, int offset, int count) - { - throw new NotSupportedException(); - } - public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) - { - throw new NotSupportedException(); - } -#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -183,7 +173,19 @@ namespace Microsoft.AspNetCore.Http.Internal { throw new NotSupportedException(); } +#elif NETSTANDARD1_3 +#else +#error Target frameworks need to be updated. #endif + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } + public override void SetLength(long value) { throw new NotSupportedException(); diff --git a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs index 1555b0b7a4..d02c9fade5 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs @@ -11,11 +11,7 @@ namespace Microsoft.AspNetCore.Http.Internal public class RequestCookieCollection : IRequestCookieCollection { public static readonly RequestCookieCollection Empty = new RequestCookieCollection(); -#if NETSTANDARD1_3 private static readonly string[] EmptyKeys = Array.Empty(); -#else - private static readonly string[] EmptyKeys = new string[0]; -#endif private static readonly Enumerator EmptyEnumerator = new Enumerator(); // Pre-box private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index f0163c501c..1623b6fcce 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -4,7 +4,7 @@ ASP.NET Core default HTTP feature implementations. - net451;netstandard1.3 + netstandard1.3;net46 $(NoWarn);CS1591 true true diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj index e9af551d5f..356eafe318 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj @@ -4,7 +4,7 @@ ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application. - net451;netstandard1.3 + netstandard1.3 $(NoWarn);CS1591 true aspnetcore;owin diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs index ef72c199c9..5d581164dc 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs @@ -162,17 +162,7 @@ namespace Microsoft.AspNetCore.WebUtilities { _inner.Write(buffer, offset, count); } -#if NET451 - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - return _inner.BeginWrite(buffer, offset, count, callback, state); - } - public override void EndWrite(IAsyncResult asyncResult) - { - _inner.EndWrite(asyncResult); - } -#endif public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { return _inner.WriteAsync(buffer, offset, count, cancellationToken); @@ -211,7 +201,17 @@ namespace Microsoft.AspNetCore.WebUtilities return await _inner.ReadAsync(buffer, offset, count, cancellationToken); } -#if NET451 +#if NET46 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + return _inner.BeginWrite(buffer, offset, count, callback, state); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + _inner.EndWrite(asyncResult); + } + // We only anticipate using ReadAsync public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { @@ -262,6 +262,9 @@ namespace Microsoft.AspNetCore.WebUtilities } return _inner.EndRead(asyncResult); } +#elif NETSTANDARD1_3 +#else +#error Target frameworks need to be updated. #endif public bool EnsureBuffered() { diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs index 2eea705a57..db72b3af84 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs @@ -250,7 +250,7 @@ namespace Microsoft.AspNetCore.WebUtilities return read; } -#if NET451 +#if NET46 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -298,6 +298,19 @@ namespace Microsoft.AspNetCore.WebUtilities var task = (Task)asyncResult; return task.GetAwaiter().GetResult(); } + + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } +#elif NETSTANDARD1_3 +#else +#error Target frameworks need to be updated. #endif public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { @@ -358,17 +371,7 @@ namespace Microsoft.AspNetCore.WebUtilities { throw new NotSupportedException(); } -#if NET451 - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException(); - } - public override void EndWrite(IAsyncResult asyncResult) - { - throw new NotSupportedException(); - } -#endif public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { throw new NotSupportedException(); diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs index 67977ca6f0..08331555c4 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs @@ -108,11 +108,14 @@ namespace Microsoft.AspNetCore.WebUtilities } } -#if NET451 +#if NET46 public override void Close() { Dispose(true); } +#elif NETSTANDARD1_3 +#else +#error Target frameworks need to be updated. #endif protected override void Dispose(bool disposing) diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index 1f900cb99a..d4b6bc397e 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -4,7 +4,7 @@ ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings. - net451;netstandard1.3 + netstandard1.3;net46 $(DefineConstants);WebEncoders_In_WebUtilities $(NoWarn);CS1591 true diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index bc40b08afc..c2a266db0d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -126,17 +126,7 @@ namespace Microsoft.AspNetCore.WebUtilities { throw new NotSupportedException(); } -#if NET451 - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) - { - throw new NotSupportedException(); - } - public override void EndWrite(IAsyncResult asyncResult) - { - throw new NotSupportedException(); - } -#endif public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { throw new NotSupportedException(); @@ -168,7 +158,17 @@ namespace Microsoft.AspNetCore.WebUtilities } return read; } -#if NET451 +#if NET46 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } + public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { var tcs = new TaskCompletionSource(state); @@ -215,6 +215,9 @@ namespace Microsoft.AspNetCore.WebUtilities var task = (Task)asyncResult; return task.GetAwaiter().GetResult(); } +#elif NETSTANDARD1_3 +#else +#error Target frameworks need to be updated. #endif public override int Read(byte[] buffer, int offset, int count) { @@ -231,10 +234,8 @@ namespace Microsoft.AspNetCore.WebUtilities var bufferedData = _innerStream.BufferedData; // scan for a boundary match, full or partial. - int matchOffset; - int matchCount; int read; - if (SubMatch(bufferedData, _boundary.BoundaryBytes, out matchOffset, out matchCount)) + if (SubMatch(bufferedData, _boundary.BoundaryBytes, out var matchOffset, out var matchCount)) { // We found a possible match, return any data before it. if (matchOffset > bufferedData.Offset) diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index a32841da8e..8dc2020da1 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -4,7 +4,7 @@ HTTP header parser implementations. - net451;netstandard1.1 + netstandard1.1 $(NoWarn);CS1591 true true diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index ce293532eb..72ef16dc34 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0;net452 + netcoreapp2.0;net46 netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index d7a065af56..12e14311b0 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0;net452 + netcoreapp2.0;net46 netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index fde9ce797e..9b9b88308d 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0;net452 + netcoreapp2.0;net46 netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index c7bb075df9..ee1249897b 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Options; @@ -36,7 +37,7 @@ namespace Microsoft.AspNetCore.Http contextFactory.Dispose(context); } -#if NET452 +#if NET46 private static void DomainFunc() { var accessor = new HttpContextAccessor(); @@ -50,9 +51,11 @@ namespace Microsoft.AspNetCore.Http // Arrange var accessor = new HttpContextAccessor(); var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions()), accessor); + var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; var setupInfo = new AppDomainSetup { - ApplicationBase = AppDomain.CurrentDomain.BaseDirectory + ApplicationBase = baseDirectory, + ConfigurationFile = Path.Combine(baseDirectory, Path.GetFileNameWithoutExtension(GetType().Assembly.Location) + ".dll.config"), }; var domain = AppDomain.CreateDomain("newDomain", null, setupInfo); diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 9de27f7667..902e0a52b6 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -3,8 +3,10 @@ - netcoreapp2.0;net452 + netcoreapp2.0;net46 netcoreapp2.0 + true + true diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 30a4721d3c..7c97057bf0 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0;net452 + netcoreapp2.0;net46 netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs index ea8e609b49..0ffc8506fb 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs @@ -293,7 +293,7 @@ namespace Microsoft.AspNetCore.WebUtilities private static string GetCurrentDirectory() { -#if NET452 +#if NET46 return AppDomain.CurrentDomain.BaseDirectory; #elif NETCOREAPP2_0 return AppContext.BaseDirectory; diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 41a73e8876..878accd163 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(expectedData, memoryStream.ToArray()); } -#if NET452 +#if NET46 [Fact] public async Task DoesNotFlush_UnderlyingStream_OnClosingWriter() { @@ -71,7 +71,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(0, stream.FlushAsyncCallCount); } -#if NET452 +#if NET46 [Fact] public async Task DoesNotClose_UnderlyingStream_OnDisposingWriter() { @@ -119,7 +119,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test await writer.WriteAsync(new string('a', byteLength)); // Act -#if NET452 +#if NET46 writer.Close(); #elif NETCOREAPP2_0 writer.Dispose(); @@ -345,7 +345,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [Theory] [InlineData("你好世界", "utf-16")] -#if NET452 +#if NET46 // CoreCLR does not like shift_jis as an encoding. [InlineData("こんにちは世界", "shift_jis")] #elif NETCOREAPP2_0 @@ -379,7 +379,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [InlineData('你', 1023, "utf-16")] [InlineData('你', 1024, "utf-16")] [InlineData('你', 1050, "utf-16")] -#if NET452 +#if NET46 // CoreCLR does not like shift_jis as an encoding. [InlineData('こ', 1023, "shift_jis")] [InlineData('こ', 1024, "shift_jis")] @@ -516,7 +516,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test return base.WriteAsync(buffer, offset, count, cancellationToken); } -#if NET452 +#if NET46 public override void Close() { CloseCallCount++; diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index c4c0973c46..ab9cca9cd5 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0;net452 + netcoreapp2.0;net46 netcoreapp2.0 diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 1996f25c58..3b151518ba 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0;net452 + netcoreapp2.0;net46 netcoreapp2.0 From 2bdbbbf41daa814977acbdc3bc5526c894120dc4 Mon Sep 17 00:00:00 2001 From: John Luo Date: Sat, 25 Mar 2017 23:42:14 -0700 Subject: [PATCH 658/846] UseMiddleware resolves InvokeAsync in addition to Invoke --- .../Extensions/UseMiddlewareExtensions.cs | 25 +- .../IMiddleware.cs | 6 +- .../Properties/Resources.Designer.cs | 16 +- .../Resources.resx | 8 +- .../UseMiddlewareTest.cs | 222 ++++++++++++------ 5 files changed, 177 insertions(+), 100 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 71677c0582..88a79d7daa 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -17,7 +17,8 @@ namespace Microsoft.AspNetCore.Builder /// public static class UseMiddlewareExtensions { - private const string InvokeMethodName = "Invoke"; + internal const string InvokeMethodName = "Invoke"; + internal const string InvokeAsyncMethodName = "InvokeAsync"; private static readonly MethodInfo GetServiceInfo = typeof(UseMiddlewareExtensions).GetMethod(nameof(GetService), BindingFlags.NonPublic | BindingFlags.Static); @@ -44,7 +45,7 @@ namespace Microsoft.AspNetCore.Builder { if (typeof(IMiddleware).GetTypeInfo().IsAssignableFrom(middleware.GetTypeInfo())) { - // IMiddleware doesn't support passing args directly since it's + // IMiddleware doesn't support passing args directly since it's // activated from the container if (args.Length > 0) { @@ -58,27 +59,31 @@ namespace Microsoft.AspNetCore.Builder return app.Use(next => { var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public); - var invokeMethods = methods.Where(m => string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal)).ToArray(); + var invokeMethods = methods.Where(m => + string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal) + || string.Equals(m.Name, InvokeAsyncMethodName, StringComparison.Ordinal) + ).ToArray(); + if (invokeMethods.Length > 1) { - throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName)); + throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName, InvokeAsyncMethodName)); } if (invokeMethods.Length == 0) { - throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName)); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName, InvokeAsyncMethodName)); } var methodinfo = invokeMethods[0]; if (!typeof(Task).IsAssignableFrom(methodinfo.ReturnType)) { - throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNonTaskReturnType(InvokeMethodName, nameof(Task))); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNonTaskReturnType(InvokeMethodName, InvokeAsyncMethodName, nameof(Task))); } var parameters = methodinfo.GetParameters(); if (parameters.Length == 0 || parameters[0].ParameterType != typeof(HttpContext)) { - throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName, nameof(HttpContext))); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName, InvokeAsyncMethodName, nameof(HttpContext))); } var ctorArgs = new object[args.Length + 1]; @@ -127,7 +132,7 @@ namespace Microsoft.AspNetCore.Builder try { - await middleware.Invoke(context, next); + await middleware.InvokeAsync(context, next); } finally { @@ -140,12 +145,12 @@ namespace Microsoft.AspNetCore.Builder private static Func Compile(MethodInfo methodinfo, ParameterInfo[] parameters) { // If we call something like - // + // // public class Middleware // { // public Task Invoke(HttpContext context, ILoggerFactory loggeryFactory) // { - // + // // } // } // diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs index 53d549833b..f92527f3f5 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs @@ -1,10 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading.Tasks; namespace Microsoft.AspNetCore.Http @@ -20,6 +16,6 @@ namespace Microsoft.AspNetCore.Http /// The for the current request. /// The delegate representing the remaining middleware in the request pipeline. /// A that represents the execution of this middleware. - Task Invoke(HttpContext context, RequestDelegate next); + Task InvokeAsync(HttpContext context, RequestDelegate next); } } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs index c91b54e3aa..3b747cd441 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs @@ -37,9 +37,9 @@ namespace Microsoft.AspNetCore.Http.Abstractions /// /// No public '{0}' method found. /// - internal static string FormatException_UseMiddlewareNoInvokeMethod(object p0) + internal static string FormatException_UseMiddlewareNoInvokeMethod(object p0, object p1) { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0); + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0, p1); } /// @@ -53,9 +53,9 @@ namespace Microsoft.AspNetCore.Http.Abstractions /// /// '{0}' does not return an object of type '{1}'. /// - internal static string FormatException_UseMiddlewareNonTaskReturnType(object p0, object p1) + internal static string FormatException_UseMiddlewareNonTaskReturnType(object p0, object p1, object p2) { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNonTaskReturnType"), p0, p1); + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNonTaskReturnType"), p0, p1, p2); } /// @@ -69,9 +69,9 @@ namespace Microsoft.AspNetCore.Http.Abstractions /// /// The '{0}' method's first argument must be of type '{1}'. /// - internal static string FormatException_UseMiddlewareNoParameters(object p0, object p1) + internal static string FormatException_UseMiddlewareNoParameters(object p0, object p1, object p2) { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoParameters"), p0, p1); + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoParameters"), p0, p1, p2); } /// @@ -85,9 +85,9 @@ namespace Microsoft.AspNetCore.Http.Abstractions /// /// Multiple public '{0}' methods are available. /// - internal static string FormatException_UseMiddleMutlipleInvokes(object p0) + internal static string FormatException_UseMiddleMutlipleInvokes(object p0, object p1) { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0); + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0, p1); } /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx index b37e46a114..969b4044a6 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx @@ -121,16 +121,16 @@ '{0}' is not available. - No public '{0}' method found. + No public '{0}' or '{1}' method found. - '{0}' does not return an object of type '{1}'. + '{0}' or '{1}' does not return an object of type '{2}'. - The '{0}' method's first argument must be of type '{1}'. + The '{0}' or '{1}' method's first argument must be of type '{2}'. - Multiple public '{0}' methods are available. + Multiple public '{0}' or '{1}' methods are available. The path in '{0}' must start with '/'. diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index 8f0446ce35..6ba21da298 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Http.Abstractions; +using Microsoft.Extensions.Internal; using Xunit; namespace Microsoft.AspNetCore.Http @@ -16,60 +17,137 @@ namespace Microsoft.AspNetCore.Http [Fact] public void UseMiddleware_WithNoParameters_ThrowsException() { - var mockServiceProvider = new DummyServiceProvider(); - var builder = new ApplicationBuilder(mockServiceProvider); + var builder = new ApplicationBuilder(new DummyServiceProvider()); builder.UseMiddleware(typeof(MiddlewareNoParametersStub)); var exception = Assert.Throws(() => builder.Build()); - Assert.Equal(Resources.FormatException_UseMiddlewareNoParameters("Invoke", nameof(HttpContext)), exception.Message); + Assert.Equal( + Resources.FormatException_UseMiddlewareNoParameters( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName, + nameof(HttpContext)), + exception.Message); + } + + [Fact] + public void UseMiddleware_AsyncWithNoParameters_ThrowsException() + { + var builder = new ApplicationBuilder(new DummyServiceProvider()); + builder.UseMiddleware(typeof(MiddlewareAsyncNoParametersStub)); + var exception = Assert.Throws(() => builder.Build()); + + Assert.Equal( + Resources.FormatException_UseMiddlewareNoParameters( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName, + nameof(HttpContext)), + exception.Message); } [Fact] public void UseMiddleware_NonTaskReturnType_ThrowsException() { - var mockServiceProvider = new DummyServiceProvider(); - var builder = new ApplicationBuilder(mockServiceProvider); + var builder = new ApplicationBuilder(new DummyServiceProvider()); builder.UseMiddleware(typeof(MiddlewareNonTaskReturnStub)); var exception = Assert.Throws(() => builder.Build()); - Assert.Equal(Resources.FormatException_UseMiddlewareNonTaskReturnType("Invoke", nameof(Task)), exception.Message); + + Assert.Equal( + Resources.FormatException_UseMiddlewareNonTaskReturnType( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName, + nameof(Task)), + exception.Message); } [Fact] - public void UseMiddleware_NoInvokeMethod_ThrowsException() + public void UseMiddleware_AsyncNonTaskReturnType_ThrowsException() { - var mockServiceProvider = new DummyServiceProvider(); - var builder = new ApplicationBuilder(mockServiceProvider); + var builder = new ApplicationBuilder(new DummyServiceProvider()); + builder.UseMiddleware(typeof(MiddlewareAsyncNonTaskReturnStub)); + var exception = Assert.Throws(() => builder.Build()); + + Assert.Equal( + Resources.FormatException_UseMiddlewareNonTaskReturnType( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName, + nameof(Task)), + exception.Message); + } + + [Fact] + public void UseMiddleware_NoInvokeOrInvokeAsyncMethod_ThrowsException() + { + var builder = new ApplicationBuilder(new DummyServiceProvider()); builder.UseMiddleware(typeof(MiddlewareNoInvokeStub)); var exception = Assert.Throws(() => builder.Build()); - Assert.Equal(Resources.FormatException_UseMiddlewareNoInvokeMethod("Invoke"), exception.Message); + + Assert.Equal( + Resources.FormatException_UseMiddlewareNoInvokeMethod( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName), + exception.Message); } [Fact] public void UseMiddleware_MutlipleInvokeMethods_ThrowsException() { - var mockServiceProvider = new DummyServiceProvider(); - var builder = new ApplicationBuilder(mockServiceProvider); + var builder = new ApplicationBuilder(new DummyServiceProvider()); builder.UseMiddleware(typeof(MiddlewareMultipleInvokesStub)); var exception = Assert.Throws(() => builder.Build()); - Assert.Equal(Resources.FormatException_UseMiddleMutlipleInvokes("Invoke"), exception.Message); + + Assert.Equal( + Resources.FormatException_UseMiddleMutlipleInvokes( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName), + exception.Message); + } + + [Fact] + public void UseMiddleware_MutlipleInvokeAsyncMethods_ThrowsException() + { + var builder = new ApplicationBuilder(new DummyServiceProvider()); + builder.UseMiddleware(typeof(MiddlewareMultipleInvokeAsyncStub)); + var exception = Assert.Throws(() => builder.Build()); + + Assert.Equal( + Resources.FormatException_UseMiddleMutlipleInvokes( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName), + exception.Message); + } + + [Fact] + public void UseMiddleware_MutlipleInvokeAndInvokeAsyncMethods_ThrowsException() + { + var builder = new ApplicationBuilder(new DummyServiceProvider()); + builder.UseMiddleware(typeof(MiddlewareMultipleInvokeAndInvokeAsyncStub)); + var exception = Assert.Throws(() => builder.Build()); + + Assert.Equal( + Resources.FormatException_UseMiddleMutlipleInvokes( + UseMiddlewareExtensions.InvokeMethodName, + UseMiddlewareExtensions.InvokeAsyncMethodName), + exception.Message); } [Fact] public async Task UseMiddleware_ThrowsIfArgCantBeResolvedFromContainer() { - var mockServiceProvider = new DummyServiceProvider(); - var builder = new ApplicationBuilder(mockServiceProvider); + var builder = new ApplicationBuilder(new DummyServiceProvider()); builder.UseMiddleware(typeof(MiddlewareInjectInvokeNoService)); var app = builder.Build(); var exception = await Assert.ThrowsAsync(() => app(new DefaultHttpContext())); - Assert.Equal(Resources.FormatException_InvokeMiddlewareNoService(typeof(object), typeof(MiddlewareInjectInvokeNoService)), exception.Message); + Assert.Equal( + Resources.FormatException_InvokeMiddlewareNoService( + typeof(object), + typeof(MiddlewareInjectInvokeNoService)), + exception.Message); } [Fact] public void UseMiddlewareWithInvokeArg() { - var mockServiceProvider = new DummyServiceProvider(); - var builder = new ApplicationBuilder(mockServiceProvider); + var builder = new ApplicationBuilder(new DummyServiceProvider()); builder.UseMiddleware(typeof(MiddlewareInjectInvoke)); var app = builder.Build(); app(new DefaultHttpContext()); @@ -126,7 +204,11 @@ namespace Microsoft.AspNetCore.Http await app(context); }); - Assert.Equal(Resources.FormatException_UseMiddlewareUnableToCreateMiddleware(typeof(BadMiddlewareFactory), typeof(Middleware)), exception.Message); + Assert.Equal( + Resources.FormatException_UseMiddlewareUnableToCreateMiddleware( + typeof(BadMiddlewareFactory), + typeof(Middleware)), + exception.Message); } [Fact] @@ -153,7 +235,7 @@ namespace Microsoft.AspNetCore.Http public class Middleware : IMiddleware { - public async Task Invoke(HttpContext context, RequestDelegate next) + public async Task InvokeAsync(HttpContext context, RequestDelegate next) { context.Items["before"] = true; await next(context); @@ -180,15 +262,9 @@ namespace Microsoft.AspNetCore.Http public class BadMiddlewareFactory : IMiddlewareFactory { - public IMiddleware Create(Type middlewareType) - { - return null; - } + public IMiddleware Create(Type middlewareType) => null; - public void Release(IMiddleware middleware) - { - - } + public void Release(IMiddleware middleware) { } } private class DummyServiceProvider : IServiceProvider @@ -214,9 +290,7 @@ namespace Microsoft.AspNetCore.Http public class MiddlewareInjectWithOutAndRefParams { - public MiddlewareInjectWithOutAndRefParams(RequestDelegate next) - { - } + public MiddlewareInjectWithOutAndRefParams(RequestDelegate next) { } public Task Invoke(HttpContext context, ref IServiceProvider sp1, out IServiceProvider sp2) { @@ -228,74 +302,76 @@ namespace Microsoft.AspNetCore.Http private class MiddlewareInjectInvokeNoService { - public MiddlewareInjectInvokeNoService(RequestDelegate next) - { - } + public MiddlewareInjectInvokeNoService(RequestDelegate next) { } - public Task Invoke(HttpContext context, object value) - { - return Task.FromResult(0); - } + public Task Invoke(HttpContext context, object value) => TaskCache.CompletedTask; } private class MiddlewareInjectInvoke { - public MiddlewareInjectInvoke(RequestDelegate next) - { - } + public MiddlewareInjectInvoke(RequestDelegate next) { } - public Task Invoke(HttpContext context, IServiceProvider provider) - { - return Task.FromResult(0); - } + public Task Invoke(HttpContext context, IServiceProvider provider) => TaskCache.CompletedTask; } private class MiddlewareNoParametersStub { - public MiddlewareNoParametersStub(RequestDelegate next) - { - } + public MiddlewareNoParametersStub(RequestDelegate next) { } - public Task Invoke() - { - return Task.FromResult(0); - } + public Task Invoke() => TaskCache.CompletedTask; + } + + private class MiddlewareAsyncNoParametersStub + { + public MiddlewareAsyncNoParametersStub(RequestDelegate next) { } + + public Task InvokeAsync() => TaskCache.CompletedTask; } private class MiddlewareNonTaskReturnStub { - public MiddlewareNonTaskReturnStub(RequestDelegate next) - { - } + public MiddlewareNonTaskReturnStub(RequestDelegate next) { } - public int Invoke() - { - return 0; - } + public int Invoke() => 0; + } + + private class MiddlewareAsyncNonTaskReturnStub + { + public MiddlewareAsyncNonTaskReturnStub(RequestDelegate next) { } + + public int InvokeAsync() => 0; } private class MiddlewareNoInvokeStub { - public MiddlewareNoInvokeStub(RequestDelegate next) - { - } + public MiddlewareNoInvokeStub(RequestDelegate next) { } } private class MiddlewareMultipleInvokesStub { - public MiddlewareMultipleInvokesStub(RequestDelegate next) - { - } + public MiddlewareMultipleInvokesStub(RequestDelegate next) { } - public Task Invoke(HttpContext context) - { - return Task.FromResult(0); - } + public Task Invoke(HttpContext context) => TaskCache.CompletedTask; - public Task Invoke(HttpContext context, int i) - { - return Task.FromResult(0); - } + public Task Invoke(HttpContext context, int i) => TaskCache.CompletedTask; + } + + private class MiddlewareMultipleInvokeAsyncStub + { + public MiddlewareMultipleInvokeAsyncStub(RequestDelegate next) { } + + public Task InvokeAsync(HttpContext context) => TaskCache.CompletedTask; + + public Task InvokeAsync(HttpContext context, int i) => TaskCache.CompletedTask; + } + + private class MiddlewareMultipleInvokeAndInvokeAsyncStub + { + public MiddlewareMultipleInvokeAndInvokeAsyncStub(RequestDelegate next) { } + + public Task Invoke(HttpContext context) => TaskCache.CompletedTask; + + public Task InvokeAsync(HttpContext context) => TaskCache.CompletedTask; } } } \ No newline at end of file From a0bb843dd581c1521ad8bcbe21923959158cc1f2 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 29 Mar 2017 11:30:33 -0700 Subject: [PATCH 659/846] Updating to 2.0.0 Internal.AspNetCore.Sdk --- build/common.props | 2 +- build/dependencies.props | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build/common.props b/build/common.props index e9fa82d8ef..af6d920c37 100644 --- a/build/common.props +++ b/build/common.props @@ -13,7 +13,7 @@ - + diff --git a/build/dependencies.props b/build/dependencies.props index 12a50aa67f..8c81df7f34 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -2,9 +2,10 @@ 1.2.0-* 4.3.0 + 2.0.0-* 1.6.1 2.0.0-* 15.0.0 2.2.0 - + \ No newline at end of file From 13925be91e0336a37e782af05a96507bb676122d Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 31 Mar 2017 11:56:20 -0700 Subject: [PATCH 660/846] Initial Auth 2.0 checkin --- HttpAbstractions.sln | 45 ++++ .../AuthenticateContext.cs | 21 ++ .../AuthenticateResult.cs | 105 ++++++++++ .../AuthenticationHttpContextExtensions.cs | 158 ++++++++++++++ .../AuthenticationOptions.cs | 65 ++++++ .../AuthenticationProperties.cs | 197 ++++++++++++++++++ .../AuthenticationScheme.cs | 49 +++++ .../AuthenticationSchemeBuilder.cs | 38 ++++ .../AuthenticationTicket.cs | 56 +++++ .../AuthenticationToken.cs | 22 ++ .../BaseAuthenticationContext.cs | 41 ++++ .../BaseContext.cs | 49 +++++ .../ChallengeBehavior.cs | 15 ++ .../ChallengeContext.cs | 45 ++++ .../IAuthenticationFeature.cs | 23 ++ .../IAuthenticationHandler.cs | 50 +++++ .../IAuthenticationHandlerProvider.cs | 22 ++ .../IAuthenticationRequestHandler.cs | 21 ++ .../IAuthenticationSchemeProvider.cs | 70 +++++++ .../IAuthenticationService.cs | 52 +++++ .../IClaimsTransformation.cs | 21 ++ ...NetCore.Authentication.Abstractions.csproj | 24 +++ .../SignInContext.cs | 37 ++++ .../SignOutContext.cs | 23 ++ .../TokenExtensions.cs | 155 ++++++++++++++ ...ticationCoreServiceCollectionExtensions.cs | 56 +++++ .../AuthenticationFeature.cs | 23 ++ .../AuthenticationHandlerProvider.cs | 63 ++++++ .../AuthenticationSchemeProvider.cs | 170 +++++++++++++++ .../AuthenticationService.cs | 167 +++++++++++++++ ...soft.AspNetCore.Authentication.Core.csproj | 21 ++ .../NoopClaimsTransformation.cs | 24 +++ ...AspNetCore.Authentication.Core.Test.csproj | 19 ++ .../TokenExtensionTests.cs | 123 +++++++++++ 34 files changed, 2070 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationTicket.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationToken.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationFeature.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandlerProvider.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/AuthenticationFeature.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/AuthenticationHandlerProvider.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/NoopClaimsTransformation.cs create mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj create mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 9525343a98..6434e357d0 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -57,6 +57,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{ED7BCAC5 build\Key.snk = build\Key.snk EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Abstractions", "src\Microsoft.AspNetCore.Authentication.Abstractions\Microsoft.AspNetCore.Authentication.Abstractions.csproj", "{3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Core", "src\Microsoft.AspNetCore.Authentication.Core\Microsoft.AspNetCore.Authentication.Core.csproj", "{73CA3145-91BD-4DA5-BC74-40008DE7EA98}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Core.Test", "test\Microsoft.AspNetCore.Authentication.Core.Test\Microsoft.AspNetCore.Authentication.Core.Test.csproj", "{A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -223,6 +229,42 @@ Global {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|x86.Build.0 = Debug|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Any CPU.Build.0 = Release|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|x86.ActiveCfg = Release|Any CPU + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|x86.Build.0 = Release|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|x86.ActiveCfg = Debug|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|x86.Build.0 = Debug|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Any CPU.Build.0 = Release|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|x86.ActiveCfg = Release|Any CPU + {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|x86.Build.0 = Release|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|x86.Build.0 = Debug|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Any CPU.Build.0 = Release|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|x86.ActiveCfg = Release|Any CPU + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -244,5 +286,8 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {ED7BCAC5-2796-44BD-9954-7C248263BC8B} = {C6C48D5F-B289-4150-A6FC-77A5C7064BCE} + {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {73CA3145-91BD-4DA5-BC74-40008DE7EA98} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs new file mode 100644 index 0000000000..814d7024e4 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Base class used by methods. + /// + public class AuthenticateContext : BaseAuthenticationContext + { + /// + /// Constructor. + /// + /// The context. + /// The name of the authentication scheme. + public AuthenticateContext(HttpContext context, string authenticationScheme) : base(context, authenticationScheme, properties: null) + { } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs new file mode 100644 index 0000000000..bb9bbb9716 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs @@ -0,0 +1,105 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Contains the result of an Authenticate call + /// + public class AuthenticateResult + { + private AuthenticateResult() { } + + /// + /// If a ticket was produced, authenticate was successful. + /// + public bool Succeeded => Ticket != null; + + /// + /// The authentication ticket. + /// + public AuthenticationTicket Ticket { get; private set; } + + /// + /// Gets the claims-principal with authenticated user identities. + /// + public ClaimsPrincipal Principal => Ticket?.Principal; + + /// + /// Additional state values for the authentication session. + /// + public AuthenticationProperties Properties => Ticket?.Properties; + + /// + /// Holds failure information from the authentication. + /// + public Exception Failure { get; private set; } + + /// + /// Indicates that stage of authentication was directly handled by user intervention and no + /// further processing should be attempted. + /// + public bool Handled { get; private set; } + + /// + /// Indicates that there was no information returned for this authentication scheme. + /// + public bool Nothing { get; private set; } + + /// + /// Indicates that authentication was successful. + /// + /// The ticket representing the authentication result. + /// The result. + public static AuthenticateResult Success(AuthenticationTicket ticket) + { + if (ticket == null) + { + throw new ArgumentNullException(nameof(ticket)); + } + return new AuthenticateResult() { Ticket = ticket }; + } + + /// + /// Indicates that stage of authentication was directly handled by user intervention and no + /// further processing should be attempted. + /// + /// The result. + public static AuthenticateResult Handle() + { + return new AuthenticateResult() { Handled = true }; + } + + /// + /// Indicates that there was no information returned for this authentication scheme. + /// + /// The result. + public static AuthenticateResult None() + { + return new AuthenticateResult() { Nothing = true }; + } + + /// + /// Indicates that there was a failure during authentication. + /// + /// The failure exception. + /// The result. + public static AuthenticateResult Fail(Exception failure) + { + return new AuthenticateResult() { Failure = failure }; + } + + /// + /// Indicates that there was a failure during authentication. + /// + /// The failure message. + /// The result. + public static AuthenticateResult Fail(string failureMessage) + { + return new AuthenticateResult() { Failure = new Exception(failureMessage) }; + } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs new file mode 100644 index 0000000000..a1fd3756ef --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs @@ -0,0 +1,158 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Extension methods to expose Authentication on HttpContext. + /// + public static class AuthenticationHttpContextExtensions + { + /// + /// Extension method for authenticate using the scheme. + /// + /// The context. + /// The . + public static Task AuthenticateAsync(this HttpContext context) => + context.AuthenticateAsync(scheme: null); + + /// + /// Extension method for authenticate. + /// + /// The context. + /// The name of the authentication scheme. + /// The . + public static Task AuthenticateAsync(this HttpContext context, string scheme) => + context.RequestServices.GetRequiredService().AuthenticateAsync(context, scheme); + + /// + /// Extension method for Challenge. + /// + /// The context. + /// The name of the authentication scheme. + /// The result. + public static Task ChallengeAsync(this HttpContext context, string scheme) => + context.ChallengeAsync(scheme, properties: null); + + /// + /// Extension method for authenticate using the scheme. + /// + /// The context. + /// The task. + public static Task ChallengeAsync(this HttpContext context) => + context.ChallengeAsync(scheme: null, properties: null); + + /// + /// Extension method for Challenge. + /// + /// The context. + /// The name of the authentication scheme. + /// The properties. + /// The task. + public static Task ChallengeAsync(this HttpContext context, string scheme, AuthenticationProperties properties) => + context.ChallengeAsync(scheme, properties: properties, behavior: ChallengeBehavior.Automatic); + + /// + /// Extension method for Challenge. + /// + /// The context. + /// The name of the authentication scheme. + /// The properties. + /// The behavior. + /// The task. + public static Task ChallengeAsync(this HttpContext context, string scheme, AuthenticationProperties properties, ChallengeBehavior behavior) => + context.RequestServices.GetRequiredService().ChallengeAsync(context, scheme, properties, behavior); + + /// + /// Extension method for Forbid. + /// + /// The context. + /// The name of the authentication scheme. + /// The task. + public static Task ForbidAsync(this HttpContext context, string scheme) => + context.ForbidAsync(scheme, properties: null); + + /// + /// Extension method for Forbid. + /// + /// The context. + /// The name of the authentication scheme. + /// The properties. + /// The task. + public static Task ForbidAsync(this HttpContext context, string scheme, AuthenticationProperties properties) => + context.RequestServices.GetRequiredService().ChallengeAsync(context, scheme, properties, ChallengeBehavior.Forbidden); + + /// + /// Extension method for SignIn. + /// + /// The context. + /// The name of the authentication scheme. + /// The user. + /// The task. + public static Task SignInAsync(this HttpContext context, string scheme, ClaimsPrincipal principal) => + context.SignInAsync(scheme, principal, properties: null); + + /// + /// Extension method for SignIn using the . + /// + /// The context. + /// The user. + /// The task. + public static Task SignInAsync(this HttpContext context, ClaimsPrincipal principal) => + context.SignInAsync(scheme: null, principal: principal, properties: null); + + /// + /// Extension method for SignIn using the . + /// + /// The context. + /// The user. + /// The properties. + /// The task. + public static Task SignInAsync(this HttpContext context, ClaimsPrincipal principal, AuthenticationProperties properties) => + context.SignInAsync(scheme: null, principal: principal, properties: properties); + + /// + /// Extension method for SignIn. + /// + /// The context. + /// The name of the authentication scheme. + /// The user. + /// The properties. + /// The task. + public static Task SignInAsync(this HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties) => + context.RequestServices.GetRequiredService().SignInAsync(context, scheme, principal, properties); + + /// + /// Extension method for SignOut. + /// + /// The context. + /// The name of the authentication scheme. + /// The task. + public static Task SignOutAsync(this HttpContext context, string scheme) => context.SignOutAsync(scheme, properties: null); + + /// + /// Extension method for SignOut. + /// + /// The context. + /// The name of the authentication scheme. + /// The properties. + /// + public static Task SignOutAsync(this HttpContext context, string scheme, AuthenticationProperties properties) => + context.RequestServices.GetRequiredService().SignOutAsync(context, scheme, properties); + + /// + /// Extension method for getting the value of an authentication token. + /// + /// The context. + /// The name of the authentication scheme. + /// The name of the token. + /// The value of the token. + public static Task GetTokenAsync(this HttpContext context, string scheme, string tokenName) => + context.RequestServices.GetRequiredService().GetTokenAsync(context, scheme, tokenName); + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs new file mode 100644 index 0000000000..e7e5936e17 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs @@ -0,0 +1,65 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + public class AuthenticationOptions + { + private readonly IList _schemes = new List(); + + /// + /// Returns the schemes in the order they were added (important for request handling priority) + /// + public IEnumerable Schemes => _schemes; + + /// + /// Maps schemes by name. + /// + public IDictionary SchemeMap { get; } = new Dictionary(StringComparer.Ordinal); + + /// + /// Adds an . + /// + /// The name of the scheme being added. + /// Configures the scheme. + public void AddScheme(string name, Action configureBuilder) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (configureBuilder == null) + { + throw new ArgumentNullException(nameof(configureBuilder)); + } + if (SchemeMap.ContainsKey(name)) + { + throw new InvalidOperationException("Scheme already exists: " + name); + } + + var builder = new AuthenticationSchemeBuilder(name); + configureBuilder(builder); + _schemes.Add(builder); + SchemeMap[name] = builder; + } + + /// + /// Used by as the default scheme by . + /// + public string DefaultAuthenticationScheme { get; set; } + + /// + /// Used by as the default scheme by . + /// + public string DefaultSignInScheme { get; set; } + + /// + /// Used by as the default scheme by . + /// + public string DefaultChallengeScheme { get; set; } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs new file mode 100644 index 0000000000..609b6fad58 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs @@ -0,0 +1,197 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Dictionary used to store state values about the authentication session. + /// + public class AuthenticationProperties + { + internal const string IssuedUtcKey = ".issued"; + internal const string ExpiresUtcKey = ".expires"; + internal const string IsPersistentKey = ".persistent"; + internal const string RedirectUriKey = ".redirect"; + internal const string RefreshKey = ".refresh"; + internal const string UtcDateTimeFormat = "r"; + + /// + /// Initializes a new instance of the class + /// + public AuthenticationProperties() + : this(items: null) + { + } + + /// + /// Initializes a new instance of the class + /// + /// + public AuthenticationProperties(IDictionary items) + { + Items = items ?? new Dictionary(StringComparer.Ordinal); + } + + /// + /// State values about the authentication session. + /// + public IDictionary Items { get; } + + /// + /// Gets or sets whether the authentication session is persisted across multiple requests. + /// + public bool IsPersistent + { + get { return Items.ContainsKey(IsPersistentKey); } + set + { + if (Items.ContainsKey(IsPersistentKey)) + { + if (!value) + { + Items.Remove(IsPersistentKey); + } + } + else + { + if (value) + { + Items.Add(IsPersistentKey, string.Empty); + } + } + } + } + + /// + /// Gets or sets the full path or absolute URI to be used as an http redirect response value. + /// + public string RedirectUri + { + get + { + string value; + return Items.TryGetValue(RedirectUriKey, out value) ? value : null; + } + set + { + if (value != null) + { + Items[RedirectUriKey] = value; + } + else + { + if (Items.ContainsKey(RedirectUriKey)) + { + Items.Remove(RedirectUriKey); + } + } + } + } + + /// + /// Gets or sets the time at which the authentication ticket was issued. + /// + public DateTimeOffset? IssuedUtc + { + get + { + string value; + if (Items.TryGetValue(IssuedUtcKey, out value)) + { + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + { + return dateTimeOffset; + } + } + return null; + } + set + { + if (value.HasValue) + { + Items[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + } + else + { + if (Items.ContainsKey(IssuedUtcKey)) + { + Items.Remove(IssuedUtcKey); + } + } + } + } + + /// + /// Gets or sets the time at which the authentication ticket expires. + /// + public DateTimeOffset? ExpiresUtc + { + get + { + string value; + if (Items.TryGetValue(ExpiresUtcKey, out value)) + { + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + { + return dateTimeOffset; + } + } + return null; + } + set + { + if (value.HasValue) + { + Items[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + } + else + { + if (Items.ContainsKey(ExpiresUtcKey)) + { + Items.Remove(ExpiresUtcKey); + } + } + } + } + + /// + /// Gets or sets if refreshing the authentication session should be allowed. + /// + public bool? AllowRefresh + { + get + { + string value; + if (Items.TryGetValue(RefreshKey, out value)) + { + bool refresh; + if (bool.TryParse(value, out refresh)) + { + return refresh; + } + } + return null; + } + set + { + if (value.HasValue) + { + Items[RefreshKey] = value.Value.ToString(); + } + else + { + if (Items.ContainsKey(RefreshKey)) + { + Items.Remove(RefreshKey); + } + } + } + } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs new file mode 100644 index 0000000000..77bd9e6d35 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// AuthenticationSchemes assign a name to a specific + /// handlerType. + /// + public class AuthenticationScheme + { + /// + /// Constructor. + /// + /// The name for the authentication scheme. + /// The type that handles this scheme. + public AuthenticationScheme(string name, Type handlerType) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (handlerType == null) + { + throw new ArgumentNullException(nameof(handlerType)); + } + if (!typeof(IAuthenticationHandler).IsAssignableFrom(handlerType)) + { + throw new ArgumentException("handlerType must implement IAuthenticationSchemeHandler."); + } + + Name = name; + HandlerType = handlerType; + } + + /// + /// The name of the authentication scheme. + /// + public string Name { get; } + + /// + /// The type that handles this scheme. + /// + public Type HandlerType { get; } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs new file mode 100644 index 0000000000..e1ea0cbc4a --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used to build s. + /// + public class AuthenticationSchemeBuilder + { + /// + /// Constructor. + /// + /// The name of the scheme being built. + public AuthenticationSchemeBuilder(string name) + { + Name = name; + } + + /// + /// The name of the scheme being built. + /// + public string Name { get; } + + /// + /// The type responsible for this scheme. + /// + public Type HandlerType { get; set; } + + /// + /// Builds the instance. + /// + /// + public AuthenticationScheme Build() => new AuthenticationScheme(Name, HandlerType); + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationTicket.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationTicket.cs new file mode 100644 index 0000000000..c31f15ec01 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationTicket.cs @@ -0,0 +1,56 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Contains user identity information as well as additional authentication state. + /// + public class AuthenticationTicket + { + /// + /// Initializes a new instance of the class + /// + /// the that represents the authenticated user. + /// additional properties that can be consumed by the user or runtime. + /// the authentication middleware that was responsible for this ticket. + public AuthenticationTicket(ClaimsPrincipal principal, AuthenticationProperties properties, string authenticationScheme) + { + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + + AuthenticationScheme = authenticationScheme; + Principal = principal; + Properties = properties ?? new AuthenticationProperties(); + } + + /// + /// Initializes a new instance of the class + /// + /// the that represents the authenticated user. + /// the authentication middleware that was responsible for this ticket. + public AuthenticationTicket(ClaimsPrincipal principal, string authenticationScheme) + : this(principal, properties: null, authenticationScheme: authenticationScheme) + { } + + /// + /// Gets the authentication type. + /// + public string AuthenticationScheme { get; private set; } + + /// + /// Gets the claims-principal with authenticated user identities. + /// + public ClaimsPrincipal Principal { get; private set; } + + /// + /// Additional state values for the authentication session. + /// + public AuthenticationProperties Properties { get; private set; } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationToken.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationToken.cs new file mode 100644 index 0000000000..555da9e098 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationToken.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Name/Value representing an token. + /// + public class AuthenticationToken + { + /// + /// Name. + /// + public string Name { get; set; } + + /// + /// Value. + /// + public string Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs new file mode 100644 index 0000000000..cfe5809c5a --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs @@ -0,0 +1,41 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Base context for authentication. + /// + public abstract class BaseAuthenticationContext : BaseContext + { + /// + /// Constructor. + /// + /// The context. + /// The name of the scheme. + /// The properties. + protected BaseAuthenticationContext(HttpContext context, string authenticationScheme, AuthenticationProperties properties) : base(context) + { + if (string.IsNullOrEmpty(authenticationScheme)) + { + throw new ArgumentException(nameof(authenticationScheme)); + } + + AuthenticationScheme = authenticationScheme; + Properties = properties ?? new AuthenticationProperties(); + } + + /// + /// The name of the scheme. + /// + public string AuthenticationScheme { get; } + + /// + /// Contains the extra meta-data arriving with the authentication. May be altered. + /// + public AuthenticationProperties Properties { get; protected set; } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs new file mode 100644 index 0000000000..3d65f0dd75 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Base class used by other context classes. + /// + public abstract class BaseContext + { + /// + /// Constructor. + /// + /// The request context. + protected BaseContext(HttpContext context) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + HttpContext = context; + } + + /// + /// The context. + /// + public HttpContext HttpContext { get; } + + /// + /// The request. + /// + public HttpRequest Request + { + get { return HttpContext.Request; } + } + + /// + /// The response. + /// + public HttpResponse Response + { + get { return HttpContext.Response; } + } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs new file mode 100644 index 0000000000..1506021dd4 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs @@ -0,0 +1,15 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Controls how challenge will behave (i.e. 401 vs 403). + /// + public enum ChallengeBehavior + { + Automatic, + Unauthorized, + Forbidden + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs new file mode 100644 index 0000000000..ee2392eb04 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs @@ -0,0 +1,45 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Context used for challenges. + /// + public class ChallengeContext : BaseAuthenticationContext + { + /// + /// Constructor. + /// + /// The context. + /// The name of the scheme. + public ChallengeContext(HttpContext httpContext, string authenticationScheme) + : this(httpContext, authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) + { } + + /// + /// Constructor + /// + /// The context. + /// The name of the scheme. + /// The properties. + /// The challenge behavior. + public ChallengeContext(HttpContext httpContext, string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) + : base(httpContext, authenticationScheme, properties) + { + if (string.IsNullOrEmpty(authenticationScheme)) + { + throw new ArgumentException(nameof(authenticationScheme)); + } + Behavior = behavior; + } + + /// + /// The challenge behavior. + /// + public ChallengeBehavior Behavior { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationFeature.cs new file mode 100644 index 0000000000..43e5a13b49 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationFeature.cs @@ -0,0 +1,23 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used to capture path info so redirects can be computed properly within an app.Map(). + /// + public interface IAuthenticationFeature + { + /// + /// The original path base. + /// + PathString OriginalPathBase { get; set; } + + /// + /// The original path. + /// + PathString OriginalPath { get; set; } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs new file mode 100644 index 0000000000..7a805f7af4 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs @@ -0,0 +1,50 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Created per request to handle authentication for to a particular scheme. + /// + public interface IAuthenticationHandler + { + /// + /// The handler should initialize anything it needs from the request and scheme here. + /// + /// The scheme. + /// The context. + /// + Task InitializeAsync(AuthenticationScheme scheme, HttpContext context); + + /// + /// Authentication behavior. + /// + /// The context. + /// The result. + Task AuthenticateAsync(AuthenticateContext context); + + /// + /// Challenge behavior. + /// + /// The context. + /// A task. + Task ChallengeAsync(ChallengeContext context); + + /// + /// Handle sign in. + /// + /// The context. + /// A task. + Task SignInAsync(SignInContext context); + + /// + /// Signout behavior. + /// + /// The context. + /// A task. + Task SignOutAsync(SignOutContext context); + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandlerProvider.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandlerProvider.cs new file mode 100644 index 0000000000..0507f51d61 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandlerProvider.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Provides the appropriate IAuthenticationHandler instance for the authenticationScheme and request. + /// + public interface IAuthenticationHandlerProvider + { + /// + /// Returns the handler instance that will be used. + /// + /// The context. + /// The name of the authentication scheme being handled. + /// The handler instance. + Task GetHandlerAsync(HttpContext context, string authenticationScheme); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs new file mode 100644 index 0000000000..fffe08f427 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used to determine if a handler wants to participate in request processing. + /// + public interface IAuthenticationRequestHandler : IAuthenticationHandler + { + + /// + /// Returns true if request processing should stop. + /// + /// + Task HandleRequestAsync(); + } + +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs new file mode 100644 index 0000000000..4b36abdac7 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs @@ -0,0 +1,70 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Responsible for managing what authenticationSchemes are supported. + /// + public interface IAuthenticationSchemeProvider + { + /// + /// Returns all currently registered s. + /// + /// All currently registered s. + Task> GetAllSchemesAsync(); + + /// + /// Returns the matching the name, or null. + /// + /// The name of the authenticationScheme. + /// The scheme or null if not found. + Task GetSchemeAsync(string name); + + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// + /// The scheme that will be used by default for . + Task GetDefaultAuthenticateSchemeAsync(); + + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// + /// The scheme that will be used by default for . + Task GetDefaultChallengeSchemeAsync(); + + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// + /// The scheme that will be used by default for . + Task GetDefaultSignInSchemeAsync(); + + /// + /// Registers a scheme for use by . + /// + /// The scheme. + void AddScheme(AuthenticationScheme scheme); + + /// + /// Removes a scheme, preventing it from being used by . + /// + /// The name of the authenticationScheme being removed. + void RemoveScheme(string name); + + /// + /// Returns the schemes in priority order for request handling. + /// + /// The schemes in priority order for request handling + Task> GetRequestHandlerSchemesAsync(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs new file mode 100644 index 0000000000..ec54325ea4 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs @@ -0,0 +1,52 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used to provide authentication. + /// + public interface IAuthenticationService + { + /// + /// Authenticate for the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The result. + Task AuthenticateAsync(HttpContext context, string scheme); + + /// + /// Challenge the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The . + /// The . + /// A task. + Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties, ChallengeBehavior behavior); + + /// + /// Sign a principal in for the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The to sign in. + /// The . + /// A task. + Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties); + + /// + /// Sign out the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The . + /// A task. + Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties); + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs new file mode 100644 index 0000000000..3aed710aa9 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used by the for claims transformation. + /// + public interface IClaimsTransformation + { + /// + /// Provides a central transformation point to change the specified principal. + /// + /// The to transform. + /// The transformed principal. + Task TransformAsync(ClaimsPrincipal principal); + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj new file mode 100644 index 0000000000..aa2fae7fc3 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -0,0 +1,24 @@ + + + + ASP.NET Core common types used by the various authentication components. + netstandard1.3;net46 + $(NoWarn);CS1591 + true + aspnetcore;authentication;security + false + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs new file mode 100644 index 0000000000..e89b663a7d --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs @@ -0,0 +1,37 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Context used for sign out. + /// + public class SignInContext : BaseAuthenticationContext + { + /// + /// Constructor. + /// + /// The context. + /// The name of the authentication scheme. + /// The user to sign in. + /// The properties. + public SignInContext(HttpContext context, string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties) + : base(context, authenticationScheme, properties) + { + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + Principal = principal; + } + + /// + /// The user to sign in. + /// + public ClaimsPrincipal Principal { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs new file mode 100644 index 0000000000..307a3af875 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs @@ -0,0 +1,23 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Context used to sign out. + /// + public class SignOutContext : BaseAuthenticationContext + { + /// + /// Constructor. + /// + /// The context. + /// The name of the authentication scheme. + /// The properties. + public SignOutContext(HttpContext context, string authenticationScheme, AuthenticationProperties properties) + : base(context, authenticationScheme, properties) + { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs new file mode 100644 index 0000000000..24f66d9043 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs @@ -0,0 +1,155 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Extension methods for storing authentication tokens in . + /// + public static class AuthenticationTokenExtensions + { + private static string TokenNamesKey = ".TokenNames"; + private static string TokenKeyPrefix = ".Token."; + + /// + /// Stores a set of authentication tokens, after removing any old tokens. + /// + /// The properties. + /// The tokens to store. + public static void StoreTokens(this AuthenticationProperties properties, IEnumerable tokens) + { + if (properties == null) + { + throw new ArgumentNullException(nameof(properties)); + } + if (tokens == null) + { + throw new ArgumentNullException(nameof(tokens)); + } + + // Clear old tokens first + var oldTokens = properties.GetTokens(); + foreach (var t in oldTokens) + { + properties.Items.Remove(TokenKeyPrefix + t.Name); + } + properties.Items.Remove(TokenNamesKey); + + var tokenNames = new List(); + foreach (var token in tokens) + { + // REVIEW: should probably check that there are no ; in the token name and throw or encode + tokenNames.Add(token.Name); + properties.Items[TokenKeyPrefix+token.Name] = token.Value; + } + if (tokenNames.Count > 0) + { + properties.Items[TokenNamesKey] = string.Join(";", tokenNames.ToArray()); + } + } + + /// + /// Returns the value of a token. + /// + /// The properties. + /// The token name. + /// The token value. + public static string GetTokenValue(this AuthenticationProperties properties, string tokenName) + { + if (properties == null) + { + throw new ArgumentNullException(nameof(properties)); + } + if (tokenName == null) + { + throw new ArgumentNullException(nameof(tokenName)); + } + + var tokenKey = TokenKeyPrefix + tokenName; + return properties.Items.ContainsKey(tokenKey) + ? properties.Items[tokenKey] + : null; + } + + public static bool UpdateTokenValue(this AuthenticationProperties properties, string tokenName, string tokenValue) + { + if (properties == null) + { + throw new ArgumentNullException(nameof(properties)); + } + if (tokenName == null) + { + throw new ArgumentNullException(nameof(tokenName)); + } + + var tokenKey = TokenKeyPrefix + tokenName; + if (!properties.Items.ContainsKey(tokenKey)) + { + return false; + } + properties.Items[tokenKey] = tokenValue; + return true; + } + + /// + /// Returns all of the AuthenticationTokens contained in the properties. + /// + /// The properties. + /// The authentication toekns. + public static IEnumerable GetTokens(this AuthenticationProperties properties) + { + if (properties == null) + { + throw new ArgumentNullException(nameof(properties)); + } + + var tokens = new List(); + if (properties.Items.ContainsKey(TokenNamesKey)) + { + var tokenNames = properties.Items[TokenNamesKey].Split(';'); + foreach (var name in tokenNames) + { + var token = properties.GetTokenValue(name); + if (token != null) + { + tokens.Add(new AuthenticationToken { Name = name, Value = token }); + } + } + } + + return tokens; + } + + /// + /// Extension method for getting the value of an authentication token. + /// + /// The . + /// The context. + /// The name of the authentication scheme. + /// The name of the token. + /// The value of the token. + public static async Task GetTokenAsync(this IAuthenticationService auth, HttpContext context, string scheme, string tokenName) + { + if (auth == null) + { + throw new ArgumentNullException(nameof(auth)); + } + if (scheme == null) + { + throw new ArgumentNullException(nameof(scheme)); + } + if (tokenName == null) + { + throw new ArgumentNullException(nameof(tokenName)); + } + + var result = await auth.AuthenticateAsync(context, scheme); + return result?.Properties?.GetTokenValue(tokenName); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs new file mode 100644 index 0000000000..fdf85a9b45 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs @@ -0,0 +1,56 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Authentication; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// Extension methods for setting up authentication services in an . + /// + public static class AuthenticationCoreServiceCollectionExtensions + { + /// + /// Add core authentication services needed for . + /// + /// The . + /// The service collection. + public static IServiceCollection AddAuthenticationCore(this IServiceCollection services) + { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + + services.TryAddScoped(); + services.TryAddSingleton(); // Can be replaced with scoped ones that use DbContext + services.TryAddScoped(); + services.TryAddSingleton(); + return services; + } + + /// + /// Add core authentication services needed for . + /// + /// The . + /// Used to configure the . + /// The service collection. + public static IServiceCollection AddAuthenticationCore(this IServiceCollection services, Action configureOptions) { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + + if (configureOptions == null) + { + throw new ArgumentNullException(nameof(configureOptions)); + } + + services.AddAuthenticationCore(); + services.Configure(configureOptions); + return services; + } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationFeature.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationFeature.cs new file mode 100644 index 0000000000..3282cbf467 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationFeature.cs @@ -0,0 +1,23 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used to capture path info so redirects can be computed properly within an app.Map(). + /// + public class AuthenticationFeature : IAuthenticationFeature + { + /// + /// The original path base. + /// + public PathString OriginalPathBase { get; set; } + + /// + /// The original path. + /// + public PathString OriginalPath { get; set; } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationHandlerProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationHandlerProvider.cs new file mode 100644 index 0000000000..c4921e5334 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationHandlerProvider.cs @@ -0,0 +1,63 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Implementation of . + /// + public class AuthenticationHandlerProvider : IAuthenticationHandlerProvider + { + /// + /// Constructor. + /// + /// The . + public AuthenticationHandlerProvider(IAuthenticationSchemeProvider schemes) + { + Schemes = schemes; + } + + /// + /// The . + /// + public IAuthenticationSchemeProvider Schemes { get; } + + // handler instance cache, need to initialize once per request + private Dictionary _handlerMap = new Dictionary(StringComparer.Ordinal); + + /// + /// Returns the handler instance that will be used. + /// + /// The context. + /// The name of the authentication scheme being handled. + /// The handler instance. + public async Task GetHandlerAsync(HttpContext context, string authenticationScheme) + { + if (_handlerMap.ContainsKey(authenticationScheme)) + { + return _handlerMap[authenticationScheme]; + } + + var scheme = await Schemes.GetSchemeAsync(authenticationScheme); + if (scheme == null) + { + return null; + } + var handler = (context.RequestServices.GetService(scheme.HandlerType) ?? + ActivatorUtilities.CreateInstance(context.RequestServices, scheme.HandlerType)) + as IAuthenticationHandler; + if (handler != null) + { + await handler.InitializeAsync(scheme, context); + _handlerMap[authenticationScheme] = handler; + } + return handler; + } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs new file mode 100644 index 0000000000..fe347d6ee9 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs @@ -0,0 +1,170 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Implements . + /// + public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider + { + /// + /// Constructor. + /// + /// The options. + public AuthenticationSchemeProvider(IOptions options) + { + _options = options.Value; + + foreach (var builder in _options.Schemes) + { + var scheme = builder.Build(); + AddScheme(scheme); + } + } + + private readonly AuthenticationOptions _options; + private readonly object _lock = new object(); + + private IDictionary _map = new Dictionary(StringComparer.Ordinal); + private List _requestHandlers = new List(); + + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// + /// The scheme that will be used by default for . + public Task GetDefaultAuthenticateSchemeAsync() + { + if (_options.DefaultAuthenticationScheme != null) + { + return GetSchemeAsync(_options.DefaultAuthenticationScheme); + } + if (_map.Count == 1) + { + return Task.FromResult(_map.Values.First()); + } + return Task.FromResult(null); + } + + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// + /// The scheme that will be used by default for . + public Task GetDefaultChallengeSchemeAsync() + { + if (_options.DefaultChallengeScheme != null) + { + return GetSchemeAsync(_options.DefaultChallengeScheme); + } + if (_map.Count == 1) + { + return Task.FromResult(_map.Values.First()); + } + return Task.FromResult(null); + } + + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// + /// The scheme that will be used by default for . + public Task GetDefaultSignInSchemeAsync() + { + if (_options.DefaultSignInScheme != null) + { + return GetSchemeAsync(_options.DefaultSignInScheme); + } + if (_map.Count == 1) + { + return Task.FromResult(_map.Values.First()); + } + return Task.FromResult(null); + } + + /// + /// Returns the matching the name, or null. + /// + /// The name of the authenticationScheme. + /// The scheme or null if not found. + public Task GetSchemeAsync(string name) + { + if (_map.ContainsKey(name)) + { + return Task.FromResult(_map[name]); + } + return Task.FromResult(null); + } + + /// + /// Returns the schemes in priority order for request handling. + /// + /// The schemes in priority order for request handling + public Task> GetRequestHandlerSchemesAsync() + { + return Task.FromResult>(_requestHandlers); + } + + /// + /// Registers a scheme for use by . + /// + /// The scheme. + public void AddScheme(AuthenticationScheme scheme) + { + if (_map.ContainsKey(scheme.Name)) + { + throw new InvalidOperationException("Scheme already exists: " + scheme.Name); + } + lock (_lock) + { + if (_map.ContainsKey(scheme.Name)) + { + throw new InvalidOperationException("Scheme already exists: " + scheme.Name); + } + if (typeof(IAuthenticationRequestHandler).IsAssignableFrom(scheme.HandlerType)) + { + _requestHandlers.Add(scheme); + } + _map[scheme.Name] = scheme; + } + } + + /// + /// Removes a scheme, preventing it from being used by . + /// + /// The name of the authenticationScheme being removed. + public void RemoveScheme(string name) + { + if (!_map.ContainsKey(name)) + { + return; + } + lock (_lock) + { + if (_map.ContainsKey(name)) + { + var scheme = _map[name]; + _requestHandlers.Remove(_requestHandlers.Where(s => s.Name == name).FirstOrDefault()); + _map.Remove(name); + } + } + } + + public Task> GetAllSchemesAsync() + { + return Task.FromResult>(_map.Values); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs new file mode 100644 index 0000000000..9b8837f22e --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -0,0 +1,167 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Implements . + /// + public class AuthenticationService : IAuthenticationService + { + /// + /// Constructor. + /// + /// The . + /// The . + /// The The . + public AuthenticationService(IAuthenticationSchemeProvider schemes, IAuthenticationHandlerProvider handlers, IClaimsTransformation transform) + { + Schemes = schemes; + Handlers = handlers; + Transform = transform; + } + + /// + /// Used to lookup AuthenticationSchemes. + /// + public IAuthenticationSchemeProvider Schemes { get; } + + /// + /// Used to resolve IAuthenticationHandler instances. + /// + public IAuthenticationHandlerProvider Handlers { get; } + + /// + /// Used for claims transformation. + /// + public IClaimsTransformation Transform { get; } + + /// + /// Authenticate for the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The result. + public virtual async Task AuthenticateAsync(HttpContext context, string scheme) + { + if (scheme == null) + { + var defaultScheme = await Schemes.GetDefaultAuthenticateSchemeAsync(); + scheme = defaultScheme?.Name; + if (scheme == null) + { + throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found."); + } + } + + var handler = await Handlers.GetHandlerAsync(context, scheme); + if (handler == null) + { + throw new InvalidOperationException($"No authentication handler is configured to authenticate for the scheme: {scheme}"); + } + + var authContext = new AuthenticateContext(context, scheme); + var result = await handler.AuthenticateAsync(authContext); + if (result.Succeeded) + { + var transformed = await Transform.TransformAsync(result.Principal); + return AuthenticateResult.Success(new AuthenticationTicket(transformed, result.Properties, result.Ticket.AuthenticationScheme)); + } + return result; + } + + /// + /// Challenge the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The . + /// The . + /// A task. + public virtual async Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties, ChallengeBehavior behavior) + { + if (scheme == null) + { + var defaultChallengeScheme = await Schemes.GetDefaultChallengeSchemeAsync(); + scheme = defaultChallengeScheme?.Name; + if (scheme == null) + { + throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultChallengeScheme found."); + } + } + + var handler = await Handlers.GetHandlerAsync(context, scheme); + if (handler == null) + { + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + } + + var challengeContext = new ChallengeContext(context, scheme, properties, behavior); + await handler.ChallengeAsync(challengeContext); + } + + /// + /// Sign a principal in for the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The to sign in. + /// The . + /// A task. + public virtual async Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties) + { + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + + if (scheme == null) + { + var defaultScheme = await Schemes.GetDefaultSignInSchemeAsync(); + scheme = defaultScheme?.Name; + if (scheme == null) + { + throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultSignInScheme found."); + } + } + + var handler = await Handlers.GetHandlerAsync(context, scheme); + if (handler == null) + { + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + } + + var signInContext = new SignInContext(context, scheme, principal, properties); + await handler.SignInAsync(signInContext); + } + + /// + /// Sign out the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The . + /// A task. + public virtual async Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties) + { + if (string.IsNullOrEmpty(scheme)) + { + throw new ArgumentException(nameof(scheme)); + } + + var handler = await Handlers.GetHandlerAsync(context, scheme); + if (handler == null) + { + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + } + + var signOutContext = new SignOutContext(context, scheme, properties); + await handler.SignOutAsync(signOutContext); + } + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj new file mode 100644 index 0000000000..61628336f1 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -0,0 +1,21 @@ + + + + + + ASP.NET Core common types used by the various authentication middleware components. + netstandard1.3;net46 + $(NoWarn);CS1591 + true + aspnetcore;authentication;security + false + + + + + + + + + + diff --git a/src/Microsoft.AspNetCore.Authentication.Core/NoopClaimsTransformation.cs b/src/Microsoft.AspNetCore.Authentication.Core/NoopClaimsTransformation.cs new file mode 100644 index 0000000000..83c488fe42 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/NoopClaimsTransformation.cs @@ -0,0 +1,24 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Default claims transformation is a no-op. + /// + public class NoopClaimsTransformation : IClaimsTransformation + { + /// + /// Returns the principal unchanged. + /// + /// The user. + /// The principal unchanged. + public virtual Task TransformAsync(ClaimsPrincipal principal) + { + return Task.FromResult(principal); + } + } +} diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj new file mode 100644 index 0000000000..925f5aa079 --- /dev/null +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -0,0 +1,19 @@ + + + + + netcoreapp2.0;net46 + netcoreapp2.0 + + + + + + + + + + + + + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs new file mode 100644 index 0000000000..3e3eb9c52b --- /dev/null +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs @@ -0,0 +1,123 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.AspNetCore.Authentication +{ + public class TokenExtensionTests + { + [Fact] + public void CanStoreMultipleTokens() + { + var props = new AuthenticationProperties(); + var tokens = new List(); + var tok1 = new AuthenticationToken { Name = "One", Value = "1" }; + var tok2 = new AuthenticationToken { Name = "Two", Value = "2" }; + var tok3 = new AuthenticationToken { Name = "Three", Value = "3" }; + tokens.Add(tok1); + tokens.Add(tok2); + tokens.Add(tok3); + props.StoreTokens(tokens); + + Assert.Equal("1", props.GetTokenValue("One")); + Assert.Equal("2", props.GetTokenValue("Two")); + Assert.Equal("3", props.GetTokenValue("Three")); + Assert.Equal(3, props.GetTokens().Count()); + } + + [Fact] + public void SubsequentStoreTokenDeletesPreviousTokens() + { + var props = new AuthenticationProperties(); + var tokens = new List(); + var tok1 = new AuthenticationToken { Name = "One", Value = "1" }; + var tok2 = new AuthenticationToken { Name = "Two", Value = "2" }; + var tok3 = new AuthenticationToken { Name = "Three", Value = "3" }; + tokens.Add(tok1); + tokens.Add(tok2); + tokens.Add(tok3); + + props.StoreTokens(tokens); + + props.StoreTokens(new[] { new AuthenticationToken { Name = "Zero", Value = "0" } }); + + Assert.Equal("0", props.GetTokenValue("Zero")); + Assert.Equal(null, props.GetTokenValue("One")); + Assert.Equal(null, props.GetTokenValue("Two")); + Assert.Equal(null, props.GetTokenValue("Three")); + Assert.Equal(1, props.GetTokens().Count()); + } + + [Fact] + public void CanUpdateTokens() + { + var props = new AuthenticationProperties(); + var tokens = new List(); + var tok1 = new AuthenticationToken { Name = "One", Value = "1" }; + var tok2 = new AuthenticationToken { Name = "Two", Value = "2" }; + var tok3 = new AuthenticationToken { Name = "Three", Value = "3" }; + tokens.Add(tok1); + tokens.Add(tok2); + tokens.Add(tok3); + props.StoreTokens(tokens); + + tok1.Value = ".1"; + tok2.Value = ".2"; + tok3.Value = ".3"; + props.StoreTokens(tokens); + + Assert.Equal(".1", props.GetTokenValue("One")); + Assert.Equal(".2", props.GetTokenValue("Two")); + Assert.Equal(".3", props.GetTokenValue("Three")); + Assert.Equal(3, props.GetTokens().Count()); + } + + [Fact] + public void CanUpdateTokenValues() + { + var props = new AuthenticationProperties(); + var tokens = new List(); + var tok1 = new AuthenticationToken { Name = "One", Value = "1" }; + var tok2 = new AuthenticationToken { Name = "Two", Value = "2" }; + var tok3 = new AuthenticationToken { Name = "Three", Value = "3" }; + tokens.Add(tok1); + tokens.Add(tok2); + tokens.Add(tok3); + props.StoreTokens(tokens); + + Assert.True(props.UpdateTokenValue("One", ".11")); + Assert.True(props.UpdateTokenValue("Two", ".22")); + Assert.True(props.UpdateTokenValue("Three", ".33")); + + Assert.Equal(".11", props.GetTokenValue("One")); + Assert.Equal(".22", props.GetTokenValue("Two")); + Assert.Equal(".33", props.GetTokenValue("Three")); + Assert.Equal(3, props.GetTokens().Count()); + } + + [Fact] + public void UpdateTokenValueReturnsFalseForUnknownToken() + { + var props = new AuthenticationProperties(); + var tokens = new List(); + var tok1 = new AuthenticationToken { Name = "One", Value = "1" }; + var tok2 = new AuthenticationToken { Name = "Two", Value = "2" }; + var tok3 = new AuthenticationToken { Name = "Three", Value = "3" }; + tokens.Add(tok1); + tokens.Add(tok2); + tokens.Add(tok3); + props.StoreTokens(tokens); + + Assert.False(props.UpdateTokenValue("ONE", ".11")); + Assert.False(props.UpdateTokenValue("Jigglypuff", ".11")); + + Assert.Null(props.GetTokenValue("ONE")); + Assert.Null(props.GetTokenValue("Jigglypuff")); + Assert.Equal(3, props.GetTokens().Count()); + + } + } +} From f264659c959a0fbaf98a1078c268929131b7b924 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 3 Apr 2017 21:41:10 -0700 Subject: [PATCH 661/846] Updating versions to 2.0.0-preview1 --- build/dependencies.props | 2 +- version.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 8c81df7f34..1973fc186f 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,6 +1,6 @@ - 1.2.0-* + 2.0.0-* 4.3.0 2.0.0-* 1.6.1 diff --git a/version.props b/version.props index 38c93687ab..10a1c898f3 100644 --- a/version.props +++ b/version.props @@ -1,7 +1,7 @@ - 1.2.0 + 2.0.0 preview1 \ No newline at end of file From 0da88e0dda36d48ae68ac24289c349605cd94828 Mon Sep 17 00:00:00 2001 From: John Luo Date: Sun, 2 Apr 2017 17:32:24 -0700 Subject: [PATCH 662/846] Avoid double escaping in PathString --- .../Internal/PathStringHelper.cs | 15 +++++++++++ .../PathString.cs | 26 ++++++++++++++----- .../PathStringTests.cs | 4 +++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs index 45b44ab1bb..b6cebb2b9c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs @@ -28,5 +28,20 @@ namespace Microsoft.AspNetCore.Http.Internal { return c < ValidPathChars.Length && ValidPathChars[c]; } + + public static bool IsPercentEncodedChar(string str, int index) + { + return index < str.Length - 2 + && str[index] == '%' + && IsHexadecimalChar(str[index + 1]) + && IsHexadecimalChar(str[index + 2]); + } + + public static bool IsHexadecimalChar(char c) + { + return ('0' <= c && c <= '9') + || ('A' <= c && c <= 'F') + || ('a' <= c && c <= 'f'); + } } } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index a211d2737c..50124e5e47 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -53,7 +53,7 @@ namespace Microsoft.AspNetCore.Http } /// - /// Provides the path string escaped in a way which is correct for combining into the URI representation. + /// Provides the path string escaped in a way which is correct for combining into the URI representation. /// /// The escaped path value public override string ToString() @@ -77,9 +77,12 @@ namespace Microsoft.AspNetCore.Http var start = 0; var count = 0; var requiresEscaping = false; - for (int i = 0; i < _value.Length; ++i) + var i = 0; + + while (i < _value.Length) { - if (PathStringHelper.IsValidPathChar(_value[i])) + var isPercentEncodedChar = PathStringHelper.IsPercentEncodedChar(_value, i); + if (PathStringHelper.IsValidPathChar(_value[i]) || isPercentEncodedChar) { if (requiresEscaping) { @@ -96,7 +99,16 @@ namespace Microsoft.AspNetCore.Http count = 0; } - count++; + if (isPercentEncodedChar) + { + count += 3; + i += 3; + } + else + { + count++; + i++; + } } else { @@ -116,6 +128,7 @@ namespace Microsoft.AspNetCore.Http } count++; + i++; } } @@ -146,6 +159,7 @@ namespace Microsoft.AspNetCore.Http } } + /// /// Returns an PathString given the path as it is escaped in the URI format. The string MUST NOT contain any /// value that is not a path. @@ -279,7 +293,7 @@ namespace Microsoft.AspNetCore.Http } /// - /// Adds two PathString instances into a combined PathString value. + /// Adds two PathString instances into a combined PathString value. /// /// The combined PathString value public PathString Add(PathString other) @@ -297,7 +311,7 @@ namespace Microsoft.AspNetCore.Http } /// - /// Combines a PathString and QueryString into the joined URI formatted string value. + /// Combines a PathString and QueryString into the joined URI formatted string value. /// /// The joined URI formatted string value public string Add(QueryString other) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index b901944524..f5cbe052dd 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -195,6 +195,10 @@ namespace Microsoft.AspNetCore.Http [InlineData("pct-encoding", "/单行道", "/%E5%8D%95%E8%A1%8C%E9%81%93")] [InlineData("mixed1", "/index/单行道=(x*y)[abc]", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D")] [InlineData("mixed2", "/index/单行道=(x*y)[abc]_", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D_")] + [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/", "/http%3a%2f%2f%5Bfoo%5D%3A5000/")] + [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/%", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%25")] + [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/%2", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%252")] + [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/%2F", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%2F")] public void ToUriComponentEscapeCorrectly(string category, string input, string expected) { var path = new PathString(input); From f6cf5293a08be59005b42d896a19a7f70d9e4091 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 12 Apr 2017 16:03:35 -0700 Subject: [PATCH 663/846] Add challenge/forbid overloads for MVC --- .../AuthenticationHttpContextExtensions.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs index a1fd3756ef..0adb66f31f 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs @@ -47,6 +47,15 @@ namespace Microsoft.AspNetCore.Authentication public static Task ChallengeAsync(this HttpContext context) => context.ChallengeAsync(scheme: null, properties: null); + /// + /// Extension method for authenticate using the scheme. + /// + /// The context. + /// The properties. + /// The task. + public static Task ChallengeAsync(this HttpContext context, AuthenticationProperties properties) => + context.ChallengeAsync(scheme: null, properties: properties); + /// /// Extension method for Challenge. /// @@ -77,6 +86,23 @@ namespace Microsoft.AspNetCore.Authentication public static Task ForbidAsync(this HttpContext context, string scheme) => context.ForbidAsync(scheme, properties: null); + /// + /// Extension method for Forbid. + /// + /// The context. + /// The task. + public static Task ForbidAsync(this HttpContext context) => + context.ForbidAsync(scheme: null, properties: null); + + /// + /// Extension method for Forbid. + /// + /// The context. + /// The properties. + /// The task. + public static Task ForbidAsync(this HttpContext context, AuthenticationProperties properties) => + context.ForbidAsync(scheme: null, properties: properties); + /// /// Extension method for Forbid. /// From f2f643ad1571465ebb61af5ab3e482c5a5c2cd12 Mon Sep 17 00:00:00 2001 From: Jonathan Channon Date: Thu, 13 Apr 2017 17:57:35 +0100 Subject: [PATCH 664/846] Updated XML documentation for HttpResponse.Body (#816) --- src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs index b34df35a4e..01854e6ccd 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Http public abstract IHeaderDictionary Headers { get; } /// - /// Gets the response body . + /// Gets or sets the response body . /// public abstract Stream Body { get; set; } From f9e19ed522f78f9f346b00b42b32d06f3aefbc02 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 14 Apr 2017 14:42:10 -0700 Subject: [PATCH 665/846] DefaultAuthentication => DefaultAuthenticate --- .../AuthenticationHttpContextExtensions.cs | 2 +- .../AuthenticationOptions.cs | 2 +- .../IAuthenticationSchemeProvider.cs | 2 +- .../AuthenticationSchemeProvider.cs | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs index 0adb66f31f..8f159eb279 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Authentication public static class AuthenticationHttpContextExtensions { /// - /// Extension method for authenticate using the scheme. + /// Extension method for authenticate using the scheme. /// /// The context. /// The . diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs index e7e5936e17..4d90d3d6f2 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs @@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// Used by as the default scheme by . /// - public string DefaultAuthenticationScheme { get; set; } + public string DefaultAuthenticateScheme { get; set; } /// /// Used by as the default scheme by . diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs index 4b36abdac7..861f3dda49 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// Returns the scheme that will be used by default for . - /// This is typically specified via . + /// This is typically specified via . /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. /// /// The scheme that will be used by default for . diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs index fe347d6ee9..91e68f2ca0 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs @@ -39,15 +39,15 @@ namespace Microsoft.AspNetCore.Authentication /// /// Returns the scheme that will be used by default for . - /// This is typically specified via . + /// This is typically specified via . /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. /// /// The scheme that will be used by default for . public Task GetDefaultAuthenticateSchemeAsync() { - if (_options.DefaultAuthenticationScheme != null) + if (_options.DefaultAuthenticateScheme != null) { - return GetSchemeAsync(_options.DefaultAuthenticationScheme); + return GetSchemeAsync(_options.DefaultAuthenticateScheme); } if (_map.Count == 1) { From ef9ff35370433c5ce2488037c7f99611a09da364 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 14 Apr 2017 17:19:25 -0700 Subject: [PATCH 666/846] Remove unneeded AuthenticateContext --- .../AuthenticateContext.cs | 21 ------------------- .../IAuthenticationHandler.cs | 3 +-- .../AuthenticationService.cs | 3 +-- 3 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs deleted file mode 100644 index 814d7024e4..0000000000 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateContext.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.Authentication -{ - /// - /// Base class used by methods. - /// - public class AuthenticateContext : BaseAuthenticationContext - { - /// - /// Constructor. - /// - /// The context. - /// The name of the authentication scheme. - public AuthenticateContext(HttpContext context, string authenticationScheme) : base(context, authenticationScheme, properties: null) - { } - } -} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs index 7a805f7af4..49d5f498af 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs @@ -22,9 +22,8 @@ namespace Microsoft.AspNetCore.Authentication /// /// Authentication behavior. /// - /// The context. /// The result. - Task AuthenticateAsync(AuthenticateContext context); + Task AuthenticateAsync(); /// /// Challenge behavior. diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index 9b8837f22e..9196e62cf6 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -65,8 +65,7 @@ namespace Microsoft.AspNetCore.Authentication throw new InvalidOperationException($"No authentication handler is configured to authenticate for the scheme: {scheme}"); } - var authContext = new AuthenticateContext(context, scheme); - var result = await handler.AuthenticateAsync(authContext); + var result = await handler.AuthenticateAsync(); if (result.Succeeded) { var transformed = await Transform.TransformAsync(result.Principal); From 4b4b3759096a7451605baf17db017a540c681430 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 14 Apr 2017 17:37:05 -0700 Subject: [PATCH 667/846] Add GetToken overload using default scheme --- .../TokenExtensions.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs index 24f66d9043..1af05aab0f 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs @@ -125,6 +125,16 @@ namespace Microsoft.AspNetCore.Authentication return tokens; } + /// + /// Extension method for getting the value of an authentication token. + /// + /// The . + /// The context. + /// The name of the token. + /// The value of the token. + public static Task GetTokenAsync(this IAuthenticationService auth, HttpContext context, string tokenName) + => auth.GetTokenAsync(context, scheme: null, tokenName: tokenName); + /// /// Extension method for getting the value of an authentication token. /// From d508c027baa42180efa06f532c676b2fcbc058bf Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 17 Apr 2017 16:41:22 -0700 Subject: [PATCH 668/846] Add GetToken overload to HttpContext as well --- .../AuthenticationHttpContextExtensions.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs index 8f159eb279..238251a60d 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs @@ -180,5 +180,14 @@ namespace Microsoft.AspNetCore.Authentication /// The value of the token. public static Task GetTokenAsync(this HttpContext context, string scheme, string tokenName) => context.RequestServices.GetRequiredService().GetTokenAsync(context, scheme, tokenName); + + /// + /// Extension method for getting the value of an authentication token. + /// + /// The context. + /// The name of the token. + /// The value of the token. + public static Task GetTokenAsync(this HttpContext context, string tokenName) => + context.RequestServices.GetRequiredService().GetTokenAsync(context, tokenName); } } From 4566cf9fdb322c6722dbe45b298f190e49541c42 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 20 Apr 2017 12:42:12 -0700 Subject: [PATCH 669/846] Add DisplayName to scheme --- .../AuthenticationScheme.cs | 9 ++++++++- .../AuthenticationSchemeBuilder.cs | 7 ++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs index 77bd9e6d35..7969877550 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs @@ -16,8 +16,9 @@ namespace Microsoft.AspNetCore.Authentication /// Constructor. /// /// The name for the authentication scheme. + /// The display name for the authentication scheme. /// The type that handles this scheme. - public AuthenticationScheme(string name, Type handlerType) + public AuthenticationScheme(string name, string displayName, Type handlerType) { if (name == null) { @@ -34,6 +35,7 @@ namespace Microsoft.AspNetCore.Authentication Name = name; HandlerType = handlerType; + DisplayName = displayName; } /// @@ -41,6 +43,11 @@ namespace Microsoft.AspNetCore.Authentication /// public string Name { get; } + /// + /// The display name for the scheme. Null is valid and used for non user facing schemes. + /// + public string DisplayName { get; } + /// /// The type that handles this scheme. /// diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs index e1ea0cbc4a..30e843c028 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs @@ -24,6 +24,11 @@ namespace Microsoft.AspNetCore.Authentication /// public string Name { get; } + /// + /// The display name for the scheme being built. + /// + public string DisplayName { get; set; } + /// /// The type responsible for this scheme. /// @@ -33,6 +38,6 @@ namespace Microsoft.AspNetCore.Authentication /// Builds the instance. /// /// - public AuthenticationScheme Build() => new AuthenticationScheme(Name, HandlerType); + public AuthenticationScheme Build() => new AuthenticationScheme(Name, DisplayName, HandlerType); } } From 5472763fc27d3a84dc44eeef36c9ae1bf9bbdec6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 22 Apr 2017 02:52:40 -0700 Subject: [PATCH 670/846] Added feature to control http body behavior (#821) * Added feature to control http body behavior - Added a flag to allow synchronous IO --- .../IHttpBodyControlFeature.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Features/IHttpBodyControlFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpBodyControlFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpBodyControlFeature.cs new file mode 100644 index 0000000000..3f61be9788 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpBodyControlFeature.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Http.Features +{ + /// + /// Controls the IO behavior for the and + /// + public interface IHttpBodyControlFeature + { + /// + /// Gets or sets a value that controls whether synchronous IO is allowed for the and + /// + bool AllowSynchronousIO { get; set; } + } +} From 3085f016e47bb3e0c90491e2c155a95b151fabda Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 24 Apr 2017 11:58:12 -0700 Subject: [PATCH 671/846] Fix GetToken() --- .../TokenExtensions.cs | 4 -- ...AspNetCore.Authentication.Core.Test.csproj | 1 + .../TokenExtensionTests.cs | 70 ++++++++++++++++++- 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs index 1af05aab0f..497acabc23 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs @@ -149,10 +149,6 @@ namespace Microsoft.AspNetCore.Authentication { throw new ArgumentNullException(nameof(auth)); } - if (scheme == null) - { - throw new ArgumentNullException(nameof(scheme)); - } if (tokenName == null) { throw new ArgumentNullException(nameof(tokenName)); diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index 925f5aa079..e176bcad4c 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -8,6 +8,7 @@ + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs index 3e3eb9c52b..d9e050fe82 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs @@ -1,8 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; using Xunit; namespace Microsoft.AspNetCore.Authentication @@ -117,7 +122,70 @@ namespace Microsoft.AspNetCore.Authentication Assert.Null(props.GetTokenValue("ONE")); Assert.Null(props.GetTokenValue("Jigglypuff")); Assert.Equal(3, props.GetTokens().Count()); - } + + [Fact] + public async Task GetTokenWorksWithDefaultAuthenticateScheme() + { + var context = new DefaultHttpContext(); + var services = new ServiceCollection().AddOptions() + .AddAuthenticationCore(o => o.AddScheme("simple", s => s.HandlerType = typeof(SimpleAuth))); + context.RequestServices = services.BuildServiceProvider(); + + Assert.Equal("1", await context.GetTokenAsync("One")); + Assert.Equal("2", await context.GetTokenAsync("Two")); + Assert.Equal("3", await context.GetTokenAsync("Three")); + } + + [Fact] + public async Task GetTokenWorksWithExplicitScheme() + { + var context = new DefaultHttpContext(); + var services = new ServiceCollection().AddOptions() + .AddAuthenticationCore(o => o.AddScheme("simple", s => s.HandlerType = typeof(SimpleAuth))); + context.RequestServices = services.BuildServiceProvider(); + + Assert.Equal("1", await context.GetTokenAsync("simple", "One")); + Assert.Equal("2", await context.GetTokenAsync("simple", "Two")); + Assert.Equal("3", await context.GetTokenAsync("simple", "Three")); + } + + private class SimpleAuth : IAuthenticationHandler + { + public Task AuthenticateAsync() + { + var props = new AuthenticationProperties(); + var tokens = new List(); + var tok1 = new AuthenticationToken { Name = "One", Value = "1" }; + var tok2 = new AuthenticationToken { Name = "Two", Value = "2" }; + var tok3 = new AuthenticationToken { Name = "Three", Value = "3" }; + tokens.Add(tok1); + tokens.Add(tok2); + tokens.Add(tok3); + props.StoreTokens(tokens); + return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(new ClaimsPrincipal(), props, "simple"))); + } + + public Task ChallengeAsync(ChallengeContext context) + { + return Task.FromResult(0); + } + + public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) + { + return Task.FromResult(0); + } + + public Task SignInAsync(SignInContext context) + { + return Task.FromResult(0); + } + + public Task SignOutAsync(SignOutContext context) + { + return Task.FromResult(0); + } + } + } } From 73e44417c528bec008b755874d7b9f1a629a28a0 Mon Sep 17 00:00:00 2001 From: Smit Patel Date: Mon, 24 Apr 2017 15:56:43 -0700 Subject: [PATCH 672/846] Update API Check related files React to aspnet/BuildTools#238 --- .../{baseline.net45.json => baseline.netframework.json} | 0 .../{baseline.net45.json => baseline.netframework.json} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNetCore.Http/{baseline.net45.json => baseline.netframework.json} (100%) rename src/Microsoft.AspNetCore.WebUtilities/{baseline.net45.json => baseline.netframework.json} (100%) diff --git a/src/Microsoft.AspNetCore.Http/baseline.net45.json b/src/Microsoft.AspNetCore.Http/baseline.netframework.json similarity index 100% rename from src/Microsoft.AspNetCore.Http/baseline.net45.json rename to src/Microsoft.AspNetCore.Http/baseline.netframework.json diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.net45.json b/src/Microsoft.AspNetCore.WebUtilities/baseline.netframework.json similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/baseline.net45.json rename to src/Microsoft.AspNetCore.WebUtilities/baseline.netframework.json From 8f0bb46484d47d40b4b49b1b2e80d30d7cd7305b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 25 Apr 2017 11:04:08 -0700 Subject: [PATCH 673/846] Use Bundled NETStandard.Library \ NETCoreApp versions instead of explicitly specifying one --- build/common.props | 2 +- build/dependencies.props | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/build/common.props b/build/common.props index af6d920c37..e8d514cc8b 100644 --- a/build/common.props +++ b/build/common.props @@ -17,7 +17,7 @@ - + diff --git a/build/dependencies.props b/build/dependencies.props index 1973fc186f..01387147a4 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,9 +3,7 @@ 2.0.0-* 4.3.0 2.0.0-* - 1.6.1 - 2.0.0-* 15.0.0 2.2.0 - \ No newline at end of file + From 94c009feb7882c0fb2a591283887ec73ee5ff56c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 25 Apr 2017 22:02:44 -0700 Subject: [PATCH 674/846] Branching for 2.0.0-preview1 --- NuGet.config | 4 ++-- build.ps1 | 2 +- build.sh | 2 +- build/dependencies.props | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/NuGet.config b/NuGet.config index 6f9f028ca1..2d69fec1ef 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + diff --git a/build.ps1 b/build.ps1 index 5bf0e2c113..225b1fe450 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0-preview1.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index b0bcadb579..702b25c636 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0-preview1.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi diff --git a/build/dependencies.props b/build/dependencies.props index 01387147a4..c7741b724b 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,6 +1,6 @@ - 2.0.0-* + 2.0.0-preview1-* 4.3.0 2.0.0-* 15.0.0 From 08132f809e70e6d9ff6a7c841a7715ded961c192 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 26 Apr 2017 07:12:59 -0700 Subject: [PATCH 675/846] Updating package version to preview2 --- version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.props b/version.props index 10a1c898f3..019fba2829 100644 --- a/version.props +++ b/version.props @@ -2,6 +2,6 @@ 2.0.0 - preview1 + preview2 \ No newline at end of file From e950934314747ffea7ac2941e71fdf8877391fd0 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 1 May 2017 12:39:28 -0700 Subject: [PATCH 676/846] Use the bundled NETStandard.Library package in netstandard targeting libraries --- build/dependencies.props | 1 + 1 file changed, 1 insertion(+) diff --git a/build/dependencies.props b/build/dependencies.props index c7741b724b..3db1eba0a2 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,6 +3,7 @@ 2.0.0-preview1-* 4.3.0 2.0.0-* + $(BundledNETStandardPackageVersion) 15.0.0 2.2.0 From f2f4813023863f6219f7a2f390526575c9526b35 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 5 May 2017 10:22:47 -0700 Subject: [PATCH 677/846] Update InternalAspNetCoreSdkVersion --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index 3db1eba0a2..f66ecf394c 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -2,7 +2,7 @@ 2.0.0-preview1-* 4.3.0 - 2.0.0-* + 2.1.0-* $(BundledNETStandardPackageVersion) 15.0.0 2.2.0 From 9168442704a50e1af2dd5e2f299b1baa4d9e1740 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 5 May 2017 14:59:10 -0700 Subject: [PATCH 678/846] Migration --- .gitignore | 1 + samples/SampleApp/SampleApp.csproj | 4 +- ...NetCore.Authentication.Abstractions.csproj | 2 +- ...soft.AspNetCore.Authentication.Core.csproj | 2 +- ...rosoft.AspNetCore.Http.Abstractions.csproj | 7 +- .../baseline.net45.json | 4028 -------------- ...icrosoft.AspNetCore.Http.Extensions.csproj | 2 +- .../baseline.net45.json | 1567 ------ .../Microsoft.AspNetCore.Http.Features.csproj | 7 +- .../baseline.net45.json | 2485 --------- .../exceptions.net45.json | 14 - .../Internal/ReferenceReadStream.cs | 61 - .../Microsoft.AspNetCore.Http.csproj | 2 +- .../baseline.netframework.json | 4691 ----------------- .../Microsoft.AspNetCore.Owin.csproj | 2 +- .../baseline.net45.json | 999 ---- .../BufferedReadStream.cs | 64 - .../FileBufferingReadStream.cs | 61 - .../HttpRequestStreamReader.cs | 10 - .../Microsoft.AspNetCore.WebUtilities.csproj | 2 +- .../MultipartReaderStream.cs | 60 - .../baseline.netframework.json | 1747 ------ .../Microsoft.Net.Http.Headers.csproj | 2 +- ...AspNetCore.Authentication.Core.Test.csproj | 3 +- ....AspNetCore.Http.Abstractions.Tests.csproj | 3 +- ...ft.AspNetCore.Http.Extensions.Tests.csproj | 3 +- ...soft.AspNetCore.Http.Features.Tests.csproj | 3 +- .../HttpContextFactoryTests.cs | 35 - .../Microsoft.AspNetCore.Http.Tests.csproj | 3 +- .../Microsoft.AspNetCore.Owin.Tests.csproj | 3 +- .../FileBufferingReadStreamTests.cs | 6 - .../HttpResponseStreamWriterTest.cs | 74 - ...osoft.AspNetCore.WebUtilities.Tests.csproj | 3 +- .../Microsoft.Net.Http.Headers.Tests.csproj | 3 +- 34 files changed, 20 insertions(+), 15939 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json delete mode 100644 src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json delete mode 100644 src/Microsoft.AspNetCore.Http.Features/baseline.net45.json delete mode 100644 src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json delete mode 100644 src/Microsoft.AspNetCore.Http/baseline.netframework.json delete mode 100644 src/Microsoft.AspNetCore.Owin/baseline.net45.json delete mode 100644 src/Microsoft.AspNetCore.WebUtilities/baseline.netframework.json diff --git a/.gitignore b/.gitignore index bcc811de9a..d5717b3f3f 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ project.lock.json .build/ .testPublish/ /.vs/ +.vscode/ global.json diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index 349d945d26..2014414f28 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -1,9 +1,9 @@  - + - netcoreapp2.0;net46 + netcoreapp2.0 Exe diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj index aa2fae7fc3..8f6e24afa4 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -2,7 +2,7 @@ ASP.NET Core common types used by the various authentication components. - netstandard1.3;net46 + netcoreapp2.0 $(NoWarn);CS1591 true aspnetcore;authentication;security diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj index 61628336f1..a6dae40ac5 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -4,7 +4,7 @@ ASP.NET Core common types used by the various authentication middleware components. - netstandard1.3;net46 + netcoreapp2.0 $(NoWarn);CS1591 true aspnetcore;authentication;security diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index ab10fcc573..6d710eef0e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -10,7 +10,7 @@ Microsoft.AspNetCore.Builder.IApplicationBuilder Microsoft.AspNetCore.Http.HttpContext Microsoft.AspNetCore.Http.HttpRequest Microsoft.AspNetCore.Http.HttpResponse - netstandard1.3 + netcoreapp2.0 true aspnetcore $(NoWarn);CS1591 @@ -26,9 +26,4 @@ Microsoft.AspNetCore.Http.HttpResponse - - - - - diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json deleted file mode 100644 index 4814d96431..0000000000 --- a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.net45.json +++ /dev/null @@ -1,4028 +0,0 @@ -{ - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", - "Types": [ - { - "Name": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_ApplicationServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ApplicationServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ServerFeatures", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Use", - "Parameters": [ - { - "Name": "middleware", - "Type": "System.Func" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "New", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Build", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.MapExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Map", - "Parameters": [ - { - "Name": "app", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - }, - { - "Name": "pathMatch", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "configuration", - "Type": "System.Action" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.MapWhenExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "MapWhen", - "Parameters": [ - { - "Name": "app", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - }, - { - "Name": "predicate", - "Type": "System.Func" - }, - { - "Name": "configuration", - "Type": "System.Action" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.RunExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Run", - "Parameters": [ - { - "Name": "app", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - }, - { - "Name": "handler", - "Type": "Microsoft.AspNetCore.Http.RequestDelegate" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.UseExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Use", - "Parameters": [ - { - "Name": "app", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - }, - { - "Name": "middleware", - "Type": "System.Func, System.Threading.Tasks.Task>" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.UseMiddlewareExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "UseMiddleware", - "Parameters": [ - { - "Name": "app", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - }, - { - "Name": "args", - "Type": "System.Object[]", - "IsParams": true - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "TMiddleware", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "UseMiddleware", - "Parameters": [ - { - "Name": "app", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - }, - { - "Name": "middleware", - "Type": "System.Type" - }, - { - "Name": "args", - "Type": "System.Object[]", - "IsParams": true - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.Extensions.MapMiddleware", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Invoke", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "next", - "Type": "Microsoft.AspNetCore.Http.RequestDelegate" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Builder.Extensions.MapOptions" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.Extensions.MapOptions", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_PathMatch", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_PathMatch", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Branch", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Branch", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.RequestDelegate" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Invoke", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "next", - "Type": "Microsoft.AspNetCore.Http.RequestDelegate" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Builder.Extensions.MapWhenOptions" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Builder.Extensions.MapWhenOptions", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Predicate", - "Parameters": [], - "ReturnType": "System.Func", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Predicate", - "Parameters": [ - { - "Name": "value", - "Type": "System.Func" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Branch", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Branch", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.RequestDelegate" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.ConnectionInfo", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_RemoteIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemoteIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemotePort", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemotePort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalPort", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalPort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ClientCertificate", - "Parameters": [], - "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ClientCertificate", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetClientCertificateAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Protected", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.CookieSecurePolicy", - "Visibility": "Public", - "Kind": "Enumeration", - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Field", - "Name": "SameAsRequest", - "Parameters": [], - "GenericParameter": [], - "Literal": "0" - }, - { - "Kind": "Field", - "Name": "Always", - "Parameters": [], - "GenericParameter": [], - "Literal": "1" - }, - { - "Kind": "Field", - "Name": "None", - "Parameters": [], - "GenericParameter": [], - "Literal": "2" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.FragmentString", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.IEquatable" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Value", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasValue", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToString", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToUriComponent", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uriComponent", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uri", - "Type": "System.Uri" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.FragmentString" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IEquatable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "obj", - "Type": "System.Object" - } - ], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHashCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Equality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.FragmentString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.FragmentString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Inequality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.FragmentString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.FragmentString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.FragmentString", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HostString", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.IEquatable" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Value", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasValue", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Host", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Port", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToString", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToUriComponent", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uriComponent", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.HostString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uri", - "Type": "System.Uri" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.HostString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.HostString" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IEquatable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "obj", - "Type": "System.Object" - } - ], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHashCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Equality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.HostString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.HostString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Inequality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.HostString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.HostString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "host", - "Type": "System.String" - }, - { - "Name": "port", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HttpContext", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Features", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Request", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Response", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Connection", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_WebSockets", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Authentication", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_User", - "Parameters": [], - "ReturnType": "System.Security.Claims.ClaimsPrincipal", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_User", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Claims.ClaimsPrincipal" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Items", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RequestServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RequestAborted", - "Parameters": [], - "ReturnType": "System.Threading.CancellationToken", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestAborted", - "Parameters": [ - { - "Name": "value", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_TraceIdentifier", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_TraceIdentifier", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Session", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.ISession", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Session", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.ISession" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Abort", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Protected", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HttpRequest", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Method", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Method", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Scheme", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Scheme", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsHttps", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IsHttps", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Host", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HostString", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Host", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.HostString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_PathBase", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_PathBase", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Path", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Path", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_QueryString", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_QueryString", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Query", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Query", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IQueryCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Protocol", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Protocol", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Cookies", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasFormContentType", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Form", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Form", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IFormCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Protected", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HttpResponse", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_StatusCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_StatusCode", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasStarted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnStarting", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnStarting", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnCompleted", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "RegisterForDispose", - "Parameters": [ - { - "Name": "disposable", - "Type": "System.IDisposable" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnCompleted", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Redirect", - "Parameters": [ - { - "Name": "location", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Redirect", - "Parameters": [ - { - "Name": "location", - "Type": "System.String" - }, - { - "Name": "permanent", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Protected", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IHttpContextAccessor", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_HttpContext", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IHttpContextFactory", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Create", - "Parameters": [ - { - "Name": "featureCollection", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [ - { - "Name": "httpContext", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.PathString", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.IEquatable" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Value", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasValue", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToString", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToUriComponent", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uriComponent", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uri", - "Type": "System.Uri" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "StartsWithSegments", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "StartsWithSegments", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "comparisonType", - "Type": "System.StringComparison" - } - ], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "StartsWithSegments", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "remaining", - "Type": "Microsoft.AspNetCore.Http.PathString", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "StartsWithSegments", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "comparisonType", - "Type": "System.StringComparison" - }, - { - "Name": "remaining", - "Type": "Microsoft.AspNetCore.Http.PathString", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IEquatable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "comparisonType", - "Type": "System.StringComparison" - } - ], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "obj", - "Type": "System.Object" - } - ], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHashCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Equality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Inequality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Addition", - "Parameters": [ - { - "Name": "left", - "Type": "System.String" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Addition", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "right", - "Type": "System.String" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Addition", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Addition", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.PathString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Implicit", - "Parameters": [ - { - "Name": "s", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Implicit", - "Parameters": [ - { - "Name": "path", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.QueryString", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.IEquatable" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Value", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasValue", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToString", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToUriComponent", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uriComponent", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FromUriComponent", - "Parameters": [ - { - "Name": "uri", - "Type": "System.Uri" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Create", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Create", - "Parameters": [ - { - "Name": "parameters", - "Type": "System.Collections.Generic.IEnumerable>" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Create", - "Parameters": [ - { - "Name": "parameters", - "Type": "System.Collections.Generic.IEnumerable>" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IEquatable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "obj", - "Type": "System.Object" - } - ], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHashCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Equality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.QueryString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Inequality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.QueryString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Addition", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.QueryString" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.RequestDelegate", - "Visibility": "Public", - "Kind": "Class", - "Sealed": true, - "BaseType": "System.MulticastDelegate", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Invoke", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "BeginInvoke", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - }, - { - "Name": "callback", - "Type": "System.AsyncCallback" - }, - { - "Name": "object", - "Type": "System.Object" - } - ], - "ReturnType": "System.IAsyncResult", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "EndInvoke", - "Parameters": [ - { - "Name": "result", - "Type": "System.IAsyncResult" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "object", - "Type": "System.Object" - }, - { - "Name": "method", - "Type": "System.IntPtr" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.StatusCodes", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Field", - "Name": "Status200OK", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "200" - }, - { - "Kind": "Field", - "Name": "Status201Created", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "201" - }, - { - "Kind": "Field", - "Name": "Status202Accepted", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "202" - }, - { - "Kind": "Field", - "Name": "Status203NonAuthoritative", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "203" - }, - { - "Kind": "Field", - "Name": "Status204NoContent", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "204" - }, - { - "Kind": "Field", - "Name": "Status205ResetContent", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "205" - }, - { - "Kind": "Field", - "Name": "Status206PartialContent", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "206" - }, - { - "Kind": "Field", - "Name": "Status300MultipleChoices", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "300" - }, - { - "Kind": "Field", - "Name": "Status301MovedPermanently", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "301" - }, - { - "Kind": "Field", - "Name": "Status302Found", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "302" - }, - { - "Kind": "Field", - "Name": "Status303SeeOther", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "303" - }, - { - "Kind": "Field", - "Name": "Status304NotModified", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "304" - }, - { - "Kind": "Field", - "Name": "Status305UseProxy", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "305" - }, - { - "Kind": "Field", - "Name": "Status306SwitchProxy", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "306" - }, - { - "Kind": "Field", - "Name": "Status307TemporaryRedirect", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "307" - }, - { - "Kind": "Field", - "Name": "Status400BadRequest", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "400" - }, - { - "Kind": "Field", - "Name": "Status401Unauthorized", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "401" - }, - { - "Kind": "Field", - "Name": "Status402PaymentRequired", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "402" - }, - { - "Kind": "Field", - "Name": "Status403Forbidden", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "403" - }, - { - "Kind": "Field", - "Name": "Status404NotFound", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "404" - }, - { - "Kind": "Field", - "Name": "Status405MethodNotAllowed", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "405" - }, - { - "Kind": "Field", - "Name": "Status406NotAcceptable", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "406" - }, - { - "Kind": "Field", - "Name": "Status407ProxyAuthenticationRequired", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "407" - }, - { - "Kind": "Field", - "Name": "Status408RequestTimeout", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "408" - }, - { - "Kind": "Field", - "Name": "Status409Conflict", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "409" - }, - { - "Kind": "Field", - "Name": "Status410Gone", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "410" - }, - { - "Kind": "Field", - "Name": "Status411LengthRequired", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "411" - }, - { - "Kind": "Field", - "Name": "Status412PreconditionFailed", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "412" - }, - { - "Kind": "Field", - "Name": "Status413RequestEntityTooLarge", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "413" - }, - { - "Kind": "Field", - "Name": "Status414RequestUriTooLong", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "414" - }, - { - "Kind": "Field", - "Name": "Status415UnsupportedMediaType", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "415" - }, - { - "Kind": "Field", - "Name": "Status416RequestedRangeNotSatisfiable", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "416" - }, - { - "Kind": "Field", - "Name": "Status417ExpectationFailed", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "417" - }, - { - "Kind": "Field", - "Name": "Status418ImATeapot", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "418" - }, - { - "Kind": "Field", - "Name": "Status419AuthenticationTimeout", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "419" - }, - { - "Kind": "Field", - "Name": "Status500InternalServerError", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "500" - }, - { - "Kind": "Field", - "Name": "Status501NotImplemented", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "501" - }, - { - "Kind": "Field", - "Name": "Status502BadGateway", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "502" - }, - { - "Kind": "Field", - "Name": "Status503ServiceUnavailable", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "503" - }, - { - "Kind": "Field", - "Name": "Status504GatewayTimeout", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "504" - }, - { - "Kind": "Field", - "Name": "Status505HttpVersionNotsupported", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "505" - }, - { - "Kind": "Field", - "Name": "Status506VariantAlsoNegotiates", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "506" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.WebSocketManager", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_IsWebSocketRequest", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_WebSocketRequestedProtocols", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AcceptWebSocketAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AcceptWebSocketAsync", - "Parameters": [ - { - "Name": "subProtocol", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Protected", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AppendCommaSeparatedValues", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.String[]", - "IsParams": true - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetCommaSeparatedValues", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.String[]", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetCommaSeparatedValues", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.String[]", - "IsParams": true - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HttpResponseWritingExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "text", - "Type": "System.String" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "text", - "Type": "System.String" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticateInfo", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Principal", - "Parameters": [], - "ReturnType": "System.Security.Claims.ClaimsPrincipal", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Principal", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Claims.ClaimsPrincipal" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Properties", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Description", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Description", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationDescription", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_AuthenticationScheme", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_AuthenticationScheme", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_DisplayName", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_DisplayName", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "items", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetAuthenticationSchemes", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerable", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetAuthenticateInfoAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AuthenticateAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AuthenticateAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [ - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignInAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "principal", - "Type": "System.Security.Claims.ClaimsPrincipal" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ForbidAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ForbidAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ForbidAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ForbidAsync", - "Parameters": [ - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - }, - { - "Name": "behavior", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignInAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "principal", - "Type": "System.Security.Claims.ClaimsPrincipal" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignOutAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignOutAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Abstract": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "AutomaticScheme", - "Parameters": [], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "\"Automatic\"" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsPersistent", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IsPersistent", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RedirectUri", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RedirectUri", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IssuedUtc", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IssuedUtc", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ExpiresUtc", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ExpiresUtc", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_AllowRefresh", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_AllowRefresh", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "items", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - } - ] -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index 9f9a858a8a..880297069c 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -4,7 +4,7 @@ ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. - netstandard1.3 + netcoreapp2.0 $(NoWarn);CS1591 true aspnetcore diff --git a/src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json b/src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json deleted file mode 100644 index 9b55f4ed4d..0000000000 --- a/src/Microsoft.AspNetCore.Http.Extensions/baseline.net45.json +++ /dev/null @@ -1,1567 +0,0 @@ -{ - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", - "Types": [ - { - "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryTypeExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "GetTypedHeaders", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.Headers.RequestHeaders", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetTypedHeaders", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.Headers.ResponseHeaders", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AppendList", - "Parameters": [ - { - "Name": "Headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.ResponseExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Clear", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.SendFileResponseExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "SendFileAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "file", - "Type": "Microsoft.Extensions.FileProviders.IFileInfo" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SendFileAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "file", - "Type": "Microsoft.Extensions.FileProviders.IFileInfo" - }, - { - "Name": "offset", - "Type": "System.Int64" - }, - { - "Name": "count", - "Type": "System.Nullable" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SendFileAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "fileName", - "Type": "System.String" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SendFileAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "fileName", - "Type": "System.String" - }, - { - "Name": "offset", - "Type": "System.Int64" - }, - { - "Name": "count", - "Type": "System.Nullable" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.SessionExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "SetInt32", - "Parameters": [ - { - "Name": "session", - "Type": "Microsoft.AspNetCore.Http.ISession" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetInt32", - "Parameters": [ - { - "Name": "session", - "Type": "Microsoft.AspNetCore.Http.ISession" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Nullable", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetString", - "Parameters": [ - { - "Name": "session", - "Type": "Microsoft.AspNetCore.Http.ISession" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetString", - "Parameters": [ - { - "Name": "session", - "Type": "Microsoft.AspNetCore.Http.ISession" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.String", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Get", - "Parameters": [ - { - "Name": "session", - "Type": "Microsoft.AspNetCore.Http.ISession" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Byte[]", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Headers.RequestHeaders", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Accept", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Accept", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_AcceptCharset", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_AcceptCharset", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_AcceptEncoding", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_AcceptEncoding", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_AcceptLanguage", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_AcceptLanguage", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_CacheControl", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_CacheControl", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.CacheControlHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentDisposition", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentDisposition", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentRange", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentRange", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Cookie", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Cookie", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Date", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Date", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Expires", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Expires", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Host", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HostString", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Host", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.HostString" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IfMatch", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IfMatch", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IfModifiedSince", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IfModifiedSince", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IfNoneMatch", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IfNoneMatch", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IfRange", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IfRange", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IfUnmodifiedSince", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IfUnmodifiedSince", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LastModified", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LastModified", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Range", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.RangeHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Range", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.RangeHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Get", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "T0", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "GetList", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Set", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetList", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AppendList", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Headers.ResponseHeaders", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_CacheControl", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_CacheControl", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.CacheControlHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentDisposition", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentDisposition", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentRange", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentRange", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Date", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Date", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ETag", - "Parameters": [], - "ReturnType": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ETag", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.Net.Http.Headers.EntityTagHeaderValue" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Expires", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Expires", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LastModified", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LastModified", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Location", - "Parameters": [], - "ReturnType": "System.Uri", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Location", - "Parameters": [ - { - "Name": "value", - "Type": "System.Uri" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_SetCookie", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_SetCookie", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Get", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "T0", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "GetList", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "System.Collections.Generic.IList", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Set", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetList", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AppendList", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Extensions.QueryBuilder", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerable>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.Collections.Generic.IEnumerable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToString", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ToQueryString", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHashCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "obj", - "Type": "System.Object" - } - ], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerator>", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerable>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "parameters", - "Type": "System.Collections.Generic.IEnumerable>" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Extensions.StreamCopyOperation", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "CopyToAsync", - "Parameters": [ - { - "Name": "source", - "Type": "System.IO.Stream" - }, - { - "Name": "destination", - "Type": "System.IO.Stream" - }, - { - "Name": "count", - "Type": "System.Nullable" - }, - { - "Name": "cancel", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Extensions.UriHelper", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "BuildRelative", - "Parameters": [ - { - "Name": "pathBase", - "Type": "Microsoft.AspNetCore.Http.PathString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" - }, - { - "Name": "path", - "Type": "Microsoft.AspNetCore.Http.PathString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" - }, - { - "Name": "query", - "Type": "Microsoft.AspNetCore.Http.QueryString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.QueryString)" - }, - { - "Name": "fragment", - "Type": "Microsoft.AspNetCore.Http.FragmentString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.FragmentString)" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "BuildAbsolute", - "Parameters": [ - { - "Name": "scheme", - "Type": "System.String" - }, - { - "Name": "host", - "Type": "Microsoft.AspNetCore.Http.HostString" - }, - { - "Name": "pathBase", - "Type": "Microsoft.AspNetCore.Http.PathString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" - }, - { - "Name": "path", - "Type": "Microsoft.AspNetCore.Http.PathString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.PathString)" - }, - { - "Name": "query", - "Type": "Microsoft.AspNetCore.Http.QueryString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.QueryString)" - }, - { - "Name": "fragment", - "Type": "Microsoft.AspNetCore.Http.FragmentString", - "DefaultValue": "default(Microsoft.AspNetCore.Http.FragmentString)" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Encode", - "Parameters": [ - { - "Name": "uri", - "Type": "System.Uri" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEncodedUrl", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - } - ], - "ReturnType": "System.String", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetDisplayUrl", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - } - ], - "ReturnType": "System.String", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - } - ] -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index e14b016d26..b31493d7f2 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -4,7 +4,7 @@ ASP.NET Core HTTP feature interface definitions. - netstandard1.3 + netcoreapp2.0 $(NoWarn);CS1591 true aspnetcore @@ -17,9 +17,4 @@ - - - - - diff --git a/src/Microsoft.AspNetCore.Http.Features/baseline.net45.json b/src/Microsoft.AspNetCore.Http.Features/baseline.net45.json deleted file mode 100644 index d209ce2ee1..0000000000 --- a/src/Microsoft.AspNetCore.Http.Features/baseline.net45.json +++ /dev/null @@ -1,2485 +0,0 @@ -{ - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", - "Types": [ - { - "Name": "Microsoft.AspNetCore.Http.CookieOptions", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Domain", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Domain", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Path", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Path", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Expires", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Expires", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Secure", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Secure", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HttpOnly", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_HttpOnly", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IFormCollection", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerable>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Files", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFileCollection", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentDisposition", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Length", - "Parameters": [], - "ReturnType": "System.Int64", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Name", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_FileName", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OpenReadStream", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyTo", - "Parameters": [ - { - "Name": "target", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyToAsync", - "Parameters": [ - { - "Name": "target", - "Type": "System.IO.Stream" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IReadOnlyList" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetFile", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetFiles", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "System.Collections.Generic.IReadOnlyList", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IDictionary" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerable>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerable>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.String", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.CookieOptions" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Delete", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Delete", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.CookieOptions" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.ISession", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_IsAvailable", - "Parameters": [], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Id", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerable", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "LoadAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CommitAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.Byte[]", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Set", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.Byte[]" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Remove", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Clear", - "Parameters": [], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.WebSocketAcceptContext", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_SubProtocol", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_SubProtocol", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.FeatureCollection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Revision", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsReadOnly", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - } - ], - "ReturnType": "System.Object", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerator>", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerable>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Get", - "Parameters": [], - "ReturnType": "T0", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Set", - "Parameters": [ - { - "Name": "instance", - "Type": "T0" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "defaults", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.FeatureReference", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Fetch", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "T0", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Update", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - }, - { - "Name": "feature", - "Type": "T0" - } - ], - "ReturnType": "T0", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Default", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.FeatureReference", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [ - { - "ParameterName": "T", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.FeatureReferences", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Collection", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Revision", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Fetch", - "Parameters": [ - { - "Name": "cached", - "Type": "T0", - "Direction": "Ref" - }, - { - "Name": "state", - "Type": "T1" - }, - { - "Name": "factory", - "Type": "System.Func" - } - ], - "ReturnType": "T0", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "Class": true, - "BaseTypeOrInterfaces": [] - }, - { - "ParameterName": "TState", - "ParameterPosition": 1, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Fetch", - "Parameters": [ - { - "Name": "cached", - "Type": "T0", - "Direction": "Ref" - }, - { - "Name": "factory", - "Type": "System.Func" - } - ], - "ReturnType": "T0", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "Class": true, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "collection", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Cache", - "Parameters": [], - "ReturnType": "T0", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [ - { - "ParameterName": "TCache", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerable>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_IsReadOnly", - "Parameters": [], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Revision", - "Parameters": [], - "ReturnType": "System.Int32", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - } - ], - "ReturnType": "System.Object", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Get", - "Parameters": [], - "ReturnType": "T0", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Set", - "Parameters": [ - { - "Name": "instance", - "Type": "T0" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IFormFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_HasFormContentType", - "Parameters": [], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Form", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Form", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IFormCollection" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadForm", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "DisableRequestBuffering", - "Parameters": [], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "DisableResponseBuffering", - "Parameters": [], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_ConnectionId", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ConnectionId", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemoteIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemoteIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemotePort", - "Parameters": [], - "ReturnType": "System.Int32", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemotePort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalPort", - "Parameters": [], - "ReturnType": "System.Int32", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalPort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Protocol", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Protocol", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Scheme", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Scheme", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Method", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Method", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_PathBase", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_PathBase", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Path", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Path", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_QueryString", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_QueryString", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RawTarget", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RawTarget", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Headers", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_TraceIdentifier", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_TraceIdentifier", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_RequestAborted", - "Parameters": [], - "ReturnType": "System.Threading.CancellationToken", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestAborted", - "Parameters": [ - { - "Name": "value", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Abort", - "Parameters": [], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_StatusCode", - "Parameters": [], - "ReturnType": "System.Int32", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_StatusCode", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ReasonPhrase", - "Parameters": [], - "ReturnType": "System.String", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ReasonPhrase", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Headers", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasStarted", - "Parameters": [], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnStarting", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnCompleted", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "SendFileAsync", - "Parameters": [ - { - "Name": "path", - "Type": "System.String" - }, - { - "Name": "offset", - "Type": "System.Int64" - }, - { - "Name": "count", - "Type": "System.Nullable" - }, - { - "Name": "cancellation", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpUpgradeFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_IsUpgradableRequest", - "Parameters": [], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UpgradeAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IHttpWebSocketFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_IsWebSocketRequest", - "Parameters": [], - "ReturnType": "System.Boolean", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AcceptAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.WebSocketAcceptContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IItemsFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Items", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IQueryFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Query", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Query", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IQueryCollection" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Cookies", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_RequestServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.ISessionFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Session", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.ISession", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Session", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.ISession" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_ClientCertificate", - "Parameters": [], - "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ClientCertificate", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetClientCertificateAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.ITlsTokenBindingFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "GetProvidedTokenBindingId", - "Parameters": [], - "ReturnType": "System.Byte[]", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetReferredTokenBindingId", - "Parameters": [], - "ReturnType": "System.Byte[]", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_AuthenticationScheme", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Accepted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Principal", - "Parameters": [], - "ReturnType": "System.Security.Claims.ClaimsPrincipal", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Description", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Error", - "Parameters": [], - "ReturnType": "System.Exception", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Authenticated", - "Parameters": [ - { - "Name": "principal", - "Type": "System.Security.Claims.ClaimsPrincipal" - }, - { - "Name": "properties", - "Type": "System.Collections.Generic.IDictionary" - }, - { - "Name": "description", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "NotAuthenticated", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Failed", - "Parameters": [ - { - "Name": "error", - "Type": "System.Exception" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior", - "Visibility": "Public", - "Kind": "Enumeration", - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Field", - "Name": "Automatic", - "Parameters": [], - "GenericParameter": [], - "Literal": "0" - }, - { - "Kind": "Field", - "Name": "Unauthorized", - "Parameters": [], - "GenericParameter": [], - "Literal": "1" - }, - { - "Kind": "Field", - "Name": "Forbidden", - "Parameters": [], - "GenericParameter": [], - "Literal": "2" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_AuthenticationScheme", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Behavior", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Accepted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Accept", - "Parameters": [], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "System.Collections.Generic.IDictionary" - }, - { - "Name": "behavior", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Results", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerable>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Accept", - "Parameters": [ - { - "Name": "description", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "GetDescriptions", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.DescribeSchemesContext" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AuthenticateAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignInAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.SignInContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignOutAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_User", - "Parameters": [], - "ReturnType": "System.Security.Claims.ClaimsPrincipal", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_User", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Claims.ClaimsPrincipal" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Handler", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Handler", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.SignInContext", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_AuthenticationScheme", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Principal", - "Parameters": [], - "ReturnType": "System.Security.Claims.ClaimsPrincipal", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Accepted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Accept", - "Parameters": [], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "principal", - "Type": "System.Security.Claims.ClaimsPrincipal" - }, - { - "Name": "properties", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.SignOutContext", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_AuthenticationScheme", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Accepted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Accept", - "Parameters": [], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - } - ] -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json b/src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json deleted file mode 100644 index e312fab8bd..0000000000 --- a/src/Microsoft.AspNetCore.Http.Features/exceptions.net45.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewMemberId": "System.Nullable get_ContentLength()", - "Kind": "Addition" - }, - { - "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewMemberId": "System.Void set_ContentLength(System.Nullable value)", - "Kind": "Addition" - } -] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs index fbc435f406..c36a59d010 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs @@ -115,68 +115,7 @@ namespace Microsoft.AspNetCore.Http.Internal _position += read; return read; } -#if NET46 - public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - ThrowIfDisposed(); - VerifyPosition(); - var tcs = new TaskCompletionSource(state); - BeginRead(buffer, offset, count, callback, tcs); - return tcs.Task; - } - private async void BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, TaskCompletionSource tcs) - { - try - { - var read = await ReadAsync(buffer, offset, count); - tcs.TrySetResult(read); - } - catch (Exception ex) - { - tcs.TrySetException(ex); - } - - if (callback != null) - { - // Offload callbacks to avoid stack dives on sync completions. - var ignored = Task.Run(() => - { - try - { - callback(tcs.Task); - } - catch (Exception) - { - // Suppress exceptions on background threads. - } - }); - } - } - - public override int EndRead(IAsyncResult asyncResult) - { - if (asyncResult == null) - { - throw new ArgumentNullException(nameof(asyncResult)); - } - - var task = (Task)asyncResult; - return task.GetAwaiter().GetResult(); - } - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException(); - } - - public override void EndWrite(IAsyncResult asyncResult) - { - throw new NotSupportedException(); - } -#elif NETSTANDARD1_3 -#else -#error Target frameworks need to be updated. -#endif public override void Write(byte[] buffer, int offset, int count) { throw new NotSupportedException(); diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index 1623b6fcce..a1a646e5fa 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -4,7 +4,7 @@ ASP.NET Core default HTTP feature implementations. - netstandard1.3;net46 + netcoreapp2.0 $(NoWarn);CS1591 true true diff --git a/src/Microsoft.AspNetCore.Http/baseline.netframework.json b/src/Microsoft.AspNetCore.Http/baseline.netframework.json deleted file mode 100644 index a7bc95d6cb..0000000000 --- a/src/Microsoft.AspNetCore.Http/baseline.netframework.json +++ /dev/null @@ -1,4691 +0,0 @@ -{ - "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", - "Types": [ - { - "Name": "Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Builder.IApplicationBuilder" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_ApplicationServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ApplicationServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ServerFeatures", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Use", - "Parameters": [ - { - "Name": "middleware", - "Type": "System.Func" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "New", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Build", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "serviceProvider", - "Type": "System.IServiceProvider" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "serviceProvider", - "Type": "System.IServiceProvider" - }, - { - "Name": "server", - "Type": "System.Object" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.DefaultHttpContext", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.HttpContext", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Features", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Request", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Response", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Connection", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Authentication", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_WebSockets", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_User", - "Parameters": [], - "ReturnType": "System.Security.Claims.ClaimsPrincipal", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_User", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Claims.ClaimsPrincipal" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Items", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RequestServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RequestAborted", - "Parameters": [], - "ReturnType": "System.Threading.CancellationToken", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestAborted", - "Parameters": [ - { - "Name": "value", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_TraceIdentifier", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_TraceIdentifier", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Session", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.ISession", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Session", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.ISession" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Abort", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "InitializeHttpRequest", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UninitializeHttpRequest", - "Parameters": [ - { - "Name": "instance", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "InitializeHttpResponse", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpResponse", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UninitializeHttpResponse", - "Parameters": [ - { - "Name": "instance", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "InitializeConnectionInfo", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.ConnectionInfo", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UninitializeConnectionInfo", - "Parameters": [ - { - "Name": "instance", - "Type": "Microsoft.AspNetCore.Http.ConnectionInfo" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "InitializeAuthenticationManager", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UninitializeAuthenticationManager", - "Parameters": [ - { - "Name": "instance", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "InitializeWebSocketManager", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.WebSocketManager", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UninitializeWebSocketManager", - "Parameters": [ - { - "Name": "instance", - "Type": "Microsoft.AspNetCore.Http.WebSocketManager" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.FormCollection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IFormCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Files", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "fields", - "Type": "System.Collections.Generic.Dictionary" - }, - { - "Name": "files", - "Type": "Microsoft.AspNetCore.Http.IFormFileCollection", - "DefaultValue": "null" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.FormCollection", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HeaderDictionary", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IHeaderDictionary" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsReadOnly", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Values", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "item", - "Type": "System.Collections.Generic.KeyValuePair" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Clear", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Contains", - "Parameters": [ - { - "Name": "item", - "Type": "System.Collections.Generic.KeyValuePair" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyTo", - "Parameters": [ - { - "Name": "array", - "Type": "System.Collections.Generic.KeyValuePair[]" - }, - { - "Name": "arrayIndex", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Remove", - "Parameters": [ - { - "Name": "item", - "Type": "System.Collections.Generic.KeyValuePair" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Remove", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HeaderDictionary+Enumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "store", - "Type": "System.Collections.Generic.Dictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "capacity", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HttpContextAccessor", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IHttpContextAccessor" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextAccessor", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_HttpContext", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextAccessor", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HttpContextFactory", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IHttpContextFactory" - ], - "Members": [ - { - "Kind": "Method", - "Name": "Create", - "Parameters": [ - { - "Name": "featureCollection", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextFactory", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [ - { - "Name": "httpContext", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IHttpContextFactory", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "poolProvider", - "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" - }, - { - "Name": "formOptions", - "Type": "Microsoft.Extensions.Options.IOptions" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "poolProvider", - "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" - }, - { - "Name": "formOptions", - "Type": "Microsoft.Extensions.Options.IOptions" - }, - { - "Name": "httpContextAccessor", - "Type": "Microsoft.AspNetCore.Http.IHttpContextAccessor" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.RequestFormReaderExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.Features.FormOptions" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.BufferingHelper", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_TempDirectory", - "Parameters": [], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "EnableRewind", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - }, - { - "Name": "bufferThreshold", - "Type": "System.Int32", - "DefaultValue": "30720" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable", - "DefaultValue": "default(System.Nullable)" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "EnableRewind", - "Parameters": [ - { - "Name": "section", - "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" - }, - { - "Name": "registerForDispose", - "Type": "System.Action" - }, - { - "Name": "bufferThreshold", - "Type": "System.Int32", - "DefaultValue": "30720" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable", - "DefaultValue": "default(System.Nullable)" - } - ], - "ReturnType": "Microsoft.AspNetCore.WebUtilities.MultipartSection", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultConnectionInfo", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.ConnectionInfo", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemoteIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemoteIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemotePort", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemotePort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalPort", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalPort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ClientCertificate", - "Parameters": [], - "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ClientCertificate", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetClientCertificateAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.HttpRequest", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_PathBase", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_PathBase", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Path", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Path", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_QueryString", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_QueryString", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Method", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Method", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Scheme", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Scheme", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsHttps", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IsHttps", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Host", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HostString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Host", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.HostString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Query", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Query", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IQueryCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Protocol", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Protocol", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Cookies", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasFormContentType", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Form", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Form", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IFormCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.HttpResponse", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_StatusCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_StatusCode", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasStarted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnStarting", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnCompleted", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Redirect", - "Parameters": [ - { - "Name": "location", - "Type": "System.String" - }, - { - "Name": "permanent", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultWebSocketManager", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.WebSocketManager", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsWebSocketRequest", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_WebSocketRequestedProtocols", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AcceptWebSocketAsync", - "Parameters": [ - { - "Name": "subProtocol", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.FormFile", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IFormFile" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_ContentDisposition", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentDisposition", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Headers", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Length", - "Parameters": [], - "ReturnType": "System.Int64", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Name", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_FileName", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OpenReadStream", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyTo", - "Parameters": [ - { - "Name": "target", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyToAsync", - "Parameters": [ - { - "Name": "target", - "Type": "System.IO.Stream" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "baseStream", - "Type": "System.IO.Stream" - }, - { - "Name": "baseStreamOffset", - "Type": "System.Int64" - }, - { - "Name": "length", - "Type": "System.Int64" - }, - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "fileName", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.FormFileCollection", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "System.Collections.Generic.List", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IFormFileCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetFile", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetFiles", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "System.Collections.Generic.IReadOnlyList", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.ItemsDictionary", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "System.Collections.Generic.IDictionary" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "items", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IQueryCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "store", - "Type": "System.Collections.Generic.Dictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "store", - "Type": "Microsoft.AspNetCore.Http.Internal.QueryCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "capacity", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IRequestCookieCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Parse", - "Parameters": [ - { - "Name": "values", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "store", - "Type": "System.Collections.Generic.Dictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "capacity", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.ResponseCookies", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IResponseCookies" - ], - "Members": [ - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.CookieOptions" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Delete", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Delete", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.CookieOptions" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "builderPool", - "Type": "Microsoft.Extensions.ObjectPool.ObjectPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.DefaultSessionFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.ISessionFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Session", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.ISession", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ISessionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Session", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.ISession" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ISessionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.FormFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IFormFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_HasFormContentType", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Form", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Form", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IFormCollection" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadForm", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFormFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "form", - "Type": "Microsoft.AspNetCore.Http.IFormCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.Features.FormOptions" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.FormOptions", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_BufferBody", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_BufferBody", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_MemoryBufferThreshold", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_MemoryBufferThreshold", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_BufferBodyLengthLimit", - "Parameters": [], - "ReturnType": "System.Int64", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_BufferBodyLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int64" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ValueCountLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ValueCountLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_KeyLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_KeyLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ValueLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ValueLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_MultipartBoundaryLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_MultipartBoundaryLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_MultipartHeadersCountLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_MultipartHeadersCountLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_MultipartHeadersLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_MultipartHeadersLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_MultipartBodyLengthLimit", - "Parameters": [], - "ReturnType": "System.Int64", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_MultipartBodyLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int64" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "DefaultMemoryBufferThreshold", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "65536" - }, - { - "Kind": "Field", - "Name": "DefaultBufferBodyLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "134217728" - }, - { - "Kind": "Field", - "Name": "DefaultMultipartBoundaryLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "128" - }, - { - "Kind": "Field", - "Name": "DefaultMultipartBodyLengthLimit", - "Parameters": [], - "ReturnType": "System.Int64", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "134217728" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.HttpConnectionFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_ConnectionId", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ConnectionId", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalPort", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalPort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemoteIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemoteIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemotePort", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemotePort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Protocol", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Protocol", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Scheme", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Scheme", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Method", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Method", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_PathBase", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_PathBase", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Path", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Path", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_QueryString", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_QueryString", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RawTarget", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RawTarget", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Headers", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestIdentifierFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_TraceIdentifier", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_TraceIdentifier", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.HttpRequestLifetimeFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_RequestAborted", - "Parameters": [], - "ReturnType": "System.Threading.CancellationToken", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestAborted", - "Parameters": [ - { - "Name": "value", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Abort", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.HttpResponseFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_StatusCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_StatusCode", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ReasonPhrase", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ReasonPhrase", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Headers", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasStarted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnStarting", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnCompleted", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.ItemsFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IItemsFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IItemsFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Items", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IItemsFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.QueryFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IQueryFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Query", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IQueryFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Query", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IQueryCollection" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IQueryFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "query", - "Type": "Microsoft.AspNetCore.Http.IQueryCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.RequestCookiesFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Cookies", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IRequestCookiesFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "cookies", - "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.ResponseCookiesFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IResponseCookiesFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - }, - { - "Name": "builderPool", - "Type": "Microsoft.Extensions.ObjectPool.ObjectPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.ServiceProvidersFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_RequestServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RequestServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IServiceProvidersFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.TlsConnectionFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_ClientCertificate", - "Parameters": [], - "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ClientCertificate", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetClientCertificateAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Features.Authentication.HttpAuthenticationFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_User", - "Parameters": [], - "ReturnType": "System.Security.Claims.ClaimsPrincipal", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_User", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Claims.ClaimsPrincipal" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Handler", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Handler", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.IAuthenticationHandler" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetAuthenticationSchemes", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerable", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AuthenticateAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetAuthenticateInfoAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - }, - { - "Name": "behavior", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignInAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "principal", - "Type": "System.Security.Claims.ClaimsPrincipal" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignOutAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerator>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "MoveNext", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Current", - "Parameters": [], - "ReturnType": "System.Collections.Generic.KeyValuePair", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerator>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HeaderDictionary+Enumerator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerator>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "MoveNext", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Current", - "Parameters": [], - "ReturnType": "System.Collections.Generic.KeyValuePair", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerator>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerator>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "MoveNext", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Current", - "Parameters": [], - "ReturnType": "System.Collections.Generic.KeyValuePair", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerator>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerator>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "MoveNext", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Current", - "Parameters": [], - "ReturnType": "System.Collections.Generic.KeyValuePair", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerator>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Reset", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - } - ] -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj index 356eafe318..ace8ebff29 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj @@ -4,7 +4,7 @@ ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application. - netstandard1.3 + netcoreapp2.0 $(NoWarn);CS1591 true aspnetcore;owin diff --git a/src/Microsoft.AspNetCore.Owin/baseline.net45.json b/src/Microsoft.AspNetCore.Owin/baseline.net45.json deleted file mode 100644 index ec8635bdd3..0000000000 --- a/src/Microsoft.AspNetCore.Owin/baseline.net45.json +++ /dev/null @@ -1,999 +0,0 @@ -{ - "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", - "Types": [ - { - "Name": "Microsoft.AspNetCore.Builder.OwinExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "UseOwin", - "Parameters": [ - { - "Name": "builder", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - } - ], - "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UseOwin", - "Parameters": [ - { - "Name": "builder", - "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" - }, - { - "Name": "pipeline", - "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>>" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UseBuilder", - "Parameters": [ - { - "Name": "app", - "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UseBuilder", - "Parameters": [ - { - "Name": "app", - "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" - }, - { - "Name": "serviceProvider", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UseBuilder", - "Parameters": [ - { - "Name": "app", - "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" - }, - { - "Name": "pipeline", - "Type": "System.Action" - } - ], - "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "UseBuilder", - "Parameters": [ - { - "Name": "app", - "Type": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>" - }, - { - "Name": "pipeline", - "Type": "System.Action" - }, - { - "Name": "serviceProvider", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Action, System.Threading.Tasks.Task>, System.Func, System.Threading.Tasks.Task>>>", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Environment", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Environment", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "System.Collections.Generic.IDictionary" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_FeatureMaps", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinEnvironmentFeature", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Environment", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Environment", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinFeatureCollection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", - "Microsoft.AspNetCore.Http.Features.IHttpResponseFeature", - "Microsoft.AspNetCore.Http.Features.IHttpConnectionFeature", - "Microsoft.AspNetCore.Http.Features.IHttpSendFileFeature", - "Microsoft.AspNetCore.Http.Features.ITlsConnectionFeature", - "Microsoft.AspNetCore.Http.Features.IHttpRequestIdentifierFeature", - "Microsoft.AspNetCore.Http.Features.IHttpRequestLifetimeFeature", - "Microsoft.AspNetCore.Http.Features.Authentication.IHttpAuthenticationFeature", - "Microsoft.AspNetCore.Http.Features.IHttpWebSocketFeature", - "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Environment", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Environment", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_SupportsWebSockets", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_SupportsWebSockets", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Revision", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsReadOnly", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - } - ], - "ReturnType": "System.Object", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Get", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - } - ], - "ReturnType": "System.Object", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Set", - "Parameters": [ - { - "Name": "key", - "Type": "System.Type" - }, - { - "Name": "value", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Get", - "Parameters": [], - "ReturnType": "T0", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "Set", - "Parameters": [ - { - "Name": "instance", - "Type": "T0" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Visibility": "Public", - "GenericParameter": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerator>", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerable>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "environment", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAcceptAdapter", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "AdaptWebSockets", - "Parameters": [ - { - "Name": "next", - "Type": "System.Func, System.Threading.Tasks.Task>" - } - ], - "ReturnType": "System.Func, System.Threading.Tasks.Task>", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAcceptContext", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.WebSocketAcceptContext", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_SubProtocol", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_SubProtocol", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Options", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "options", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinWebSocketAdapter", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "System.Net.WebSockets.WebSocket", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_CloseStatus", - "Parameters": [], - "ReturnType": "System.Nullable", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_CloseStatusDescription", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_SubProtocol", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_State", - "Parameters": [], - "ReturnType": "System.Net.WebSockets.WebSocketState", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReceiveAsync", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.ArraySegment" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SendAsync", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.ArraySegment" - }, - { - "Name": "messageType", - "Type": "System.Net.WebSockets.WebSocketMessageType" - }, - { - "Name": "endOfMessage", - "Type": "System.Boolean" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CloseAsync", - "Parameters": [ - { - "Name": "closeStatus", - "Type": "System.Net.WebSockets.WebSocketCloseStatus" - }, - { - "Name": "statusDescription", - "Type": "System.String" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CloseOutputAsync", - "Parameters": [ - { - "Name": "closeStatus", - "Type": "System.Net.WebSockets.WebSocketCloseStatus" - }, - { - "Name": "statusDescription", - "Type": "System.String" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Abort", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "websocketContext", - "Type": "System.Collections.Generic.IDictionary" - }, - { - "Name": "subProtocol", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.WebSocketAcceptAdapter", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "AdaptWebSockets", - "Parameters": [ - { - "Name": "next", - "Type": "System.Func, System.Threading.Tasks.Task>" - } - ], - "ReturnType": "System.Func, System.Threading.Tasks.Task>", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "env", - "Type": "System.Collections.Generic.IDictionary" - }, - { - "Name": "accept", - "Type": "System.Func>" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.WebSocketAdapter", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_CanSet", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "featureInterface", - "Type": "System.Type" - }, - { - "Name": "getter", - "Type": "System.Func" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "featureInterface", - "Type": "System.Type" - }, - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "defaultFactory", - "Type": "System.Func" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "featureInterface", - "Type": "System.Type" - }, - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "setter", - "Type": "System.Action" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "featureInterface", - "Type": "System.Type" - }, - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "defaultFactory", - "Type": "System.Func" - }, - { - "Name": "setter", - "Type": "System.Action" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "featureInterface", - "Type": "System.Type" - }, - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "defaultFactory", - "Type": "System.Func" - }, - { - "Name": "setter", - "Type": "System.Action" - }, - { - "Name": "featureFactory", - "Type": "System.Func" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Owin.OwinEnvironment+FeatureMap", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "getter", - "Type": "System.Func" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "defaultFactory", - "Type": "System.Func" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "setter", - "Type": "System.Action" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "defaultFactory", - "Type": "System.Func" - }, - { - "Name": "setter", - "Type": "System.Action" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "getter", - "Type": "System.Func" - }, - { - "Name": "defaultFactory", - "Type": "System.Func" - }, - { - "Name": "setter", - "Type": "System.Action" - }, - { - "Name": "featureFactory", - "Type": "System.Func" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [ - { - "ParameterName": "TFeature", - "ParameterPosition": 0, - "BaseTypeOrInterfaces": [] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs index 5d581164dc..a6c4106d80 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs @@ -201,71 +201,7 @@ namespace Microsoft.AspNetCore.WebUtilities return await _inner.ReadAsync(buffer, offset, count, cancellationToken); } -#if NET46 - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - return _inner.BeginWrite(buffer, offset, count, callback, state); - } - public override void EndWrite(IAsyncResult asyncResult) - { - _inner.EndWrite(asyncResult); - } - - // We only anticipate using ReadAsync - public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - ValidateBuffer(buffer, offset, count); - - // Drain buffer - if (_bufferCount > 0) - { - int toCopy = Math.Min(_bufferCount, count); - Buffer.BlockCopy(_buffer, _bufferOffset, buffer, offset, toCopy); - _bufferOffset += toCopy; - _bufferCount -= toCopy; - - TaskCompletionSource tcs = new TaskCompletionSource(state); - tcs.TrySetResult(toCopy); - if (callback != null) - { - // Offload callbacks to avoid stack dives on sync completions. - var ignored = Task.Run(() => - { - try - { - callback(tcs.Task); - } - catch (Exception) - { - // Suppress exceptions on background threads. - } - }); - } - return tcs.Task; - } - - return _inner.BeginRead(buffer, offset, count, callback, state); - } - - public override int EndRead(IAsyncResult asyncResult) - { - if (asyncResult == null) - { - throw new ArgumentNullException(nameof(asyncResult)); - } - - Task task = asyncResult as Task; - if (task != null) - { - return task.GetAwaiter().GetResult(); - } - return _inner.EndRead(asyncResult); - } -#elif NETSTANDARD1_3 -#else -#error Target frameworks need to be updated. -#endif public bool EnsureBuffered() { if (_bufferCount > 0) diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs index db72b3af84..9dd1fbf13f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs @@ -250,68 +250,7 @@ namespace Microsoft.AspNetCore.WebUtilities return read; } -#if NET46 - public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - ThrowIfDisposed(); - var tcs = new TaskCompletionSource(state); - BeginRead(buffer, offset, count, callback, tcs); - return tcs.Task; - } - private async void BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, TaskCompletionSource tcs) - { - try - { - var read = await ReadAsync(buffer, offset, count); - tcs.TrySetResult(read); - } - catch (Exception ex) - { - tcs.TrySetException(ex); - } - - if (callback != null) - { - // Offload callbacks to avoid stack dives on sync completions. - var ignored = Task.Run(() => - { - try - { - callback(tcs.Task); - } - catch (Exception) - { - // Suppress exceptions on background threads. - } - }); - } - } - - public override int EndRead(IAsyncResult asyncResult) - { - if (asyncResult == null) - { - throw new ArgumentNullException(nameof(asyncResult)); - } - - var task = (Task)asyncResult; - return task.GetAwaiter().GetResult(); - } - - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) - { - throw new NotSupportedException(); - } - - public override void EndWrite(IAsyncResult asyncResult) - { - throw new NotSupportedException(); - } -#elif NETSTANDARD1_3 -#else -#error Target frameworks need to be updated. -#endif public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { ThrowIfDisposed(); diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs index 08331555c4..24ee35936c 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs @@ -108,16 +108,6 @@ namespace Microsoft.AspNetCore.WebUtilities } } -#if NET46 - public override void Close() - { - Dispose(true); - } -#elif NETSTANDARD1_3 -#else -#error Target frameworks need to be updated. -#endif - protected override void Dispose(bool disposing) { if (disposing && _stream != null) diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index d4b6bc397e..1667d601f3 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -4,7 +4,7 @@ ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings. - netstandard1.3;net46 + netcoreapp2.0 $(DefineConstants);WebEncoders_In_WebUtilities $(NoWarn);CS1591 true diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index c2a266db0d..7952bd34b2 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -158,67 +158,7 @@ namespace Microsoft.AspNetCore.WebUtilities } return read; } -#if NET46 - public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) - { - throw new NotSupportedException(); - } - public override void EndWrite(IAsyncResult asyncResult) - { - throw new NotSupportedException(); - } - - public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) - { - var tcs = new TaskCompletionSource(state); - InternalReadAsync(buffer, offset, size, callback, tcs); - return tcs.Task; - } - - private async void InternalReadAsync(byte[] buffer, int offset, int size, AsyncCallback callback, TaskCompletionSource tcs) - { - try - { - int read = await ReadAsync(buffer, offset, size); - tcs.TrySetResult(read); - } - catch (Exception ex) - { - tcs.TrySetException(ex); - } - - if (callback != null) - { - // Offload callbacks to avoid stack dives on sync completions. - var ignored = Task.Run(() => - { - try - { - callback(tcs.Task); - } - catch (Exception) - { - // Suppress exceptions on background threads. - } - }); - } - } - - public override int EndRead(IAsyncResult asyncResult) - { - if (asyncResult == null) - { - throw new ArgumentNullException(nameof(asyncResult)); - } - - var task = (Task)asyncResult; - return task.GetAwaiter().GetResult(); - } -#elif NETSTANDARD1_3 -#else -#error Target frameworks need to be updated. -#endif public override int Read(byte[] buffer, int offset, int count) { if (_finished) diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.netframework.json b/src/Microsoft.AspNetCore.WebUtilities/baseline.netframework.json deleted file mode 100644 index fd99a279f6..0000000000 --- a/src/Microsoft.AspNetCore.WebUtilities/baseline.netframework.json +++ /dev/null @@ -1,1747 +0,0 @@ -{ - "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", - "Types": [ - { - "Name": "Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "System.IO.Stream", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_InMemory", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_TempFileName", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_CanRead", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_CanSeek", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_CanWrite", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Length", - "Parameters": [], - "ReturnType": "System.Int64", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Position", - "Parameters": [], - "ReturnType": "System.Int64", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Position", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int64" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Seek", - "Parameters": [ - { - "Name": "offset", - "Type": "System.Int64" - }, - { - "Name": "origin", - "Type": "System.IO.SeekOrigin" - } - ], - "ReturnType": "System.Int64", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Read", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "BeginRead", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - }, - { - "Name": "callback", - "Type": "System.AsyncCallback" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.IAsyncResult", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "EndRead", - "Parameters": [ - { - "Name": "asyncResult", - "Type": "System.IAsyncResult" - } - ], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadAsync", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Write", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "BeginWrite", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - }, - { - "Name": "callback", - "Type": "System.AsyncCallback" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.IAsyncResult", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "EndWrite", - "Parameters": [ - { - "Name": "asyncResult", - "Type": "System.IAsyncResult" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int64" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Flush", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [ - { - "Name": "disposing", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "inner", - "Type": "System.IO.Stream" - }, - { - "Name": "memoryThreshold", - "Type": "System.Int32" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable" - }, - { - "Name": "tempFileDirectoryAccessor", - "Type": "System.Func" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "inner", - "Type": "System.IO.Stream" - }, - { - "Name": "memoryThreshold", - "Type": "System.Int32" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable" - }, - { - "Name": "tempFileDirectoryAccessor", - "Type": "System.Func" - }, - { - "Name": "bytePool", - "Type": "System.Buffers.ArrayPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "inner", - "Type": "System.IO.Stream" - }, - { - "Name": "memoryThreshold", - "Type": "System.Int32" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable" - }, - { - "Name": "tempFileDirectory", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "inner", - "Type": "System.IO.Stream" - }, - { - "Name": "memoryThreshold", - "Type": "System.Int32" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable" - }, - { - "Name": "tempFileDirectory", - "Type": "System.String" - }, - { - "Name": "bytePool", - "Type": "System.Buffers.ArrayPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.FormReader", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "System.IDisposable" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_ValueCountLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ValueCountLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_KeyLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_KeyLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ValueLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ValueLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadNextPair", - "Parameters": [], - "ReturnType": "System.Nullable>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadNextPairAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task>>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadForm", - "Parameters": [], - "ReturnType": "System.Collections.Generic.Dictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "data", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "data", - "Type": "System.String" - }, - { - "Name": "charPool", - "Type": "System.Buffers.ArrayPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - }, - { - "Name": "charPool", - "Type": "System.Buffers.ArrayPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "DefaultValueCountLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "1024" - }, - { - "Kind": "Field", - "Name": "DefaultKeyLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "2048" - }, - { - "Kind": "Field", - "Name": "DefaultValueLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "4194304" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.HttpRequestStreamReader", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "System.IO.TextReader", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Close", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [ - { - "Name": "disposing", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Peek", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Read", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Read", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Char[]" - }, - { - "Name": "index", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadAsync", - "Parameters": [ - { - "Name": "buffer", - "Type": "System.Char[]" - }, - { - "Name": "index", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - }, - { - "Name": "bufferSize", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - }, - { - "Name": "bufferSize", - "Type": "System.Int32" - }, - { - "Name": "bytePool", - "Type": "System.Buffers.ArrayPool" - }, - { - "Name": "charPool", - "Type": "System.Buffers.ArrayPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "System.IO.TextWriter", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_Encoding", - "Parameters": [], - "ReturnType": "System.Text.Encoding", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Write", - "Parameters": [ - { - "Name": "value", - "Type": "System.Char" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Write", - "Parameters": [ - { - "Name": "values", - "Type": "System.Char[]" - }, - { - "Name": "index", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Write", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "value", - "Type": "System.Char" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "values", - "Type": "System.Char[]" - }, - { - "Name": "index", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Flush", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "FlushAsync", - "Parameters": [], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [ - { - "Name": "disposing", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Protected", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - }, - { - "Name": "bufferSize", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - }, - { - "Name": "bufferSize", - "Type": "System.Int32" - }, - { - "Name": "bytePool", - "Type": "System.Buffers.ArrayPool" - }, - { - "Name": "charPool", - "Type": "System.Buffers.ArrayPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "DefaultBufferSize", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "1024" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.KeyValueAccumulator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasValues", - "Parameters": [], - "ReturnType": "System.Boolean", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_KeyCount", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ValueCount", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetResults", - "Parameters": [], - "ReturnType": "System.Collections.Generic.Dictionary", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.MultipartReader", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_HeadersCountLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_HeadersCountLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HeadersLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_HeadersLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_BodyLengthLimit", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_BodyLengthLimit", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadNextSectionAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "boundary", - "Type": "System.String" - }, - { - "Name": "stream", - "Type": "System.IO.Stream" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "boundary", - "Type": "System.String" - }, - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "bufferSize", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "DefaultHeadersCountLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "16" - }, - { - "Kind": "Field", - "Name": "DefaultHeadersLengthLimit", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "16384" - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.MultipartSection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentDisposition", - "Parameters": [], - "ReturnType": "System.String", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "System.Collections.Generic.Dictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Headers", - "Parameters": [ - { - "Name": "value", - "Type": "System.Collections.Generic.Dictionary" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_BaseStreamOffset", - "Parameters": [], - "ReturnType": "System.Nullable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_BaseStreamOffset", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.QueryHelpers", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "AddQueryString", - "Parameters": [ - { - "Name": "uri", - "Type": "System.String" - }, - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AddQueryString", - "Parameters": [ - { - "Name": "uri", - "Type": "System.String" - }, - { - "Name": "queryString", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ParseQuery", - "Parameters": [ - { - "Name": "queryString", - "Type": "System.String" - } - ], - "ReturnType": "System.Collections.Generic.Dictionary", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ParseNullableQuery", - "Parameters": [ - { - "Name": "queryString", - "Type": "System.String" - } - ], - "ReturnType": "System.Collections.Generic.Dictionary", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.ReasonPhrases", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "GetReasonPhrase", - "Parameters": [ - { - "Name": "statusCode", - "Type": "System.Int32" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "DrainAsync", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "DrainAsync", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "limit", - "Type": "System.Nullable" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "DrainAsync", - "Parameters": [ - { - "Name": "stream", - "Type": "System.IO.Stream" - }, - { - "Name": "bytePool", - "Type": "System.Buffers.ArrayPool" - }, - { - "Name": "limit", - "Type": "System.Nullable" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.WebEncoders", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Base64UrlDecode", - "Parameters": [ - { - "Name": "input", - "Type": "System.String" - } - ], - "ReturnType": "System.Byte[]", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlDecode", - "Parameters": [ - { - "Name": "input", - "Type": "System.String" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Byte[]", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlDecode", - "Parameters": [ - { - "Name": "input", - "Type": "System.String" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "buffer", - "Type": "System.Char[]" - }, - { - "Name": "bufferOffset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Byte[]", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetArraySizeRequiredToDecode", - "Parameters": [ - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlEncode", - "Parameters": [ - { - "Name": "input", - "Type": "System.Byte[]" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlEncode", - "Parameters": [ - { - "Name": "input", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlEncode", - "Parameters": [ - { - "Name": "input", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "output", - "Type": "System.Char[]" - }, - { - "Name": "outputOffset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetArraySizeRequiredToEncode", - "Parameters": [ - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - } - ] -} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 8dc2020da1..6b037fca38 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -4,7 +4,7 @@ HTTP header parser implementations. - netstandard1.1 + netcoreapp2.0 $(NoWarn);CS1591 true true diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index e176bcad4c..493e57568c 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -2,8 +2,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index 72ef16dc34..7a31ffb37c 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -3,8 +3,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 12e14311b0..914c592b03 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -3,8 +3,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index 9b9b88308d..457ac55c05 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -3,8 +3,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index ee1249897b..40dff9bf5f 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -36,40 +36,5 @@ namespace Microsoft.AspNetCore.Http var context = contextFactory.Create(new FeatureCollection()); contextFactory.Dispose(context); } - -#if NET46 - private static void DomainFunc() - { - var accessor = new HttpContextAccessor(); - Assert.Equal(null, accessor.HttpContext); - accessor.HttpContext = new DefaultHttpContext(); - } - - [Fact] - public void ChangingAppDomainsDoesNotBreak() - { - // Arrange - var accessor = new HttpContextAccessor(); - var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions()), accessor); - var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; - var setupInfo = new AppDomainSetup - { - ApplicationBase = baseDirectory, - ConfigurationFile = Path.Combine(baseDirectory, Path.GetFileNameWithoutExtension(GetType().Assembly.Location) + ".dll.config"), - }; - var domain = AppDomain.CreateDomain("newDomain", null, setupInfo); - - // Act - var context = contextFactory.Create(new FeatureCollection()); - domain.DoCallBack(DomainFunc); - AppDomain.Unload(domain); - - // Assert - Assert.True(ReferenceEquals(context, accessor.HttpContext)); - } -#elif NETCOREAPP2_0 -#else -#error Target framework needs to be updated -#endif } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 902e0a52b6..96e9eb66c5 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -3,8 +3,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 true true diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 7c97057bf0..f12a45f2bb 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -3,8 +3,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs index 0ffc8506fb..a83f1574eb 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs @@ -293,13 +293,7 @@ namespace Microsoft.AspNetCore.WebUtilities private static string GetCurrentDirectory() { -#if NET46 - return AppDomain.CurrentDomain.BaseDirectory; -#elif NETCOREAPP2_0 return AppContext.BaseDirectory; -#else -#error Target framework needs to be updated -#endif } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 878accd163..f87a6a70e6 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -34,27 +34,6 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(expectedData, memoryStream.ToArray()); } -#if NET46 - [Fact] - public async Task DoesNotFlush_UnderlyingStream_OnClosingWriter() - { - // Arrange - var stream = new TestMemoryStream(); - var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); - - // Act - await writer.WriteAsync("Hello"); - writer.Close(); - - // Assert - Assert.Equal(0, stream.FlushCallCount); - Assert.Equal(0, stream.FlushAsyncCallCount); - } -#elif NETCOREAPP2_0 -#else -#error Target framework needs to be updated -#endif - [Fact] public async Task DoesNotFlush_UnderlyingStream_OnDisposingWriter() { @@ -71,26 +50,6 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(0, stream.FlushAsyncCallCount); } -#if NET46 - [Fact] - public async Task DoesNotClose_UnderlyingStream_OnDisposingWriter() - { - // Arrange - var stream = new TestMemoryStream(); - var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); - - // Act - await writer.WriteAsync("Hello"); - writer.Close(); - - // Assert - Assert.Equal(0, stream.CloseCallCount); - } -#elif NETCOREAPP2_0 -#else -#error Target framework needs to be updated -#endif - [Fact] public async Task DoesNotDispose_UnderlyingStream_OnDisposingWriter() { @@ -119,13 +78,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test await writer.WriteAsync(new string('a', byteLength)); // Act -#if NET46 - writer.Close(); -#elif NETCOREAPP2_0 writer.Dispose(); -#else -#error Target framework needs to be updated -#endif // Assert Assert.Equal(0, stream.FlushCallCount); @@ -345,13 +298,6 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [Theory] [InlineData("你好世界", "utf-16")] -#if NET46 - // CoreCLR does not like shift_jis as an encoding. - [InlineData("こんにちは世界", "shift_jis")] -#elif NETCOREAPP2_0 -#else -#error Target framework needs to be updated -#endif [InlineData("హలో ప్రపంచ", "iso-8859-1")] [InlineData("வணக்கம் உலக", "utf-32")] public async Task WritesData_InExpectedEncoding(string data, string encodingName) @@ -379,15 +325,6 @@ namespace Microsoft.AspNetCore.WebUtilities.Test [InlineData('你', 1023, "utf-16")] [InlineData('你', 1024, "utf-16")] [InlineData('你', 1050, "utf-16")] -#if NET46 - // CoreCLR does not like shift_jis as an encoding. - [InlineData('こ', 1023, "shift_jis")] - [InlineData('こ', 1024, "shift_jis")] - [InlineData('こ', 1050, "shift_jis")] -#elif NETCOREAPP2_0 -#else -#error Target framework needs to be updated -#endif [InlineData('హ', 1023, "iso-8859-1")] [InlineData('హ', 1024, "iso-8859-1")] [InlineData('హ', 1050, "iso-8859-1")] @@ -516,17 +453,6 @@ namespace Microsoft.AspNetCore.WebUtilities.Test return base.WriteAsync(buffer, offset, count, cancellationToken); } -#if NET46 - public override void Close() - { - CloseCallCount++; - base.Close(); - } -#elif NETCOREAPP2_0 -#else -#error Target framework needs to be updated -#endif - protected override void Dispose(bool disposing) { DisposeCallCount++; diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index ab9cca9cd5..b3bb954826 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -3,8 +3,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 3b151518ba..84323cd28e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -3,8 +3,7 @@ - netcoreapp2.0;net46 - netcoreapp2.0 + netcoreapp2.0 From d1d9bceff56cb44a194ae36923ce687e5e353006 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Mon, 8 May 2017 22:37:00 +0200 Subject: [PATCH 679/846] #833 Change non-standard header name 'ContentMD5' to 'Content-MD5' --- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index 7f6432c363..379630744e 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -20,7 +20,7 @@ namespace Microsoft.Net.Http.Headers public const string ContentLanguage = "Content-Language"; public const string ContentLength = "Content-Length"; public const string ContentLocation = "Content-Location"; - public const string ContentMD5 = "ContentMD5"; + public const string ContentMD5 = "Content-MD5"; public const string ContentRange = "Content-Range"; public const string ContentType = "Content-Type"; public const string Cookie = "Cookie"; @@ -57,4 +57,4 @@ namespace Microsoft.Net.Http.Headers public const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; public const string WWWAuthenticate = "WWW-Authenticate"; } -} \ No newline at end of file +} From 412e4de2a57fe575a5e06779da67989aa0788a1e Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 10 May 2017 12:10:19 -0700 Subject: [PATCH 680/846] Remove unnecessary package references (#835) --- .../Microsoft.AspNetCore.Http.Extensions.csproj | 3 +-- .../Microsoft.AspNetCore.Http.Features.csproj | 4 +--- .../Microsoft.AspNetCore.Http.csproj | 3 +-- .../Microsoft.Net.Http.Headers.csproj | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index 880297069c..64051bad3e 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -1,4 +1,4 @@ - + @@ -17,7 +17,6 @@ - diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index b31493d7f2..c65645e9d0 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -1,4 +1,4 @@ - + @@ -13,8 +13,6 @@ - - diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index a1a646e5fa..b513020038 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -1,4 +1,4 @@ - + @@ -22,7 +22,6 @@ - diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 6b037fca38..7fe6cd4256 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -1,4 +1,4 @@ - + @@ -14,8 +14,6 @@ - - From f5107596a5486f9531276af290ac32d2a62780ec Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Wed, 10 May 2017 23:54:05 +0200 Subject: [PATCH 681/846] Add Id to ConnectionInfo (#828) --- .../ConnectionInfo.cs | 7 ++++++- .../Internal/DefaultConnectionInfo.cs | 9 ++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs index 08c4108609..d4cab49afe 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs @@ -10,6 +10,11 @@ namespace Microsoft.AspNetCore.Http { public abstract class ConnectionInfo { + /// + /// Gets or sets a unique identifier to represent this connection. + /// + public abstract string Id { get; set; } + public abstract IPAddress RemoteIpAddress { get; set; } public abstract int RemotePort { get; set; } @@ -22,4 +27,4 @@ namespace Microsoft.AspNetCore.Http public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs b/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs index 496df69654..6ae7f9fc38 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs @@ -39,6 +39,13 @@ namespace Microsoft.AspNetCore.Http.Internal private ITlsConnectionFeature TlsConnectionFeature=> _features.Fetch(ref _features.Cache.TlsConnection, _newTlsConnectionFeature); + /// + public override string Id + { + get { return HttpConnectionFeature.ConnectionId; } + set { HttpConnectionFeature.ConnectionId = value; } + } + public override IPAddress RemoteIpAddress { get { return HttpConnectionFeature.RemoteIpAddress; } @@ -80,4 +87,4 @@ namespace Microsoft.AspNetCore.Http.Internal public ITlsConnectionFeature TlsConnection; } } -} \ No newline at end of file +} From 043f8fda61931ee23416bd68865f3623f3ce2ac2 Mon Sep 17 00:00:00 2001 From: cdavid Date: Wed, 10 May 2017 15:02:53 -0700 Subject: [PATCH 682/846] Fix typo (delegate) in documentation (#830) --- .../Extensions/UseExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs index d8791b8675..c0c9a0f6e5 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Builder public static class UseExtensions { /// - /// Adds a middleware delagate defined in-line to the application's request pipeline. + /// Adds a middleware delegate defined in-line to the application's request pipeline. /// /// The instance. /// A function that handles the request or calls the given next function. @@ -30,4 +30,4 @@ namespace Microsoft.AspNetCore.Builder }); } } -} \ No newline at end of file +} From bf0b0e283d32c990b1b32a77a1b73482b5c7472f Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 15 May 2017 14:54:39 -0700 Subject: [PATCH 683/846] Upgrade test framework versions and fix test issues --- build/dependencies.props | 4 ++-- ...icrosoft.AspNetCore.Authentication.Core.Test.csproj | 4 ---- .../TokenExtensionTests.cs | 6 +++--- .../FragmentStringTests.cs | 4 ++-- .../HostStringTest.cs | 6 +++--- ...Microsoft.AspNetCore.Http.Abstractions.Tests.csproj | 4 ---- .../PathStringTests.cs | 4 ++-- .../QueryStringTests.cs | 4 ++-- .../UseMiddlewareTest.cs | 6 +++--- .../Microsoft.AspNetCore.Http.Extensions.Tests.csproj | 4 ---- .../Microsoft.AspNetCore.Http.Features.Tests.csproj | 4 ---- .../Features/FormFeatureTests.cs | 10 +++++----- .../Internal/ApplicationBuilderTests.cs | 4 ++-- .../Microsoft.AspNetCore.Http.Tests.csproj | 6 ------ .../Microsoft.AspNetCore.Owin.Tests.csproj | 4 ---- .../OwinFeatureCollectionTests.cs | 6 +++--- .../HttpRequestStreamReaderTest.cs | 2 +- .../Microsoft.AspNetCore.WebUtilities.Tests.csproj | 4 ---- .../Microsoft.Net.Http.Headers.Tests.csproj | 4 ---- .../NameValueHeaderValueTest.cs | 4 ++-- 20 files changed, 30 insertions(+), 64 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 09cfb1fe04..ed2c89867f 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,7 +4,7 @@ 4.3.0 2.1.0-* $(BundledNETStandardPackageVersion) - 15.0.0 - 2.2.0 + 15.3.0-* + 2.3.0-beta2-* diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index 493e57568c..b197458c5c 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -12,8 +12,4 @@ - - - - diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs index d9e050fe82..a203afadf0 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs @@ -50,9 +50,9 @@ namespace Microsoft.AspNetCore.Authentication props.StoreTokens(new[] { new AuthenticationToken { Name = "Zero", Value = "0" } }); Assert.Equal("0", props.GetTokenValue("Zero")); - Assert.Equal(null, props.GetTokenValue("One")); - Assert.Equal(null, props.GetTokenValue("Two")); - Assert.Equal(null, props.GetTokenValue("Three")); + Assert.Null(props.GetTokenValue("One")); + Assert.Null(props.GetTokenValue("Two")); + Assert.Null(props.GetTokenValue("Three")); Assert.Equal(1, props.GetTokens().Count()); } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs index eb0c955e3d..4f5fe20916 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.Abstractions.Tests public void Equals_EmptyFragmentStringAndDefaultFragmentString() { // Act and Assert - Assert.Equal(FragmentString.Empty, default(FragmentString)); + Assert.Equal(default(FragmentString), FragmentString.Empty); Assert.Equal(default(FragmentString), FragmentString.Empty); // explicitly checking == operator Assert.True(FragmentString.Empty == default(FragmentString)); @@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Http.Abstractions.Tests var fragmentString = new FragmentString("#col=1"); // Act and Assert - Assert.NotEqual(fragmentString, default(FragmentString)); + Assert.NotEqual(default(FragmentString), fragmentString); } [Fact] diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs index b5d5f3e392..d529ed76d2 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs @@ -70,7 +70,7 @@ namespace Microsoft.AspNetCore.Http var result = hostString.Port; // Assert - Assert.Equal(null, result); + Assert.Null(result); } [Theory] @@ -97,7 +97,7 @@ namespace Microsoft.AspNetCore.Http public void Equals_EmptyHostStringAndDefaultHostString() { // Act and Assert - Assert.Equal(new HostString(string.Empty), default(HostString)); + Assert.Equal(default(HostString), new HostString(string.Empty)); Assert.Equal(default(HostString), new HostString(string.Empty)); // explicitly checking == operator Assert.True(new HostString(string.Empty) == default(HostString)); @@ -111,7 +111,7 @@ namespace Microsoft.AspNetCore.Http var hostString = new HostString("example.com"); // Act and Assert - Assert.NotEqual(hostString, default(HostString)); + Assert.NotEqual(default(HostString), hostString); } [Fact] diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index 7a31ffb37c..0942ec9578 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -17,8 +17,4 @@ - - - - diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index f5cbe052dd..60a1a9b017 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Http public void Equals_EmptyPathStringAndDefaultPathString() { // Act and Assert - Assert.Equal(PathString.Empty, default(PathString)); + Assert.Equal(default(PathString), PathString.Empty); Assert.Equal(default(PathString), PathString.Empty); Assert.True(PathString.Empty == default(PathString)); Assert.True(default(PathString) == PathString.Empty); @@ -35,7 +35,7 @@ namespace Microsoft.AspNetCore.Http var pathString = new PathString("/hello"); // Act and Assert - Assert.NotEqual(pathString, default(PathString)); + Assert.NotEqual(default(PathString), pathString); } [Fact] diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs index ec3a36cbe2..01532d45ab 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs @@ -110,7 +110,7 @@ namespace Microsoft.AspNetCore.Http.Abstractions public void Equals_EmptyQueryStringAndDefaultQueryString() { // Act and Assert - Assert.Equal(QueryString.Empty, default(QueryString)); + Assert.Equal(default(QueryString), QueryString.Empty); Assert.Equal(default(QueryString), QueryString.Empty); // explicitly checking == operator Assert.True(QueryString.Empty == default(QueryString)); @@ -124,7 +124,7 @@ namespace Microsoft.AspNetCore.Http.Abstractions var queryString = new QueryString("?foo=1"); // Act and Assert - Assert.NotEqual(queryString, default(QueryString)); + Assert.NotEqual(default(QueryString), queryString); } [Fact] diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index 6ba21da298..e00b3ead76 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -224,8 +224,8 @@ namespace Microsoft.AspNetCore.Http sp.AddService(typeof(IMiddlewareFactory), middlewareFactory); context.RequestServices = sp; await app(context); - Assert.Equal(true, context.Items["before"]); - Assert.Equal(true, context.Items["after"]); + Assert.True(Assert.IsType(context.Items["before"])); + Assert.True(Assert.IsType(context.Items["after"])); Assert.NotNull(middlewareFactory.Created); Assert.NotNull(middlewareFactory.Released); Assert.IsType(typeof(Middleware), middlewareFactory.Created); @@ -374,4 +374,4 @@ namespace Microsoft.AspNetCore.Http public Task InvokeAsync(HttpContext context) => TaskCache.CompletedTask; } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 914c592b03..05bbaf148f 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -18,8 +18,4 @@ - - - - diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index 457ac55c05..1851cf26e0 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -16,8 +16,4 @@ - - - - diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index 7a73c1f446..9cf4f872ce 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -202,7 +202,7 @@ namespace Microsoft.AspNetCore.Http.Features { Assert.True(body.CanSeek); var content = reader.ReadToEnd(); - Assert.Equal(content, "Hello World"); + Assert.Equal("Hello World", content); } await responseFeature.CompleteAsync(); @@ -250,7 +250,7 @@ namespace Microsoft.AspNetCore.Http.Features { Assert.True(body.CanSeek); var content = reader.ReadToEnd(); - Assert.Equal(content, "Hello World"); + Assert.Equal("Hello World", content); } await responseFeature.CompleteAsync(); @@ -297,7 +297,7 @@ namespace Microsoft.AspNetCore.Http.Features { Assert.True(body.CanSeek); var content = reader.ReadToEnd(); - Assert.Equal(content, "Hello World"); + Assert.Equal("Hello World", content); } await responseFeature.CompleteAsync(); @@ -324,7 +324,7 @@ namespace Microsoft.AspNetCore.Http.Features context.Features.Set(formFeature); var exception = await Assert.ThrowsAsync (() => context.Request.ReadFormAsync()); - Assert.Equal(exception.Message, "Form value count limit 2 exceeded."); + Assert.Equal("Form value count limit 2 exceeded.", exception.Message); } [Theory] @@ -349,7 +349,7 @@ namespace Microsoft.AspNetCore.Http.Features context.Features.Set(formFeature); var exception = await Assert.ThrowsAsync (() => context.Request.ReadFormAsync()); - Assert.Equal(exception.Message, "Form value count limit 2 exceeded."); + Assert.Equal("Form value count limit 2 exceeded.", exception.Message); } [Theory] diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs index 976d9bf7e1..e1336c82ba 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Builder.Internal var httpContext = new DefaultHttpContext(); app.Invoke(httpContext); - Assert.Equal(httpContext.Response.StatusCode, 404); + Assert.Equal(404, httpContext.Response.StatusCode); } [Fact] @@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Builder.Internal var builder2 = builder1.New(); builder2.Properties["test"] = "value2"; - Assert.Equal(builder1.Properties["test"], "value1"); + Assert.Equal("value1", builder1.Properties["test"]); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 96e9eb66c5..b5db0529d5 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -4,8 +4,6 @@ netcoreapp2.0 - true - true @@ -18,8 +16,4 @@ - - - - diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index f12a45f2bb..98a2f4889f 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -18,8 +18,4 @@ - - - - diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs index 792d854854..b2755961c8 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs @@ -35,9 +35,9 @@ namespace Microsoft.AspNetCore.Owin var requestFeature = Get(features); Assert.Equal(requestFeature.Method, HttpMethods.Post); - Assert.Equal(requestFeature.Path, "/path"); - Assert.Equal(requestFeature.PathBase, "/pathBase"); - Assert.Equal(requestFeature.QueryString, "?name=value"); + Assert.Equal("/path", requestFeature.Path); + Assert.Equal("/pathBase", requestFeature.PathBase); + Assert.Equal("?name=value", requestFeature.QueryString); } [Fact] diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs index d163f2b526..82163c2b54 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test var read = await reader.ReadAsync(chars, 4, 3); // Assert - Assert.Equal(read, 3); + Assert.Equal(3, read); for (var i = 0; i < 3; i++) { Assert.Equal(CharData[i], chars[i + 4]); diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index b3bb954826..863c4e3c91 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -16,8 +16,4 @@ - - - - diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 84323cd28e..55476bcdcf 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -16,8 +16,4 @@ - - - - diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index c90a922574..9a8396f79d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -72,7 +72,7 @@ namespace Microsoft.Net.Http.Headers // Change one value and verify the other is unchanged. pair0.Value = "othervalue"; Assert.Equal("othervalue", pair0.Value); - Assert.Equal(null, pair1.Value); + Assert.Null(pair1.Value); } [Fact] @@ -90,7 +90,7 @@ namespace Microsoft.Net.Http.Headers // Change one value and verify the other is unchanged. pair0.Value = "othervalue"; Assert.Equal("othervalue", pair0.Value); - Assert.Equal(null, pair1.Value); + Assert.Null(pair1.Value); Assert.Throws(() => { pair1.Value = "othervalue"; }); } From dfd938e4f7c2138877b83925dc84bb74f48a00ce Mon Sep 17 00:00:00 2001 From: user1336 Date: Tue, 16 May 2017 21:42:12 +0200 Subject: [PATCH 684/846] =?UTF-8?q?Fixed=20=EF=BF=BD=20in=20summary=20(#83?= =?UTF-8?q?8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs index 2c48cea430..7bff41769f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Http public DateTimeOffset? Expires { get; set; } /// - /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)�that is, over HTTPS only. + /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)--that is, over HTTPS only. /// /// true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. public bool Secure { get; set; } From 07470d41b1d93959792a6b8dc0f25cc38c3f94b2 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 15 May 2017 11:16:24 -0700 Subject: [PATCH 685/846] Ignore empty header values #722 --- .../Internal/ParsingHelpers.cs | 8 +++++-- .../HeaderDictionaryTests.cs | 23 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs index fb6af992ce..1e06ce6e7d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs @@ -26,9 +26,13 @@ namespace Microsoft.AspNetCore.Http.Internal { foreach (var segment in new HeaderSegmentCollection(values)) { - if (segment.Data.HasValue) + if (!StringSegment.IsNullOrEmpty(segment.Data)) { - yield return DeQuote(segment.Data.Value); + var value = DeQuote(segment.Data.Value); + if (!string.IsNullOrEmpty(value)) + { + yield return value; + } } } } diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index 40c94df9dd..f9cd2488ab 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.Primitives; using Xunit; @@ -15,7 +16,9 @@ namespace Microsoft.AspNetCore.Http new[] { "Value1", "Value2", "Value3", "Value4" }, new[] { "Value1", "", "Value3", "Value4" }, new[] { "Value1", "", "", "Value4" }, - new[] { "", "", "", "" } + new[] { "Value1", "", null, "Value4" }, + new[] { "", "", "", "" }, + new[] { "", null, "", null }, }; [Fact] @@ -37,7 +40,7 @@ namespace Microsoft.AspNetCore.Http [Theory] [MemberData(nameof(HeaderSegmentData))] - public void EmptyHeaderSegmentsAreParsable(IEnumerable segments) + public void EmptyHeaderSegmentsAreIgnored(IEnumerable segments) { var header = string.Join(",", segments); @@ -48,8 +51,22 @@ namespace Microsoft.AspNetCore.Http }); var result = headers.GetCommaSeparatedValues("Header1"); + var expectedResult = segments.Where(s => !string.IsNullOrEmpty(s)); - Assert.Equal(segments, result); + Assert.Equal(expectedResult, result); + } + + [Fact] + public void EmtpyQuotedHeaderSegmentsAreIgnored() + { + var headers = new HeaderDictionary( + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Header1", "Value1,\"\",,Value2" }, + }); + + var result = headers.GetCommaSeparatedValues("Header1"); + Assert.Equal(new[] { "Value1", "Value2" }, result); } } } \ No newline at end of file From 9313a02aa87b23ed3c1639f31da19b2004cdb7ce Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 18 May 2017 11:20:26 -0700 Subject: [PATCH 686/846] Remove duplication of parsing helper --- .../Internal/HeaderSegment.cs | 4 +- .../Internal/HeaderSegmentCollection.cs | 4 +- .../Internal/ParsingHelpers.cs | 2 +- .../Internal/ParsingHelpers.cs | 407 ------------------ 4 files changed, 5 insertions(+), 412 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs index a405c7c9d4..eed9d80f88 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs @@ -6,13 +6,13 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Http.Internal { - internal struct HeaderSegment : IEquatable + public struct HeaderSegment : IEquatable { private readonly StringSegment _formatting; private readonly StringSegment _data; // - // Initializes a new instance of the structure. // public HeaderSegment(StringSegment formatting, StringSegment data) { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs index 77ece1864f..40c40a8eb3 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Http.Internal { - internal struct HeaderSegmentCollection : IEnumerable, IEquatable + public struct HeaderSegmentCollection : IEnumerable, IEquatable { private readonly StringValues _headers; @@ -62,7 +62,7 @@ namespace Microsoft.AspNetCore.Http.Internal return GetEnumerator(); } - internal struct Enumerator : IEnumerator + public struct Enumerator : IEnumerator { private readonly StringValues _headers; private int _index; diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs index 1e06ce6e7d..173ea4438d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Http.Internal { - internal static class ParsingHelpers + public static class ParsingHelpers { public static StringValues GetHeader(IHeaderDictionary headers, string key) { diff --git a/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs deleted file mode 100644 index 1f4d713098..0000000000 --- a/src/Microsoft.AspNetCore.Http/Internal/ParsingHelpers.cs +++ /dev/null @@ -1,407 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using Microsoft.Extensions.Primitives; -using Microsoft.Net.Http.Headers; - -namespace Microsoft.AspNetCore.Http.Internal -{ - internal struct HeaderSegment : IEquatable - { - private readonly StringSegment _formatting; - private readonly StringSegment _data; - - // - // Initializes a new instance of the structure. - // - public HeaderSegment(StringSegment formatting, StringSegment data) - { - _formatting = formatting; - _data = data; - } - - public StringSegment Formatting - { - get { return _formatting; } - } - - public StringSegment Data - { - get { return _data; } - } - - #region Equality members - - public bool Equals(HeaderSegment other) - { - return _formatting.Equals(other._formatting) && _data.Equals(other._data); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is HeaderSegment && Equals((HeaderSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); - } - } - - public static bool operator ==(HeaderSegment left, HeaderSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(HeaderSegment left, HeaderSegment right) - { - return !left.Equals(right); - } - - #endregion - } - - internal struct HeaderSegmentCollection : IEnumerable, IEquatable - { - private readonly StringValues _headers; - - public HeaderSegmentCollection(StringValues headers) - { - _headers = headers; - } - - #region Equality members - - public bool Equals(HeaderSegmentCollection other) - { - return StringValues.Equals(_headers, other._headers); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is HeaderSegmentCollection && Equals((HeaderSegmentCollection)obj); - } - - public override int GetHashCode() - { - return (!StringValues.IsNullOrEmpty(_headers) ? _headers.GetHashCode() : 0); - } - - public static bool operator ==(HeaderSegmentCollection left, HeaderSegmentCollection right) - { - return left.Equals(right); - } - - public static bool operator !=(HeaderSegmentCollection left, HeaderSegmentCollection right) - { - return !left.Equals(right); - } - - #endregion - - public Enumerator GetEnumerator() - { - return new Enumerator(_headers); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - internal struct Enumerator : IEnumerator - { - private readonly StringValues _headers; - private int _index; - - private string _header; - private int _headerLength; - private int _offset; - - private int _leadingStart; - private int _leadingEnd; - private int _valueStart; - private int _valueEnd; - private int _trailingStart; - - private Mode _mode; - - public Enumerator(StringValues headers) - { - _headers = headers; - _header = string.Empty; - _headerLength = -1; - _index = -1; - _offset = -1; - _leadingStart = -1; - _leadingEnd = -1; - _valueStart = -1; - _valueEnd = -1; - _trailingStart = -1; - _mode = Mode.Leading; - } - - private enum Mode - { - Leading, - Value, - ValueQuoted, - Trailing, - Produce, - } - - private enum Attr - { - Value, - Quote, - Delimiter, - Whitespace - } - - public HeaderSegment Current - { - get - { - return new HeaderSegment( - new StringSegment(_header, _leadingStart, _leadingEnd - _leadingStart), - new StringSegment(_header, _valueStart, _valueEnd - _valueStart)); - } - } - - object IEnumerator.Current - { - get { return Current; } - } - - public void Dispose() - { - } - - public bool MoveNext() - { - while (true) - { - if (_mode == Mode.Produce) - { - _leadingStart = _trailingStart; - _leadingEnd = -1; - _valueStart = -1; - _valueEnd = -1; - _trailingStart = -1; - - if (_offset == _headerLength && - _leadingStart != -1 && - _leadingStart != _offset) - { - // Also produce trailing whitespace - _leadingEnd = _offset; - return true; - } - _mode = Mode.Leading; - } - - // if end of a string - if (_offset == _headerLength) - { - ++_index; - _offset = -1; - _leadingStart = 0; - _leadingEnd = -1; - _valueStart = -1; - _valueEnd = -1; - _trailingStart = -1; - - // if that was the last string - if (_index == _headers.Count) - { - // no more move nexts - return false; - } - - // grab the next string - _header = _headers[_index] ?? string.Empty; - _headerLength = _header.Length; - } - while (true) - { - ++_offset; - char ch = _offset == _headerLength ? (char)0 : _header[_offset]; - // todo - array of attrs - Attr attr = char.IsWhiteSpace(ch) ? Attr.Whitespace : ch == '\"' ? Attr.Quote : (ch == ',' || ch == (char)0) ? Attr.Delimiter : Attr.Value; - - switch (_mode) - { - case Mode.Leading: - switch (attr) - { - case Attr.Delimiter: - _leadingEnd = _offset; - _mode = Mode.Produce; - break; - case Attr.Quote: - _leadingEnd = _offset; - _valueStart = _offset; - _mode = Mode.ValueQuoted; - break; - case Attr.Value: - _leadingEnd = _offset; - _valueStart = _offset; - _mode = Mode.Value; - break; - case Attr.Whitespace: - // more - break; - } - break; - case Mode.Value: - switch (attr) - { - case Attr.Quote: - _mode = Mode.ValueQuoted; - break; - case Attr.Delimiter: - _valueEnd = _offset; - _trailingStart = _offset; - _mode = Mode.Produce; - break; - case Attr.Value: - // more - break; - case Attr.Whitespace: - _valueEnd = _offset; - _trailingStart = _offset; - _mode = Mode.Trailing; - break; - } - break; - case Mode.ValueQuoted: - switch (attr) - { - case Attr.Quote: - _mode = Mode.Value; - break; - case Attr.Delimiter: - if (ch == (char)0) - { - _valueEnd = _offset; - _trailingStart = _offset; - _mode = Mode.Produce; - } - break; - case Attr.Value: - case Attr.Whitespace: - // more - break; - } - break; - case Mode.Trailing: - switch (attr) - { - case Attr.Delimiter: - _mode = Mode.Produce; - break; - case Attr.Quote: - // back into value - _trailingStart = -1; - _valueEnd = -1; - _mode = Mode.ValueQuoted; - break; - case Attr.Value: - // back into value - _trailingStart = -1; - _valueEnd = -1; - _mode = Mode.Value; - break; - case Attr.Whitespace: - // more - break; - } - break; - } - if (_mode == Mode.Produce) - { - return true; - } - } - } - } - - public void Reset() - { - _index = 0; - _offset = 0; - _leadingStart = 0; - _leadingEnd = 0; - _valueStart = 0; - _valueEnd = 0; - } - } - } - - internal static class ParsingHelpers - { - public static StringValues GetHeaderSplit(IHeaderDictionary headers, string key) - { - var values = GetHeaderUnmodified(headers, key); - return new StringValues(GetHeaderSplitImplementation(values).ToArray()); - } - - private static IEnumerable GetHeaderSplitImplementation(StringValues values) - { - foreach (var segment in new HeaderSegmentCollection(values)) - { - if (segment.Data.HasValue) - { - yield return DeQuote(segment.Data.Value); - } - } - } - - public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key) - { - if (headers == null) - { - throw new ArgumentNullException(nameof(headers)); - } - - StringValues values; - return headers.TryGetValue(key, out values) ? values : StringValues.Empty; - } - - private static string DeQuote(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') - { - value = value.Substring(1, value.Length - 2); - } - - return value; - } - } -} From 6e87b0f5eb0c4f09d49174850cb9fa5f2366bb06 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 17 May 2017 16:09:56 -0700 Subject: [PATCH 687/846] Target netstandard2.0 TFM --- build/common.props | 5 ++--- build/dependencies.props | 1 + samples/SampleApp/SampleApp.csproj | 6 +++++- .../Microsoft.AspNetCore.Authentication.Abstractions.csproj | 2 +- .../Microsoft.AspNetCore.Authentication.Core.csproj | 2 +- .../Microsoft.AspNetCore.Http.Abstractions.csproj | 2 +- .../Microsoft.AspNetCore.Http.Extensions.csproj | 3 ++- .../Microsoft.AspNetCore.Http.Features.csproj | 2 +- .../Microsoft.AspNetCore.Http.csproj | 2 +- .../Microsoft.AspNetCore.Owin.csproj | 2 +- .../Microsoft.AspNetCore.WebUtilities.csproj | 2 +- .../Microsoft.Net.Http.Headers.csproj | 3 ++- .../Microsoft.AspNetCore.Authentication.Core.Test.csproj | 3 ++- .../Microsoft.AspNetCore.Http.Abstractions.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.Http.Extensions.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.Http.Features.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.Http.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.Owin.Tests.csproj | 3 ++- .../Microsoft.AspNetCore.WebUtilities.Tests.csproj | 3 ++- .../Microsoft.Net.Http.Headers.Tests.csproj | 3 ++- 20 files changed, 35 insertions(+), 21 deletions(-) diff --git a/build/common.props b/build/common.props index e8d514cc8b..e4bc74e655 100644 --- a/build/common.props +++ b/build/common.props @@ -16,8 +16,7 @@ - - + + - diff --git a/build/dependencies.props b/build/dependencies.props index ed2c89867f..802cc3bfc8 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,6 +4,7 @@ 4.3.0 2.1.0-* $(BundledNETStandardPackageVersion) + 2.0.0-* 15.3.0-* 2.3.0-beta2-* diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index 2014414f28..470e3971d6 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -3,7 +3,7 @@ - netcoreapp2.0 + netcoreapp2.0;net461 Exe @@ -12,4 +12,8 @@ + + + + diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj index 8f6e24afa4..adda966c8b 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -2,7 +2,7 @@ ASP.NET Core common types used by the various authentication components. - netcoreapp2.0 + netstandard2.0 $(NoWarn);CS1591 true aspnetcore;authentication;security diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj index a6dae40ac5..0ceaa4d374 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -4,7 +4,7 @@ ASP.NET Core common types used by the various authentication middleware components. - netcoreapp2.0 + netstandard2.0 $(NoWarn);CS1591 true aspnetcore;authentication;security diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index 6d710eef0e..e19971e2db 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -10,7 +10,7 @@ Microsoft.AspNetCore.Builder.IApplicationBuilder Microsoft.AspNetCore.Http.HttpContext Microsoft.AspNetCore.Http.HttpRequest Microsoft.AspNetCore.Http.HttpResponse - netcoreapp2.0 + netstandard2.0 true aspnetcore $(NoWarn);CS1591 diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index 64051bad3e..869d392b14 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -4,7 +4,7 @@ ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. - netcoreapp2.0 + netstandard2.0 $(NoWarn);CS1591 true aspnetcore @@ -17,6 +17,7 @@ + diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index c65645e9d0..1920b47231 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -4,7 +4,7 @@ ASP.NET Core HTTP feature interface definitions. - netcoreapp2.0 + netstandard2.0 $(NoWarn);CS1591 true aspnetcore diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index b513020038..a4d86ade8c 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -4,7 +4,7 @@ ASP.NET Core default HTTP feature implementations. - netcoreapp2.0 + netstandard2.0 $(NoWarn);CS1591 true true diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj index ace8ebff29..b6eb0a3585 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj @@ -4,7 +4,7 @@ ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application. - netcoreapp2.0 + netstandard2.0 $(NoWarn);CS1591 true aspnetcore;owin diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index 1667d601f3..1508370a09 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -4,7 +4,7 @@ ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings. - netcoreapp2.0 + netstandard2.0 $(DefineConstants);WebEncoders_In_WebUtilities $(NoWarn);CS1591 true diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 7fe6cd4256..e86898c885 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -4,7 +4,7 @@ HTTP header parser implementations. - netcoreapp2.0 + netstandard2.0 $(NoWarn);CS1591 true true @@ -14,6 +14,7 @@ + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index b197458c5c..d438974331 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -2,7 +2,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index 0942ec9578..34dd0337e3 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -3,7 +3,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 05bbaf148f..ecb6c6615f 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -3,7 +3,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index 1851cf26e0..cf542d9cc5 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -3,7 +3,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index b5db0529d5..4e244a483b 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -3,7 +3,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 98a2f4889f..47fc0bafde 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -3,7 +3,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index 863c4e3c91..c37aac336e 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -3,7 +3,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 55476bcdcf..c1c4924b80 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -3,7 +3,8 @@ - netcoreapp2.0 + netcoreapp2.0;net461 + netcoreapp2.0 From e8123db21ece289e30abf174a37a908b9e5e1e98 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 17 May 2017 20:03:34 -0700 Subject: [PATCH 688/846] Add SameSite attribute to SetCookie header --- .../CookieOptions.cs | 7 +++ .../SameSiteMode.cs | 14 +++++ .../Internal/ResponseCookies.cs | 3 +- .../SameSiteMode.cs | 13 +++++ .../SetCookieHeaderValue.cs | 53 +++++++++++++++++-- .../SetCookieHeaderValueTest.cs | 42 +++++++++++++-- 6 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Features/SameSiteMode.cs create mode 100644 src/Microsoft.Net.Http.Headers/SameSiteMode.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs index 7bff41769f..d9e0047dca 100644 --- a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs @@ -42,6 +42,13 @@ namespace Microsoft.AspNetCore.Http /// true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. public bool Secure { get; set; } + + /// + /// Gets or sets the value for the SameSite attribute of the cookie. The default value is + /// + /// The representing the enforcement mode of the cookie. + public SameSiteMode SameSite { get; set; } = SameSiteMode.Lax; + /// /// Gets or sets a value that indicates whether a cookie is accessible by client-side script. /// diff --git a/src/Microsoft.AspNetCore.Http.Features/SameSiteMode.cs b/src/Microsoft.AspNetCore.Http.Features/SameSiteMode.cs new file mode 100644 index 0000000000..0ae4481e3d --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/SameSiteMode.cs @@ -0,0 +1,14 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Http +{ + // RFC Draft: https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00 + // This mirrors Microsoft.Net.Http.Headers.SameSiteMode + public enum SameSiteMode + { + None = 0, + Lax, + Strict + } +} diff --git a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs index e7f2d12039..04dc5b947e 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs @@ -62,7 +62,8 @@ namespace Microsoft.AspNetCore.Http.Internal Path = options.Path, Expires = options.Expires, Secure = options.Secure, - HttpOnly = options.HttpOnly, + SameSite = (Net.Http.Headers.SameSiteMode)options.SameSite, + HttpOnly = options.HttpOnly }; var cookieValue = setCookieHeaderValue.ToString(); diff --git a/src/Microsoft.Net.Http.Headers/SameSiteMode.cs b/src/Microsoft.Net.Http.Headers/SameSiteMode.cs new file mode 100644 index 0000000000..1976386c85 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/SameSiteMode.cs @@ -0,0 +1,13 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + // RFC Draft: https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00 + public enum SameSiteMode + { + None = 0, + Lax, + Strict + } +} diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 8c6d9a565d..10c68bb5b1 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -17,6 +17,10 @@ namespace Microsoft.Net.Http.Headers private const string DomainToken = "domain"; private const string PathToken = "path"; private const string SecureToken = "secure"; + // RFC Draft: https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00 + private const string SameSiteToken = "samesite"; + private static readonly string SameSiteLaxToken = SameSiteMode.Lax.ToString().ToLower(); + private static readonly string SameSiteStrictToken = SameSiteMode.Strict.ToString().ToLower(); private const string HttpOnlyToken = "httponly"; private const string SeparatorToken = "; "; private const string EqualsToken = "="; @@ -87,15 +91,18 @@ namespace Microsoft.Net.Http.Headers public bool Secure { get; set; } + public SameSiteMode SameSite { get; set; } + public bool HttpOnly { get; set; } - // name="val ue"; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly + // name="value"; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; samesite={Strict|Lax}; httponly public override string ToString() { var length = _name.Length + EqualsToken.Length + _value.Length; string expires = null; string maxAge = null; + string sameSite = null; if (Expires.HasValue) { @@ -124,6 +131,12 @@ namespace Microsoft.Net.Http.Headers length += SeparatorToken.Length + SecureToken.Length; } + if (SameSite != SameSiteMode.None) + { + sameSite = SameSite == SameSiteMode.Lax ? SameSiteLaxToken : SameSiteStrictToken; + length += SeparatorToken.Length + SameSiteToken.Length + EqualsToken.Length + sameSite.Length; + } + if (HttpOnly) { length += SeparatorToken.Length + HttpOnlyToken.Length; @@ -160,6 +173,11 @@ namespace Microsoft.Net.Http.Headers AppendSegment(ref sb, SecureToken, null); } + if (SameSite != SameSiteMode.None) + { + AppendSegment(ref sb, SameSiteToken, sameSite); + } + if (HttpOnly) { AppendSegment(ref sb, HttpOnlyToken, null); @@ -218,6 +236,11 @@ namespace Microsoft.Net.Http.Headers AppendSegment(builder, SecureToken, null); } + if (SameSite != SameSiteMode.None) + { + AppendSegment(builder, SameSiteToken, SameSite == SameSiteMode.Lax ? SameSiteLaxToken : SameSiteStrictToken); + } + if (HttpOnly) { AppendSegment(builder, HttpOnlyToken, null); @@ -267,7 +290,7 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); } - // name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly + // name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; samesite={Strict|Lax}; httponly private static int GetSetCookieLength(string input, int startIndex, out SetCookieHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); @@ -322,7 +345,7 @@ namespace Microsoft.Net.Http.Headers offset += HttpRuleParser.GetWhitespaceLength(input, offset); - // cookie-av = expires-av / max-age-av / domain-av / path-av / secure-av / httponly-av / extension-av + // cookie-av = expires-av / max-age-av / domain-av / path-av / secure-av / samesite-av / httponly-av / extension-av itemLength = HttpRuleParser.GetTokenLength(input, offset); if (itemLength == 0) { @@ -402,6 +425,28 @@ namespace Microsoft.Net.Http.Headers { result.Secure = true; } + // samesite-av = "SameSite" / "SameSite=" samesite-value + // samesite-value = "Strict" / "Lax" + else if (string.Equals(token, SameSiteToken, StringComparison.OrdinalIgnoreCase)) + { + if (!ReadEqualsSign(input, ref offset)) + { + result.SameSite = SameSiteMode.Strict; + } + else + { + var enforcementMode = ReadToSemicolonOrEnd(input, ref offset); + + if (string.Equals(enforcementMode, SameSiteLaxToken, StringComparison.OrdinalIgnoreCase)) + { + result.SameSite = SameSiteMode.Lax; + } + else + { + result.SameSite = SameSiteMode.Strict; + } + } + } // httponly-av = "HttpOnly" else if (string.Equals(token, HttpOnlyToken, StringComparison.OrdinalIgnoreCase)) { @@ -459,6 +504,7 @@ namespace Microsoft.Net.Http.Headers && string.Equals(Domain, other.Domain, StringComparison.OrdinalIgnoreCase) && string.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase) && Secure == other.Secure + && SameSite == other.SameSite && HttpOnly == other.HttpOnly; } @@ -471,6 +517,7 @@ namespace Microsoft.Net.Http.Headers ^ (Domain != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Domain) : 0) ^ (Path != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Path) : 0) ^ Secure.GetHashCode() + ^ SameSite.GetHashCode() ^ HttpOnly.GetHashCode(); } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index a3dad09a24..2a84397bb8 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -20,12 +20,13 @@ namespace Microsoft.Net.Http.Headers { Domain = "domain1", Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + SameSite = SameSiteMode.Strict, HttpOnly = true, MaxAge = TimeSpan.FromDays(1), Path = "path1", Secure = true }; - dataset.Add(header1, "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"); + dataset.Add(header1, "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; samesite=strict; httponly"); var header2 = new SetCookieHeaderValue("name2", ""); dataset.Add(header2, "name2="); @@ -46,6 +47,19 @@ namespace Microsoft.Net.Http.Headers }; dataset.Add(header5, "name5=value5; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1"); + var header6 = new SetCookieHeaderValue("name6", "value6") + { + SameSite = SameSiteMode.Lax, + }; + dataset.Add(header6, "name6=value6; samesite=lax"); + + var header7 = new SetCookieHeaderValue("name7", "value7") + { + SameSite = SameSiteMode.None, + }; + dataset.Add(header7, "name7=value7"); + + return dataset; } } @@ -106,12 +120,13 @@ namespace Microsoft.Net.Http.Headers { Domain = "domain1", Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + SameSite = SameSiteMode.Strict, HttpOnly = true, MaxAge = TimeSpan.FromDays(1), Path = "path1", Secure = true }; - var string1 = "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"; + var string1 = "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; samesite=strict; httponly"; var header2 = new SetCookieHeaderValue("name2", "value2"); var string2 = "name2=value2"; @@ -129,6 +144,21 @@ namespace Microsoft.Net.Http.Headers }; var string4 = "name4=value4; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1"; + var header5 = new SetCookieHeaderValue("name5", "value5") + { + SameSite = SameSiteMode.Lax + }; + var string5a = "name5=value5; samesite=lax"; + var string5b = "name5=value5; samesite=Lax"; + + var header6 = new SetCookieHeaderValue("name6", "value6") + { + SameSite = SameSiteMode.Strict + }; + var string6a = "name6=value6; samesite"; + var string6b = "name6=value6; samesite=Strict"; + var string6c = "name6=value6; samesite=invalid"; + dataset.Add(new[] { header1 }.ToList(), new[] { string1 }); dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, string1 }); dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, null, "", " ", ",", " , ", string1 }); @@ -138,6 +168,11 @@ namespace Microsoft.Net.Http.Headers dataset.Add(new[] { header2, header1 }.ToList(), new[] { string2 + ", " + string1 }); dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, string3, string4 }); dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, string3, string4) }); + dataset.Add(new[] { header5 }.ToList(), new[] { string5a }); + dataset.Add(new[] { header5 }.ToList(), new[] { string5b }); + dataset.Add(new[] { header6 }.ToList(), new[] { string6a }); + dataset.Add(new[] { header6 }.ToList(), new[] { string6b }); + dataset.Add(new[] { header6 }.ToList(), new[] { string6c }); return dataset; } @@ -152,12 +187,13 @@ namespace Microsoft.Net.Http.Headers { Domain = "domain1", Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + SameSite = SameSiteMode.Strict, HttpOnly = true, MaxAge = TimeSpan.FromDays(1), Path = "path1", Secure = true }; - var string1 = "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"; + var string1 = "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; samesite=Strict; httponly"; var header2 = new SetCookieHeaderValue("name2", "value2"); var string2 = "name2=value2"; From 2ce2d8b6c5c4d3111f5bbfe642c478f229bd955f Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 18 May 2017 20:33:30 -0700 Subject: [PATCH 689/846] #758 Convert the header parsers to use StringSegment --- .../HttpRequestMultipartExtensions.cs | 2 +- .../Features/FormFeature.cs | 9 +- .../Internal/RequestCookieCollection.cs | 4 +- .../FileMultipartSection.cs | 8 +- .../FormMultipartSection.cs | 2 +- .../BaseHeaderParser.cs | 8 +- .../CacheControlHeaderValue.cs | 67 +++++----- .../ContentDispositionHeaderValue.cs | 121 ++++++++++-------- ...ispositionHeaderValueIdentityExtensions.cs | 5 +- .../ContentRangeHeaderValue.cs | 36 +++--- .../CookieHeaderParser.cs | 7 +- .../CookieHeaderValue.cs | 56 ++++---- .../EntityTagHeaderValue.cs | 33 ++--- .../GenericHeaderParser.cs | 5 +- .../HeaderUtilities.cs | 43 ++----- .../HttpHeaderParser.cs | 7 +- .../HttpRuleParser.cs | 17 +-- .../MediaTypeHeaderValue.cs | 90 ++++++------- .../NameValueHeaderValue.cs | 68 +++++----- .../ObjectCollection.cs | 2 +- .../RangeConditionHeaderValue.cs | 11 +- .../RangeHeaderValue.cs | 22 ++-- .../RangeItemHeaderValue.cs | 13 +- .../SetCookieHeaderValue.cs | 75 ++++++----- .../StringWithQualityHeaderValue.cs | 27 ++-- .../StringWithQualityHeaderValueComparer.cs | 7 +- .../ContentDispositionHeaderValueTest.cs | 24 ++-- .../MediaTypeHeaderValueTest.cs | 28 ++-- .../NameValueHeaderValueTest.cs | 30 ++--- 29 files changed, 407 insertions(+), 420 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs index 76770428a0..da9188dad3 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Http.Extensions { return string.Empty; } - return HeaderUtilities.RemoveQuotes(mediaType.Boundary); + return HeaderUtilities.RemoveQuotes(mediaType.Boundary).ToString(); } } } diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index cd8b491ffd..f091e3b166 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Internal; using Microsoft.AspNetCore.WebUtilities; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Http.Features @@ -293,14 +294,14 @@ namespace Microsoft.AspNetCore.Http.Features { // Content-Disposition: form-data; name="key"; return contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") - && string.IsNullOrEmpty(contentDisposition.FileName) && string.IsNullOrEmpty(contentDisposition.FileNameStar); + && StringSegment.IsNullOrEmpty(contentDisposition.FileName) && StringSegment.IsNullOrEmpty(contentDisposition.FileNameStar); } private bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition) { // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" return contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") - && (!string.IsNullOrEmpty(contentDisposition.FileName) || !string.IsNullOrEmpty(contentDisposition.FileNameStar)); + && (!StringSegment.IsNullOrEmpty(contentDisposition.FileName) || !StringSegment.IsNullOrEmpty(contentDisposition.FileNameStar)); } // Content-Type: multipart/form-data; boundary="----WebKitFormBoundarymx2fSWqWSd0OxQqq" @@ -308,7 +309,7 @@ namespace Microsoft.AspNetCore.Http.Features private static string GetBoundary(MediaTypeHeaderValue contentType, int lengthLimit) { var boundary = HeaderUtilities.RemoveQuotes(contentType.Boundary); - if (string.IsNullOrWhiteSpace(boundary)) + if (StringSegment.IsNullOrEmpty(boundary)) { throw new InvalidDataException("Missing content-type boundary."); } @@ -316,7 +317,7 @@ namespace Microsoft.AspNetCore.Http.Features { throw new InvalidDataException($"Multipart boundary length limit {lengthLimit} exceeded."); } - return boundary; + return boundary.ToString(); } } } diff --git a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs index d02c9fade5..ca85fd1d04 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs @@ -75,8 +75,8 @@ namespace Microsoft.AspNetCore.Http.Internal for (var i = 0; i < cookies.Count; i++) { var cookie = cookies[i]; - var name = Uri.UnescapeDataString(cookie.Name); - var value = Uri.UnescapeDataString(cookie.Value); + var name = Uri.UnescapeDataString(cookie.Name.Value); + var value = Uri.UnescapeDataString(cookie.Value.Value); store[name] = value; } diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs index b1ba2ff47e..70d7741f64 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs @@ -39,11 +39,11 @@ namespace Microsoft.AspNetCore.WebUtilities Section = section; _contentDispositionHeader = header; - Name = HeaderUtilities.RemoveQuotes(_contentDispositionHeader.Name) ?? string.Empty; + Name = HeaderUtilities.RemoveQuotes(_contentDispositionHeader.Name).ToString(); FileName = HeaderUtilities.RemoveQuotes( - _contentDispositionHeader.FileNameStar ?? - _contentDispositionHeader.FileName ?? - string.Empty); + _contentDispositionHeader.FileNameStar.HasValue ? + _contentDispositionHeader.FileNameStar : + _contentDispositionHeader.FileName).ToString(); } /// diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs index 652cbdeb12..01af0455b8 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.WebUtilities Section = section; _contentDispositionHeader = header; - Name = HeaderUtilities.RemoveQuotes(_contentDispositionHeader.Name); + Name = HeaderUtilities.RemoveQuotes(_contentDispositionHeader.Name).ToString(); } /// diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs index 1b4038d21b..f3caaafb70 100644 --- a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs @@ -1,6 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.Extensions.Primitives; + namespace Microsoft.Net.Http.Headers { internal abstract class BaseHeaderParser : HttpHeaderParser @@ -10,9 +12,9 @@ namespace Microsoft.Net.Http.Headers { } - protected abstract int GetParsedValueLength(string value, int startIndex, out T parsedValue); + protected abstract int GetParsedValueLength(StringSegment value, int startIndex, out T parsedValue); - public sealed override bool TryParseValue(string value, ref int index, out T parsedValue) + public sealed override bool TryParseValue(StringSegment value, ref int index, out T parsedValue) { parsedValue = default(T); @@ -21,7 +23,7 @@ namespace Microsoft.Net.Http.Headers // Accept: text/xml; q=1 // Accept: // Accept: text/plain; q=0.2 - if (string.IsNullOrEmpty(value) || (index == value.Length)) + if (StringSegment.IsNullOrEmpty(value) || (index == value.Length)) { return SupportsMultipleValues; } diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index af31316667..81e18faf47 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -32,10 +33,10 @@ namespace Microsoft.Net.Http.Headers private static readonly HttpHeaderParser Parser = new GenericHeaderParser(true, GetCacheControlLength); - private static readonly Action CheckIsValidTokenAction = CheckIsValidToken; + private static readonly Action CheckIsValidTokenAction = CheckIsValidToken; private bool _noCache; - private ICollection _noCacheHeaders; + private ICollection _noCacheHeaders; private bool _noStore; private TimeSpan? _maxAge; private TimeSpan? _sharedMaxAge; @@ -46,7 +47,7 @@ namespace Microsoft.Net.Http.Headers private bool _onlyIfCached; private bool _public; private bool _private; - private ICollection _privateHeaders; + private ICollection _privateHeaders; private bool _mustRevalidate; private bool _proxyRevalidate; private IList _extensions; @@ -62,13 +63,13 @@ namespace Microsoft.Net.Http.Headers set { _noCache = value; } } - public ICollection NoCacheHeaders + public ICollection NoCacheHeaders { get { if (_noCacheHeaders == null) { - _noCacheHeaders = new ObjectCollection(CheckIsValidTokenAction); + _noCacheHeaders = new ObjectCollection(CheckIsValidTokenAction); } return _noCacheHeaders; } @@ -134,13 +135,13 @@ namespace Microsoft.Net.Http.Headers set { _private = value; } } - public ICollection PrivateHeaders + public ICollection PrivateHeaders { get { if (_privateHeaders == null) { - _privateHeaders = new ObjectCollection(CheckIsValidTokenAction); + _privateHeaders = new ObjectCollection(CheckIsValidTokenAction); } return _privateHeaders; } @@ -259,13 +260,13 @@ namespace Microsoft.Net.Http.Headers } if (!HeaderUtilities.AreEqualCollections(_noCacheHeaders, other._noCacheHeaders, - StringComparer.OrdinalIgnoreCase)) + StringSegmentComparer.OrdinalIgnoreCase)) { return false; } if (!HeaderUtilities.AreEqualCollections(_privateHeaders, other._privateHeaders, - StringComparer.OrdinalIgnoreCase)) + StringSegmentComparer.OrdinalIgnoreCase)) { return false; } @@ -299,7 +300,7 @@ namespace Microsoft.Net.Http.Headers { foreach (var noCacheHeader in _noCacheHeaders) { - result = result ^ StringComparer.OrdinalIgnoreCase.GetHashCode(noCacheHeader); + result = result ^ StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(noCacheHeader); } } @@ -307,7 +308,7 @@ namespace Microsoft.Net.Http.Headers { foreach (var privateHeader in _privateHeaders) { - result = result ^ StringComparer.OrdinalIgnoreCase.GetHashCode(privateHeader); + result = result ^ StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(privateHeader); } } @@ -322,7 +323,7 @@ namespace Microsoft.Net.Http.Headers return result; } - public static CacheControlHeaderValue Parse(string input) + public static CacheControlHeaderValue Parse(StringSegment input) { int index = 0; // Cache-Control is unusual because there are no required values so the parser will succeed for an empty string, but still return null. @@ -334,7 +335,7 @@ namespace Microsoft.Net.Http.Headers return result; } - public static bool TryParse(string input, out CacheControlHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out CacheControlHeaderValue parsedValue) { int index = 0; // Cache-Control is unusual because there are no required values so the parser will succeed for an empty string, but still return null. @@ -346,13 +347,13 @@ namespace Microsoft.Net.Http.Headers return false; } - private static int GetCacheControlLength(string input, int startIndex, out CacheControlHeaderValue parsedValue) + private static int GetCacheControlLength(StringSegment input, int startIndex, out CacheControlHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } @@ -403,7 +404,7 @@ namespace Microsoft.Net.Http.Headers switch (name.Length) { case 6: - if (string.Equals(PublicString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(PublicString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTokenOnlyValue(nameValue, ref cc._public); } @@ -414,11 +415,11 @@ namespace Microsoft.Net.Http.Headers break; case 7: - if (string.Equals(MaxAgeString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(MaxAgeString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTimeSpan(nameValue, ref cc._maxAge); } - else if(string.Equals(PrivateString, name, StringComparison.OrdinalIgnoreCase)) + else if(StringSegment.Equals(PrivateString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetOptionalTokenList(nameValue, ref cc._private, ref cc._privateHeaders); } @@ -429,15 +430,15 @@ namespace Microsoft.Net.Http.Headers break; case 8: - if (string.Equals(NoCacheString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(NoCacheString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetOptionalTokenList(nameValue, ref cc._noCache, ref cc._noCacheHeaders); } - else if (string.Equals(NoStoreString, name, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(NoStoreString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTokenOnlyValue(nameValue, ref cc._noStore); } - else if (string.Equals(SharedMaxAgeString, name, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(SharedMaxAgeString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTimeSpan(nameValue, ref cc._sharedMaxAge); } @@ -448,7 +449,7 @@ namespace Microsoft.Net.Http.Headers break; case 9: - if (string.Equals(MaxStaleString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(MaxStaleString, name, StringComparison.OrdinalIgnoreCase)) { success = ((nameValue.Value == null) || TrySetTimeSpan(nameValue, ref cc._maxStaleLimit)); if (success) @@ -456,7 +457,7 @@ namespace Microsoft.Net.Http.Headers cc._maxStale = true; } } - else if (string.Equals(MinFreshString, name, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(MinFreshString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTimeSpan(nameValue, ref cc._minFresh); } @@ -467,7 +468,7 @@ namespace Microsoft.Net.Http.Headers break; case 12: - if (string.Equals(NoTransformString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(NoTransformString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTokenOnlyValue(nameValue, ref cc._noTransform); } @@ -478,7 +479,7 @@ namespace Microsoft.Net.Http.Headers break; case 14: - if (string.Equals(OnlyIfCachedString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(OnlyIfCachedString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTokenOnlyValue(nameValue, ref cc._onlyIfCached); } @@ -489,7 +490,7 @@ namespace Microsoft.Net.Http.Headers break; case 15: - if (string.Equals(MustRevalidateString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(MustRevalidateString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTokenOnlyValue(nameValue, ref cc._mustRevalidate); } @@ -500,7 +501,7 @@ namespace Microsoft.Net.Http.Headers break; case 16: - if (string.Equals(ProxyRevalidateString, name, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(ProxyRevalidateString, name, StringComparison.OrdinalIgnoreCase)) { success = TrySetTokenOnlyValue(nameValue, ref cc._proxyRevalidate); } @@ -538,7 +539,7 @@ namespace Microsoft.Net.Http.Headers private static bool TrySetOptionalTokenList( NameValueHeaderValue nameValue, ref bool boolField, - ref ICollection destination) + ref ICollection destination) { Contract.Requires(nameValue != null); @@ -582,10 +583,10 @@ namespace Microsoft.Net.Http.Headers if (destination == null) { - destination = new ObjectCollection(CheckIsValidTokenAction); + destination = new ObjectCollection(CheckIsValidTokenAction); } - destination.Add(valueString.Substring(current, tokenLength)); + destination.Add(valueString.Subsegment(current, tokenLength)); current = current + tokenLength; } @@ -637,10 +638,10 @@ namespace Microsoft.Net.Http.Headers sb.Append(value); } - private static void AppendValues(StringBuilder sb, IEnumerable values) + private static void AppendValues(StringBuilder sb, IEnumerable values) { var first = true; - foreach (string value in values) + foreach (var value in values) { if (first) { @@ -655,7 +656,7 @@ namespace Microsoft.Net.Http.Headers } } - private static void CheckIsValidToken(string item) + private static void CheckIsValidToken(StringSegment item) { HeaderUtilities.CheckValidToken(item, nameof(item)); } diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index fbae25b6d1..ff9faf066b 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -6,7 +6,9 @@ using System.Buffers; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; +using System.Linq; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -20,26 +22,28 @@ namespace Microsoft.Net.Http.Headers private const string ModificationDateString = "modification-date"; private const string ReadDateString = "read-date"; private const string SizeString = "size"; + private static readonly char[] QuestionMark = new char[] { '?' }; + private static readonly char[] SingleQuote = new char[] { '\'' }; private static readonly HttpHeaderParser Parser = new GenericHeaderParser(false, GetDispositionTypeLength); // Use list instead of dictionary since we may have multiple parameters with the same name. private ObjectCollection _parameters; - private string _dispositionType; + private StringSegment _dispositionType; private ContentDispositionHeaderValue() { // Used by the parser to create a new instance of this type. } - public ContentDispositionHeaderValue(string dispositionType) + public ContentDispositionHeaderValue(StringSegment dispositionType) { CheckDispositionTypeFormat(dispositionType, "dispositionType"); _dispositionType = dispositionType; } - public string DispositionType + public StringSegment DispositionType { get { return _dispositionType; } set @@ -63,19 +67,19 @@ namespace Microsoft.Net.Http.Headers // Helpers to access specific parameters in the list - public string Name + public StringSegment Name { get { return GetName(NameString); } set { SetName(NameString, value); } } - public string FileName + public StringSegment FileName { get { return GetName(FileNameString); } set { SetName(FileNameString, value); } } - public string FileNameStar + public StringSegment FileNameStar { get { return GetName(FileNameStarString); } set { SetName(FileNameStarString, value); } @@ -146,9 +150,9 @@ namespace Microsoft.Net.Http.Headers /// Sets both FileName and FileNameStar using encodings appropriate for HTTP headers. /// /// - public void SetHttpFileName(string fileName) + public void SetHttpFileName(StringSegment fileName) { - if (!string.IsNullOrEmpty(fileName)) + if (!StringSegment.IsNullOrEmpty(fileName)) { FileName = Sanatize(fileName); } @@ -164,7 +168,7 @@ namespace Microsoft.Net.Http.Headers /// The FileNameStar paraemter is removed. /// /// - public void SetMimeFileName(string fileName) + public void SetMimeFileName(StringSegment fileName) { FileNameStar = null; FileName = fileName; @@ -184,42 +188,41 @@ namespace Microsoft.Net.Http.Headers return false; } - return (string.Compare(_dispositionType, other._dispositionType, StringComparison.OrdinalIgnoreCase) == 0) && + return _dispositionType.Equals(other._dispositionType, StringComparison.OrdinalIgnoreCase) && HeaderUtilities.AreEqualCollections(_parameters, other._parameters); } public override int GetHashCode() { // The dispositionType string is case-insensitive. - return StringComparer.OrdinalIgnoreCase.GetHashCode(_dispositionType) ^ NameValueHeaderValue.GetHashCode(_parameters); + return StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_dispositionType) ^ NameValueHeaderValue.GetHashCode(_parameters); } - public static ContentDispositionHeaderValue Parse(string input) + public static ContentDispositionHeaderValue Parse(StringSegment input) { var index = 0; return Parser.ParseValue(input, ref index); } - public static bool TryParse(string input, out ContentDispositionHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out ContentDispositionHeaderValue parsedValue) { var index = 0; return Parser.TryParseValue(input, ref index, out parsedValue); } - private static int GetDispositionTypeLength(string input, int startIndex, out ContentDispositionHeaderValue parsedValue) + private static int GetDispositionTypeLength(StringSegment input, int startIndex, out ContentDispositionHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } // Caller must remove leading whitespaces. If not, we'll return 0. - string dispositionType = null; - var dispositionTypeLength = GetDispositionTypeExpressionLength(input, startIndex, out dispositionType); + var dispositionTypeLength = GetDispositionTypeExpressionLength(input, startIndex, out var dispositionType); if (dispositionTypeLength == 0) { @@ -247,7 +250,7 @@ namespace Microsoft.Net.Http.Headers return current - startIndex; } - private static int GetDispositionTypeExpressionLength(string input, int startIndex, out string dispositionType) + private static int GetDispositionTypeExpressionLength(StringSegment input, int startIndex, out StringSegment dispositionType) { Contract.Requires((input != null) && (input.Length > 0) && (startIndex < input.Length)); @@ -263,20 +266,19 @@ namespace Microsoft.Net.Http.Headers return 0; } - dispositionType = input.Substring(startIndex, typeLength); + dispositionType = input.Subsegment(startIndex, typeLength); return typeLength; } - private static void CheckDispositionTypeFormat(string dispositionType, string parameterName) + private static void CheckDispositionTypeFormat(StringSegment dispositionType, string parameterName) { - if (string.IsNullOrEmpty(dispositionType)) + if (StringSegment.IsNullOrEmpty(dispositionType)) { throw new ArgumentException("An empty string is not allowed.", parameterName); } // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. - string tempDispositionType; - var dispositionTypeLength = GetDispositionTypeExpressionLength(dispositionType, 0, out tempDispositionType); + var dispositionTypeLength = GetDispositionTypeExpressionLength(dispositionType, 0, out var tempDispositionType); if ((dispositionTypeLength == 0) || (tempDispositionType.Length != dispositionType.Length)) { throw new FormatException(string.Format(CultureInfo.InvariantCulture, @@ -291,11 +293,11 @@ namespace Microsoft.Net.Http.Headers var dateParameter = NameValueHeaderValue.Find(_parameters, parameter); if (dateParameter != null) { - string dateString = dateParameter.Value; + var dateString = dateParameter.Value; // Should have quotes, remove them. if (IsQuoted(dateString)) { - dateString = dateString.Substring(1, dateString.Length - 2); + dateString = dateString.Subsegment(1, dateString.Length - 2); } DateTimeOffset date; if (HttpRuleParser.TryStringToDate(dateString, out date)) @@ -357,17 +359,17 @@ namespace Microsoft.Net.Http.Headers return result; } // May not have been encoded - return nameParameter.Value; + return nameParameter.Value.ToString(); } return null; } // Add/update the given parameter in the list, encoding if necessary. // Remove if value is null/Empty - private void SetName(string parameter, string value) + private void SetName(StringSegment parameter, StringSegment value) { var nameParameter = NameValueHeaderValue.Find(_parameters, parameter); - if (string.IsNullOrEmpty(value)) + if (StringSegment.IsNullOrEmpty(value)) { // Remove parameter if (nameParameter != null) @@ -377,7 +379,7 @@ namespace Microsoft.Net.Http.Headers } else { - var processedValue = string.Empty; + var processedValue = StringSegment.Empty; if (parameter.EndsWith("*", StringComparison.Ordinal)) { processedValue = Encode5987(value); @@ -399,14 +401,14 @@ namespace Microsoft.Net.Http.Headers } // Returns input for decoding failures, as the content might not be encoded - private string EncodeAndQuoteMime(string input) + private StringSegment EncodeAndQuoteMime(StringSegment input) { var result = input; var needsQuotes = false; // Remove bounding quotes, they'll get re-added later if (IsQuoted(result)) { - result = result.Substring(1, result.Length - 2); + result = result.Subsegment(1, result.Length - 2); needsQuotes = true; } @@ -423,8 +425,7 @@ namespace Microsoft.Net.Http.Headers if (needsQuotes) { // '\' and '"' must be escaped in a quoted string - result = result.Replace(@"\", @"\\"); - result = result.Replace(@"""", @"\"""); + result = result.ToString().Replace(@"\", @"\\").Replace(@"""", @"\"""); // Re-add quotes "value" result = string.Format(CultureInfo.InvariantCulture, "\"{0}\"", result); } @@ -432,7 +433,7 @@ namespace Microsoft.Net.Http.Headers } // Replaces characters not suitable for HTTP headers with '_' rather than MIME encoding them. - private string Sanatize(string input) + private StringSegment Sanatize(StringSegment input) { var result = input; @@ -455,7 +456,7 @@ namespace Microsoft.Net.Http.Headers } // Returns true if the value starts and ends with a quote - private bool IsQuoted(string value) + private bool IsQuoted(StringSegment value) { Contract.Assert(value != null); @@ -464,13 +465,13 @@ namespace Microsoft.Net.Http.Headers } // tspecials are required to be in a quoted string. Only non-ascii needs to be encoded. - private bool RequiresEncoding(string input) + private bool RequiresEncoding(StringSegment input) { Contract.Assert(input != null); - foreach (char c in input) + for (int i = 0; i < input.Length; i++) { - if ((int)c > 0x7f) + if ((int)input[i] > 0x7f) { return true; } @@ -479,15 +480,23 @@ namespace Microsoft.Net.Http.Headers } // Encode using MIME encoding - private string EncodeMime(string input) + private unsafe string EncodeMime(StringSegment input) { - var buffer = Encoding.UTF8.GetBytes(input); - var encodedName = Convert.ToBase64String(buffer); - return string.Format(CultureInfo.InvariantCulture, "=?utf-8?B?{0}?=", encodedName); + fixed (char* chars = input.Buffer) + { + var byteCount = Encoding.UTF8.GetByteCount(chars + input.Offset, input.Length); + var buffer = new byte[byteCount]; + fixed (byte* bytes = buffer) + { + Encoding.UTF8.GetBytes(chars + input.Offset, input.Length, bytes, byteCount); + } + var encodedName = Convert.ToBase64String(buffer); + return "=?utf-8?B?" + encodedName + "?="; + } } // Attempt to decode MIME encoded strings - private bool TryDecodeMime(string input, out string output) + private bool TryDecodeMime(StringSegment input, out string output) { Contract.Assert(input != null); @@ -498,9 +507,11 @@ namespace Microsoft.Net.Http.Headers { return false; } - var parts = processedInput.Split('?'); + + var parts = processedInput.Split(QuestionMark).ToArray(); // "=, encodingName, encodingType, encodedData, =" - if (parts.Length != 5 || parts[0] != "\"=" || parts[4] != "=\"" || parts[2].ToLowerInvariant() != "b") + if (parts.Length != 5 || parts[0] != "\"=" || parts[4] != "=\"" + || !parts[2].Equals("b", StringComparison.OrdinalIgnoreCase)) { // Not encoded. // This does not support multi-line encoding. @@ -510,8 +521,8 @@ namespace Microsoft.Net.Http.Headers try { - var encoding = Encoding.GetEncoding(parts[1]); - var bytes = Convert.FromBase64String(parts[3]); + var encoding = Encoding.GetEncoding(parts[1].ToString()); + var bytes = Convert.FromBase64String(parts[3].ToString()); output = encoding.GetString(bytes, 0, bytes.Length); return true; } @@ -528,11 +539,12 @@ namespace Microsoft.Net.Http.Headers // Encode a string using RFC 5987 encoding // encoding'lang'PercentEncodedSpecials - private string Encode5987(string input) + private string Encode5987(StringSegment input) { var builder = new StringBuilder("UTF-8\'\'"); - foreach (char c in input) + for (int i = 0; i < input.Length; i++) { + var c = input[i]; // attr-char = ALPHA / DIGIT / "!" / "#" / "$" / "&" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" // ; token except ( "*" / "'" / "%" ) if (c > 0x7F) // Encodes as multiple utf-8 bytes @@ -569,10 +581,11 @@ namespace Microsoft.Net.Http.Headers // Attempt to decode using RFC 5987 encoding. // encoding'language'my%20string - private bool TryDecode5987(string input, out string output) + private bool TryDecode5987(StringSegment input, out string output) { output = null; - var parts = input.Split('\''); + + var parts = input.Split(SingleQuote).ToArray(); if (parts.Length != 3) { return false; @@ -582,7 +595,7 @@ namespace Microsoft.Net.Http.Headers byte[] unescapedBytes = null; try { - var encoding = Encoding.GetEncoding(parts[0]); + var encoding = Encoding.GetEncoding(parts[0].ToString()); var dataString = parts[2]; unescapedBytes = ArrayPool.Shared.Rent(dataString.Length); @@ -629,7 +642,7 @@ namespace Microsoft.Net.Http.Headers return true; } - private static bool IsHexEncoding(string pattern, int index) + private static bool IsHexEncoding(StringSegment pattern, int index) { if ((pattern.Length - index) < 3) { @@ -661,7 +674,7 @@ namespace Microsoft.Net.Http.Headers return true; } - private static byte HexUnescape(string pattern, ref int index) + private static byte HexUnescape(StringSegment pattern, ref int index) { if ((index < 0) || (index >= pattern.Length)) { diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs index 0a275e55b8..9ef74baa0c 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -23,7 +24,7 @@ namespace Microsoft.Net.Http.Headers } return header.DispositionType.Equals("form-data") - && (!string.IsNullOrEmpty(header.FileName) || !string.IsNullOrEmpty(header.FileNameStar)); + && (!StringSegment.IsNullOrEmpty(header.FileName) || !StringSegment.IsNullOrEmpty(header.FileNameStar)); } /// @@ -39,7 +40,7 @@ namespace Microsoft.Net.Http.Headers } return header.DispositionType.Equals("form-data") - && string.IsNullOrEmpty(header.FileName) && string.IsNullOrEmpty(header.FileNameStar); + && StringSegment.IsNullOrEmpty(header.FileName) && StringSegment.IsNullOrEmpty(header.FileNameStar); } } } diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index c187491dfc..99583cdf47 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Diagnostics.Contracts; using System.Globalization; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -13,7 +14,7 @@ namespace Microsoft.Net.Http.Headers private static readonly HttpHeaderParser Parser = new GenericHeaderParser(false, GetContentRangeLength); - private string _unit; + private StringSegment _unit; private long? _from; private long? _to; private long? _length; @@ -77,7 +78,7 @@ namespace Microsoft.Net.Http.Headers _unit = HeaderUtilities.BytesUnit; } - public string Unit + public StringSegment Unit { get { return _unit; } set @@ -122,12 +123,12 @@ namespace Microsoft.Net.Http.Headers } return ((_from == other._from) && (_to == other._to) && (_length == other._length) && - (string.Compare(_unit, other._unit, StringComparison.OrdinalIgnoreCase) == 0)); + StringSegment.Equals(_unit, other._unit, StringComparison.OrdinalIgnoreCase)); } public override int GetHashCode() { - var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_unit); + var result = StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_unit); if (HasRange) { @@ -144,7 +145,8 @@ namespace Microsoft.Net.Http.Headers public override string ToString() { - var sb = new StringBuilder(_unit); + var sb = new StringBuilder(); + sb.Append(_unit); sb.Append(' '); if (HasRange) @@ -171,25 +173,25 @@ namespace Microsoft.Net.Http.Headers return sb.ToString(); } - public static ContentRangeHeaderValue Parse(string input) + public static ContentRangeHeaderValue Parse(StringSegment input) { var index = 0; return Parser.ParseValue(input, ref index); } - public static bool TryParse(string input, out ContentRangeHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out ContentRangeHeaderValue parsedValue) { var index = 0; return Parser.TryParseValue(input, ref index, out parsedValue); } - private static int GetContentRangeLength(string input, int startIndex, out ContentRangeHeaderValue parsedValue) + private static int GetContentRangeLength(StringSegment input, int startIndex, out ContentRangeHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } @@ -202,7 +204,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - var unit = input.Substring(startIndex, unitLength); + var unit = input.Subsegment(startIndex, unitLength); var current = startIndex + unitLength; var separatorLength = HttpRuleParser.GetWhitespaceLength(input, current); @@ -259,7 +261,7 @@ namespace Microsoft.Net.Http.Headers return current - startIndex; } - private static bool TryGetLengthLength(string input, ref int current, out int lengthLength) + private static bool TryGetLengthLength(StringSegment input, ref int current, out int lengthLength) { lengthLength = 0; @@ -284,7 +286,7 @@ namespace Microsoft.Net.Http.Headers return true; } - private static bool TryGetRangeLength(string input, ref int current, out int fromLength, out int toStartIndex, out int toLength) + private static bool TryGetRangeLength(StringSegment input, ref int current, out int fromLength, out int toStartIndex, out int toLength) { fromLength = 0; toStartIndex = 0; @@ -341,8 +343,8 @@ namespace Microsoft.Net.Http.Headers } private static bool TryCreateContentRange( - string input, - string unit, + StringSegment input, + StringSegment unit, int fromStartIndex, int fromLength, int toStartIndex, @@ -354,13 +356,13 @@ namespace Microsoft.Net.Http.Headers parsedValue = null; long from = 0; - if ((fromLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(fromStartIndex, fromLength), out from)) + if ((fromLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Subsegment(fromStartIndex, fromLength), out from)) { return false; } long to = 0; - if ((toLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(toStartIndex, toLength), out to)) + if ((toLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Subsegment(toStartIndex, toLength), out to)) { return false; } @@ -372,7 +374,7 @@ namespace Microsoft.Net.Http.Headers } long length = 0; - if ((lengthLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(lengthStartIndex, lengthLength), + if ((lengthLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Subsegment(lengthStartIndex, lengthLength), out length)) { return false; diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs index 9253e881e5..a94b61d319 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Diagnostics.Contracts; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -12,7 +13,7 @@ namespace Microsoft.Net.Http.Headers { } - public sealed override bool TryParseValue(string value, ref int index, out CookieHeaderValue parsedValue) + public sealed override bool TryParseValue(StringSegment value, ref int index, out CookieHeaderValue parsedValue) { parsedValue = null; @@ -21,7 +22,7 @@ namespace Microsoft.Net.Http.Headers // Accept: text/xml; q=1 // Accept: // Accept: text/plain; q=0.2 - if (string.IsNullOrEmpty(value) || (index == value.Length)) + if (StringSegment.IsNullOrEmpty(value) || (index == value.Length)) { return SupportsMultipleValues; } @@ -62,7 +63,7 @@ namespace Microsoft.Net.Http.Headers return true; } - private static int GetNextNonEmptyOrWhitespaceIndex(string input, int startIndex, bool skipEmptyValues, out bool separatorFound) + private static int GetNextNonEmptyOrWhitespaceIndex(StringSegment input, int startIndex, bool skipEmptyValues, out bool separatorFound) { Contract.Requires(input != null); Contract.Requires(startIndex <= input.Length); // it's OK if index == value.Length. diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index 77adcf5441..3061b7d2fa 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -14,16 +15,16 @@ namespace Microsoft.Net.Http.Headers private static readonly CookieHeaderParser SingleValueParser = new CookieHeaderParser(supportsMultipleValues: false); private static readonly CookieHeaderParser MultipleValueParser = new CookieHeaderParser(supportsMultipleValues: true); - private string _name; - private string _value; + private StringSegment _name; + private StringSegment _value; private CookieHeaderValue() { // Used by the parser to create a new instance of this type. } - public CookieHeaderValue(string name) - : this(name, string.Empty) + public CookieHeaderValue(StringSegment name) + : this(name, StringSegment.Empty) { if (name == null) { @@ -31,7 +32,7 @@ namespace Microsoft.Net.Http.Headers } } - public CookieHeaderValue(string name, string value) + public CookieHeaderValue(StringSegment name, StringSegment value) { if (name == null) { @@ -47,7 +48,7 @@ namespace Microsoft.Net.Http.Headers Value = value; } - public string Name + public StringSegment Name { get { return _name; } set @@ -57,7 +58,7 @@ namespace Microsoft.Net.Http.Headers } } - public string Value + public StringSegment Value { get { return _value; } set @@ -79,24 +80,13 @@ namespace Microsoft.Net.Http.Headers return header.ToString(); } - private static void AppendSegment(StringBuilder builder, string name, string value) - { - builder.Append("; "); - builder.Append(name); - if (value != null) - { - builder.Append("="); - builder.Append(value); - } - } - - public static CookieHeaderValue Parse(string input) + public static CookieHeaderValue Parse(StringSegment input) { var index = 0; return SingleValueParser.ParseValue(input, ref index); } - public static bool TryParse(string input, out CookieHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out CookieHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); @@ -123,13 +113,13 @@ namespace Microsoft.Net.Http.Headers } // name=value; name="value" - internal static bool TryGetCookieLength(string input, ref int offset, out CookieHeaderValue parsedValue) + internal static bool TryGetCookieLength(StringSegment input, ref int offset, out CookieHeaderValue parsedValue) { Contract.Requires(offset >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (offset >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (offset >= input.Length)) { return false; } @@ -146,7 +136,7 @@ namespace Microsoft.Net.Http.Headers { return false; } - result._name = input.Substring(offset, itemLength); + result._name = input.Subsegment(offset, itemLength); offset += itemLength; // = (no spaces) @@ -166,7 +156,7 @@ namespace Microsoft.Net.Http.Headers // cookie-value = *cookie-octet / ( DQUOTE* cookie-octet DQUOTE ) // cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E // ; US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash - internal static string GetCookieValue(string input, ref int offset) + internal static StringSegment GetCookieValue(StringSegment input, ref int offset) { Contract.Requires(input != null); Contract.Requires(offset >= 0); @@ -176,7 +166,7 @@ namespace Microsoft.Net.Http.Headers if (offset >= input.Length) { - return string.Empty; + return StringSegment.Empty; } var inQuotes = false; @@ -202,7 +192,7 @@ namespace Microsoft.Net.Http.Headers if (offset == input.Length || input[offset] != '"') { // Missing final quote - return string.Empty; + return StringSegment.Empty; } offset++; } @@ -210,13 +200,13 @@ namespace Microsoft.Net.Http.Headers int length = offset - startIndex; if (offset > startIndex) { - return input.Substring(startIndex, length); + return input.Subsegment(startIndex, length); } - return string.Empty; + return StringSegment.Empty; } - private static bool ReadEqualsSign(string input, ref int offset) + private static bool ReadEqualsSign(StringSegment input, ref int offset) { // = (no spaces) if (offset >= input.Length || input[offset] != '=') @@ -238,7 +228,7 @@ namespace Microsoft.Net.Http.Headers return !(c == '"' || c == ',' || c == ';' || c == '\\'); } - internal static void CheckNameFormat(string name, string parameterName) + internal static void CheckNameFormat(StringSegment name, string parameterName) { if (name == null) { @@ -251,7 +241,7 @@ namespace Microsoft.Net.Http.Headers } } - internal static void CheckValueFormat(string value, string parameterName) + internal static void CheckValueFormat(StringSegment value, string parameterName) { if (value == null) { @@ -275,8 +265,8 @@ namespace Microsoft.Net.Http.Headers return false; } - return string.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) - && string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + return StringSegment.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) + && StringSegment.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); } public override int GetHashCode() diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs index 7d09920c77..e46cee3a34 100644 --- a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -22,7 +23,7 @@ namespace Microsoft.Net.Http.Headers private static EntityTagHeaderValue AnyType; - private string _tag; + private StringSegment _tag; private bool _isWeak; private EntityTagHeaderValue() @@ -30,20 +31,20 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public EntityTagHeaderValue(string tag) + public EntityTagHeaderValue(StringSegment tag) : this(tag, false) { } - public EntityTagHeaderValue(string tag, bool isWeak) + public EntityTagHeaderValue(StringSegment tag, bool isWeak) { - if (string.IsNullOrEmpty(tag)) + if (StringSegment.IsNullOrEmpty(tag)) { throw new ArgumentException("An empty string is not allowed.", nameof(tag)); } int length = 0; - if (!isWeak && string.Equals(tag, "*", StringComparison.Ordinal)) + if (!isWeak && StringSegment.Equals(tag, "*", StringComparison.Ordinal)) { // * is valid, but W/* isn't. _tag = tag; @@ -74,7 +75,7 @@ namespace Microsoft.Net.Http.Headers } } - public string Tag + public StringSegment Tag { get { return _tag; } } @@ -88,9 +89,9 @@ namespace Microsoft.Net.Http.Headers { if (_isWeak) { - return "W/" + _tag; + return "W/" + _tag.ToString(); } - return _tag; + return _tag.ToString(); } /// @@ -112,7 +113,7 @@ namespace Microsoft.Net.Http.Headers } // Since the tag is a quoted-string we treat it case-sensitive. - return _isWeak == other._isWeak && string.Equals(_tag, other._tag, StringComparison.Ordinal); + return _isWeak == other._isWeak && StringSegment.Equals(_tag, other._tag, StringComparison.Ordinal); } public override int GetHashCode() @@ -139,21 +140,21 @@ namespace Microsoft.Net.Http.Headers if (useStrongComparison) { - return !IsWeak && !other.IsWeak && string.Equals(Tag, other.Tag, StringComparison.Ordinal); + return !IsWeak && !other.IsWeak && StringSegment.Equals(Tag, other.Tag, StringComparison.Ordinal); } else { - return string.Equals(Tag, other.Tag, StringComparison.Ordinal); + return StringSegment.Equals(Tag, other.Tag, StringComparison.Ordinal); } } - public static EntityTagHeaderValue Parse(string input) + public static EntityTagHeaderValue Parse(StringSegment input) { var index = 0; return SingleValueParser.ParseValue(input, ref index); } - public static bool TryParse(string input, out EntityTagHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out EntityTagHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); @@ -179,13 +180,13 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); } - internal static int GetEntityTagLength(string input, int startIndex, out EntityTagHeaderValue parsedValue) + internal static int GetEntityTagLength(StringSegment input, int startIndex, out EntityTagHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } @@ -235,7 +236,7 @@ namespace Microsoft.Net.Http.Headers } else { - parsedValue._tag = input.Substring(tagStartIndex, tagLength); + parsedValue._tag = input.Subsegment(tagStartIndex, tagLength); parsedValue._isWeak = isWeak; } diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs index 63f9b8aed0..a2fbf720f9 100644 --- a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -2,12 +2,13 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { internal sealed class GenericHeaderParser : BaseHeaderParser { - internal delegate int GetParsedValueLengthDelegate(string value, int startIndex, out T parsedValue); + internal delegate int GetParsedValueLengthDelegate(StringSegment value, int startIndex, out T parsedValue); private GetParsedValueLengthDelegate _getParsedValueLength; @@ -22,7 +23,7 @@ namespace Microsoft.Net.Http.Headers _getParsedValueLength = getParsedValueLength; } - protected override int GetParsedValueLength(string value, int startIndex, out T parsedValue) + protected override int GetParsedValueLength(StringSegment value, int startIndex, out T parsedValue) { return _getParsedValueLength(value, startIndex, out parsedValue); } diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 9f49ba742c..abcf102076 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -72,9 +72,9 @@ namespace Microsoft.Net.Http.Headers return null; } - internal static void CheckValidToken(string value, string parameterName) + internal static void CheckValidToken(StringSegment value, string parameterName) { - if (string.IsNullOrEmpty(value)) + if (StringSegment.IsNullOrEmpty(value)) { throw new ArgumentException("An empty string is not allowed.", parameterName); } @@ -85,21 +85,6 @@ namespace Microsoft.Net.Http.Headers } } - internal static void CheckValidQuotedString(string value, string parameterName) - { - if (string.IsNullOrEmpty(value)) - { - throw new ArgumentException("An empty string is not allowed.", parameterName); - } - - int length; - if ((HttpRuleParser.GetQuotedStringLength(value, 0, out length) != HttpParseResult.Parsed) || - (length != value.Length)) // no trailing spaces allowed - { - throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid quoted string '{0}'.", value)); - } - } - internal static bool AreEqualCollections(ICollection x, ICollection y) { return AreEqualCollections(x, y, null); @@ -167,7 +152,7 @@ namespace Microsoft.Net.Http.Headers } internal static int GetNextNonEmptyOrWhitespaceIndex( - string input, + StringSegment input, int startIndex, bool skipEmptyValues, out bool separatorFound) @@ -368,11 +353,6 @@ namespace Microsoft.Net.Http.Headers return false; } - internal static bool TryParseNonNegativeInt32(string value, out int result) - { - return TryParseNonNegativeInt32(new StringSegment(value), out result); - } - /// /// Try to convert a string representation of a positive number to its 64-bit signed integer equivalent. /// A return value indicates whether the conversion succeeded or failed. @@ -388,12 +368,7 @@ namespace Microsoft.Net.Http.Headers /// result will be overwritten. /// /// true if parsing succeeded; otherwise, false. - public static bool TryParseNonNegativeInt64(string value, out long result) - { - return TryParseNonNegativeInt64(new StringSegment(value), out result); - } - - internal static unsafe bool TryParseNonNegativeInt32(StringSegment value, out int result) + public static unsafe bool TryParseNonNegativeInt32(StringSegment value, out int result) { if (string.IsNullOrEmpty(value.Buffer) || value.Length == 0) { @@ -483,7 +458,7 @@ namespace Microsoft.Net.Http.Headers // Strict and fast RFC7231 5.3.1 Quality value parser (and without memory allocation) // See https://tools.ietf.org/html/rfc7231#section-5.3.1 // Check is made to verify if the value is between 0 and 1 (and it returns False if the check fails). - internal static bool TryParseQualityDouble(string input, int startIndex, out double quality, out int length) + internal static bool TryParseQualityDouble(StringSegment input, int startIndex, out double quality, out int length) { quality = 0; length = 0; @@ -602,7 +577,7 @@ namespace Microsoft.Net.Http.Headers return new string(charBuffer, position, _int64MaxStringLength - position); } - public static bool TryParseDate(string input, out DateTimeOffset result) + public static bool TryParseDate(StringSegment input, out DateTimeOffset result) { return HttpRuleParser.TryStringToDate(input, out result); } @@ -617,11 +592,11 @@ namespace Microsoft.Net.Http.Headers return dateTime.ToRfc1123String(quoted); } - public static string RemoveQuotes(string input) + public static StringSegment RemoveQuotes(StringSegment input) { - if (!string.IsNullOrEmpty(input) && input.Length >= 2 && input[0] == '"' && input[input.Length - 1] == '"') + if (!StringSegment.IsNullOrEmpty(input) && input.Length >= 2 && input[0] == '"' && input[input.Length - 1] == '"') { - input = input.Substring(1, input.Length - 2); + input = input.Subsegment(1, input.Length - 2); } return input; } diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs index 383a304dcf..027a9de438 100644 --- a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -26,9 +27,9 @@ namespace Microsoft.Net.Http.Headers // pointing to the next non-whitespace character after a delimiter. E.g. if called with a start index of 0 // for string "value , second_value", then after the call completes, 'index' must point to 's', i.e. the first // non-whitespace after the separator ','. - public abstract bool TryParseValue(string value, ref int index, out T parsedValue); + public abstract bool TryParseValue(StringSegment value, ref int index, out T parsedValue); - public T ParseValue(string value, ref int index) + public T ParseValue(StringSegment value, ref int index) { // Index may be value.Length (e.g. both 0). This may be allowed for some headers (e.g. Accept but not // allowed by others (e.g. Content-Length). The parser has to decide if this is valid or not. @@ -40,7 +41,7 @@ namespace Microsoft.Net.Http.Headers if (!TryParseValue(value, ref index, out result)) { throw new FormatException(string.Format(CultureInfo.InvariantCulture, - "The header contains invalid values at index {0}: '{1}'", index, value ?? "")); + "The header contains invalid values at index {0}: '{1}'", index, value.Value ?? "")); } return result; } diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 0ce5833600..5a6adf9415 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -5,6 +5,7 @@ using System; using System.Diagnostics.Contracts; using System.Globalization; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -89,7 +90,7 @@ namespace Microsoft.Net.Http.Headers } [Pure] - internal static int GetTokenLength(string input, int startIndex) + internal static int GetTokenLength(StringSegment input, int startIndex) { Contract.Requires(input != null); Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); @@ -112,7 +113,7 @@ namespace Microsoft.Net.Http.Headers return input.Length - startIndex; } - internal static int GetWhitespaceLength(string input, int startIndex) + internal static int GetWhitespaceLength(StringSegment input, int startIndex) { Contract.Requires(input != null); Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); @@ -156,7 +157,7 @@ namespace Microsoft.Net.Http.Headers return input.Length - startIndex; } - internal static int GetNumberLength(string input, int startIndex, bool allowDecimal) + internal static int GetNumberLength(StringSegment input, int startIndex, bool allowDecimal) { Contract.Requires(input != null); Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); @@ -201,7 +202,7 @@ namespace Microsoft.Net.Http.Headers return current - startIndex; } - internal static HttpParseResult GetQuotedStringLength(string input, int startIndex, out int length) + internal static HttpParseResult GetQuotedStringLength(StringSegment input, int startIndex, out int length) { var nestedCount = 0; return GetExpressionLength(input, startIndex, '"', '"', false, ref nestedCount, out length); @@ -209,7 +210,7 @@ namespace Microsoft.Net.Http.Headers // quoted-pair = "\" CHAR // CHAR = - internal static HttpParseResult GetQuotedPairLength(string input, int startIndex, out int length) + internal static HttpParseResult GetQuotedPairLength(StringSegment input, int startIndex, out int length) { Contract.Requires(input != null); Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); @@ -237,8 +238,8 @@ namespace Microsoft.Net.Http.Headers // Try the various date formats in the order listed above. // We should accept a wide verity of common formats, but only output RFC 1123 style dates. - internal static bool TryStringToDate(string input, out DateTimeOffset result) => - DateTimeOffset.TryParseExact(input, DateFormats, DateTimeFormatInfo.InvariantInfo, + internal static bool TryStringToDate(StringSegment input, out DateTimeOffset result) => + DateTimeOffset.TryParseExact(input.ToString(), DateFormats, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, out result); // TEXT = @@ -253,7 +254,7 @@ namespace Microsoft.Net.Http.Headers // comments, resulting in a stack overflow exception. In addition having more than 1 nested comment (if any) // is unusual. private static HttpParseResult GetExpressionLength( - string input, + StringSegment input, int startIndex, char openChar, char closeChar, diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 0ec7666402..bfda2aac81 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -7,6 +7,7 @@ using System.Diagnostics.Contracts; using System.Globalization; using System.Linq; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -22,7 +23,7 @@ namespace Microsoft.Net.Http.Headers // Use a collection instead of a dictionary since we may have multiple parameters with the same name. private ObjectCollection _parameters; - private string _mediaType; + private StringSegment _mediaType; private bool _isReadOnly; private MediaTypeHeaderValue() @@ -30,23 +31,23 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public MediaTypeHeaderValue(string mediaType) + public MediaTypeHeaderValue(StringSegment mediaType) { CheckMediaTypeFormat(mediaType, "mediaType"); _mediaType = mediaType; } - public MediaTypeHeaderValue(string mediaType, double quality) + public MediaTypeHeaderValue(StringSegment mediaType, double quality) : this(mediaType) { Quality = quality; } - public string Charset + public StringSegment Charset { get { - return NameValueHeaderValue.Find(_parameters, CharsetString)?.Value; + return NameValueHeaderValue.Find(_parameters, CharsetString)?.Value.Value; } set { @@ -54,7 +55,7 @@ namespace Microsoft.Net.Http.Headers // We don't prevent a user from setting whitespace-only charsets. Like we can't prevent a user from // setting a non-existing charset. var charsetParameter = NameValueHeaderValue.Find(_parameters, CharsetString); - if (string.IsNullOrEmpty(value)) + if (StringSegment.IsNullOrEmpty(value)) { // Remove charset parameter if (charsetParameter != null) @@ -81,11 +82,11 @@ namespace Microsoft.Net.Http.Headers get { var charset = Charset; - if (!string.IsNullOrWhiteSpace(charset)) + if (!StringSegment.IsNullOrEmpty(charset)) { try { - return Encoding.GetEncoding(charset); + return Encoding.GetEncoding(charset.Value); } catch (ArgumentException) { @@ -108,17 +109,17 @@ namespace Microsoft.Net.Http.Headers } } - public string Boundary + public StringSegment Boundary { get { - return NameValueHeaderValue.Find(_parameters, BoundaryString)?.Value; + return NameValueHeaderValue.Find(_parameters, BoundaryString)?.Value ?? default(StringSegment); } set { HeaderUtilities.ThrowIfReadOnly(IsReadOnly); var boundaryParameter = NameValueHeaderValue.Find(_parameters, BoundaryString); - if (string.IsNullOrEmpty(value)) + if (StringSegment.IsNullOrEmpty(value)) { // Remove charset parameter if (boundaryParameter != null) @@ -169,7 +170,7 @@ namespace Microsoft.Net.Http.Headers } } - public string MediaType + public StringSegment MediaType { get { return _mediaType; } set @@ -180,19 +181,19 @@ namespace Microsoft.Net.Http.Headers } } - public string Type + public StringSegment Type { get { - return _mediaType.Substring(0, _mediaType.IndexOf('/')); + return _mediaType.Subsegment(0, _mediaType.IndexOf('/')); } } - public string SubType + public StringSegment SubType { get { - return _mediaType.Substring(_mediaType.IndexOf('/') + 1); + return _mediaType.Subsegment(_mediaType.IndexOf('/') + 1); } } @@ -214,7 +215,7 @@ namespace Microsoft.Net.Http.Headers { get { - return string.Compare(_mediaType, _mediaType.IndexOf('/') + 1, "*", 0, 1, StringComparison.Ordinal) == 0; + return SubType.Equals("*", StringComparison.Ordinal); } } @@ -245,31 +246,15 @@ namespace Microsoft.Net.Http.Headers return false; } - // PERF: Avoid doing anything here that allocates a substring, this is a very hot path - // for content-negotiation. - var indexOfSlash = _mediaType.IndexOf('/'); - // "text/plain" is a subset of "text/plain", "text/*" and "*/*". "*/*" is a subset only of "*/*". - if (string.Compare( - strA: _mediaType, - indexA: 0, - strB: otherMediaType._mediaType, - indexB: 0, - length: indexOfSlash, - comparisonType: StringComparison.OrdinalIgnoreCase) != 0) + if (!Type.Equals(otherMediaType.Type, comparisonType: StringComparison.OrdinalIgnoreCase)) { if (!otherMediaType.MatchesAllTypes) { return false; } } - else if (string.Compare( - strA: MediaType, - indexA: indexOfSlash + 1, - strB: otherMediaType._mediaType, - indexB: indexOfSlash + 1, // We know the Type is equal, so the index of '/' is the same in both strings. - length: _mediaType.Length - indexOfSlash, - comparisonType: StringComparison.OrdinalIgnoreCase) != 0) + else if (!SubType.Equals(otherMediaType.SubType, comparisonType: StringComparison.OrdinalIgnoreCase)) { if (!otherMediaType.MatchesAllSubTypes) { @@ -285,7 +270,7 @@ namespace Microsoft.Net.Http.Headers // parameters locally; they make this one more specific. foreach (var parameter in otherMediaType._parameters) { - if (string.Equals(parameter.Name, "q", StringComparison.OrdinalIgnoreCase)) + if (parameter.Name.Equals("q", StringComparison.OrdinalIgnoreCase)) { // "q" and later parameters are not involved in media type matching. Quoting the RFC: The first // "q" parameter (if any) separates the media-range parameter(s) from the accept-params. @@ -299,7 +284,7 @@ namespace Microsoft.Net.Http.Headers return false; } - if (!string.Equals(parameter.Value, localParameter.Value, StringComparison.OrdinalIgnoreCase)) + if (!StringSegment.Equals(parameter.Value, localParameter.Value, StringComparison.OrdinalIgnoreCase)) { return false; } @@ -352,7 +337,10 @@ namespace Microsoft.Net.Http.Headers public override string ToString() { - return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true); + var builder = new StringBuilder(); + builder.Append(_mediaType); + NameValueHeaderValue.ToString(_parameters, separator: ';', leadingSeparator: true, destination: builder); + return builder.ToString(); } public override bool Equals(object obj) @@ -364,23 +352,23 @@ namespace Microsoft.Net.Http.Headers return false; } - return (string.Compare(_mediaType, other._mediaType, StringComparison.OrdinalIgnoreCase) == 0) && + return _mediaType.Equals(other._mediaType, StringComparison.OrdinalIgnoreCase) && HeaderUtilities.AreEqualCollections(_parameters, other._parameters); } public override int GetHashCode() { // The media-type string is case-insensitive. - return StringComparer.OrdinalIgnoreCase.GetHashCode(_mediaType) ^ NameValueHeaderValue.GetHashCode(_parameters); + return StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_mediaType) ^ NameValueHeaderValue.GetHashCode(_parameters); } - public static MediaTypeHeaderValue Parse(string input) + public static MediaTypeHeaderValue Parse(StringSegment input) { var index = 0; return SingleValueParser.ParseValue(input, ref index); } - public static bool TryParse(string input, out MediaTypeHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out MediaTypeHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); @@ -406,20 +394,19 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); } - private static int GetMediaTypeLength(string input, int startIndex, out MediaTypeHeaderValue parsedValue) + private static int GetMediaTypeLength(StringSegment input, int startIndex, out MediaTypeHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } // Caller must remove leading whitespace. If not, we'll return 0. - string mediaType = null; - var mediaTypeLength = MediaTypeHeaderValue.GetMediaTypeExpressionLength(input, startIndex, out mediaType); + var mediaTypeLength = MediaTypeHeaderValue.GetMediaTypeExpressionLength(input, startIndex, out var mediaType); if (mediaTypeLength == 0) { @@ -451,7 +438,7 @@ namespace Microsoft.Net.Http.Headers return current - startIndex; } - private static int GetMediaTypeExpressionLength(string input, int startIndex, out string mediaType) + private static int GetMediaTypeExpressionLength(StringSegment input, int startIndex, out StringSegment mediaType) { Contract.Requires((input != null) && (input.Length > 0) && (startIndex < input.Length)); @@ -490,7 +477,7 @@ namespace Microsoft.Net.Http.Headers var mediaTypeLength = current + subtypeLength - startIndex; if (typeLength + subtypeLength + 1 == mediaTypeLength) { - mediaType = input.Substring(startIndex, mediaTypeLength); + mediaType = input.Subsegment(startIndex, mediaTypeLength); } else { @@ -500,17 +487,16 @@ namespace Microsoft.Net.Http.Headers return mediaTypeLength; } - private static void CheckMediaTypeFormat(string mediaType, string parameterName) + private static void CheckMediaTypeFormat(StringSegment mediaType, string parameterName) { - if (string.IsNullOrEmpty(mediaType)) + if (StringSegment.IsNullOrEmpty(mediaType)) { throw new ArgumentException("An empty string is not allowed.", parameterName); } // When adding values using strongly typed objects, no leading/trailing LWS (whitespace) is allowed. // Also no LWS between type and subtype is allowed. - string tempMediaType; - var mediaTypeLength = GetMediaTypeExpressionLength(mediaType, 0, out tempMediaType); + var mediaTypeLength = GetMediaTypeExpressionLength(mediaType, 0, out var tempMediaType); if ((mediaTypeLength == 0) || (tempMediaType.Length != mediaType.Length)) { throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid media type '{0}'.", mediaType)); diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index a04b8d7164..76b48e0093 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -18,8 +19,8 @@ namespace Microsoft.Net.Http.Headers internal static readonly HttpHeaderParser MultipleValueParser = new GenericHeaderParser(true, GetNameValueLength); - private string _name; - private string _value; + private StringSegment _name; + private StringSegment _value; private bool _isReadOnly; private NameValueHeaderValue() @@ -27,12 +28,12 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public NameValueHeaderValue(string name) + public NameValueHeaderValue(StringSegment name) : this(name, null) { } - public NameValueHeaderValue(string name, string value) + public NameValueHeaderValue(StringSegment name, StringSegment value) { CheckNameValueFormat(name, value); @@ -40,12 +41,12 @@ namespace Microsoft.Net.Http.Headers _value = value; } - public string Name + public StringSegment Name { get { return _name; } } - public string Value + public StringSegment Value { get { return _value; } set @@ -90,9 +91,9 @@ namespace Microsoft.Net.Http.Headers { Contract.Assert(_name != null); - var nameHashCode = StringComparer.OrdinalIgnoreCase.GetHashCode(_name); + var nameHashCode = StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_name); - if (!string.IsNullOrEmpty(_value)) + if (!StringSegment.IsNullOrEmpty(_value)) { // If we have a quoted-string, then just use the hash code. If we have a token, convert to lowercase // and retrieve the hash code. @@ -101,7 +102,7 @@ namespace Microsoft.Net.Http.Headers return nameHashCode ^ _value.GetHashCode(); } - return nameHashCode ^ StringComparer.OrdinalIgnoreCase.GetHashCode(_value); + return nameHashCode ^ StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_value); } return nameHashCode; @@ -116,7 +117,7 @@ namespace Microsoft.Net.Http.Headers return false; } - if (string.Compare(_name, other._name, StringComparison.OrdinalIgnoreCase) != 0) + if (!_name.Equals(other._name, StringComparison.OrdinalIgnoreCase)) { return false; } @@ -125,29 +126,29 @@ namespace Microsoft.Net.Http.Headers // case-sensitive comparison. The RFC doesn't mention how to compare quoted-strings outside the "Expect" // header. We treat all quoted-strings the same: case-sensitive comparison. - if (string.IsNullOrEmpty(_value)) + if (StringSegment.IsNullOrEmpty(_value)) { - return string.IsNullOrEmpty(other._value); + return StringSegment.IsNullOrEmpty(other._value); } if (_value[0] == '"') { // We have a quoted string, so we need to do case-sensitive comparison. - return (string.CompareOrdinal(_value, other._value) == 0); + return (_value.Equals(other._value, StringComparison.Ordinal)); } else { - return (string.Compare(_value, other._value, StringComparison.OrdinalIgnoreCase) == 0); + return (_value.Equals(other._value, StringComparison.OrdinalIgnoreCase)); } } - public static NameValueHeaderValue Parse(string input) + public static NameValueHeaderValue Parse(StringSegment input) { var index = 0; return SingleValueParser.ParseValue(input, ref index); } - public static bool TryParse(string input, out NameValueHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out NameValueHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); @@ -175,11 +176,11 @@ namespace Microsoft.Net.Http.Headers public override string ToString() { - if (!string.IsNullOrEmpty(_value)) + if (!StringSegment.IsNullOrEmpty(_value)) { return _name + "=" + _value; } - return _name; + return _name.ToString(); } internal static void ToString( @@ -202,7 +203,12 @@ namespace Microsoft.Net.Http.Headers destination.Append(separator); destination.Append(' '); } - destination.Append(values[i].ToString()); + destination.Append(values[i].Name); + if (!StringSegment.IsNullOrEmpty(values[i].Value)) + { + destination.Append('='); + destination.Append(values[i].Value); + } } } @@ -235,14 +241,14 @@ namespace Microsoft.Net.Http.Headers return result; } - private static int GetNameValueLength(string input, int startIndex, out NameValueHeaderValue parsedValue) + private static int GetNameValueLength(StringSegment input, int startIndex, out NameValueHeaderValue parsedValue) { Contract.Requires(input != null); Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } @@ -256,7 +262,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - var name = input.Substring(startIndex, nameLength); + var name = input.Subsegment(startIndex, nameLength); var current = startIndex + nameLength; current = current + HttpRuleParser.GetWhitespaceLength(input, current); @@ -280,7 +286,7 @@ namespace Microsoft.Net.Http.Headers // Use parameterless ctor to avoid double-parsing of name and value, i.e. skip public ctor validation. parsedValue = new NameValueHeaderValue(); parsedValue._name = name; - parsedValue._value = input.Substring(current, valueLength); + parsedValue._value = input.Subsegment(current, valueLength); current = current + valueLength; current = current + HttpRuleParser.GetWhitespaceLength(input, current); // skip whitespaces return current - startIndex; @@ -289,7 +295,7 @@ namespace Microsoft.Net.Http.Headers // Returns the length of a name/value list, separated by 'delimiter'. E.g. "a=b, c=d, e=f" adds 3 // name/value pairs to 'nameValueCollection' if 'delimiter' equals ','. internal static int GetNameValueListLength( - string input, + StringSegment input, int startIndex, char delimiter, IList nameValueCollection) @@ -297,7 +303,7 @@ namespace Microsoft.Net.Http.Headers Contract.Requires(nameValueCollection != null); Contract.Requires(startIndex >= 0); - if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) + if ((StringSegment.IsNullOrEmpty(input)) || (startIndex >= input.Length)) { return 0; } @@ -330,7 +336,7 @@ namespace Microsoft.Net.Http.Headers } } - public static NameValueHeaderValue Find(IList values, string name) + public static NameValueHeaderValue Find(IList values, StringSegment name) { Contract.Requires((name != null) && (name.Length > 0)); @@ -342,7 +348,7 @@ namespace Microsoft.Net.Http.Headers for (var i = 0; i < values.Count; i++) { var value = values[i]; - if (string.Compare(value.Name, name, StringComparison.OrdinalIgnoreCase) == 0) + if (value.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) { return value; } @@ -350,7 +356,7 @@ namespace Microsoft.Net.Http.Headers return null; } - internal static int GetValueLength(string input, int startIndex) + internal static int GetValueLength(StringSegment input, int startIndex) { Contract.Requires(input != null); @@ -373,16 +379,16 @@ namespace Microsoft.Net.Http.Headers return valueLength; } - private static void CheckNameValueFormat(string name, string value) + private static void CheckNameValueFormat(StringSegment name, StringSegment value) { HeaderUtilities.CheckValidToken(name, nameof(name)); CheckValueFormat(value); } - private static void CheckValueFormat(string value) + private static void CheckValueFormat(StringSegment value) { // Either value is null/empty or a valid token/quoted string - if (!(string.IsNullOrEmpty(value) || (GetValueLength(value, 0) == value.Length))) + if (!(StringSegment.IsNullOrEmpty(value) || (GetValueLength(value, 0) == value.Length))) { throw new FormatException(string.Format(System.Globalization.CultureInfo.InvariantCulture, "The header value is invalid: '{0}'", value)); } diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index f6d91e1508..db5f876b53 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -11,7 +11,7 @@ namespace Microsoft.Net.Http.Headers // type to throw if 'null' gets added. Collection internally uses List which comes at some cost. In addition // Collection.Add() calls List.InsertItem() which is an O(n) operation (compared to O(1) for List.Add()). // This type is only used for very small collections (1-2 items) to keep the impact of using Collection small. - internal class ObjectCollection : Collection where T : class + internal class ObjectCollection : Collection { internal static readonly Action DefaultValidator = CheckNotNull; internal static readonly ObjectCollection EmptyReadOnlyCollection diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs index 4960e4beab..f1ebee276c 100644 --- a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics.Contracts; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -85,26 +86,26 @@ namespace Microsoft.Net.Http.Headers return _entityTag.GetHashCode(); } - public static RangeConditionHeaderValue Parse(string input) + public static RangeConditionHeaderValue Parse(StringSegment input) { var index = 0; return Parser.ParseValue(input, ref index); } - public static bool TryParse(string input, out RangeConditionHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out RangeConditionHeaderValue parsedValue) { var index = 0; return Parser.TryParseValue(input, ref index, out parsedValue); } - private static int GetRangeConditionLength(string input, int startIndex, out RangeConditionHeaderValue parsedValue) + private static int GetRangeConditionLength(StringSegment input, int startIndex, out RangeConditionHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; // Make sure we have at least 2 characters - if (string.IsNullOrEmpty(input) || (startIndex + 1 >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex + 1 >= input.Length)) { return 0; } @@ -141,7 +142,7 @@ namespace Microsoft.Net.Http.Headers } else { - if (!HttpRuleParser.TryStringToDate(input.Substring(current), out date)) + if (!HttpRuleParser.TryStringToDate(input.Subsegment(current), out date)) { return 0; } diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs index 3657e24c27..934b6b6cc1 100644 --- a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -13,7 +14,7 @@ namespace Microsoft.Net.Http.Headers private static readonly HttpHeaderParser Parser = new GenericHeaderParser(false, GetRangeLength); - private string _unit; + private StringSegment _unit; private ICollection _ranges; public RangeHeaderValue() @@ -28,7 +29,7 @@ namespace Microsoft.Net.Http.Headers Ranges.Add(new RangeItemHeaderValue(from, to)); } - public string Unit + public StringSegment Unit { get { return _unit; } set @@ -52,7 +53,8 @@ namespace Microsoft.Net.Http.Headers public override string ToString() { - var sb = new StringBuilder(_unit); + var sb = new StringBuilder(); + sb.Append(_unit); sb.Append('='); var first = true; @@ -84,13 +86,13 @@ namespace Microsoft.Net.Http.Headers return false; } - return (string.Compare(_unit, other._unit, StringComparison.OrdinalIgnoreCase) == 0) && + return StringSegment.Equals(_unit, other._unit, StringComparison.OrdinalIgnoreCase) && HeaderUtilities.AreEqualCollections(Ranges, other.Ranges); } public override int GetHashCode() { - var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_unit); + var result = StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_unit); foreach (var range in Ranges) { @@ -100,25 +102,25 @@ namespace Microsoft.Net.Http.Headers return result; } - public static RangeHeaderValue Parse(string input) + public static RangeHeaderValue Parse(StringSegment input) { var index = 0; return Parser.ParseValue(input, ref index); } - public static bool TryParse(string input, out RangeHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out RangeHeaderValue parsedValue) { var index = 0; return Parser.TryParseValue(input, ref index, out parsedValue); } - private static int GetRangeLength(string input, int startIndex, out RangeHeaderValue parsedValue) + private static int GetRangeLength(StringSegment input, int startIndex, out RangeHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } @@ -132,7 +134,7 @@ namespace Microsoft.Net.Http.Headers } RangeHeaderValue result = new RangeHeaderValue(); - result._unit = input.Substring(startIndex, unitLength); + result._unit = input.Subsegment(startIndex, unitLength); var current = startIndex + unitLength; current = current + HttpRuleParser.GetWhitespaceLength(input, current); diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index 866d4b8e8b..99fdbfef5c 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -87,7 +88,7 @@ namespace Microsoft.Net.Http.Headers // Returns the length of a range list. E.g. "1-2, 3-4, 5-6" adds 3 ranges to 'rangeCollection'. Note that empty // list segments are allowed, e.g. ",1-2, , 3-4,,". internal static int GetRangeItemListLength( - string input, + StringSegment input, int startIndex, ICollection rangeCollection) { @@ -96,7 +97,7 @@ namespace Microsoft.Net.Http.Headers Contract.Ensures((Contract.Result() == 0) || (rangeCollection.Count > 0), "If we can parse the string, then we expect to have at least one range item."); - if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) + if ((StringSegment.IsNullOrEmpty(input)) || (startIndex >= input.Length)) { return 0; } @@ -140,7 +141,7 @@ namespace Microsoft.Net.Http.Headers } } - internal static int GetRangeItemLength(string input, int startIndex, out RangeItemHeaderValue parsedValue) + internal static int GetRangeItemLength(StringSegment input, int startIndex, out RangeItemHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); @@ -148,7 +149,7 @@ namespace Microsoft.Net.Http.Headers parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } @@ -202,14 +203,14 @@ namespace Microsoft.Net.Http.Headers // Try convert first value to int64 long from = 0; - if ((fromLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(fromStartIndex, fromLength), out from)) + if ((fromLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Subsegment(fromStartIndex, fromLength), out from)) { return 0; } // Try convert second value to int64 long to = 0; - if ((toLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Substring(toStartIndex, toLength), out to)) + if ((toLength > 0) && !HeaderUtilities.TryParseNonNegativeInt64(input.Subsegment(toStartIndex, toLength), out to)) { return 0; } diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 10c68bb5b1..f3477648de 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -31,20 +31,20 @@ namespace Microsoft.Net.Http.Headers private static readonly HttpHeaderParser MultipleValueParser = new GenericHeaderParser(true, GetSetCookieLength); - private string _name; - private string _value; + private StringSegment _name; + private StringSegment _value; private SetCookieHeaderValue() { // Used by the parser to create a new instance of this type. } - public SetCookieHeaderValue(string name) - : this(name, string.Empty) + public SetCookieHeaderValue(StringSegment name) + : this(name, StringSegment.Empty) { } - public SetCookieHeaderValue(string name, string value) + public SetCookieHeaderValue(StringSegment name, StringSegment value) { if (name == null) { @@ -60,7 +60,7 @@ namespace Microsoft.Net.Http.Headers Value = value; } - public string Name + public StringSegment Name { get { return _name; } set @@ -70,7 +70,7 @@ namespace Microsoft.Net.Http.Headers } } - public string Value + public StringSegment Value { get { return _value; } set @@ -84,10 +84,9 @@ namespace Microsoft.Net.Http.Headers public TimeSpan? MaxAge { get; set; } - public string Domain { get; set; } + public StringSegment Domain { get; set; } - // TODO: PathString? - public string Path { get; set; } + public StringSegment Path { get; set; } public bool Secure { get; set; } @@ -186,7 +185,7 @@ namespace Microsoft.Net.Http.Headers return sb.ToString(); } - private static void AppendSegment(ref InplaceStringBuilder builder, string name, string value) + private static void AppendSegment(ref InplaceStringBuilder builder, StringSegment name, StringSegment value) { builder.Append(SeparatorToken); builder.Append(name); @@ -247,7 +246,7 @@ namespace Microsoft.Net.Http.Headers } } - private static void AppendSegment(StringBuilder builder, string name, string value) + private static void AppendSegment(StringBuilder builder, StringSegment name, StringSegment value) { builder.Append("; "); builder.Append(name); @@ -258,13 +257,13 @@ namespace Microsoft.Net.Http.Headers } } - public static SetCookieHeaderValue Parse(string input) + public static SetCookieHeaderValue Parse(StringSegment input) { var index = 0; return SingleValueParser.ParseValue(input, ref index); } - public static bool TryParse(string input, out SetCookieHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out SetCookieHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); @@ -291,14 +290,14 @@ namespace Microsoft.Net.Http.Headers } // name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; samesite={Strict|Lax}; httponly - private static int GetSetCookieLength(string input, int startIndex, out SetCookieHeaderValue parsedValue) + private static int GetSetCookieLength(StringSegment input, int startIndex, out SetCookieHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); var offset = startIndex; parsedValue = null; - if (string.IsNullOrEmpty(input) || (offset >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (offset >= input.Length)) { return 0; } @@ -315,7 +314,7 @@ namespace Microsoft.Net.Http.Headers { return 0; } - result._name = input.Substring(offset, itemLength); + result._name = input.Subsegment(offset, itemLength); offset += itemLength; // = (no spaces) @@ -352,11 +351,11 @@ namespace Microsoft.Net.Http.Headers // Trailing ';' or leading into garbage. Let the next parser fail. break; } - var token = input.Substring(offset, itemLength); + var token = input.Subsegment(offset, itemLength); offset += itemLength; // expires-av = "Expires=" sane-cookie-date - if (string.Equals(token, ExpiresToken, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(token, ExpiresToken, StringComparison.OrdinalIgnoreCase)) { // = (no spaces) if (!ReadEqualsSign(input, ref offset)) @@ -373,7 +372,7 @@ namespace Microsoft.Net.Http.Headers result.Expires = expirationDate; } // max-age-av = "Max-Age=" non-zero-digit *DIGIT - else if (string.Equals(token, MaxAgeToken, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(token, MaxAgeToken, StringComparison.OrdinalIgnoreCase)) { // = (no spaces) if (!ReadEqualsSign(input, ref offset)) @@ -386,7 +385,7 @@ namespace Microsoft.Net.Http.Headers { return 0; } - var numberString = input.Substring(offset, itemLength); + var numberString = input.Subsegment(offset, itemLength); long maxAge; if (!HeaderUtilities.TryParseNonNegativeInt64(numberString, out maxAge)) { @@ -398,7 +397,7 @@ namespace Microsoft.Net.Http.Headers } // domain-av = "Domain=" domain-value // domain-value = ; defined in [RFC1034], Section 3.5, as enhanced by [RFC1123], Section 2.1 - else if (string.Equals(token, DomainToken, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(token, DomainToken, StringComparison.OrdinalIgnoreCase)) { // = (no spaces) if (!ReadEqualsSign(input, ref offset)) @@ -410,7 +409,7 @@ namespace Microsoft.Net.Http.Headers } // path-av = "Path=" path-value // path-value = - else if (string.Equals(token, PathToken, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(token, PathToken, StringComparison.OrdinalIgnoreCase)) { // = (no spaces) if (!ReadEqualsSign(input, ref offset)) @@ -421,13 +420,13 @@ namespace Microsoft.Net.Http.Headers result.Path = ReadToSemicolonOrEnd(input, ref offset); } // secure-av = "Secure" - else if (string.Equals(token, SecureToken, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(token, SecureToken, StringComparison.OrdinalIgnoreCase)) { result.Secure = true; } // samesite-av = "SameSite" / "SameSite=" samesite-value // samesite-value = "Strict" / "Lax" - else if (string.Equals(token, SameSiteToken, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(token, SameSiteToken, StringComparison.OrdinalIgnoreCase)) { if (!ReadEqualsSign(input, ref offset)) { @@ -437,7 +436,7 @@ namespace Microsoft.Net.Http.Headers { var enforcementMode = ReadToSemicolonOrEnd(input, ref offset); - if (string.Equals(enforcementMode, SameSiteLaxToken, StringComparison.OrdinalIgnoreCase)) + if (StringSegment.Equals(enforcementMode, SameSiteLaxToken, StringComparison.OrdinalIgnoreCase)) { result.SameSite = SameSiteMode.Lax; } @@ -448,7 +447,7 @@ namespace Microsoft.Net.Http.Headers } } // httponly-av = "HttpOnly" - else if (string.Equals(token, HttpOnlyToken, StringComparison.OrdinalIgnoreCase)) + else if (StringSegment.Equals(token, HttpOnlyToken, StringComparison.OrdinalIgnoreCase)) { result.HttpOnly = true; } @@ -463,7 +462,7 @@ namespace Microsoft.Net.Http.Headers return offset - startIndex; } - private static bool ReadEqualsSign(string input, ref int offset) + private static bool ReadEqualsSign(StringSegment input, ref int offset) { // = (no spaces) if (offset >= input.Length || input[offset] != '=') @@ -474,7 +473,7 @@ namespace Microsoft.Net.Http.Headers return true; } - private static string ReadToSemicolonOrEnd(string input, ref int offset) + private static StringSegment ReadToSemicolonOrEnd(StringSegment input, ref int offset) { var end = input.IndexOf(';', offset); if (end < 0) @@ -483,7 +482,7 @@ namespace Microsoft.Net.Http.Headers end = input.Length; } var itemLength = end - offset; - var result = input.Substring(offset, itemLength); + var result = input.Subsegment(offset, itemLength); offset += itemLength; return result; } @@ -497,12 +496,12 @@ namespace Microsoft.Net.Http.Headers return false; } - return string.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) - && string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase) + return StringSegment.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) + && StringSegment.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase) && Expires.Equals(other.Expires) && MaxAge.Equals(other.MaxAge) - && string.Equals(Domain, other.Domain, StringComparison.OrdinalIgnoreCase) - && string.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase) + && StringSegment.Equals(Domain, other.Domain, StringComparison.OrdinalIgnoreCase) + && StringSegment.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase) && Secure == other.Secure && SameSite == other.SameSite && HttpOnly == other.HttpOnly; @@ -510,12 +509,12 @@ namespace Microsoft.Net.Http.Headers public override int GetHashCode() { - return StringComparer.OrdinalIgnoreCase.GetHashCode(_name) - ^ StringComparer.OrdinalIgnoreCase.GetHashCode(_value) + return StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_name) + ^ StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_value) ^ (Expires.HasValue ? Expires.GetHashCode() : 0) ^ (MaxAge.HasValue ? MaxAge.GetHashCode() : 0) - ^ (Domain != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Domain) : 0) - ^ (Path != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Path) : 0) + ^ (Domain != null ? StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(Domain) : 0) + ^ (Path != null ? StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(Path) : 0) ^ Secure.GetHashCode() ^ SameSite.GetHashCode() ^ HttpOnly.GetHashCode(); diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index 13ac4fb15c..deba2d2697 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -15,7 +16,7 @@ namespace Microsoft.Net.Http.Headers private static readonly HttpHeaderParser MultipleValueParser = new GenericHeaderParser(true, GetStringWithQualityLength); - private string _value; + private StringSegment _value; private double? _quality; private StringWithQualityHeaderValue() @@ -23,14 +24,14 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public StringWithQualityHeaderValue(string value) + public StringWithQualityHeaderValue(StringSegment value) { HeaderUtilities.CheckValidToken(value, nameof(value)); _value = value; } - public StringWithQualityHeaderValue(string value, double quality) + public StringWithQualityHeaderValue(StringSegment value, double quality) { HeaderUtilities.CheckValidToken(value, nameof(value)); @@ -43,7 +44,7 @@ namespace Microsoft.Net.Http.Headers _quality = quality; } - public string Value + public StringSegment Value { get { return _value; } } @@ -60,7 +61,7 @@ namespace Microsoft.Net.Http.Headers return _value + "; q=" + _quality.Value.ToString("0.0##", NumberFormatInfo.InvariantInfo); } - return _value; + return _value.ToString(); } public override bool Equals(object obj) @@ -72,7 +73,7 @@ namespace Microsoft.Net.Http.Headers return false; } - if (string.Compare(_value, other._value, StringComparison.OrdinalIgnoreCase) != 0) + if (!StringSegment.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase)) { return false; } @@ -92,7 +93,7 @@ namespace Microsoft.Net.Http.Headers public override int GetHashCode() { - var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_value); + var result = StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_value); if (_quality.HasValue) { @@ -102,13 +103,13 @@ namespace Microsoft.Net.Http.Headers return result; } - public static StringWithQualityHeaderValue Parse(string input) + public static StringWithQualityHeaderValue Parse(StringSegment input) { var index = 0; return SingleValueParser.ParseValue(input, ref index); } - public static bool TryParse(string input, out StringWithQualityHeaderValue parsedValue) + public static bool TryParse(StringSegment input, out StringWithQualityHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); @@ -134,13 +135,13 @@ namespace Microsoft.Net.Http.Headers return MultipleValueParser.TryParseStrictValues(input, out parsedValues); } - private static int GetStringWithQualityLength(string input, int startIndex, out StringWithQualityHeaderValue parsedValue) + private static int GetStringWithQualityLength(StringSegment input, int startIndex, out StringWithQualityHeaderValue parsedValue) { Contract.Requires(startIndex >= 0); parsedValue = null; - if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + if (StringSegment.IsNullOrEmpty(input) || (startIndex >= input.Length)) { return 0; } @@ -154,7 +155,7 @@ namespace Microsoft.Net.Http.Headers } StringWithQualityHeaderValue result = new StringWithQualityHeaderValue(); - result._value = input.Substring(startIndex, valueLength); + result._value = input.Subsegment(startIndex, valueLength); var current = startIndex + valueLength; current = current + HttpRuleParser.GetWhitespaceLength(input, current); @@ -177,7 +178,7 @@ namespace Microsoft.Net.Http.Headers return current - startIndex; } - private static bool TryReadQuality(string input, StringWithQualityHeaderValue result, ref int index) + private static bool TryReadQuality(StringSegment input, StringWithQualityHeaderValue result, ref int index) { var current = index; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 0d092ec19d..961cc07841 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { @@ -64,13 +65,13 @@ namespace Microsoft.Net.Http.Headers return 1; } - if (!string.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) + if (!StringSegment.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) { - if (string.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) + if (StringSegment.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) { return -1; } - else if (string.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) + else if (StringSegment.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) { return 1; } diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index 89b1ab0f10..17f9623347 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -46,8 +46,8 @@ namespace Microsoft.Net.Http.Headers var contentDisposition = new ContentDispositionHeaderValue("inline"); Assert.Equal("inline", contentDisposition.DispositionType); Assert.Equal(0, contentDisposition.Parameters.Count); - Assert.Null(contentDisposition.Name); - Assert.Null(contentDisposition.FileName); + Assert.Null(contentDisposition.Name.Value); + Assert.Null(contentDisposition.FileName.Value); Assert.Null(contentDisposition.CreationDate); Assert.Null(contentDisposition.ModificationDate); Assert.Null(contentDisposition.ReadDate); @@ -81,7 +81,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("name", contentDisposition.Parameters.First().Name); contentDisposition.Name = null; - Assert.Null(contentDisposition.Name); + Assert.Null(contentDisposition.Name.Value); Assert.Equal(0, contentDisposition.Parameters.Count); contentDisposition.Name = null; // It's OK to set it again to null; no exception. } @@ -103,7 +103,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("NAME", contentDisposition.Parameters.First().Name); contentDisposition.Parameters.Remove(name); - Assert.Null(contentDisposition.Name); + Assert.Null(contentDisposition.Name.Value); } [Fact] @@ -123,7 +123,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); contentDisposition.Parameters.Remove(fileName); - Assert.Null(contentDisposition.FileName); + Assert.Null(contentDisposition.FileName.Value); } [Fact] @@ -138,7 +138,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("\"=?utf-8?B?RmlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.Parameters.First().Value); contentDisposition.Parameters.Remove(contentDisposition.Parameters.First()); - Assert.Null(contentDisposition.FileName); + Assert.Null(contentDisposition.FileName.Value); } [Fact] @@ -160,7 +160,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); contentDisposition.Parameters.Remove(fileName); - Assert.Null(contentDisposition.FileName); + Assert.Null(contentDisposition.FileName.Value); } [Fact] @@ -173,7 +173,7 @@ namespace Microsoft.Net.Http.Headers contentDisposition.Parameters.Add(fileNameStar); Assert.Equal(1, contentDisposition.Parameters.Count); Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); - Assert.Null(contentDisposition.FileNameStar); // Decode failure + Assert.Null(contentDisposition.FileNameStar.Value); // Decode failure contentDisposition.FileNameStar = "new_name"; Assert.Equal("new_name", contentDisposition.FileNameStar); @@ -182,7 +182,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("UTF-8\'\'new_name", contentDisposition.Parameters.First().Value); contentDisposition.Parameters.Remove(fileNameStar); - Assert.Null(contentDisposition.FileNameStar); + Assert.Null(contentDisposition.FileNameStar.Value); } [Fact] @@ -197,7 +197,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("UTF-8\'\'File%C3%83Name.bat", contentDisposition.Parameters.First().Value); contentDisposition.Parameters.Remove(contentDisposition.Parameters.First()); - Assert.Null(contentDisposition.FileNameStar); + Assert.Null(contentDisposition.FileNameStar.Value); } [Fact] @@ -211,7 +211,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(1, contentDisposition.Parameters.Count); Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); Assert.Equal("utf-99'lang'File%CZName.bat", contentDisposition.Parameters.First().Value); - Assert.Null(contentDisposition.FileNameStar); // Decode failure + Assert.Null(contentDisposition.FileNameStar.Value); // Decode failure contentDisposition.FileNameStar = "new_name"; Assert.Equal("new_name", contentDisposition.FileNameStar); @@ -219,7 +219,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); contentDisposition.Parameters.Remove(fileNameStar); - Assert.Null(contentDisposition.FileNameStar); + Assert.Null(contentDisposition.FileNameStar.Value); } [Fact] diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 0a72951240..1d5c9e9f65 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -45,7 +45,7 @@ namespace Microsoft.Net.Http.Headers var mediaType = new MediaTypeHeaderValue("text/plain"); Assert.Equal("text/plain", mediaType.MediaType); Assert.Equal(0, mediaType.Parameters.Count); - Assert.Null(mediaType.Charset); + Assert.Null(mediaType.Charset.Value); } [Fact] @@ -70,7 +70,7 @@ namespace Microsoft.Net.Http.Headers var mediaType0 = new MediaTypeHeaderValue("text/plain"); var mediaType1 = mediaType0.Copy(); Assert.NotSame(mediaType0, mediaType1); - Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.Same(mediaType0.MediaType.Value, mediaType1.MediaType.Value); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); } @@ -81,7 +81,7 @@ namespace Microsoft.Net.Http.Headers var mediaType0 = new MediaTypeHeaderValue("text/plain"); var mediaType1 = mediaType0.CopyAsReadOnly(); Assert.NotSame(mediaType0, mediaType1); - Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.Same(mediaType0.MediaType.Value, mediaType1.MediaType.Value); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); @@ -97,14 +97,14 @@ namespace Microsoft.Net.Http.Headers mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); var mediaType1 = mediaType0.Copy(); Assert.NotSame(mediaType0, mediaType1); - Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.Same(mediaType0.MediaType.Value, mediaType1.MediaType.Value); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); var pair0 = mediaType0.Parameters.First(); var pair1 = mediaType1.Parameters.First(); Assert.NotSame(pair0, pair1); - Assert.Same(pair0.Name, pair1.Name); - Assert.Same(pair0.Value, pair1.Value); + Assert.Same(pair0.Name.Value, pair1.Name.Value); + Assert.Same(pair0.Value.Value, pair1.Value.Value); } [Fact] @@ -116,7 +116,7 @@ namespace Microsoft.Net.Http.Headers Assert.NotSame(mediaType0, mediaType1); Assert.False(mediaType0.IsReadOnly); Assert.True(mediaType1.IsReadOnly); - Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.Same(mediaType0.MediaType.Value, mediaType1.MediaType.Value); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); Assert.False(mediaType0.Parameters.IsReadOnly); @@ -131,8 +131,8 @@ namespace Microsoft.Net.Http.Headers Assert.NotSame(pair0, pair1); Assert.False(pair0.IsReadOnly); Assert.True(pair1.IsReadOnly); - Assert.Same(pair0.Name, pair1.Name); - Assert.Same(pair0.Value, pair1.Value); + Assert.Same(pair0.Name.Value, pair1.Name.Value); + Assert.Same(pair0.Value.Value, pair1.Value.Value); } [Fact] @@ -144,7 +144,7 @@ namespace Microsoft.Net.Http.Headers var mediaType2 = mediaType1.Copy(); Assert.NotSame(mediaType2, mediaType1); - Assert.Same(mediaType2.MediaType, mediaType1.MediaType); + Assert.Same(mediaType2.MediaType.Value, mediaType1.MediaType.Value); Assert.True(mediaType1.IsReadOnly); Assert.False(mediaType2.IsReadOnly); Assert.NotSame(mediaType2.Parameters, mediaType1.Parameters); @@ -154,8 +154,8 @@ namespace Microsoft.Net.Http.Headers Assert.NotSame(pair2, pair1); Assert.True(pair1.IsReadOnly); Assert.False(pair2.IsReadOnly); - Assert.Same(pair2.Name, pair1.Name); - Assert.Same(pair2.Value, pair1.Value); + Assert.Same(pair2.Name.Value, pair1.Name.Value); + Assert.Same(pair2.Value.Value, pair1.Value.Value); } [Fact] @@ -178,7 +178,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("charset", mediaType.Parameters.First().Name); mediaType.Charset = null; - Assert.Null(mediaType.Charset); + Assert.Null(mediaType.Charset.Value); Assert.Equal(0, mediaType.Parameters.Count); mediaType.Charset = null; // It's OK to set it again to null; no exception. } @@ -200,7 +200,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("CHARSET", mediaType.Parameters.First().Name); mediaType.Parameters.Remove(charset); - Assert.Null(mediaType.Charset); + Assert.Null(mediaType.Charset.Value); } [Fact] diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index 9a8396f79d..8310fa2864 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -65,14 +65,14 @@ namespace Microsoft.Net.Http.Headers var pair0 = new NameValueHeaderValue("name"); var pair1 = pair0.Copy(); Assert.NotSame(pair0, pair1); - Assert.Same(pair0.Name, pair1.Name); - Assert.Null(pair0.Value); - Assert.Null(pair1.Value); + Assert.Same(pair0.Name.Value, pair1.Name.Value); + Assert.Null(pair0.Value.Value); + Assert.Null(pair1.Value.Value); // Change one value and verify the other is unchanged. pair0.Value = "othervalue"; Assert.Equal("othervalue", pair0.Value); - Assert.Null(pair1.Value); + Assert.Null(pair1.Value.Value); } [Fact] @@ -81,16 +81,16 @@ namespace Microsoft.Net.Http.Headers var pair0 = new NameValueHeaderValue("name"); var pair1 = pair0.CopyAsReadOnly(); Assert.NotSame(pair0, pair1); - Assert.Same(pair0.Name, pair1.Name); - Assert.Null(pair0.Value); - Assert.Null(pair1.Value); + Assert.Same(pair0.Name.Value, pair1.Name.Value); + Assert.Null(pair0.Value.Value); + Assert.Null(pair1.Value.Value); Assert.False(pair0.IsReadOnly); Assert.True(pair1.IsReadOnly); // Change one value and verify the other is unchanged. pair0.Value = "othervalue"; Assert.Equal("othervalue", pair0.Value); - Assert.Null(pair1.Value); + Assert.Null(pair1.Value.Value); Assert.Throws(() => { pair1.Value = "othervalue"; }); } @@ -100,8 +100,8 @@ namespace Microsoft.Net.Http.Headers var pair0 = new NameValueHeaderValue("name", "value"); var pair1 = pair0.Copy(); Assert.NotSame(pair0, pair1); - Assert.Same(pair0.Name, pair1.Name); - Assert.Same(pair0.Value, pair1.Value); + Assert.Same(pair0.Name.Value, pair1.Name.Value); + Assert.Same(pair0.Value.Value, pair1.Value.Value); // Change one value and verify the other is unchanged. pair0.Value = "othervalue"; @@ -115,8 +115,8 @@ namespace Microsoft.Net.Http.Headers var pair0 = new NameValueHeaderValue("name", "value"); var pair1 = pair0.CopyAsReadOnly(); Assert.NotSame(pair0, pair1); - Assert.Same(pair0.Name, pair1.Name); - Assert.Same(pair0.Value, pair1.Value); + Assert.Same(pair0.Name.Value, pair1.Name.Value); + Assert.Same(pair0.Value.Value, pair1.Value.Value); Assert.False(pair0.IsReadOnly); Assert.True(pair1.IsReadOnly); @@ -134,8 +134,8 @@ namespace Microsoft.Net.Http.Headers var pair1 = pair0.CopyAsReadOnly(); var pair2 = pair1.Copy(); Assert.NotSame(pair0, pair1); - Assert.Same(pair0.Name, pair1.Name); - Assert.Same(pair0.Value, pair1.Value); + Assert.Same(pair0.Name.Value, pair1.Name.Value); + Assert.Same(pair0.Value.Value, pair1.Value.Value); // Change one value and verify the other is unchanged. pair2.Value = "othervalue"; From 9428d1778d4e10e6828d2d5bab0d3b6a41c39974 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 24 May 2017 11:48:05 -0700 Subject: [PATCH 690/846] Upgrade corefx packages to 4.4.0 --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index 802cc3bfc8..dba7afd01e 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,7 +1,7 @@ 2.0.0-* - 4.3.0 + 4.4.0-* 2.1.0-* $(BundledNETStandardPackageVersion) 2.0.0-* From b1f92fb6bc42b2cdbb62bd930cedaebafece1e0a Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 25 May 2017 18:26:36 -0700 Subject: [PATCH 691/846] Forbid + obsolete context.Authentication --- .../AuthenticationHttpContextExtensions.cs | 15 +----- .../AuthenticationOptions.cs | 2 +- .../BaseAuthenticationContext.cs | 41 ---------------- .../BaseContext.cs | 49 ------------------- .../ChallengeBehavior.cs | 15 ------ .../ChallengeContext.cs | 45 ----------------- .../IAuthenticationHandler.cs | 21 +++++--- .../IAuthenticationSchemeProvider.cs | 4 +- .../IAuthenticationService.cs | 12 ++++- .../SignInContext.cs | 37 -------------- .../SignOutContext.cs | 23 --------- .../AuthenticationSchemeProvider.cs | 4 +- .../AuthenticationService.cs | 40 ++++++++++++--- .../HttpContext.cs | 5 +- .../DefaultHttpContext.cs | 6 +++ .../TokenExtensionTests.cs | 17 ++++--- .../DefaultAuthenticationManagerTests.cs | 2 + .../DefaultHttpContextTests.cs | 4 ++ 18 files changed, 91 insertions(+), 251 deletions(-) delete mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs delete mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs delete mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs delete mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs delete mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs delete mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs index 238251a60d..cb8f1fb480 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs @@ -64,18 +64,7 @@ namespace Microsoft.AspNetCore.Authentication /// The properties. /// The task. public static Task ChallengeAsync(this HttpContext context, string scheme, AuthenticationProperties properties) => - context.ChallengeAsync(scheme, properties: properties, behavior: ChallengeBehavior.Automatic); - - /// - /// Extension method for Challenge. - /// - /// The context. - /// The name of the authentication scheme. - /// The properties. - /// The behavior. - /// The task. - public static Task ChallengeAsync(this HttpContext context, string scheme, AuthenticationProperties properties, ChallengeBehavior behavior) => - context.RequestServices.GetRequiredService().ChallengeAsync(context, scheme, properties, behavior); + context.RequestServices.GetRequiredService().ChallengeAsync(context, scheme, properties); /// /// Extension method for Forbid. @@ -111,7 +100,7 @@ namespace Microsoft.AspNetCore.Authentication /// The properties. /// The task. public static Task ForbidAsync(this HttpContext context, string scheme, AuthenticationProperties properties) => - context.RequestServices.GetRequiredService().ChallengeAsync(context, scheme, properties, ChallengeBehavior.Forbidden); + context.RequestServices.GetRequiredService().ForbidAsync(context, scheme, properties); /// /// Extension method for SignIn. diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs index 4d90d3d6f2..08df75a2ad 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs @@ -58,7 +58,7 @@ namespace Microsoft.AspNetCore.Authentication public string DefaultSignInScheme { get; set; } /// - /// Used by as the default scheme by . + /// Used by as the default scheme by . /// public string DefaultChallengeScheme { get; set; } } diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs deleted file mode 100644 index cfe5809c5a..0000000000 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseAuthenticationContext.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.Authentication -{ - /// - /// Base context for authentication. - /// - public abstract class BaseAuthenticationContext : BaseContext - { - /// - /// Constructor. - /// - /// The context. - /// The name of the scheme. - /// The properties. - protected BaseAuthenticationContext(HttpContext context, string authenticationScheme, AuthenticationProperties properties) : base(context) - { - if (string.IsNullOrEmpty(authenticationScheme)) - { - throw new ArgumentException(nameof(authenticationScheme)); - } - - AuthenticationScheme = authenticationScheme; - Properties = properties ?? new AuthenticationProperties(); - } - - /// - /// The name of the scheme. - /// - public string AuthenticationScheme { get; } - - /// - /// Contains the extra meta-data arriving with the authentication. May be altered. - /// - public AuthenticationProperties Properties { get; protected set; } - } -} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs deleted file mode 100644 index 3d65f0dd75..0000000000 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/BaseContext.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.Authentication -{ - /// - /// Base class used by other context classes. - /// - public abstract class BaseContext - { - /// - /// Constructor. - /// - /// The request context. - protected BaseContext(HttpContext context) - { - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } - - HttpContext = context; - } - - /// - /// The context. - /// - public HttpContext HttpContext { get; } - - /// - /// The request. - /// - public HttpRequest Request - { - get { return HttpContext.Request; } - } - - /// - /// The response. - /// - public HttpResponse Response - { - get { return HttpContext.Response; } - } - } -} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs deleted file mode 100644 index 1506021dd4..0000000000 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeBehavior.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNetCore.Authentication -{ - /// - /// Controls how challenge will behave (i.e. 401 vs 403). - /// - public enum ChallengeBehavior - { - Automatic, - Unauthorized, - Forbidden - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs deleted file mode 100644 index ee2392eb04..0000000000 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/ChallengeContext.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.Authentication -{ - /// - /// Context used for challenges. - /// - public class ChallengeContext : BaseAuthenticationContext - { - /// - /// Constructor. - /// - /// The context. - /// The name of the scheme. - public ChallengeContext(HttpContext httpContext, string authenticationScheme) - : this(httpContext, authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) - { } - - /// - /// Constructor - /// - /// The context. - /// The name of the scheme. - /// The properties. - /// The challenge behavior. - public ChallengeContext(HttpContext httpContext, string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) - : base(httpContext, authenticationScheme, properties) - { - if (string.IsNullOrEmpty(authenticationScheme)) - { - throw new ArgumentException(nameof(authenticationScheme)); - } - Behavior = behavior; - } - - /// - /// The challenge behavior. - /// - public ChallengeBehavior Behavior { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs index 49d5f498af..af92cc7659 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; @@ -28,22 +29,30 @@ namespace Microsoft.AspNetCore.Authentication /// /// Challenge behavior. /// - /// The context. + /// The that contains the extra meta-data arriving with the authentication. /// A task. - Task ChallengeAsync(ChallengeContext context); + Task ChallengeAsync(AuthenticationProperties properties); + + /// + /// Forbid behavior. + /// + /// The that contains the extra meta-data arriving with the authentication. + /// A task. + Task ForbidAsync(AuthenticationProperties properties); /// /// Handle sign in. /// - /// The context. + /// The user. + /// The that contains the extra meta-data arriving with the authentication. /// A task. - Task SignInAsync(SignInContext context); + Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties); /// /// Signout behavior. /// - /// The context. + /// The that contains the extra meta-data arriving with the authentication. /// A task. - Task SignOutAsync(SignOutContext context); + Task SignOutAsync(AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs index 861f3dda49..5fa08c977a 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs @@ -34,11 +34,11 @@ namespace Microsoft.AspNetCore.Authentication Task GetDefaultAuthenticateSchemeAsync(); /// - /// Returns the scheme that will be used by default for . + /// Returns the scheme that will be used by default for . /// This is typically specified via . /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. /// - /// The scheme that will be used by default for . + /// The scheme that will be used by default for . Task GetDefaultChallengeSchemeAsync(); /// diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs index ec54325ea4..e5d5336016 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs @@ -26,9 +26,17 @@ namespace Microsoft.AspNetCore.Authentication /// The . /// The name of the authentication scheme. /// The . - /// The . /// A task. - Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties, ChallengeBehavior behavior); + Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties); + + /// + /// Forbids the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The . + /// A task. + Task ForbidAsync(HttpContext context, string scheme, AuthenticationProperties properties); /// /// Sign a principal in for the specified authentication scheme. diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs deleted file mode 100644 index e89b663a7d..0000000000 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/SignInContext.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Security.Claims; -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.Authentication -{ - /// - /// Context used for sign out. - /// - public class SignInContext : BaseAuthenticationContext - { - /// - /// Constructor. - /// - /// The context. - /// The name of the authentication scheme. - /// The user to sign in. - /// The properties. - public SignInContext(HttpContext context, string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties) - : base(context, authenticationScheme, properties) - { - if (principal == null) - { - throw new ArgumentNullException(nameof(principal)); - } - Principal = principal; - } - - /// - /// The user to sign in. - /// - public ClaimsPrincipal Principal { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs deleted file mode 100644 index 307a3af875..0000000000 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/SignOutContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.Authentication -{ - /// - /// Context used to sign out. - /// - public class SignOutContext : BaseAuthenticationContext - { - /// - /// Constructor. - /// - /// The context. - /// The name of the authentication scheme. - /// The properties. - public SignOutContext(HttpContext context, string authenticationScheme, AuthenticationProperties properties) - : base(context, authenticationScheme, properties) - { } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs index 91e68f2ca0..2ce3801b5b 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs @@ -57,11 +57,11 @@ namespace Microsoft.AspNetCore.Authentication } /// - /// Returns the scheme that will be used by default for . + /// Returns the scheme that will be used by default for . /// This is typically specified via . /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. /// - /// The scheme that will be used by default for . + /// The scheme that will be used by default for . public Task GetDefaultChallengeSchemeAsync() { if (_options.DefaultChallengeScheme != null) diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index 9196e62cf6..326b277f9c 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -80,9 +80,8 @@ namespace Microsoft.AspNetCore.Authentication /// The . /// The name of the authentication scheme. /// The . - /// The . /// A task. - public virtual async Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties, ChallengeBehavior behavior) + public virtual async Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties) { if (scheme == null) { @@ -100,8 +99,35 @@ namespace Microsoft.AspNetCore.Authentication throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); } - var challengeContext = new ChallengeContext(context, scheme, properties, behavior); - await handler.ChallengeAsync(challengeContext); + await handler.ChallengeAsync(properties); + } + + /// + /// Forbid the specified authentication scheme. + /// + /// The . + /// The name of the authentication scheme. + /// The . + /// A task. + public virtual async Task ForbidAsync(HttpContext context, string scheme, AuthenticationProperties properties) + { + if (scheme == null) + { + var defaultChallengeScheme = await Schemes.GetDefaultChallengeSchemeAsync(); + scheme = defaultChallengeScheme?.Name; + if (scheme == null) + { + throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultChallengeScheme found."); + } + } + + var handler = await Handlers.GetHandlerAsync(context, scheme); + if (handler == null) + { + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + } + + await handler.ForbidAsync(properties); } /// @@ -135,8 +161,7 @@ namespace Microsoft.AspNetCore.Authentication throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); } - var signInContext = new SignInContext(context, scheme, principal, properties); - await handler.SignInAsync(signInContext); + await handler.SignInAsync(principal, properties); } /// @@ -159,8 +184,7 @@ namespace Microsoft.AspNetCore.Authentication throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); } - var signOutContext = new SignOutContext(context, scheme, properties); - await handler.SignOutAsync(signOutContext); + await handler.SignOutAsync(properties); } } } diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs index 7f72dcd8bb..60c938db0a 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs @@ -41,8 +41,11 @@ namespace Microsoft.AspNetCore.Http public abstract WebSocketManager WebSockets { get; } /// - /// Gets an object that facilitates authentication for this request. + /// This is obsolete and will be removed in a future version. + /// The recommended alternative is to use Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions. + /// See https://go.microsoft.com/fwlink/?linkid=845470. /// + [Obsolete("This is obsolete and will be removed in a future version. The recommended alternative is to use Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions. See https://go.microsoft.com/fwlink/?linkid=845470.")] public abstract AuthenticationManager Authentication { get; } /// diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs index d1e431c7fa..cdd1263043 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs @@ -111,6 +111,12 @@ namespace Microsoft.AspNetCore.Http public override ConnectionInfo Connection => _connection ?? (_connection = InitializeConnectionInfo()); + /// + /// This is obsolete and will be removed in a future version. + /// The recommended alternative is to use Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions. + /// See https://go.microsoft.com/fwlink/?linkid=845470. + /// + [Obsolete("This is obsolete and will be removed in a future version. The recommended alternative is to use Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions. See https://go.microsoft.com/fwlink/?linkid=845470.")] public override AuthenticationManager Authentication => _authenticationManager ?? (_authenticationManager = InitializeAuthenticationManager()); public override WebSocketManager WebSockets => _websockets ?? (_websockets = InitializeWebSocketManager()); diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs index a203afadf0..d8f25f9509 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs @@ -166,9 +166,14 @@ namespace Microsoft.AspNetCore.Authentication return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(new ClaimsPrincipal(), props, "simple"))); } - public Task ChallengeAsync(ChallengeContext context) + public Task ChallengeAsync(AuthenticationProperties properties) { - return Task.FromResult(0); + throw new NotImplementedException(); + } + + public Task ForbidAsync(AuthenticationProperties properties) + { + throw new NotImplementedException(); } public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) @@ -176,14 +181,14 @@ namespace Microsoft.AspNetCore.Authentication return Task.FromResult(0); } - public Task SignInAsync(SignInContext context) + public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties) { - return Task.FromResult(0); + throw new NotImplementedException(); } - public Task SignOutAsync(SignOutContext context) + public Task SignOutAsync(AuthenticationProperties properties) { - return Task.FromResult(0); + throw new NotImplementedException(); } } diff --git a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 85968a9425..101f2b19eb 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#pragma warning disable CS0618 // Type or member is obsolete using System; using System.Security.Claims; using System.Threading.Tasks; @@ -100,3 +101,4 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal } } } +#pragma warning restore CS0618 // Type or member is obsolete diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index 13b9ee65cc..2327db1ce9 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -191,7 +191,9 @@ namespace Microsoft.AspNetCore.Http TestCachedFeaturesAreNull(context, features); TestCachedFeaturesAreNull(context.Request, features); TestCachedFeaturesAreNull(context.Response, features); +#pragma warning disable CS0618 // Type or member is obsolete TestCachedFeaturesAreNull(context.Authentication, features); +#pragma warning restore CS0618 // Type or member is obsolete TestCachedFeaturesAreNull(context.Connection, features); TestCachedFeaturesAreNull(context.WebSockets, features); } @@ -220,7 +222,9 @@ namespace Microsoft.AspNetCore.Http TestCachedFeaturesAreSet(context, features); TestCachedFeaturesAreSet(context.Request, features); TestCachedFeaturesAreSet(context.Response, features); +#pragma warning disable CS0618 // Type or member is obsolete TestCachedFeaturesAreSet(context.Authentication, features); +#pragma warning restore CS0618 // Type or member is obsolete TestCachedFeaturesAreSet(context.Connection, features); TestCachedFeaturesAreSet(context.WebSockets, features); } From 5b9e129abb1e54ca837ef3566809634823c991f7 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 24 May 2017 12:09:06 -0700 Subject: [PATCH 692/846] React to breaking change latest API Check detects - see PR aspnet/BuildTools#259 and issue aspnet/BuildTools#146 --- .../breakingchanges.netcore.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json new file mode 100644 index 0000000000..ded45f5cc3 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json @@ -0,0 +1,12 @@ +[ + { + "TypeId": "public abstract class Microsoft.AspNetCore.Http.ConnectionInfo", + "MemberId": "public abstract System.String get_Id()", + "Kind": "Addition" + }, + { + "TypeId": "public abstract class Microsoft.AspNetCore.Http.ConnectionInfo", + "MemberId": "public abstract System.Void set_Id(System.String value)", + "Kind": "Addition" + } + ] \ No newline at end of file From c7ba8137a837ad64a608db11c53e4acdc062fede Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Fri, 26 May 2017 12:40:48 -0700 Subject: [PATCH 693/846] Updated to use the latest shared runtime --- build/dependencies.props | 1 + 1 file changed, 1 insertion(+) diff --git a/build/dependencies.props b/build/dependencies.props index dba7afd01e..583adadec1 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -5,6 +5,7 @@ 2.1.0-* $(BundledNETStandardPackageVersion) 2.0.0-* + 2.0.0-* 15.3.0-* 2.3.0-beta2-* From 8bb2d193d784c3bea3f714fa062ecde9b07309a9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 31 May 2017 19:36:39 -0700 Subject: [PATCH 694/846] Branching for rel/2.0.0-preview2 --- NuGet.config | 3 ++- build/dependencies.props | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 6f9f028ca1..c4bc056c4d 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,8 @@  - + + diff --git a/build/dependencies.props b/build/dependencies.props index 583adadec1..aa067830c6 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,6 +1,6 @@ - 2.0.0-* + 2.0.0-preview2-* 4.4.0-* 2.1.0-* $(BundledNETStandardPackageVersion) From ed4db47869cde76dfd5e8f3be484dddef1a78eb5 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 31 May 2017 19:53:20 -0700 Subject: [PATCH 695/846] Updating build scripts to point to 2.0.0-preview2 KoreBuild --- build.ps1 | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.ps1 b/build.ps1 index 5bf0e2c113..3a2476b2b4 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0-preview2.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index b0bcadb579..a40bdb87b1 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0-preview2.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi From 7de909a811806651cd5fae8c0061ea63b42e1a10 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 1 Jun 2017 10:47:04 -0700 Subject: [PATCH 696/846] Updating versions to preview3 --- NuGet.config | 3 ++- version.props | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 6f9f028ca1..4e8a1f6de1 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,8 +1,9 @@  + - \ No newline at end of file + diff --git a/version.props b/version.props index 019fba2829..a327eefab8 100644 --- a/version.props +++ b/version.props @@ -2,6 +2,6 @@ 2.0.0 - preview2 + preview3 \ No newline at end of file From ec36c3d491a8e0b1f4da136864be1092c23b7ce0 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 1 Jun 2017 15:40:54 -0700 Subject: [PATCH 697/846] Bind AuthenticationOptions to config + PathString type converter (#851) --- ...ticationCoreServiceCollectionExtensions.cs | 11 +++++ ...soft.AspNetCore.Authentication.Core.csproj | 1 + .../PathString.cs | 11 +++++ .../ConfigTests.cs | 40 +++++++++++++++++++ .../PathStringTests.cs | 9 +++++ 5 files changed, 72 insertions(+) create mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs index fdf85a9b45..9089761d5d 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs @@ -4,6 +4,8 @@ using System; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options.Infrastructure; namespace Microsoft.Extensions.DependencyInjection { @@ -28,6 +30,7 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddSingleton(); // Can be replaced with scoped ones that use DbContext services.TryAddScoped(); services.TryAddSingleton(); + services.AddTransient, DefaultConfigureOptions>(); return services; } @@ -52,5 +55,13 @@ namespace Microsoft.Extensions.DependencyInjection services.Configure(configureOptions); return services; } + + private class DefaultConfigureOptions : ConfigureDefaultOptions + { + public DefaultConfigureOptions(IConfiguration config) : + base(options => config.GetSection("Microsoft:AspNetCore:Authentication").Bind(options)) + { } + } + } } diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj index 0ceaa4d374..94550732a9 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -15,6 +15,7 @@ + diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 50124e5e47..b82d444220 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.ComponentModel; +using System.Globalization; using System.Text; using Microsoft.AspNetCore.Http.Abstractions; using Microsoft.AspNetCore.Http.Internal; @@ -11,6 +13,7 @@ namespace Microsoft.AspNetCore.Http /// /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string /// + [TypeConverter(typeof(PathStringConverter))] public struct PathString : IEquatable { private static readonly char[] splitChar = { '/' }; @@ -453,4 +456,12 @@ namespace Microsoft.AspNetCore.Http return path.ToString(); } } + + internal class PathStringConverter : TypeConverter + { + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + return new PathString((string)value); + } + } } diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs new file mode 100644 index 0000000000..31c3ee50cc --- /dev/null +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs @@ -0,0 +1,40 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options.Infrastructure; +using Xunit; + +namespace Microsoft.AspNetCore.Authentication +{ + public class ConfigTests + { + [Fact] + public void AddCanBindAgainstDefaultConfig() + { + var dic = new Dictionary + { + {"Microsoft:AspNetCore:Authentication:DefaultSignInScheme", ""}, + {"Microsoft:AspNetCore:Authentication:DefaultAuthenticateScheme", ""}, + {"Microsoft:AspNetCore:Authentication:DefaultChallengeScheme", ""} + }; + var configurationBuilder = new ConfigurationBuilder(); + configurationBuilder.AddInMemoryCollection(dic); + var config = configurationBuilder.Build(); + var services = new ServiceCollection() + .AddOptions() + .AddSingleton, ConfigureDefaults>() + .AddAuthenticationCore() + .AddSingleton(config); + var sp = services.BuildServiceProvider(); + + var options = sp.GetRequiredService>().Value; + Assert.Equal("", options.DefaultAuthenticateScheme); + Assert.Equal("", options.DefaultChallengeScheme); + Assert.Equal("", options.DefaultSignInScheme); + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index 60a1a9b017..365a9de3c3 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.ComponentModel; using Microsoft.AspNetCore.Testing; using Xunit; @@ -205,5 +206,13 @@ namespace Microsoft.AspNetCore.Http Assert.Equal(expected, path.ToUriComponent()); } + + [Fact] + public void PathStringConvertsFromString() + { + var converter = TypeDescriptor.GetConverter(typeof(PathString)); + PathString result = (PathString)converter.ConvertFromInvariantString("/foo"); + Assert.Equal("/foo", result.ToString()); + } } } From a55b818a0725197eb7686834a845fae274b8092e Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 1 Jun 2017 15:40:54 -0700 Subject: [PATCH 698/846] Bind AuthenticationOptions to config + PathString type converter (#851) --- ...ticationCoreServiceCollectionExtensions.cs | 11 +++++ ...soft.AspNetCore.Authentication.Core.csproj | 1 + .../PathString.cs | 11 +++++ .../ConfigTests.cs | 40 +++++++++++++++++++ .../PathStringTests.cs | 9 +++++ 5 files changed, 72 insertions(+) create mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs index fdf85a9b45..9089761d5d 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs @@ -4,6 +4,8 @@ using System; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options.Infrastructure; namespace Microsoft.Extensions.DependencyInjection { @@ -28,6 +30,7 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddSingleton(); // Can be replaced with scoped ones that use DbContext services.TryAddScoped(); services.TryAddSingleton(); + services.AddTransient, DefaultConfigureOptions>(); return services; } @@ -52,5 +55,13 @@ namespace Microsoft.Extensions.DependencyInjection services.Configure(configureOptions); return services; } + + private class DefaultConfigureOptions : ConfigureDefaultOptions + { + public DefaultConfigureOptions(IConfiguration config) : + base(options => config.GetSection("Microsoft:AspNetCore:Authentication").Bind(options)) + { } + } + } } diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj index 0ceaa4d374..94550732a9 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -15,6 +15,7 @@ + diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 50124e5e47..b82d444220 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.ComponentModel; +using System.Globalization; using System.Text; using Microsoft.AspNetCore.Http.Abstractions; using Microsoft.AspNetCore.Http.Internal; @@ -11,6 +13,7 @@ namespace Microsoft.AspNetCore.Http /// /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string /// + [TypeConverter(typeof(PathStringConverter))] public struct PathString : IEquatable { private static readonly char[] splitChar = { '/' }; @@ -453,4 +456,12 @@ namespace Microsoft.AspNetCore.Http return path.ToString(); } } + + internal class PathStringConverter : TypeConverter + { + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + return new PathString((string)value); + } + } } diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs new file mode 100644 index 0000000000..31c3ee50cc --- /dev/null +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs @@ -0,0 +1,40 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options.Infrastructure; +using Xunit; + +namespace Microsoft.AspNetCore.Authentication +{ + public class ConfigTests + { + [Fact] + public void AddCanBindAgainstDefaultConfig() + { + var dic = new Dictionary + { + {"Microsoft:AspNetCore:Authentication:DefaultSignInScheme", ""}, + {"Microsoft:AspNetCore:Authentication:DefaultAuthenticateScheme", ""}, + {"Microsoft:AspNetCore:Authentication:DefaultChallengeScheme", ""} + }; + var configurationBuilder = new ConfigurationBuilder(); + configurationBuilder.AddInMemoryCollection(dic); + var config = configurationBuilder.Build(); + var services = new ServiceCollection() + .AddOptions() + .AddSingleton, ConfigureDefaults>() + .AddAuthenticationCore() + .AddSingleton(config); + var sp = services.BuildServiceProvider(); + + var options = sp.GetRequiredService>().Value; + Assert.Equal("", options.DefaultAuthenticateScheme); + Assert.Equal("", options.DefaultChallengeScheme); + Assert.Equal("", options.DefaultSignInScheme); + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index 60a1a9b017..365a9de3c3 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.ComponentModel; using Microsoft.AspNetCore.Testing; using Xunit; @@ -205,5 +206,13 @@ namespace Microsoft.AspNetCore.Http Assert.Equal(expected, path.ToUriComponent()); } + + [Fact] + public void PathStringConvertsFromString() + { + var converter = TypeDescriptor.GetConverter(typeof(PathString)); + PathString result = (PathString)converter.ConvertFromInvariantString("/foo"); + Assert.Equal("/foo", result.ToString()); + } } } From 9698f539f0e7afdec9f487ac63e729d7c0568657 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Fri, 2 Jun 2017 12:46:36 -0700 Subject: [PATCH 699/846] Add IHttpMaxRequestBodySizeFeature (#852) --- .../IHttpMaxRequestBodySizeFeature.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs new file mode 100644 index 0000000000..114009b00f --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Http.Features +{ + /// + /// Feature to inspect and modify the maximum request body size for a single request. + /// + public interface IHttpMaxRequestBodySizeFeature + { + /// + /// The maximum allowed size of the current request body in bytes. + /// When set to null, the maximum request body size is unlimited. + /// This cannot be modified after the reading the request body has started. + /// This limit does not affect upgraded connections which are always unlimited. + /// + /// + /// Defaults to the server's global max request body size limit. + /// + long? MaxRequestBodySize { get; set; } + } +} \ No newline at end of file From 300d69e644b65ba3cd82cc060f17bd91e4edb68b Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 5 Jun 2017 09:57:57 -0700 Subject: [PATCH 700/846] Remove ConfigureDefaultOptions --- ...ticationCoreServiceCollectionExtensions.cs | 11 ----- ...soft.AspNetCore.Authentication.Core.csproj | 1 - .../ConfigTests.cs | 40 ------------------- 3 files changed, 52 deletions(-) delete mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs index 9089761d5d..fdf85a9b45 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs @@ -4,8 +4,6 @@ using System; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Options.Infrastructure; namespace Microsoft.Extensions.DependencyInjection { @@ -30,7 +28,6 @@ namespace Microsoft.Extensions.DependencyInjection services.TryAddSingleton(); // Can be replaced with scoped ones that use DbContext services.TryAddScoped(); services.TryAddSingleton(); - services.AddTransient, DefaultConfigureOptions>(); return services; } @@ -55,13 +52,5 @@ namespace Microsoft.Extensions.DependencyInjection services.Configure(configureOptions); return services; } - - private class DefaultConfigureOptions : ConfigureDefaultOptions - { - public DefaultConfigureOptions(IConfiguration config) : - base(options => config.GetSection("Microsoft:AspNetCore:Authentication").Bind(options)) - { } - } - } } diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj index 94550732a9..0ceaa4d374 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -15,7 +15,6 @@ - diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs deleted file mode 100644 index 31c3ee50cc..0000000000 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/ConfigTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Microsoft.Extensions.Options.Infrastructure; -using Xunit; - -namespace Microsoft.AspNetCore.Authentication -{ - public class ConfigTests - { - [Fact] - public void AddCanBindAgainstDefaultConfig() - { - var dic = new Dictionary - { - {"Microsoft:AspNetCore:Authentication:DefaultSignInScheme", ""}, - {"Microsoft:AspNetCore:Authentication:DefaultAuthenticateScheme", ""}, - {"Microsoft:AspNetCore:Authentication:DefaultChallengeScheme", ""} - }; - var configurationBuilder = new ConfigurationBuilder(); - configurationBuilder.AddInMemoryCollection(dic); - var config = configurationBuilder.Build(); - var services = new ServiceCollection() - .AddOptions() - .AddSingleton, ConfigureDefaults>() - .AddAuthenticationCore() - .AddSingleton(config); - var sp = services.BuildServiceProvider(); - - var options = sp.GetRequiredService>().Value; - Assert.Equal("", options.DefaultAuthenticateScheme); - Assert.Equal("", options.DefaultChallengeScheme); - Assert.Equal("", options.DefaultSignInScheme); - } - } -} From 2176af7edd14d5797358091725b3e0da637c72a0 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Tue, 6 Jun 2017 15:27:13 -0700 Subject: [PATCH 701/846] Add IHttpMaxRequestBodySizeFeature.IsReadOnly (#858) --- .../IHttpMaxRequestBodySizeFeature.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs index 114009b00f..c02000c72a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs @@ -8,6 +8,13 @@ namespace Microsoft.AspNetCore.Http.Features /// public interface IHttpMaxRequestBodySizeFeature { + /// + /// Indicates whether is read-only. + /// If true, this could mean that the request body has already been read from + /// or that was called. + /// + bool IsReadOnly { get; } + /// /// The maximum allowed size of the current request body in bytes. /// When set to null, the maximum request body size is unlimited. From 9dedc9809443a03e0632cbedc0318d23f21ec1f7 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 7 Jun 2017 07:04:48 -1000 Subject: [PATCH 702/846] Deprecate the IAuthenticationHandler property (#863) * Deprecate the IAuthenticationHandler property --- .../Authentication/IHttpAuthenticationFeature.cs | 2 ++ .../Authentication/DefaultAuthenticationManager.cs | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs index 080ce40574..279d6904f0 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Security.Claims; namespace Microsoft.AspNetCore.Http.Features.Authentication @@ -9,6 +10,7 @@ namespace Microsoft.AspNetCore.Http.Features.Authentication { ClaimsPrincipal User { get; set; } + [Obsolete("This is obsolete and will be removed in a future version. See https://go.microsoft.com/fwlink/?linkid=845470.")] IAuthenticationHandler Handler { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index 666e2179e1..a6cc320bb3 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -42,7 +42,9 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal public override IEnumerable GetAuthenticationSchemes() { +#pragma warning disable CS0618 // Type or member is obsolete var handler = HttpAuthenticationFeature.Handler; +#pragma warning restore CS0618 // Type or member is obsolete if (handler == null) { return new AuthenticationDescription[0]; @@ -61,7 +63,9 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal throw new ArgumentNullException(nameof(context)); } +#pragma warning disable CS0618 // Type or member is obsolete var handler = HttpAuthenticationFeature.Handler; +#pragma warning restore CS0618 // Type or member is obsolete if (handler != null) { await handler.AuthenticateAsync(context); @@ -80,7 +84,9 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal throw new ArgumentNullException(nameof(authenticationScheme)); } +#pragma warning disable CS0618 // Type or member is obsolete var handler = HttpAuthenticationFeature.Handler; +#pragma warning restore CS0618 // Type or member is obsolete var context = new AuthenticateContext(authenticationScheme); if (handler != null) { @@ -107,7 +113,9 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal throw new ArgumentException(nameof(authenticationScheme)); } +#pragma warning disable CS0618 // Type or member is obsolete var handler = HttpAuthenticationFeature.Handler; +#pragma warning restore CS0618 // Type or member is obsolete var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items, behavior); if (handler != null) @@ -133,7 +141,9 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal throw new ArgumentNullException(nameof(principal)); } +#pragma warning disable CS0618 // Type or member is obsolete var handler = HttpAuthenticationFeature.Handler; +#pragma warning restore CS0618 // Type or member is obsolete var signInContext = new SignInContext(authenticationScheme, principal, properties?.Items); if (handler != null) @@ -154,7 +164,9 @@ namespace Microsoft.AspNetCore.Http.Authentication.Internal throw new ArgumentException(nameof(authenticationScheme)); } +#pragma warning disable CS0618 // Type or member is obsolete var handler = HttpAuthenticationFeature.Handler; +#pragma warning restore CS0618 // Type or member is obsolete var signOutContext = new SignOutContext(authenticationScheme, properties?.Items); if (handler != null) From b6862981338befadabb019b07b9307fa0015bf50 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 8 Jun 2017 08:53:03 -1000 Subject: [PATCH 703/846] Don't throw for OnStarting or OnCompleted calls. (#864) --- src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs index d0cb806ba5..a02a79088b 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs @@ -31,12 +31,10 @@ namespace Microsoft.AspNetCore.Http.Features public virtual void OnStarting(Func callback, object state) { - throw new NotImplementedException(); } public virtual void OnCompleted(Func callback, object state) { - throw new NotImplementedException(); } } } From a78b194a84cfbc560a56d6d951eb71c8367d17bb Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 8 Jun 2017 11:58:18 -0700 Subject: [PATCH 704/846] Remove usage of TaskCache --- ...NetCore.Authentication.Abstractions.csproj | 5 +---- ...soft.AspNetCore.Authentication.Core.csproj | 1 - .../HttpResponse.cs | 3 +-- ...rosoft.AspNetCore.Http.Abstractions.csproj | 1 - .../Internal/ApplicationBuilder.cs | 3 ++- .../Microsoft.AspNetCore.Http.csproj | 1 - .../Microsoft.AspNetCore.Owin.csproj | 4 ---- .../OwinEnvironment.cs | 3 +-- .../WebSockets/WebSocketAdapter.cs | 3 +-- .../UseMiddlewareTest.cs | 21 +++++++++---------- 10 files changed, 16 insertions(+), 29 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj index adda966c8b..a332a50bb3 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -16,9 +16,6 @@ - - - - + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj index 0ceaa4d374..5b7ed721d7 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -15,7 +15,6 @@ - diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs index 01854e6ccd..626139183e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Http { @@ -17,7 +16,7 @@ namespace Microsoft.AspNetCore.Http private static readonly Func _disposeDelegate = disposable => { ((IDisposable)disposable).Dispose(); - return TaskCache.CompletedTask; + return Task.CompletedTask; }; /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index e19971e2db..0e87594e50 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -22,7 +22,6 @@ Microsoft.AspNetCore.Http.HttpResponse - diff --git a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs index 86b098aacd..d0b6b6f6bf 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Internal; @@ -81,7 +82,7 @@ namespace Microsoft.AspNetCore.Builder.Internal RequestDelegate app = context => { context.Response.StatusCode = 404; - return TaskCache.CompletedTask; + return Task.CompletedTask; }; foreach (var component in _components.Reverse()) diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index a4d86ade8c..82aeb9cf86 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -21,7 +21,6 @@ - diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj index b6eb0a3585..8c3b67f000 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj @@ -14,8 +14,4 @@ - - - - diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index 165c3eece4..6c7f3ad66f 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -17,7 +17,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.Features.Authentication; -using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Owin { @@ -68,7 +67,7 @@ namespace Microsoft.AspNetCore.Owin feature.OnStarting(s => { cb(s); - return TaskCache.CompletedTask; + return Task.CompletedTask; }, state); })) }, diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs index 45bb017925..7fad98704c 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs @@ -7,7 +7,6 @@ using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Owin { @@ -69,7 +68,7 @@ namespace Microsoft.AspNetCore.Owin else if (messageType == 0x9 || messageType == 0xA) { // Ping & Pong, not allowed by the underlying APIs, silently discard. - return TaskCache.CompletedTask; + return Task.CompletedTask; } return _webSocket.SendAsync(buffer, OpCodeToEnum(messageType), endOfMessage, cancel); diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index e00b3ead76..7bf6ad4a74 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder.Internal; using Microsoft.AspNetCore.Http.Abstractions; -using Microsoft.Extensions.Internal; using Xunit; namespace Microsoft.AspNetCore.Http @@ -304,28 +303,28 @@ namespace Microsoft.AspNetCore.Http { public MiddlewareInjectInvokeNoService(RequestDelegate next) { } - public Task Invoke(HttpContext context, object value) => TaskCache.CompletedTask; + public Task Invoke(HttpContext context, object value) => Task.CompletedTask; } private class MiddlewareInjectInvoke { public MiddlewareInjectInvoke(RequestDelegate next) { } - public Task Invoke(HttpContext context, IServiceProvider provider) => TaskCache.CompletedTask; + public Task Invoke(HttpContext context, IServiceProvider provider) => Task.CompletedTask; } private class MiddlewareNoParametersStub { public MiddlewareNoParametersStub(RequestDelegate next) { } - public Task Invoke() => TaskCache.CompletedTask; + public Task Invoke() => Task.CompletedTask; } private class MiddlewareAsyncNoParametersStub { public MiddlewareAsyncNoParametersStub(RequestDelegate next) { } - public Task InvokeAsync() => TaskCache.CompletedTask; + public Task InvokeAsync() => Task.CompletedTask; } private class MiddlewareNonTaskReturnStub @@ -351,27 +350,27 @@ namespace Microsoft.AspNetCore.Http { public MiddlewareMultipleInvokesStub(RequestDelegate next) { } - public Task Invoke(HttpContext context) => TaskCache.CompletedTask; + public Task Invoke(HttpContext context) => Task.CompletedTask; - public Task Invoke(HttpContext context, int i) => TaskCache.CompletedTask; + public Task Invoke(HttpContext context, int i) => Task.CompletedTask; } private class MiddlewareMultipleInvokeAsyncStub { public MiddlewareMultipleInvokeAsyncStub(RequestDelegate next) { } - public Task InvokeAsync(HttpContext context) => TaskCache.CompletedTask; + public Task InvokeAsync(HttpContext context) => Task.CompletedTask; - public Task InvokeAsync(HttpContext context, int i) => TaskCache.CompletedTask; + public Task InvokeAsync(HttpContext context, int i) => Task.CompletedTask; } private class MiddlewareMultipleInvokeAndInvokeAsyncStub { public MiddlewareMultipleInvokeAndInvokeAsyncStub(RequestDelegate next) { } - public Task Invoke(HttpContext context) => TaskCache.CompletedTask; + public Task Invoke(HttpContext context) => Task.CompletedTask; - public Task InvokeAsync(HttpContext context) => TaskCache.CompletedTask; + public Task InvokeAsync(HttpContext context) => Task.CompletedTask; } } } From b059bcc426ea7593ceeed2df1b6ce14fd3a626ba Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 12 Jun 2017 11:41:27 -0700 Subject: [PATCH 705/846] Obsolete AuthenticationManager (#866) --- .../Authentication/AuthenticationManager.cs | 1 + .../Authentication/DefaultAuthenticationManager.cs | 1 + src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs | 8 ++++++++ 3 files changed, 10 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs index 56d9dbad5f..b2916522a5 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Http.Features.Authentication; namespace Microsoft.AspNetCore.Http.Authentication { + [Obsolete("This is obsolete and will be removed in a future version. See https://go.microsoft.com/fwlink/?linkid=845470.")] public abstract class AuthenticationManager { /// diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index a6cc320bb3..9f4121f4cb 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Http.Features.Authentication; namespace Microsoft.AspNetCore.Http.Authentication.Internal { + [Obsolete("This is obsolete and will be removed in a future version. See https://go.microsoft.com/fwlink/?linkid=845470.")] public class DefaultAuthenticationManager : AuthenticationManager { // Lambda hoisted to static readonly field to improve inlining https://github.com/dotnet/roslyn/issues/13624 diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs index cdd1263043..d02ad6322b 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs @@ -28,7 +28,11 @@ namespace Microsoft.AspNetCore.Http private HttpRequest _request; private HttpResponse _response; + +#pragma warning disable CS0618 // Type or member is obsolete private AuthenticationManager _authenticationManager; +#pragma warning restore CS0618 // Type or member is obsolete + private ConnectionInfo _connection; private WebSocketManager _websockets; @@ -66,7 +70,9 @@ namespace Microsoft.AspNetCore.Http } if (_authenticationManager != null) { +#pragma warning disable CS0618 // Type or member is obsolete UninitializeAuthenticationManager(_authenticationManager); +#pragma warning restore CS0618 // Type or member is obsolete _authenticationManager = null; } if (_connection != null) @@ -196,7 +202,9 @@ namespace Microsoft.AspNetCore.Http protected virtual ConnectionInfo InitializeConnectionInfo() => new DefaultConnectionInfo(Features); protected virtual void UninitializeConnectionInfo(ConnectionInfo instance) { } + [Obsolete("This is obsolete and will be removed in a future version. See https://go.microsoft.com/fwlink/?linkid=845470.")] protected virtual AuthenticationManager InitializeAuthenticationManager() => new DefaultAuthenticationManager(this); + [Obsolete("This is obsolete and will be removed in a future version. See https://go.microsoft.com/fwlink/?linkid=845470.")] protected virtual void UninitializeAuthenticationManager(AuthenticationManager instance) { } protected virtual WebSocketManager InitializeWebSocketManager() => new DefaultWebSocketManager(Features); From df5c6730f772775bfc9c14fbff050a1a56d9fef6 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 14 Jun 2017 12:57:45 -0700 Subject: [PATCH 706/846] Add new default schemes + tests (#870) --- .../AuthenticationOptions.cs | 23 ++++ .../IAuthenticationSchemeProvider.cs | 16 +++ .../AuthenticationSchemeProvider.cs | 30 +++++ .../AuthenticationSchemeProviderTests.cs | 120 ++++++++++++++++++ 4 files changed, 189 insertions(+) create mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs index 08df75a2ad..9e1df2b455 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs @@ -47,6 +47,19 @@ namespace Microsoft.AspNetCore.Authentication SchemeMap[name] = builder; } + /// + /// Adds an . + /// + /// The responsible for the scheme. + /// The name of the scheme being added. + /// The display name for the scheme. + public void AddScheme(string name, string displayName) where THandler : IAuthenticationHandler + => AddScheme(name, b => + { + b.DisplayName = displayName; + b.HandlerType = typeof(THandler); + }); + /// /// Used by as the default scheme by . /// @@ -57,9 +70,19 @@ namespace Microsoft.AspNetCore.Authentication /// public string DefaultSignInScheme { get; set; } + /// + /// Used by as the default scheme by . + /// + public string DefaultSignOutScheme { get; set; } + /// /// Used by as the default scheme by . /// public string DefaultChallengeScheme { get; set; } + + /// + /// Used by as the default scheme by . + /// + public string DefaultForbidScheme { get; set; } } } diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs index 5fa08c977a..675cf52cf9 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs @@ -41,6 +41,14 @@ namespace Microsoft.AspNetCore.Authentication /// The scheme that will be used by default for . Task GetDefaultChallengeSchemeAsync(); + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, this will fallback to . + /// + /// The scheme that will be used by default for . + Task GetDefaultForbidSchemeAsync(); + /// /// Returns the scheme that will be used by default for . /// This is typically specified via . @@ -49,6 +57,14 @@ namespace Microsoft.AspNetCore.Authentication /// The scheme that will be used by default for . Task GetDefaultSignInSchemeAsync(); + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, this will fallback to . + /// + /// The scheme that will be used by default for . + Task GetDefaultSignOutSchemeAsync(); + /// /// Registers a scheme for use by . /// diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs index 2ce3801b5b..e56247e18c 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs @@ -75,6 +75,21 @@ namespace Microsoft.AspNetCore.Authentication return Task.FromResult(null); } + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, this will fallback to . + /// + /// The scheme that will be used by default for . + public Task GetDefaultForbidSchemeAsync() + { + if (_options.DefaultForbidScheme != null) + { + return GetSchemeAsync(_options.DefaultForbidScheme); + } + return GetDefaultChallengeSchemeAsync(); + } + /// /// Returns the scheme that will be used by default for . /// This is typically specified via . @@ -94,6 +109,21 @@ namespace Microsoft.AspNetCore.Authentication return Task.FromResult(null); } + /// + /// Returns the scheme that will be used by default for . + /// This is typically specified via . + /// Otherwise, this will fallback to . + /// + /// The scheme that will be used by default for . + public Task GetDefaultSignOutSchemeAsync() + { + if (_options.DefaultSignOutScheme != null) + { + return GetSchemeAsync(_options.DefaultSignOutScheme); + } + return GetDefaultSignInSchemeAsync(); + } + /// /// Returns the matching the name, or null. /// diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs new file mode 100644 index 0000000000..3810f8335f --- /dev/null +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs @@ -0,0 +1,120 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNetCore.Authentication +{ + public class AuthenticationSchemeProviderTests + { + [Fact] + public async Task DefaultSignOutFallsbackToSignIn() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("signin", "whatever"); + o.AddScheme("foobly", "whatever"); + o.DefaultSignInScheme = "signin"; + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + var scheme = await provider.GetDefaultSignOutSchemeAsync(); + Assert.NotNull(scheme); + Assert.Equal("signin", scheme.Name); + } + + [Fact] + public async Task DefaultForbidFallsbackToChallenge() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("challenge", "whatever"); + o.AddScheme("foobly", "whatever"); + o.DefaultChallengeScheme = "challenge"; + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + var scheme = await provider.GetDefaultForbidSchemeAsync(); + Assert.NotNull(scheme); + Assert.Equal("challenge", scheme.Name); + } + + [Fact] + public async Task DefaultSchemesFallbackToOnlyScheme() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("single", "whatever"); + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + Assert.Equal("single", (await provider.GetDefaultForbidSchemeAsync()).Name); + Assert.Equal("single", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); + Assert.Equal("single", (await provider.GetDefaultChallengeSchemeAsync()).Name); + Assert.Equal("single", (await provider.GetDefaultSignInSchemeAsync()).Name); + Assert.Equal("single", (await provider.GetDefaultSignOutSchemeAsync()).Name); + } + + [Fact] + public async Task DefaultSchemesAreSet() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("A", "whatever"); + o.AddScheme("B", "whatever"); + o.AddScheme("C", "whatever"); + o.DefaultChallengeScheme = "A"; + o.DefaultForbidScheme = "B"; + o.DefaultSignInScheme = "C"; + o.DefaultSignOutScheme = "A"; + o.DefaultAuthenticateScheme = "C"; + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + Assert.Equal("B", (await provider.GetDefaultForbidSchemeAsync()).Name); + Assert.Equal("C", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); + Assert.Equal("A", (await provider.GetDefaultChallengeSchemeAsync()).Name); + Assert.Equal("C", (await provider.GetDefaultSignInSchemeAsync()).Name); + Assert.Equal("A", (await provider.GetDefaultSignOutSchemeAsync()).Name); + } + + private class Handler : IAuthenticationHandler + { + public Task AuthenticateAsync() + { + throw new NotImplementedException(); + } + + public Task ChallengeAsync(AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + + public Task ForbidAsync(AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + + public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) + { + throw new NotImplementedException(); + } + + public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + + public Task SignOutAsync(AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + } + + } +} From 835fb603802505f0f5918112ffbe9912e52ffca9 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Thu, 15 Jun 2017 05:31:49 -0700 Subject: [PATCH 707/846] Fixed version of netstandard.library --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index 583adadec1..c81696f7f4 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,7 +3,7 @@ 2.0.0-* 4.4.0-* 2.1.0-* - $(BundledNETStandardPackageVersion) + 2.0.0-* 2.0.0-* 2.0.0-* 15.3.0-* From 12f89f66a687bdb1c1b683b0d7abd2732c05eb1a Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 20 Jun 2017 10:49:17 -0700 Subject: [PATCH 708/846] Improve PathString <-> string logic --- .../PathString.cs | 28 +++++++++++++------ .../PathStringTests.cs | 20 +++++++++++-- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index b82d444220..2a5960b661 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -443,25 +443,35 @@ namespace Microsoft.AspNetCore.Http /// /// public static implicit operator PathString(string s) - { - return new PathString(s); - } + => ConvertFromString(s); /// /// Implicitly calls ToString(). /// /// public static implicit operator string(PathString path) - { - return path.ToString(); - } + => path.ToString(); + + internal static PathString ConvertFromString(string s) + => string.IsNullOrEmpty(s) ? new PathString(s) : FromUriComponent(s); } internal class PathStringConverter : TypeConverter { + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + => sourceType == typeof(string) + ? true + : base.CanConvertFrom(context, sourceType); + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) - { - return new PathString((string)value); - } + => value is string + ? PathString.ConvertFromString((string)value) + : base.ConvertFrom(context, culture, value); + + public override object ConvertTo(ITypeDescriptorContext context, + CultureInfo culture, object value, Type destinationType) + => destinationType == typeof(string) + ? value.ToString() + : base.ConvertTo(context, culture, value, destinationType); } } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index 365a9de3c3..ad070afa02 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -208,11 +208,27 @@ namespace Microsoft.AspNetCore.Http } [Fact] - public void PathStringConvertsFromString() + public void PathStringConvertsOnlyToAndFromString() { var converter = TypeDescriptor.GetConverter(typeof(PathString)); PathString result = (PathString)converter.ConvertFromInvariantString("/foo"); Assert.Equal("/foo", result.ToString()); + Assert.Equal("/foo", converter.ConvertTo(result, typeof(string))); + Assert.True(converter.CanConvertFrom(typeof(string))); + Assert.False(converter.CanConvertFrom(typeof(int))); + Assert.False(converter.CanConvertFrom(typeof(bool))); + Assert.True(converter.CanConvertTo(typeof(string))); + Assert.False(converter.CanConvertTo(typeof(int))); + Assert.False(converter.CanConvertTo(typeof(bool))); + } + + [Fact] + public void PathStringStaysEqualAfterAssignments() + { + PathString p1 = "/?"; + string s1 = p1; + PathString p2 = s1; + Assert.Equal(p1, p2); } } } From 62fdf64cf658f9d5c7403e1218f8ca33231dec0c Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 26 Jun 2017 09:37:49 -0700 Subject: [PATCH 709/846] Adding libunwind8 to .travis.yml [skip appveyor] --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 2a46104677..b10be14215 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,6 +10,10 @@ os: - linux - osx osx_image: xcode8.2 +addons: + apt: + packages: + - libunwind8 branches: only: - master From 64c6e11ce4abbb96117e8a01c522e307a99d9f2f Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 27 Jun 2017 17:29:34 -0700 Subject: [PATCH 710/846] Change HttpResponseStreamWriter.DefaultBufferSize to 16K and remove it from public API surface --- .../HttpResponseStreamWriter.cs | 34 +++---------------- .../breakingchanges.netcore.json | 7 ++++ .../HttpResponseStreamWriterTest.cs | 8 ++--- 3 files changed, 16 insertions(+), 33 deletions(-) create mode 100644 src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs index f5568fb4a3..4356693d58 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs @@ -16,11 +16,7 @@ namespace Microsoft.AspNetCore.WebUtilities public class HttpResponseStreamWriter : TextWriter { private const int MinBufferSize = 128; - - /// - /// Default buffer size. - /// - public const int DefaultBufferSize = 1024; + internal const int DefaultBufferSize = 16 * 1024; private Stream _stream; private readonly Encoder _encoder; @@ -50,39 +46,19 @@ namespace Microsoft.AspNetCore.WebUtilities ArrayPool bytePool, ArrayPool charPool) { - if (stream == null) - { - throw new ArgumentNullException(nameof(stream)); - } - if (!stream.CanWrite) { throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); } - if (encoding == null) - { - throw new ArgumentNullException(nameof(encoding)); - } + Encoding = encoding ?? throw new ArgumentNullException(nameof(encoding)); + _bytePool = bytePool ?? throw new ArgumentNullException(nameof(bytePool)); + _charPool = charPool ?? throw new ArgumentNullException(nameof(charPool)); + _stream = stream ?? throw new ArgumentNullException(nameof(stream)); - if (bytePool == null) - { - throw new ArgumentNullException(nameof(bytePool)); - } - - if (charPool == null) - { - throw new ArgumentNullException(nameof(charPool)); - } - - _stream = stream; - Encoding = encoding; _charBufferSize = bufferSize; _encoder = encoding.GetEncoder(); - _bytePool = bytePool; - _charPool = charPool; - _charBuffer = charPool.Rent(bufferSize); try diff --git a/src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json new file mode 100644 index 0000000000..c1f57ccf9f --- /dev/null +++ b/src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json @@ -0,0 +1,7 @@ +[ + { + "TypeId": "public class Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter : System.IO.TextWriter", + "MemberId": "public const System.Int32 DefaultBufferSize = 1024", + "Kind": "Removal" + } +] diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index f87a6a70e6..10bd4bda3f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -161,10 +161,10 @@ namespace Microsoft.AspNetCore.WebUtilities.Test } [Theory] - [InlineData(1023)] - [InlineData(1024)] - [InlineData(1050)] - [InlineData(2048)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize - 1)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize * 2)] public async Task FlushesBuffer_ButNotStream_OnFlushAsync(int byteLength) { // Arrange From 163836fe1f31dd1d2b288659c2dcaf1d827da3c4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 28 Jun 2017 10:16:54 -0700 Subject: [PATCH 711/846] #800 Re-enable API check (#878) --- .../Microsoft.AspNetCore.Http.Features.csproj | 1 - .../breakingchanges.netcore.json | 12 + .../exceptions.netcore.json | 14 - .../Microsoft.Net.Http.Headers.csproj | 1 - .../breakingchanges.netcore.json | 412 ++++++++++++++++++ 5 files changed, 424 insertions(+), 16 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json delete mode 100644 src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json create mode 100644 src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index 1920b47231..a6ebb2411f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -8,7 +8,6 @@ $(NoWarn);CS1591 true aspnetcore - false diff --git a/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json new file mode 100644 index 0000000000..7bdc58b355 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json @@ -0,0 +1,12 @@ +[ + { + "TypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "MemberId": "System.Nullable get_ContentLength()", + "Kind": "Addition" + }, + { + "TypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", + "MemberId": "System.Void set_ContentLength(System.Nullable value)", + "Kind": "Addition" + } +] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json b/src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json deleted file mode 100644 index e312fab8bd..0000000000 --- a/src/Microsoft.AspNetCore.Http.Features/exceptions.netcore.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewMemberId": "System.Nullable get_ContentLength()", - "Kind": "Addition" - }, - { - "OldTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewTypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "NewMemberId": "System.Void set_ContentLength(System.Nullable value)", - "Kind": "Addition" - } -] \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index e86898c885..521dd7caa1 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -9,7 +9,6 @@ true true http - false diff --git a/src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json b/src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json new file mode 100644 index 0000000000..6748ae1f1e --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json @@ -0,0 +1,412 @@ +[ + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public .ctor(System.String dispositionType)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.ContentDispositionHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.ContentDispositionHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.String get_DispositionType()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.String get_FileName()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.String get_FileNameStar()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.String get_Name()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.Void set_DispositionType(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.Void set_FileName(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.Void set_FileNameStar(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.Void set_Name(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.Void SetHttpFileName(System.String fileName)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "MemberId": "public System.Void SetMimeFileName(System.String fileName)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public .ctor(System.String mediaType)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public .ctor(System.String mediaType, System.Double quality)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.MediaTypeHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.MediaTypeHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.String get_Boundary()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.String get_Charset()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.String get_MediaType()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.String get_SubType()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.String get_Type()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.Void set_Boundary(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.Void set_Charset(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", + "MemberId": "public System.Void set_MediaType(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public .ctor(System.String name)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public .ctor(System.String name, System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.CookieHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.CookieHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public System.String get_Name()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public System.String get_Value()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public System.Void set_Name(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", + "MemberId": "public System.Void set_Value(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public .ctor(System.String name)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public .ctor(System.String name, System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.NameValueHeaderValue Find(System.Collections.Generic.IList values, System.String name)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.NameValueHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.NameValueHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public System.String get_Name()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public System.String get_Value()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", + "MemberId": "public System.Void set_Value(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public .ctor(System.String name)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public .ctor(System.String name, System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.SetCookieHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.SetCookieHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.String get_Domain()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.String get_Name()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.String get_Path()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.String get_Value()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.Void set_Domain(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.Void set_Name(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.Void set_Path(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", + "MemberId": "public System.Void set_Value(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "MemberId": "public .ctor(System.String tag)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "MemberId": "public .ctor(System.String tag, System.Boolean isWeak)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.EntityTagHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.EntityTagHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", + "MemberId": "public System.String get_Tag()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "MemberId": "public .ctor(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "MemberId": "public .ctor(System.String value, System.Double quality)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.StringWithQualityHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.StringWithQualityHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", + "MemberId": "public System.String get_Value()", + "Kind": "Removal" + }, + { + "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderNames", + "MemberId": "public const System.String ContentMD5 = \"ContentMD5\"", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.CacheControlHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.CacheControlHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "MemberId": "public System.Collections.Generic.ICollection get_NoCacheHeaders()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", + "MemberId": "public System.Collections.Generic.ICollection get_PrivateHeaders()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.ContentRangeHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.ContentRangeHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "MemberId": "public System.String get_Unit()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", + "MemberId": "public System.Void set_Unit(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.RangeConditionHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.RangeConditionHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.RangeConditionHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.RangeConditionHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", + "MemberId": "public static Microsoft.Net.Http.Headers.RangeHeaderValue Parse(System.String input)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", + "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.RangeHeaderValue parsedValue)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", + "MemberId": "public System.String get_Unit()", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", + "MemberId": "public System.Void set_Unit(System.String value)", + "Kind": "Removal" + }, + { + "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", + "MemberId": "public static System.Boolean TryParseDate(System.String input, out System.DateTimeOffset result)", + "Kind": "Removal" + }, + { + "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", + "MemberId": "public static System.Boolean TryParseInt64(System.String value, out System.Int64 result)", + "Kind": "Removal" + }, + { + "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", + "MemberId": "public static System.String FormatInt64(System.Int64 value)", + "Kind": "Removal" + }, + { + "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", + "MemberId": "public static System.String RemoveQuotes(System.String input)", + "Kind": "Removal" + } +] \ No newline at end of file From 9bf94d36677d55be10437dc1b1b11761ffca5ae2 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 29 Jun 2017 11:44:46 -0700 Subject: [PATCH 712/846] Remove unused parameter in ctor of HttpContextFactory (#881) - We removed the use of the ObjectPoolProvider in 1.x, this change just removes it from the ctor. --- src/Microsoft.AspNetCore.Http/HttpContextFactory.cs | 11 +++-------- .../breakingchanges.netcore.json | 12 ++++++++++++ .../HttpContextFactoryTests.cs | 5 ++--- 3 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs index 80619206a3..8236a388a5 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs @@ -3,7 +3,6 @@ using System; using Microsoft.AspNetCore.Http.Features; -using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.Http @@ -13,17 +12,13 @@ namespace Microsoft.AspNetCore.Http private readonly IHttpContextAccessor _httpContextAccessor; private readonly FormOptions _formOptions; - public HttpContextFactory(ObjectPoolProvider poolProvider, IOptions formOptions) - : this(poolProvider, formOptions, httpContextAccessor: null) + public HttpContextFactory(IOptions formOptions) + : this(formOptions, httpContextAccessor: null) { } - public HttpContextFactory(ObjectPoolProvider poolProvider, IOptions formOptions, IHttpContextAccessor httpContextAccessor) + public HttpContextFactory(IOptions formOptions, IHttpContextAccessor httpContextAccessor) { - if (poolProvider == null) - { - throw new ArgumentNullException(nameof(poolProvider)); - } if (formOptions == null) { throw new ArgumentNullException(nameof(formOptions)); diff --git a/src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json new file mode 100644 index 0000000000..67515e0af1 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json @@ -0,0 +1,12 @@ + [ + { + "TypeId": "public class Microsoft.AspNetCore.Http.HttpContextFactory : Microsoft.AspNetCore.Http.IHttpContextFactory", + "MemberId": "public .ctor(Microsoft.Extensions.ObjectPool.ObjectPoolProvider poolProvider, Microsoft.Extensions.Options.IOptions formOptions)", + "Kind": "Removal" + }, + { + "TypeId": "public class Microsoft.AspNetCore.Http.HttpContextFactory : Microsoft.AspNetCore.Http.IHttpContextFactory", + "MemberId": "public .ctor(Microsoft.Extensions.ObjectPool.ObjectPoolProvider poolProvider, Microsoft.Extensions.Options.IOptions formOptions, Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor)", + "Kind": "Removal" + } + ] diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index 40dff9bf5f..ba983198e7 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -4,7 +4,6 @@ using System; using System.IO; using Microsoft.AspNetCore.Http.Features; -using Microsoft.Extensions.ObjectPool; using Microsoft.Extensions.Options; using Xunit; @@ -17,7 +16,7 @@ namespace Microsoft.AspNetCore.Http { // Arrange var accessor = new HttpContextAccessor(); - var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions()), accessor); + var contextFactory = new HttpContextFactory(Options.Create(new FormOptions()), accessor); // Act var context = contextFactory.Create(new FeatureCollection()); @@ -30,7 +29,7 @@ namespace Microsoft.AspNetCore.Http public void AllowsCreatingContextWithoutSettingAccessor() { // Arrange - var contextFactory = new HttpContextFactory(new DefaultObjectPoolProvider(), Options.Create(new FormOptions())); + var contextFactory = new HttpContextFactory(Options.Create(new FormOptions())); // Act & Assert var context = contextFactory.Create(new FeatureCollection()); From f9e0439ef1c90486ca8590def0d718cda2f2449e Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 29 Jun 2017 12:23:06 -0700 Subject: [PATCH 713/846] Add CookieBuilder --- .../CookieBuilder.cs | 93 +++++++++++++++++++ .../CookieOptions.cs | 1 - .../CookieBuilderTests.cs | 47 ++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs create mode 100644 test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs new file mode 100644 index 0000000000..d2aa125ff3 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs @@ -0,0 +1,93 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNetCore.Http +{ + /// + /// Defines settings used to create a cookie. + /// + public class CookieBuilder + { + /// + /// The name of the cookie. + /// + public virtual string Name { get; set; } + + /// + /// The cookie path. + /// + /// + /// Determines the value that will set on . + /// + public virtual string Path { get; set; } + + /// + /// The domain to associate the cookie with. + /// + /// + /// Determines the value that will set on . + /// + public virtual string Domain { get; set; } + + /// + /// Indicates whether a cookie is accessible by client-side script. + /// + /// + /// Determines the value that will set on . + /// + public virtual bool HttpOnly { get; set; } + + /// + /// The SameSite attribute of the cookie. The default value is + /// + /// + /// Determines the value that will set on . + /// + public virtual SameSiteMode SameSite { get; set; } = SameSiteMode.Lax; + + /// + /// The policy that will be used to determine . + /// This is determined from the passed to . + /// + public virtual CookieSecurePolicy SecurePolicy { get; set; } + + + /// + /// Gets or sets the lifespan of a cookie. + /// + public virtual TimeSpan? Expiration { get; set; } + + /// + /// Creates the cookie options from the given . + /// + /// The . + /// The cookie options. + public virtual CookieOptions Build(HttpContext context) => Build(context, DateTimeOffset.Now); + + /// + /// Creates the cookie options from the given with an expiration based on and . + /// + /// The . + /// The time to use as the base for computing . + /// The cookie options. + public virtual CookieOptions Build(HttpContext context, DateTimeOffset expiresFrom) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + return new CookieOptions + { + Path = Path ?? "/", + SameSite = SameSite, + HttpOnly = HttpOnly, + Domain = Domain, + Secure = SecurePolicy == CookieSecurePolicy.Always || (SecurePolicy == CookieSecurePolicy.SameAsRequest && context.Request.IsHttps), + Expires = Expiration.HasValue ? expiresFrom.Add(Expiration.Value) : default(DateTimeOffset?) + }; + } + } +} diff --git a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs index d9e0047dca..017b6520fb 100644 --- a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs @@ -42,7 +42,6 @@ namespace Microsoft.AspNetCore.Http /// true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. public bool Secure { get; set; } - /// /// Gets or sets the value for the SameSite attribute of the cookie. The default value is /// diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs new file mode 100644 index 0000000000..386374b211 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs @@ -0,0 +1,47 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.AspNetCore.Http.Abstractions.Tests +{ + public class CookieBuilderTests + { + [Theory] + [InlineData(CookieSecurePolicy.Always, false, true)] + [InlineData(CookieSecurePolicy.Always, true, true)] + [InlineData(CookieSecurePolicy.SameAsRequest, true, true)] + [InlineData(CookieSecurePolicy.SameAsRequest, false, false)] + [InlineData(CookieSecurePolicy.None, true, false)] + [InlineData(CookieSecurePolicy.None, false, false)] + public void ConfiguresSecurePolicy(CookieSecurePolicy policy, bool requestIsHttps, bool secure) + { + var builder = new CookieBuilder + { + SecurePolicy = policy + }; + var context = new DefaultHttpContext(); + context.Request.IsHttps = requestIsHttps; + var options = builder.Build(context); + + Assert.Equal(secure, options.Secure); + } + + [Fact] + public void ComputesExpiration() + { + Assert.Null(new CookieBuilder().Build(new DefaultHttpContext()).Expires); + + var now = DateTimeOffset.Now; + var options = new CookieBuilder { Expiration = TimeSpan.FromHours(1) }.Build(new DefaultHttpContext(), now); + Assert.Equal(now.AddHours(1), options.Expires); + } + + [Fact] + public void CookieBuilderPreservesDefaultPath() + { + Assert.Equal(new CookieOptions().Path, new CookieBuilder().Build(new DefaultHttpContext()).Path); + } + } +} From 271faf11bbd5b05cd758f1c7e83eb59d45b6db59 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 29 Jun 2017 16:25:24 -0700 Subject: [PATCH 714/846] Refactor IAuthenticationHandler/Result --- .../AuthenticateResult.cs | 28 +- .../AuthenticationHttpContextExtensions.cs | 17 +- .../IAuthenticationHandler.cs | 16 -- .../IAuthenticationRequestHandler.cs | 1 - .../IAuthenticationSignInHandler.cs | 22 ++ .../IAuthenticationSignOutHandler.cs | 21 ++ .../IClaimsTransformation.cs | 2 +- .../AuthenticationSchemeProvider.cs | 63 +++-- .../AuthenticationService.cs | 17 +- .../AuthenticationSchemeProviderTests.cs | 71 ++++- .../AuthenticationServiceTests.cs | 245 ++++++++++++++++++ 11 files changed, 425 insertions(+), 78 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignInHandler.cs create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignOutHandler.cs create mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs index bb9bbb9716..1da6a0b94d 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Authentication /// public class AuthenticateResult { - private AuthenticateResult() { } + protected AuthenticateResult() { } /// /// If a ticket was produced, authenticate was successful. @@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// The authentication ticket. /// - public AuthenticationTicket Ticket { get; private set; } + public AuthenticationTicket Ticket { get; protected set; } /// /// Gets the claims-principal with authenticated user identities. @@ -36,18 +36,12 @@ namespace Microsoft.AspNetCore.Authentication /// /// Holds failure information from the authentication. /// - public Exception Failure { get; private set; } - - /// - /// Indicates that stage of authentication was directly handled by user intervention and no - /// further processing should be attempted. - /// - public bool Handled { get; private set; } + public Exception Failure { get; protected set; } /// /// Indicates that there was no information returned for this authentication scheme. /// - public bool Nothing { get; private set; } + public bool None { get; protected set; } /// /// Indicates that authentication was successful. @@ -63,23 +57,13 @@ namespace Microsoft.AspNetCore.Authentication return new AuthenticateResult() { Ticket = ticket }; } - /// - /// Indicates that stage of authentication was directly handled by user intervention and no - /// further processing should be attempted. - /// - /// The result. - public static AuthenticateResult Handle() - { - return new AuthenticateResult() { Handled = true }; - } - /// /// Indicates that there was no information returned for this authentication scheme. /// /// The result. - public static AuthenticateResult None() + public static AuthenticateResult NoResult() { - return new AuthenticateResult() { Nothing = true }; + return new AuthenticateResult() { None = true }; } /// diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs index cb8f1fb480..bb50c6534f 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs @@ -76,7 +76,7 @@ namespace Microsoft.AspNetCore.Authentication context.ForbidAsync(scheme, properties: null); /// - /// Extension method for Forbid. + /// Extension method for Forbid using the scheme.. /// /// The context. /// The task. @@ -142,6 +142,21 @@ namespace Microsoft.AspNetCore.Authentication public static Task SignInAsync(this HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties) => context.RequestServices.GetRequiredService().SignInAsync(context, scheme, principal, properties); + /// + /// Extension method for SignOut using the . + /// + /// The context. + /// The task. + public static Task SignOutAsync(this HttpContext context) => context.SignOutAsync(scheme: null, properties: null); + + /// + /// Extension method for SignOut using the . + /// + /// The context. + /// The properties. + /// The task. + public static Task SignOutAsync(this HttpContext context, AuthenticationProperties properties) => context.SignOutAsync(scheme: null, properties: properties); + /// /// Extension method for SignOut. /// diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs index af92cc7659..aeb373e18e 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; @@ -39,20 +38,5 @@ namespace Microsoft.AspNetCore.Authentication /// The that contains the extra meta-data arriving with the authentication. /// A task. Task ForbidAsync(AuthenticationProperties properties); - - /// - /// Handle sign in. - /// - /// The user. - /// The that contains the extra meta-data arriving with the authentication. - /// A task. - Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties); - - /// - /// Signout behavior. - /// - /// The that contains the extra meta-data arriving with the authentication. - /// A task. - Task SignOutAsync(AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs index fffe08f427..fb1b227ad7 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs @@ -10,7 +10,6 @@ namespace Microsoft.AspNetCore.Authentication /// public interface IAuthenticationRequestHandler : IAuthenticationHandler { - /// /// Returns true if request processing should stop. /// diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignInHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignInHandler.cs new file mode 100644 index 0000000000..69b88032d5 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignInHandler.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used to determine if a handler supports SignIn. + /// + public interface IAuthenticationSignInHandler : IAuthenticationSignOutHandler + { + /// + /// Handle sign in. + /// + /// The user. + /// The that contains the extra meta-data arriving with the authentication. + /// A task. + Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties); + } +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignOutHandler.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignOutHandler.cs new file mode 100644 index 0000000000..f76d116a76 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignOutHandler.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.Authentication +{ + /// + /// Used to determine if a handler supports SignOut. + /// + public interface IAuthenticationSignOutHandler : IAuthenticationHandler + { + /// + /// Signout behavior. + /// + /// The that contains the extra meta-data arriving with the authentication. + /// A task. + Task SignOutAsync(AuthenticationProperties properties); + } + +} diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs index 3aed710aa9..8371901506 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs @@ -18,4 +18,4 @@ namespace Microsoft.AspNetCore.Authentication /// The transformed principal. Task TransformAsync(ClaimsPrincipal principal); } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs index e56247e18c..be02a5c396 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; @@ -36,6 +35,8 @@ namespace Microsoft.AspNetCore.Authentication private IDictionary _map = new Dictionary(StringComparer.Ordinal); private List _requestHandlers = new List(); + private List _signOutHandlers = new List(); + private List _signInHandlers = new List(); /// /// Returns the scheme that will be used by default for . @@ -43,7 +44,7 @@ namespace Microsoft.AspNetCore.Authentication /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. /// /// The scheme that will be used by default for . - public Task GetDefaultAuthenticateSchemeAsync() + public virtual Task GetDefaultAuthenticateSchemeAsync() { if (_options.DefaultAuthenticateScheme != null) { @@ -59,20 +60,16 @@ namespace Microsoft.AspNetCore.Authentication /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . - public Task GetDefaultChallengeSchemeAsync() + public virtual Task GetDefaultChallengeSchemeAsync() { if (_options.DefaultChallengeScheme != null) { return GetSchemeAsync(_options.DefaultChallengeScheme); } - if (_map.Count == 1) - { - return Task.FromResult(_map.Values.First()); - } - return Task.FromResult(null); + return GetDefaultAuthenticateSchemeAsync(); } /// @@ -81,7 +78,7 @@ namespace Microsoft.AspNetCore.Authentication /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . - public Task GetDefaultForbidSchemeAsync() + public virtual Task GetDefaultForbidSchemeAsync() { if (_options.DefaultForbidScheme != null) { @@ -93,34 +90,40 @@ namespace Microsoft.AspNetCore.Authentication /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// If only a single sign in handler scheme exists, that will be used, if more than one exists, + /// this will fallback to . /// /// The scheme that will be used by default for . - public Task GetDefaultSignInSchemeAsync() + public virtual Task GetDefaultSignInSchemeAsync() { if (_options.DefaultSignInScheme != null) { return GetSchemeAsync(_options.DefaultSignInScheme); } - if (_map.Count == 1) + if (_signInHandlers.Count == 1) { - return Task.FromResult(_map.Values.First()); + return Task.FromResult(_signInHandlers[0]); } - return Task.FromResult(null); + return GetDefaultAuthenticateSchemeAsync(); } /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, this will fallback to . + /// If only a single sign out handler scheme exists, that will be used, if more than one exists, + /// this will fallback to if that supoorts sign out. /// /// The scheme that will be used by default for . - public Task GetDefaultSignOutSchemeAsync() + public virtual Task GetDefaultSignOutSchemeAsync() { if (_options.DefaultSignOutScheme != null) { return GetSchemeAsync(_options.DefaultSignOutScheme); } + if (_signOutHandlers.Count == 1) + { + return Task.FromResult(_signOutHandlers[0]); + } return GetDefaultSignInSchemeAsync(); } @@ -129,7 +132,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// The name of the authenticationScheme. /// The scheme or null if not found. - public Task GetSchemeAsync(string name) + public virtual Task GetSchemeAsync(string name) { if (_map.ContainsKey(name)) { @@ -142,7 +145,7 @@ namespace Microsoft.AspNetCore.Authentication /// Returns the schemes in priority order for request handling. /// /// The schemes in priority order for request handling - public Task> GetRequestHandlerSchemesAsync() + public virtual Task> GetRequestHandlerSchemesAsync() { return Task.FromResult>(_requestHandlers); } @@ -151,7 +154,7 @@ namespace Microsoft.AspNetCore.Authentication /// Registers a scheme for use by . /// /// The scheme. - public void AddScheme(AuthenticationScheme scheme) + public virtual void AddScheme(AuthenticationScheme scheme) { if (_map.ContainsKey(scheme.Name)) { @@ -167,6 +170,14 @@ namespace Microsoft.AspNetCore.Authentication { _requestHandlers.Add(scheme); } + if (typeof(IAuthenticationSignInHandler).IsAssignableFrom(scheme.HandlerType)) + { + _signInHandlers.Add(scheme); + } + if (typeof(IAuthenticationSignOutHandler).IsAssignableFrom(scheme.HandlerType)) + { + _signOutHandlers.Add(scheme); + } _map[scheme.Name] = scheme; } } @@ -175,7 +186,7 @@ namespace Microsoft.AspNetCore.Authentication /// Removes a scheme, preventing it from being used by . /// /// The name of the authenticationScheme being removed. - public void RemoveScheme(string name) + public virtual void RemoveScheme(string name) { if (!_map.ContainsKey(name)) { @@ -186,15 +197,15 @@ namespace Microsoft.AspNetCore.Authentication if (_map.ContainsKey(name)) { var scheme = _map[name]; - _requestHandlers.Remove(_requestHandlers.Where(s => s.Name == name).FirstOrDefault()); + _requestHandlers.Remove(scheme); + _signInHandlers.Remove(scheme); + _signOutHandlers.Remove(scheme); _map.Remove(name); } } } - public Task> GetAllSchemesAsync() - { - return Task.FromResult>(_map.Values); - } + public virtual Task> GetAllSchemesAsync() + => Task.FromResult>(_map.Values); } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index 326b277f9c..e9fcfc0b9f 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -155,10 +155,10 @@ namespace Microsoft.AspNetCore.Authentication } } - var handler = await Handlers.GetHandlerAsync(context, scheme); + var handler = await Handlers.GetHandlerAsync(context, scheme) as IAuthenticationSignInHandler; if (handler == null) { - throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + throw new InvalidOperationException($"No IAuthenticationSignInHandler is configured to handle sign in for the scheme: {scheme}"); } await handler.SignInAsync(principal, properties); @@ -173,15 +173,20 @@ namespace Microsoft.AspNetCore.Authentication /// A task. public virtual async Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties) { - if (string.IsNullOrEmpty(scheme)) + if (scheme == null) { - throw new ArgumentException(nameof(scheme)); + var defaultScheme = await Schemes.GetDefaultSignOutSchemeAsync(); + scheme = defaultScheme?.Name; + if (scheme == null) + { + throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultSignOutScheme found."); + } } - var handler = await Handlers.GetHandlerAsync(context, scheme); + var handler = await Handlers.GetHandlerAsync(context, scheme) as IAuthenticationSignOutHandler; if (handler == null) { - throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + throw new InvalidOperationException($"No IAuthenticationSignOutHandler is configured to handle sign out for the scheme: {scheme}"); } await handler.SignOutAsync(properties); diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs index 3810f8335f..fc647138d5 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs @@ -1,3 +1,4 @@ + // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. @@ -17,7 +18,7 @@ namespace Microsoft.AspNetCore.Authentication { var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => { - o.AddScheme("signin", "whatever"); + o.AddScheme("signin", "whatever"); o.AddScheme("foobly", "whatever"); o.DefaultSignInScheme = "signin"; }).BuildServiceProvider(); @@ -49,7 +50,7 @@ namespace Microsoft.AspNetCore.Authentication { var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => { - o.AddScheme("single", "whatever"); + o.AddScheme("single", "whatever"); }).BuildServiceProvider(); var provider = services.GetRequiredService(); @@ -60,14 +61,32 @@ namespace Microsoft.AspNetCore.Authentication Assert.Equal("single", (await provider.GetDefaultSignOutSchemeAsync()).Name); } + [Fact] + public async Task DefaultSchemesFallbackToAuthenticateScheme() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.DefaultAuthenticateScheme = "B"; + o.AddScheme("A", "whatever"); + o.AddScheme("B", "whatever"); + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + Assert.Equal("B", (await provider.GetDefaultForbidSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultChallengeSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultSignInSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultSignOutSchemeAsync()).Name); + } + [Fact] public async Task DefaultSchemesAreSet() { var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => { - o.AddScheme("A", "whatever"); - o.AddScheme("B", "whatever"); - o.AddScheme("C", "whatever"); + o.AddScheme("A", "whatever"); + o.AddScheme("B", "whatever"); + o.AddScheme("C", "whatever"); o.DefaultChallengeScheme = "A"; o.DefaultForbidScheme = "B"; o.DefaultSignInScheme = "C"; @@ -83,6 +102,38 @@ namespace Microsoft.AspNetCore.Authentication Assert.Equal("A", (await provider.GetDefaultSignOutSchemeAsync()).Name); } + [Fact] + public async Task SignInSignOutDefaultsToOnlyOne() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("basic", "whatever"); + o.AddScheme("signout", "whatever"); + o.AddScheme("signin", "whatever"); + o.DefaultAuthenticateScheme = "basic"; + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + Assert.Equal("basic", (await provider.GetDefaultForbidSchemeAsync()).Name); + Assert.Equal("basic", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); + Assert.Equal("basic", (await provider.GetDefaultChallengeSchemeAsync()).Name); + Assert.Equal("signin", (await provider.GetDefaultSignInSchemeAsync()).Name); + Assert.Equal("signin", (await provider.GetDefaultSignOutSchemeAsync()).Name); // Defaults to single sign in scheme + } + + [Fact] + public async Task SignOutWillDefaultsToSignInThatDoesNotSignOut() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("signin", "whatever"); + o.DefaultSignInScheme = "signin"; + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + Assert.NotNull(await provider.GetDefaultSignOutSchemeAsync()); + } + private class Handler : IAuthenticationHandler { public Task AuthenticateAsync() @@ -104,7 +155,10 @@ namespace Microsoft.AspNetCore.Authentication { throw new NotImplementedException(); } + } + private class SignInHandler : Handler, IAuthenticationSignInHandler + { public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties) { throw new NotImplementedException(); @@ -116,5 +170,12 @@ namespace Microsoft.AspNetCore.Authentication } } + private class SignOutHandler : Handler, IAuthenticationSignOutHandler + { + public Task SignOutAsync(AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + } } } diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs new file mode 100644 index 0000000000..471053e6b0 --- /dev/null +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs @@ -0,0 +1,245 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNetCore.Authentication +{ + public class AuthenticationServiceTests + { + [Fact] + public async Task CanOnlySignInIfSupported() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("uber", "whatever"); + o.AddScheme("base", "whatever"); + o.AddScheme("signin", "whatever"); + o.AddScheme("signout", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.SignInAsync("uber", new ClaimsPrincipal(), null); + await Assert.ThrowsAsync(() => context.SignInAsync("base", new ClaimsPrincipal(), null)); + await context.SignInAsync("signin", new ClaimsPrincipal(), null); + await Assert.ThrowsAsync(() => context.SignInAsync("signout", new ClaimsPrincipal(), null)); + } + + [Fact] + public async Task CanOnlySignOutIfSupported() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("uber", "whatever"); + o.AddScheme("base", "whatever"); + o.AddScheme("signin", "whatever"); + o.AddScheme("signout", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.SignOutAsync("uber"); + await Assert.ThrowsAsync(() => context.SignOutAsync("base")); + await context.SignOutAsync("signout"); + await context.SignOutAsync("signin"); + } + + [Fact] + public async Task ServicesWithDefaultIAuthenticationHandlerMethodsTest() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("base", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.AuthenticateAsync(); + await context.ChallengeAsync(); + await context.ForbidAsync(); + await Assert.ThrowsAsync(() => context.SignOutAsync()); + await Assert.ThrowsAsync(() => context.SignInAsync(new ClaimsPrincipal())); + } + + [Fact] + public async Task ServicesWithDefaultUberMethodsTest() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("base", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.AuthenticateAsync(); + await context.ChallengeAsync(); + await context.ForbidAsync(); + await context.SignOutAsync(); + await context.SignInAsync(new ClaimsPrincipal()); + } + + [Fact] + public async Task ServicesWithDefaultSignInMethodsTest() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("base", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.AuthenticateAsync(); + await context.ChallengeAsync(); + await context.ForbidAsync(); + await context.SignOutAsync(); + await context.SignInAsync(new ClaimsPrincipal()); + } + + [Fact] + public async Task ServicesWithDefaultSignOutMethodsTest() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("base", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.AuthenticateAsync(); + await context.ChallengeAsync(); + await context.ForbidAsync(); + await context.SignOutAsync(); + await Assert.ThrowsAsync(() => context.SignInAsync(new ClaimsPrincipal())); + } + + + private class BaseHandler : IAuthenticationHandler + { + public Task AuthenticateAsync() + { + return Task.FromResult(AuthenticateResult.NoResult()); + } + + public Task ChallengeAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task ForbidAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) + { + return Task.FromResult(0); + } + } + + private class SignInHandler : IAuthenticationSignInHandler + { + public Task AuthenticateAsync() + { + return Task.FromResult(AuthenticateResult.NoResult()); + } + + public Task ChallengeAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task ForbidAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) + { + return Task.FromResult(0); + } + + public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task SignOutAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + } + + public class SignOutHandler : IAuthenticationSignOutHandler + { + public Task AuthenticateAsync() + { + return Task.FromResult(AuthenticateResult.NoResult()); + } + + public Task ChallengeAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task ForbidAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) + { + return Task.FromResult(0); + } + + public Task SignOutAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + } + + private class UberHandler : IAuthenticationHandler, IAuthenticationRequestHandler, IAuthenticationSignInHandler, IAuthenticationSignOutHandler + { + public Task AuthenticateAsync() + { + return Task.FromResult(AuthenticateResult.NoResult()); + } + + public Task ChallengeAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task ForbidAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task HandleRequestAsync() + { + return Task.FromResult(false); + } + + public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) + { + return Task.FromResult(0); + } + + public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task SignOutAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + } + + } +} From 199b0fa212aa03a011f3c18575f0ab5102527c1a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 30 Jun 2017 09:20:13 -0700 Subject: [PATCH 715/846] Require CookieBuilder.Name to be a not null or empty --- .../CookieBuilder.cs | 11 ++- .../Properties/Resources.Designer.cs | 98 +++++++++---------- .../Resources.resx | 3 + 3 files changed, 57 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs index d2aa125ff3..bbb97f3318 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNetCore.Http.Abstractions; namespace Microsoft.AspNetCore.Http { @@ -10,10 +11,18 @@ namespace Microsoft.AspNetCore.Http /// public class CookieBuilder { + private string _name; + /// /// The name of the cookie. /// - public virtual string Name { get; set; } + public virtual string Name + { + get => _name; + set => _name = !string.IsNullOrEmpty(value) + ? value + : throw new ArgumentException(Resources.ArgumentCannotBeNullOrEmpty, nameof(value)); + } /// /// The cookie path. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs index 3b747cd441..0db61768ee 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs @@ -15,193 +15,183 @@ namespace Microsoft.AspNetCore.Http.Abstractions /// internal static string Exception_UseMiddlewareIServiceProviderNotAvailable { - get { return GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"); } + get => GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"); } /// /// '{0}' is not available. /// internal static string FormatException_UseMiddlewareIServiceProviderNotAvailable(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"), p0); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"), p0); /// - /// No public '{0}' method found. + /// No public '{0}' or '{1}' method found. /// internal static string Exception_UseMiddlewareNoInvokeMethod { - get { return GetString("Exception_UseMiddlewareNoInvokeMethod"); } + get => GetString("Exception_UseMiddlewareNoInvokeMethod"); } /// - /// No public '{0}' method found. + /// No public '{0}' or '{1}' method found. /// internal static string FormatException_UseMiddlewareNoInvokeMethod(object p0, object p1) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0, p1); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0, p1); /// - /// '{0}' does not return an object of type '{1}'. + /// '{0}' or '{1}' does not return an object of type '{2}'. /// internal static string Exception_UseMiddlewareNonTaskReturnType { - get { return GetString("Exception_UseMiddlewareNonTaskReturnType"); } + get => GetString("Exception_UseMiddlewareNonTaskReturnType"); } /// - /// '{0}' does not return an object of type '{1}'. + /// '{0}' or '{1}' does not return an object of type '{2}'. /// internal static string FormatException_UseMiddlewareNonTaskReturnType(object p0, object p1, object p2) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNonTaskReturnType"), p0, p1, p2); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNonTaskReturnType"), p0, p1, p2); /// - /// The '{0}' method's first argument must be of type '{1}'. + /// The '{0}' or '{1}' method's first argument must be of type '{2}'. /// internal static string Exception_UseMiddlewareNoParameters { - get { return GetString("Exception_UseMiddlewareNoParameters"); } + get => GetString("Exception_UseMiddlewareNoParameters"); } /// - /// The '{0}' method's first argument must be of type '{1}'. + /// The '{0}' or '{1}' method's first argument must be of type '{2}'. /// internal static string FormatException_UseMiddlewareNoParameters(object p0, object p1, object p2) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoParameters"), p0, p1, p2); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoParameters"), p0, p1, p2); /// - /// Multiple public '{0}' methods are available. + /// Multiple public '{0}' or '{1}' methods are available. /// internal static string Exception_UseMiddleMutlipleInvokes { - get { return GetString("Exception_UseMiddleMutlipleInvokes"); } + get => GetString("Exception_UseMiddleMutlipleInvokes"); } /// - /// Multiple public '{0}' methods are available. + /// Multiple public '{0}' or '{1}' methods are available. /// internal static string FormatException_UseMiddleMutlipleInvokes(object p0, object p1) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0, p1); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0, p1); /// /// The path in '{0}' must start with '/'. /// internal static string Exception_PathMustStartWithSlash { - get { return GetString("Exception_PathMustStartWithSlash"); } + get => GetString("Exception_PathMustStartWithSlash"); } /// /// The path in '{0}' must start with '/'. /// internal static string FormatException_PathMustStartWithSlash(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); /// /// Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. /// internal static string Exception_InvokeMiddlewareNoService { - get { return GetString("Exception_InvokeMiddlewareNoService"); } + get => GetString("Exception_InvokeMiddlewareNoService"); } /// /// Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. /// internal static string FormatException_InvokeMiddlewareNoService(object p0, object p1) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeMiddlewareNoService"), p0, p1); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeMiddlewareNoService"), p0, p1); /// /// The '{0}' method must not have ref or out parameters. /// internal static string Exception_InvokeDoesNotSupportRefOrOutParams { - get { return GetString("Exception_InvokeDoesNotSupportRefOrOutParams"); } + get => GetString("Exception_InvokeDoesNotSupportRefOrOutParams"); } /// /// The '{0}' method must not have ref or out parameters. /// internal static string FormatException_InvokeDoesNotSupportRefOrOutParams(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeDoesNotSupportRefOrOutParams"), p0); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeDoesNotSupportRefOrOutParams"), p0); /// /// The value must be greater than zero. /// internal static string Exception_PortMustBeGreaterThanZero { - get { return GetString("Exception_PortMustBeGreaterThanZero"); } + get => GetString("Exception_PortMustBeGreaterThanZero"); } /// /// The value must be greater than zero. /// internal static string FormatException_PortMustBeGreaterThanZero() - { - return GetString("Exception_PortMustBeGreaterThanZero"); - } + => GetString("Exception_PortMustBeGreaterThanZero"); /// /// No service for type '{0}' has been registered. /// internal static string Exception_UseMiddlewareNoMiddlewareFactory { - get { return GetString("Exception_UseMiddlewareNoMiddlewareFactory"); } + get => GetString("Exception_UseMiddlewareNoMiddlewareFactory"); } /// /// No service for type '{0}' has been registered. /// internal static string FormatException_UseMiddlewareNoMiddlewareFactory(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoMiddlewareFactory"), p0); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoMiddlewareFactory"), p0); /// /// '{0}' failed to create middleware of type '{1}'. /// internal static string Exception_UseMiddlewareUnableToCreateMiddleware { - get { return GetString("Exception_UseMiddlewareUnableToCreateMiddleware"); } + get => GetString("Exception_UseMiddlewareUnableToCreateMiddleware"); } /// /// '{0}' failed to create middleware of type '{1}'. /// internal static string FormatException_UseMiddlewareUnableToCreateMiddleware(object p0, object p1) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareUnableToCreateMiddleware"), p0, p1); - } + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareUnableToCreateMiddleware"), p0, p1); /// /// Types that implement '{0}' do not support explicit arguments. /// internal static string Exception_UseMiddlewareExplicitArgumentsNotSupported { - get { return GetString("Exception_UseMiddlewareExplicitArgumentsNotSupported"); } + get => GetString("Exception_UseMiddlewareExplicitArgumentsNotSupported"); } /// /// Types that implement '{0}' do not support explicit arguments. /// internal static string FormatException_UseMiddlewareExplicitArgumentsNotSupported(object p0) + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareExplicitArgumentsNotSupported"), p0); + + /// + /// Argument cannot be null or empty. + /// + internal static string ArgumentCannotBeNullOrEmpty { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareExplicitArgumentsNotSupported"), p0); + get => GetString("ArgumentCannotBeNullOrEmpty"); } + /// + /// Argument cannot be null or empty. + /// + internal static string FormatArgumentCannotBeNullOrEmpty() + => GetString("ArgumentCannotBeNullOrEmpty"); + private static string GetString(string name, params string[] formatterNames) { var value = _resourceManager.GetString(name); diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx index 969b4044a6..176d3a80c6 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx @@ -153,4 +153,7 @@ Types that implement '{0}' do not support explicit arguments. + + Argument cannot be null or empty. + \ No newline at end of file From 6d858dfeb216b6a58b6b440530dc352cfbfe8b47 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 30 Jun 2017 12:13:31 -0700 Subject: [PATCH 716/846] Make CookieBuilder.Build(HttpContext) non-virtual --- src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs index bbb97f3318..f0cdc3adf1 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs @@ -58,11 +58,10 @@ namespace Microsoft.AspNetCore.Http /// /// The policy that will be used to determine . - /// This is determined from the passed to . + /// This is determined from the passed to . /// public virtual CookieSecurePolicy SecurePolicy { get; set; } - /// /// Gets or sets the lifespan of a cookie. /// @@ -73,7 +72,7 @@ namespace Microsoft.AspNetCore.Http /// /// The . /// The cookie options. - public virtual CookieOptions Build(HttpContext context) => Build(context, DateTimeOffset.Now); + public CookieOptions Build(HttpContext context) => Build(context, DateTimeOffset.Now); /// /// Creates the cookie options from the given with an expiration based on and . From 596822f676492a41c6ad00a61332ab95fef2ae11 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 3 Jul 2017 14:06:04 -0700 Subject: [PATCH 717/846] Update LICENSE.txt text --- LICENSE.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 0bdc1962b6..7b2956ecee 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,10 +1,12 @@ -Copyright (c) .NET Foundation. All rights reserved. +Copyright (c) .NET Foundation and Contributors + +All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use -these files except in compliance with the License. You may obtain a copy of the +this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR From 85402d4bd6a64bc216bab1ff50d9b19a4f97db79 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 28 Jun 2017 14:52:14 -0700 Subject: [PATCH 718/846] Add CancellationToken to ISession Load/CommitAsync --- .../ISession.cs | 5 +++-- .../breakingchanges.netcore.json | 20 +++++++++++++++++++ .../DefaultHttpContextTests.cs | 5 +++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index c2dc435801..6bd780684d 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace Microsoft.AspNetCore.Http @@ -28,13 +29,13 @@ namespace Microsoft.AspNetCore.Http /// Load the session from the data store. This may throw if the data store is unavailable. /// /// - Task LoadAsync(); + Task LoadAsync(CancellationToken cancellationToken = default(CancellationToken)); /// /// Store the session in the data store. This may throw if the data store is unavailable. /// /// - Task CommitAsync(); + Task CommitAsync(CancellationToken cancellationToken = default(CancellationToken)); /// /// Retrieve the value of the given key, if present. diff --git a/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json index 7bdc58b355..96eb5548c5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json @@ -8,5 +8,25 @@ "TypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", "MemberId": "System.Void set_ContentLength(System.Nullable value)", "Kind": "Addition" + }, + { + "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", + "MemberId": "System.Threading.Tasks.Task CommitAsync()", + "Kind": "Removal" + }, + { + "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", + "MemberId": "System.Threading.Tasks.Task LoadAsync()", + "Kind": "Removal" + }, + { + "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", + "MemberId": "System.Threading.Tasks.Task CommitAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))", + "Kind": "Addition" + }, + { + "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", + "MemberId": "System.Threading.Tasks.Task LoadAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))", + "Kind": "Addition" } ] \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index 2327db1ce9..6463880f6e 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Net.WebSockets; using System.Reflection; using System.Security.Claims; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; using Xunit; @@ -301,12 +302,12 @@ namespace Microsoft.AspNetCore.Http _store.Clear(); } - public Task CommitAsync() + public Task CommitAsync(CancellationToken cancellationToken) { return Task.FromResult(0); } - public Task LoadAsync() + public Task LoadAsync(CancellationToken cancellationToken) { return Task.FromResult(0); } From 98eb31194cd2417eddfd7965df02555c1477f5dc Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 5 Jul 2017 13:33:39 -0700 Subject: [PATCH 719/846] Guard against null --- .../AuthenticationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index e9fcfc0b9f..346f8e14a2 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -66,7 +66,7 @@ namespace Microsoft.AspNetCore.Authentication } var result = await handler.AuthenticateAsync(); - if (result.Succeeded) + if (result?.Succeeded) { var transformed = await Transform.TransformAsync(result.Principal); return AuthenticateResult.Success(new AuthenticationTicket(transformed, result.Properties, result.Ticket.AuthenticationScheme)); From a79aea3bf379ef0752567474d9490279c6818ab1 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 5 Jul 2017 14:39:27 -0700 Subject: [PATCH 720/846] Tweak null guard --- .../AuthenticationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index 346f8e14a2..54bdd82d5a 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -66,7 +66,7 @@ namespace Microsoft.AspNetCore.Authentication } var result = await handler.AuthenticateAsync(); - if (result?.Succeeded) + if (result != null && result.Succeeded) { var transformed = await Transform.TransformAsync(result.Principal); return AuthenticateResult.Success(new AuthenticationTicket(transformed, result.Properties, result.Ticket.AuthenticationScheme)); From f15474fa658702f27f8ab1c422d6c333e6fdd326 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 6 Jul 2017 10:37:39 -0700 Subject: [PATCH 721/846] React to aspnet/BuildTools#293 [ci skip] --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index c81696f7f4..b4bc781894 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -2,7 +2,7 @@ 2.0.0-* 4.4.0-* - 2.1.0-* + 2.0.1-* 2.0.0-* 2.0.0-* 2.0.0-* From ae3278bd12e8535c27f805579c0cdcefeede9a31 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Thu, 6 Jul 2017 12:13:07 -0700 Subject: [PATCH 722/846] Set "TreatWarningsAsErrors" before NuGet restore * Ensures our build stays clean of NuGet warnings --- build/common.props | 1 + 1 file changed, 1 insertion(+) diff --git a/build/common.props b/build/common.props index e4bc74e655..c499bccf3f 100644 --- a/build/common.props +++ b/build/common.props @@ -10,6 +10,7 @@ true true $(VersionSuffix)-$(BuildNumber) + true From 49f3777d67aeb026085feec24dc63be81ce6e3a7 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 6 Jul 2017 15:08:19 -0700 Subject: [PATCH 723/846] Update version suffix for 2.0.0 RTM release --- version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.props b/version.props index a327eefab8..4c3cc829ad 100644 --- a/version.props +++ b/version.props @@ -2,6 +2,6 @@ 2.0.0 - preview3 + rtm \ No newline at end of file From 0e66e7562aa3e5d1e26dd8c714d4dfd12c3fd3f9 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Thu, 6 Jul 2017 15:16:04 -0700 Subject: [PATCH 724/846] Remove NETSTandard.Library.NETFramework --- build/common.props | 4 ---- samples/SampleApp/SampleApp.csproj | 4 ---- 2 files changed, 8 deletions(-) diff --git a/build/common.props b/build/common.props index c499bccf3f..ce6035fb12 100644 --- a/build/common.props +++ b/build/common.props @@ -16,8 +16,4 @@ - - - - diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index 470e3971d6..33c06e5810 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -12,8 +12,4 @@ - - - - From d894584254ccc5a2eb5671530b2ec9880fb097c0 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 7 Jul 2017 10:47:54 -0700 Subject: [PATCH 725/846] Add DefaultScheme, remove single fallback (#891) --- .../AuthenticationOptions.cs | 5 + .../IAuthenticationSchemeProvider.cs | 6 +- .../AuthenticationSchemeProvider.cs | 102 +++++------------- .../AuthenticationSchemeProviderTests.cs | 89 +++++++-------- .../AuthenticationServiceTests.cs | 4 + .../TokenExtensionTests.cs | 6 +- 6 files changed, 79 insertions(+), 133 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs index 9e1df2b455..4322dbebe1 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs @@ -60,6 +60,11 @@ namespace Microsoft.AspNetCore.Authentication b.HandlerType = typeof(THandler); }); + /// + /// Used by as the fallback default scheme for all the other defaults."/>. + /// + public string DefaultScheme { get; set; } + /// /// Used by as the default scheme by . /// diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs index 675cf52cf9..3d2584fca8 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs @@ -28,7 +28,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . Task GetDefaultAuthenticateSchemeAsync(); @@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . Task GetDefaultChallengeSchemeAsync(); @@ -52,7 +52,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . Task GetDefaultSignInSchemeAsync(); diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs index be02a5c396..f5ec8e1598 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; @@ -35,42 +34,33 @@ namespace Microsoft.AspNetCore.Authentication private IDictionary _map = new Dictionary(StringComparer.Ordinal); private List _requestHandlers = new List(); - private List _signOutHandlers = new List(); - private List _signInHandlers = new List(); + + private Task GetDefaultSchemeAsync() + => _options.DefaultScheme != null + ? GetSchemeAsync(_options.DefaultScheme) + : Task.FromResult(null); /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, if only a single scheme exists, that will be used, if more than one exists, null will be returned. + /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . public virtual Task GetDefaultAuthenticateSchemeAsync() - { - if (_options.DefaultAuthenticateScheme != null) - { - return GetSchemeAsync(_options.DefaultAuthenticateScheme); - } - if (_map.Count == 1) - { - return Task.FromResult(_map.Values.First()); - } - return Task.FromResult(null); - } + => _options.DefaultAuthenticateScheme != null + ? GetSchemeAsync(_options.DefaultAuthenticateScheme) + : GetDefaultSchemeAsync(); /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// Otherwise, this will fallback to . + /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . public virtual Task GetDefaultChallengeSchemeAsync() - { - if (_options.DefaultChallengeScheme != null) - { - return GetSchemeAsync(_options.DefaultChallengeScheme); - } - return GetDefaultAuthenticateSchemeAsync(); - } + => _options.DefaultChallengeScheme != null + ? GetSchemeAsync(_options.DefaultChallengeScheme) + : GetDefaultSchemeAsync(); /// /// Returns the scheme that will be used by default for . @@ -79,53 +69,31 @@ namespace Microsoft.AspNetCore.Authentication /// /// The scheme that will be used by default for . public virtual Task GetDefaultForbidSchemeAsync() - { - if (_options.DefaultForbidScheme != null) - { - return GetSchemeAsync(_options.DefaultForbidScheme); - } - return GetDefaultChallengeSchemeAsync(); - } + => _options.DefaultForbidScheme != null + ? GetSchemeAsync(_options.DefaultForbidScheme) + : GetDefaultChallengeSchemeAsync(); /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// If only a single sign in handler scheme exists, that will be used, if more than one exists, - /// this will fallback to . + /// Otherwise, this will fallback to . /// /// The scheme that will be used by default for . public virtual Task GetDefaultSignInSchemeAsync() - { - if (_options.DefaultSignInScheme != null) - { - return GetSchemeAsync(_options.DefaultSignInScheme); - } - if (_signInHandlers.Count == 1) - { - return Task.FromResult(_signInHandlers[0]); - } - return GetDefaultAuthenticateSchemeAsync(); - } + => _options.DefaultSignInScheme != null + ? GetSchemeAsync(_options.DefaultSignInScheme) + : GetDefaultSchemeAsync(); /// /// Returns the scheme that will be used by default for . /// This is typically specified via . - /// If only a single sign out handler scheme exists, that will be used, if more than one exists, - /// this will fallback to if that supoorts sign out. + /// Otherwise this will fallback to if that supoorts sign out. /// /// The scheme that will be used by default for . public virtual Task GetDefaultSignOutSchemeAsync() - { - if (_options.DefaultSignOutScheme != null) - { - return GetSchemeAsync(_options.DefaultSignOutScheme); - } - if (_signOutHandlers.Count == 1) - { - return Task.FromResult(_signOutHandlers[0]); - } - return GetDefaultSignInSchemeAsync(); - } + => _options.DefaultSignOutScheme != null + ? GetSchemeAsync(_options.DefaultSignOutScheme) + : GetDefaultSignInSchemeAsync(); /// /// Returns the matching the name, or null. @@ -133,22 +101,14 @@ namespace Microsoft.AspNetCore.Authentication /// The name of the authenticationScheme. /// The scheme or null if not found. public virtual Task GetSchemeAsync(string name) - { - if (_map.ContainsKey(name)) - { - return Task.FromResult(_map[name]); - } - return Task.FromResult(null); - } + => Task.FromResult(_map.ContainsKey(name) ? _map[name] : null); /// /// Returns the schemes in priority order for request handling. /// /// The schemes in priority order for request handling public virtual Task> GetRequestHandlerSchemesAsync() - { - return Task.FromResult>(_requestHandlers); - } + => Task.FromResult>(_requestHandlers); /// /// Registers a scheme for use by . @@ -170,14 +130,6 @@ namespace Microsoft.AspNetCore.Authentication { _requestHandlers.Add(scheme); } - if (typeof(IAuthenticationSignInHandler).IsAssignableFrom(scheme.HandlerType)) - { - _signInHandlers.Add(scheme); - } - if (typeof(IAuthenticationSignOutHandler).IsAssignableFrom(scheme.HandlerType)) - { - _signOutHandlers.Add(scheme); - } _map[scheme.Name] = scheme; } } @@ -198,8 +150,6 @@ namespace Microsoft.AspNetCore.Authentication { var scheme = _map[name]; _requestHandlers.Remove(scheme); - _signInHandlers.Remove(scheme); - _signOutHandlers.Remove(scheme); _map.Remove(name); } } diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs index fc647138d5..4fa0ea8782 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs @@ -13,6 +13,40 @@ namespace Microsoft.AspNetCore.Authentication { public class AuthenticationSchemeProviderTests { + [Fact] + public async Task NoDefaultsByDefault() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("B", "whatever"); + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + Assert.Null(await provider.GetDefaultForbidSchemeAsync()); + Assert.Null(await provider.GetDefaultAuthenticateSchemeAsync()); + Assert.Null(await provider.GetDefaultChallengeSchemeAsync()); + Assert.Null(await provider.GetDefaultSignInSchemeAsync()); + Assert.Null(await provider.GetDefaultSignOutSchemeAsync()); + } + + [Fact] + public async Task DefaultSchemesFallbackToDefaultScheme() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.DefaultScheme = "B"; + o.AddScheme("B", "whatever"); + }).BuildServiceProvider(); + + var provider = services.GetRequiredService(); + Assert.Equal("B", (await provider.GetDefaultForbidSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultChallengeSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultSignInSchemeAsync()).Name); + Assert.Equal("B", (await provider.GetDefaultSignOutSchemeAsync()).Name); + } + + [Fact] public async Task DefaultSignOutFallsbackToSignIn() { @@ -45,40 +79,6 @@ namespace Microsoft.AspNetCore.Authentication Assert.Equal("challenge", scheme.Name); } - [Fact] - public async Task DefaultSchemesFallbackToOnlyScheme() - { - var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => - { - o.AddScheme("single", "whatever"); - }).BuildServiceProvider(); - - var provider = services.GetRequiredService(); - Assert.Equal("single", (await provider.GetDefaultForbidSchemeAsync()).Name); - Assert.Equal("single", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); - Assert.Equal("single", (await provider.GetDefaultChallengeSchemeAsync()).Name); - Assert.Equal("single", (await provider.GetDefaultSignInSchemeAsync()).Name); - Assert.Equal("single", (await provider.GetDefaultSignOutSchemeAsync()).Name); - } - - [Fact] - public async Task DefaultSchemesFallbackToAuthenticateScheme() - { - var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => - { - o.DefaultAuthenticateScheme = "B"; - o.AddScheme("A", "whatever"); - o.AddScheme("B", "whatever"); - }).BuildServiceProvider(); - - var provider = services.GetRequiredService(); - Assert.Equal("B", (await provider.GetDefaultForbidSchemeAsync()).Name); - Assert.Equal("B", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); - Assert.Equal("B", (await provider.GetDefaultChallengeSchemeAsync()).Name); - Assert.Equal("B", (await provider.GetDefaultSignInSchemeAsync()).Name); - Assert.Equal("B", (await provider.GetDefaultSignOutSchemeAsync()).Name); - } - [Fact] public async Task DefaultSchemesAreSet() { @@ -87,6 +87,8 @@ namespace Microsoft.AspNetCore.Authentication o.AddScheme("A", "whatever"); o.AddScheme("B", "whatever"); o.AddScheme("C", "whatever"); + o.AddScheme("Def", "whatever"); + o.DefaultScheme = "Def"; o.DefaultChallengeScheme = "A"; o.DefaultForbidScheme = "B"; o.DefaultSignInScheme = "C"; @@ -102,25 +104,6 @@ namespace Microsoft.AspNetCore.Authentication Assert.Equal("A", (await provider.GetDefaultSignOutSchemeAsync()).Name); } - [Fact] - public async Task SignInSignOutDefaultsToOnlyOne() - { - var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => - { - o.AddScheme("basic", "whatever"); - o.AddScheme("signout", "whatever"); - o.AddScheme("signin", "whatever"); - o.DefaultAuthenticateScheme = "basic"; - }).BuildServiceProvider(); - - var provider = services.GetRequiredService(); - Assert.Equal("basic", (await provider.GetDefaultForbidSchemeAsync()).Name); - Assert.Equal("basic", (await provider.GetDefaultAuthenticateSchemeAsync()).Name); - Assert.Equal("basic", (await provider.GetDefaultChallengeSchemeAsync()).Name); - Assert.Equal("signin", (await provider.GetDefaultSignInSchemeAsync()).Name); - Assert.Equal("signin", (await provider.GetDefaultSignOutSchemeAsync()).Name); // Defaults to single sign in scheme - } - [Fact] public async Task SignOutWillDefaultsToSignInThatDoesNotSignOut() { diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs index 471053e6b0..c9fe57d970 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs @@ -56,6 +56,7 @@ namespace Microsoft.AspNetCore.Authentication var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => { o.AddScheme("base", "whatever"); + o.DefaultScheme = "base"; }).BuildServiceProvider(); var context = new DefaultHttpContext(); context.RequestServices = services; @@ -73,6 +74,7 @@ namespace Microsoft.AspNetCore.Authentication var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => { o.AddScheme("base", "whatever"); + o.DefaultScheme = "base"; }).BuildServiceProvider(); var context = new DefaultHttpContext(); context.RequestServices = services; @@ -90,6 +92,7 @@ namespace Microsoft.AspNetCore.Authentication var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => { o.AddScheme("base", "whatever"); + o.DefaultScheme = "base"; }).BuildServiceProvider(); var context = new DefaultHttpContext(); context.RequestServices = services; @@ -107,6 +110,7 @@ namespace Microsoft.AspNetCore.Authentication var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => { o.AddScheme("base", "whatever"); + o.DefaultScheme = "base"; }).BuildServiceProvider(); var context = new DefaultHttpContext(); context.RequestServices = services; diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs index d8f25f9509..21b78e5276 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs @@ -129,7 +129,11 @@ namespace Microsoft.AspNetCore.Authentication { var context = new DefaultHttpContext(); var services = new ServiceCollection().AddOptions() - .AddAuthenticationCore(o => o.AddScheme("simple", s => s.HandlerType = typeof(SimpleAuth))); + .AddAuthenticationCore(o => + { + o.DefaultScheme = "simple"; + o.AddScheme("simple", s => s.HandlerType = typeof(SimpleAuth)); + }); context.RequestServices = services.BuildServiceProvider(); Assert.Equal("1", await context.GetTokenAsync("One")); From 0f7c12308110f118f537bb4244a59da1f1e375d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Chalet?= Date: Mon, 10 Jul 2017 17:50:44 +0200 Subject: [PATCH 726/846] Fix AuthenticationOptions.DefaultScheme's invalid XML summary --- .../AuthenticationOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs index 4322dbebe1..d39da26b69 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNetCore.Authentication }); /// - /// Used by as the fallback default scheme for all the other defaults."/>. + /// Used by as the fallback default scheme for all the other defaults. /// public string DefaultScheme { get; set; } From 7403418d2b2e199a50f48825f626905a15045d19 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 10 Jul 2017 09:21:56 -0700 Subject: [PATCH 727/846] Clean up doc comments --- .../AuthenticationOptions.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs index d39da26b69..2781a35757 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs @@ -61,32 +61,32 @@ namespace Microsoft.AspNetCore.Authentication }); /// - /// Used by as the fallback default scheme for all the other defaults. + /// Used as the fallback default scheme for all the other defaults. /// public string DefaultScheme { get; set; } /// - /// Used by as the default scheme by . + /// Used as the default scheme by . /// public string DefaultAuthenticateScheme { get; set; } /// - /// Used by as the default scheme by . + /// Used as the default scheme by . /// public string DefaultSignInScheme { get; set; } /// - /// Used by as the default scheme by . + /// Used as the default scheme by . /// public string DefaultSignOutScheme { get; set; } /// - /// Used by as the default scheme by . + /// Used as the default scheme by . /// public string DefaultChallengeScheme { get; set; } /// - /// Used by as the default scheme by . + /// Used as the default scheme by . /// public string DefaultForbidScheme { get; set; } } From c6fbc77a88655f9015acb5eef9e11434081ba341 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 10 Jul 2017 11:43:01 -0700 Subject: [PATCH 728/846] Branching for 2.0.0 rtm --- NuGet.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.config b/NuGet.config index 4e8a1f6de1..37f0d27ea0 100644 --- a/NuGet.config +++ b/NuGet.config @@ -2,7 +2,7 @@ - + From ab2a16f0a6b646a94086ca1178ef55d9780ce5af Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 10 Jul 2017 11:57:57 -0700 Subject: [PATCH 729/846] Updating KoreBuild branch --- build.ps1 | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.ps1 b/build.ps1 index 5bf0e2c113..1785334385 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index b0bcadb579..5e27ed8efb 100755 --- a/build.sh +++ b/build.sh @@ -2,7 +2,7 @@ repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/2.0.0.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi From ca5108a1a1cfb33a7c53d9cffe34a3046864b1cf Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Fri, 7 Jul 2017 14:55:46 -0700 Subject: [PATCH 730/846] Skip first time experience on Appveyor --- appveyor.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 1041615c68..31efd8196f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -init: +init: - git config --global core.autocrlf true branches: only: @@ -9,6 +9,10 @@ branches: build_script: - ps: .\build.ps1 clone_depth: 1 +environment: + global: + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: 1 test: off deploy: off os: Visual Studio 2017 From 8d4e04cfb430f6d9db6592a73e627fd076e69d1a Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 10 Jul 2017 16:43:44 -0700 Subject: [PATCH 731/846] Fix duplicate test warnings. --- .../UriHelperTests.cs | 1 - .../RequestCookiesCollectionTests.cs | 3 --- .../ResponseCookiesTest.cs | 3 --- .../Base64UrlTextEncoderTests.cs | 1 - .../HeaderUtilitiesTest.cs | 16 +++++++++++++++- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index 90cd27a948..a27864c529 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -83,7 +83,6 @@ namespace Microsoft.AspNetCore.Http.Extensions [InlineData("https://127.0.0.0:80/bar", "https", "127.0.0.0:80", "/bar", "", "")] [InlineData("http://[1080:0:0:0:8:800:200C:417A]/index.html", "http", "[1080:0:0:0:8:800:200C:417A]", "/index.html", "", "")] [InlineData("http://example.com///", "http", "example.com", "///", "", "")] - [InlineData("http://example.com///", "http", "example.com", "///", "", "")] public void FromAbsoluteUriParsingChecks( string uri, string expectedScheme, diff --git a/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs b/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs index 6af99b8464..70106df027 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs @@ -17,9 +17,6 @@ namespace Microsoft.AspNetCore.Http.Tests // key, value, expected return new TheoryData { - { "key=value", "key", "value" }, - { "key%2C=%21value", "key,", "!value" }, - { "ke%23y%2C=val%5Eue", "ke#y,", "val^ue" }, { "key=value", "key", "value" }, { "key%2C=%21value", "key,", "!value" }, { "ke%23y%2C=val%5Eue", "ke#y,", "val^ue" }, diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index 77c7697c82..6e13a72ff0 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -51,9 +51,6 @@ namespace Microsoft.AspNetCore.Http.Tests // key, value, object pool, expected return new TheoryData { - { "key", "value", "key=value" }, - { "key,", "!value", "key%2C=%21value" }, - { "ke#y,", "val^ue", "ke%23y%2C=val%5Eue" }, { "key", "value", "key=value" }, { "key,", "!value", "key%2C=%21value" }, { "ke#y,", "val^ue", "ke%23y%2C=val%5Eue" }, diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs index 7a5701cc85..b91a8f47eb 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs @@ -55,7 +55,6 @@ namespace Microsoft.AspNetCore.WebUtilities [InlineData("a_b_c_d", "a/b/c/d=")] [InlineData("a-b_c", "a+b/c===")] [InlineData("a-b_c-d", "a+b/c+d=")] - [InlineData("a-b_c", "a+b/c===")] [InlineData("abcd", "abcd")] public void DecodeToBase64String_ReturnsValid_Base64String(string text, string expectedValue) { diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs index 807e17cc1e..6af446ce25 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -33,12 +33,26 @@ namespace Microsoft.Net.Http.Headers foreach (var quoted in new[] { true, false }) { - for (var i = 0; i < 60; i++) + data.Add(now, quoted); + + for (var i = 1; i < 60; i++) { data.Add(now.AddSeconds(i), quoted); data.Add(now.AddMinutes(i), quoted); + } + + for (var i = 1; i < DateTime.DaysInMonth(now.Year, now.Month); i++) + { data.Add(now.AddDays(i), quoted); + } + + for (var i = 1; i < 11; i++) + { data.Add(now.AddMonths(i), quoted); + } + + for (var i = 1; i < 5; i++) + { data.Add(now.AddYears(i), quoted); } } From 3202387d3ffe5bc5f90b1a983ce2429bac9bf355 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Thu, 13 Jul 2017 10:37:33 -0700 Subject: [PATCH 732/846] Fixes typo --- .../IApplicationBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs index ece1f75d8b..6110d7f3db 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Builder /// /// Adds a middleware delegate to the application's request pipeline. /// - /// The middleware delgate. + /// The middleware delegate. /// The . IApplicationBuilder Use(Func middleware); From ab0185a0b8d0b7a80a6169fd78a45f00a28e057d Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Thu, 13 Jul 2017 17:45:01 -0700 Subject: [PATCH 733/846] Adds null checks to UriHelper and fixes typo --- .../UriHelper.cs | 14 +++++++++-- .../UriHelperTests.cs | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index 2b423b5dbb..633e591186 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -53,6 +53,11 @@ namespace Microsoft.AspNetCore.Http.Extensions QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { + if (scheme == null) + { + throw new ArgumentNullException(nameof(scheme)); + } + var combinedPath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; var encodedHost = host.ToString(); @@ -74,7 +79,7 @@ namespace Microsoft.AspNetCore.Http.Extensions } /// - /// Seperates the given absolute URI string into components. Assumes no PathBase. + /// Separates the given absolute URI string into components. Assumes no PathBase. /// /// A string representation of the uri. /// http, https, etc. @@ -94,7 +99,7 @@ namespace Microsoft.AspNetCore.Http.Extensions { throw new ArgumentNullException(nameof(uri)); } - // Satisfy the out parameters + path = new PathString(); query = new QueryString(); fragment = new FragmentString(); @@ -142,6 +147,11 @@ namespace Microsoft.AspNetCore.Http.Extensions /// public static string Encode(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + if (uri.IsAbsoluteUri) { return BuildAbsolute( diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index a27864c529..11b045af4f 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Xunit; namespace Microsoft.AspNetCore.Http.Extensions @@ -128,5 +129,28 @@ namespace Microsoft.AspNetCore.Http.Extensions Assert.Equal(query, resQuery); Assert.Equal(fragment, resFragment); } + + [Fact] + public void BuildAbsoluteNullInputThrowsArgumentNullException() + { + var resHost = new HostString(); + var resPath = new PathString(); + var resQuery = new QueryString(); + var resFragment = new FragmentString(); + Assert.Throws(() => UriHelper.BuildAbsolute(null, resHost, resPath, resPath, resQuery, resFragment)); + + } + + [Fact] + public void FromAbsoluteNullInputThrowsArgumentNullException() + { + string resScheme = null; + var resHost = new HostString(); + var resPath = new PathString(); + var resQuery = new QueryString(); + var resFragment = new FragmentString(); + Assert.Throws(() => UriHelper.FromAbsolute(null, out resScheme, out resHost, out resPath, out resQuery, out resFragment)); + + } } } From 68ba94218a6e12ab8d88850bf3d5e39e558bfc6f Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Tue, 18 Jul 2017 09:08:49 -0700 Subject: [PATCH 734/846] IsNullOrWhiteSpace => IsNullOrEmpty --- .../Internal/ParsingHelpers.cs | 8 ++++---- src/Microsoft.AspNetCore.Http/HeaderDictionary.cs | 2 +- .../DictionaryStringValuesWrapper.cs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs index 173ea4438d..59ffd2bf19 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs @@ -55,7 +55,7 @@ namespace Microsoft.AspNetCore.Http.Internal throw new ArgumentNullException(nameof(headers)); } - if (string.IsNullOrWhiteSpace(key)) + if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException(nameof(key)); } @@ -72,7 +72,7 @@ namespace Microsoft.AspNetCore.Http.Internal // Quote items that contain comas and are not already quoted. private static string QuoteIfNeeded(string value) { - if (!string.IsNullOrWhiteSpace(value) && + if (!string.IsNullOrEmpty(value) && value.Contains(',') && (value[0] != '"' || value[value.Length - 1] != '"')) { @@ -83,7 +83,7 @@ namespace Microsoft.AspNetCore.Http.Internal private static string DeQuote(string value) { - if (!string.IsNullOrWhiteSpace(value) && + if (!string.IsNullOrEmpty(value) && (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"')) { value = value.Substring(1, value.Length - 2); @@ -99,7 +99,7 @@ namespace Microsoft.AspNetCore.Http.Internal throw new ArgumentNullException(nameof(headers)); } - if (string.IsNullOrWhiteSpace(key)) + if (string.IsNullOrEmpty(key)) { throw new ArgumentNullException(nameof(key)); } diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 30d338a20b..b0224d25ee 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -100,7 +100,7 @@ namespace Microsoft.AspNetCore.Http long value; var rawValue = this[HeaderNames.ContentLength]; if (rawValue.Count == 1 && - !string.IsNullOrWhiteSpace(rawValue[0]) && + !string.IsNullOrEmpty(rawValue[0]) && HeaderUtilities.TryParseNonNegativeInt64(new StringSegment(rawValue[0]).Trim(), out value)) { return value; diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs index bef2a0e27c..b31c7e9790 100644 --- a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs @@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Owin } if (rawValue.Length == 1 && - !string.IsNullOrWhiteSpace(rawValue[0]) && + !string.IsNullOrEmpty(rawValue[0]) && HeaderUtilities.TryParseNonNegativeInt64(new StringSegment(rawValue[0]).Trim(), out value)) { return value; From b41d8656d5c6c522f9966793214b67753b24331a Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 12 Jul 2017 17:34:55 -0700 Subject: [PATCH 735/846] Adds new date string in HttpRuleParser --- .../HttpRuleParser.cs | 3 +- .../DateParserTest.cs | 58 +++++++++---------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 5a6adf9415..3741ffa110 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -24,8 +24,9 @@ namespace Microsoft.Net.Http.Headers "d MMM yy H:m:s 'GMT'", // RFC 1123, no day-of-week, short year "d MMM yy H:m:s", // RFC 1123, no day-of-week, short year, no zone - "dddd, d'-'MMM'-'yy H:m:s 'GMT'", // RFC 850 + "dddd, d'-'MMM'-'yy H:m:s 'GMT'", // RFC 850, short year "dddd, d'-'MMM'-'yy H:m:s", // RFC 850 no zone + "ddd, d'-'MMM'-'yyyy H:m:s 'GMT'", // RFC 850, long year "ddd MMM d H:m:s yyyy", // ANSI C's asctime() format "ddd, d MMM yyyy H:m:s zzz", // RFC 5322 diff --git a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs index 0fffc0c134..83fec06c46 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs @@ -2,29 +2,47 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using Xunit; namespace Microsoft.Net.Http.Headers { public class DateParserTest { - [Fact] - public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + [Theory] + [MemberData(nameof(ValidStringData))] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly(string input, DateTimeOffset expected) { // We don't need to validate all possible date values, since they're already tested in HttpRuleParserTest. // Just make sure the parser calls HttpRuleParser methods correctly. - CheckValidParsedValue("Tue, 15 Nov 1994 08:12:31 GMT", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero)); - CheckValidParsedValue(" Sunday, 06-Nov-94 08:49:37 GMT ", new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero)); - CheckValidParsedValue(" Tue,\r\n 15 Nov\r\n 1994 08:12:31 GMT ", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero)); + DateTimeOffset result; + Assert.True(HeaderUtilities.TryParseDate(input, out result)); + Assert.Equal(expected, result); } - [Fact] - public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + private static IEnumerable ValidStringData() { - CheckInvalidParsedValue(null); - CheckInvalidParsedValue(string.Empty); - CheckInvalidParsedValue(" "); - CheckInvalidParsedValue("!!Sunday, 06-Nov-94 08:49:37 GMT"); + yield return new object[] { "Tue, 15 Nov 1994 08:12:31 GMT", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero) }; + yield return new object[] { " Sunday, 06-Nov-94 08:49:37 GMT ", new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero) }; + yield return new object[] { " Tue,\r\n 15 Nov\r\n 1994 08:12:31 GMT ", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero) }; + yield return new object[] { "Sat, 09-Dec-2017 07:07:03 GMT ", new DateTimeOffset(2017, 12, 09, 7, 7, 3, TimeSpan.Zero) }; + } + + [Theory] + [MemberData(nameof(InvalidStringData))] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse(string input) + { + DateTimeOffset result; + Assert.False(HeaderUtilities.TryParseDate(input, out result)); + Assert.Equal(new DateTimeOffset(), result); + } + + private static IEnumerable InvalidStringData() + { + yield return new object[] { null }; + yield return new object[] { string.Empty }; + yield return new object[] { " " }; + yield return new object[] { "!!Sunday, 06-Nov-94 08:49:37 GMT" }; } [Fact] @@ -36,23 +54,5 @@ namespace Microsoft.Net.Http.Headers Assert.Equal("Fri, 01 Jan 2010 01:01:01 GMT", HeaderUtilities.FormatDate(new DateTimeOffset(2010, 1, 1, 1, 1, 1, TimeSpan.Zero))); } - - #region Helper methods - - private void CheckValidParsedValue(string input, DateTimeOffset expectedResult) - { - DateTimeOffset result; - Assert.True(HeaderUtilities.TryParseDate(input, out result)); - Assert.Equal(expectedResult, result); - } - - private void CheckInvalidParsedValue(string input) - { - DateTimeOffset result; - Assert.False(HeaderUtilities.TryParseDate(input, out result)); - Assert.Equal(new DateTimeOffset(), result); - } - - #endregion } } From 21c44469f05cb9d3bdffdb4212057c2026393609 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Fri, 21 Jul 2017 12:59:27 -0700 Subject: [PATCH 736/846] 2.0.0-rtm to 2.1.0-preview1 --- version.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.props b/version.props index 4c3cc829ad..b32d3db0a8 100644 --- a/version.props +++ b/version.props @@ -1,7 +1,7 @@ - 2.0.0 - rtm + 2.1.0 + preview1 \ No newline at end of file From 1c7effa86eb5128dde046208cd940ac4faf00562 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Mon, 24 Jul 2017 17:56:19 -0700 Subject: [PATCH 737/846] Set AspNetCoreVersion --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index b4bc781894..833d909a0d 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,6 +1,6 @@ - 2.0.0-* + 2.1.0-* 4.4.0-* 2.0.1-* 2.0.0-* From 43bbd9697b12137b1a7386e2bd91e0399370fcdc Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 25 Jul 2017 15:13:22 -0700 Subject: [PATCH 738/846] Updating to InternalAspNetCoreSdkVersion 2.1.1-* --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index 833d909a0d..3c71bd378d 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -2,7 +2,7 @@ 2.1.0-* 4.4.0-* - 2.0.1-* + 2.1.1-* 2.0.0-* 2.0.0-* 2.0.0-* From 985e2eac6f4a2a0c31112965cb3a1607b15e04a8 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 25 Jul 2017 16:32:14 -0700 Subject: [PATCH 739/846] Update bootstrappers to use the compiled version of KoreBuild [ci skip] --- .gitignore | 1 + HttpAbstractions.sln | 2 +- build.cmd | 2 +- build.ps1 | 218 +++++++++++++++++++++++++--------- build.sh | 224 +++++++++++++++++++++++++++++------ build/common.props | 2 +- version.props => version.xml | 5 +- 7 files changed, 358 insertions(+), 96 deletions(-) rename version.props => version.xml (51%) diff --git a/.gitignore b/.gitignore index d5717b3f3f..bac5b75057 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ project.lock.json /.vs/ .vscode/ global.json +korebuild-lock.txt diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 6434e357d0..0a68e1e4c6 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -47,7 +47,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution build.sh = build.sh NuGet.config = NuGet.config README.md = README.md - version.props = version.props + version.xml = version.xml EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{ED7BCAC5-2796-44BD-9954-7C248263BC8B}" diff --git a/build.cmd b/build.cmd index 7d4894cb4a..b6c8d24864 100644 --- a/build.cmd +++ b/build.cmd @@ -1,2 +1,2 @@ @ECHO OFF -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" \ No newline at end of file +PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" diff --git a/build.ps1 b/build.ps1 index 5bf0e2c113..d5eb4d5cf2 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,67 +1,177 @@ -$ErrorActionPreference = "Stop" +#!/usr/bin/env powershell +#requires -version 4 -function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries) -{ - while($true) - { - try - { - Invoke-WebRequest $url -OutFile $downloadLocation - break - } - catch - { - $exceptionMessage = $_.Exception.Message - Write-Host "Failed to download '$url': $exceptionMessage" - if ($retries -gt 0) { - $retries-- - Write-Host "Waiting 10 seconds before retrying. Retries left: $retries" - Start-Sleep -Seconds 10 +<# +.SYNOPSIS +Build this repository +.DESCRIPTION +Downloads korebuild if required. Then builds the repository. + +.PARAMETER Path +The folder to build. Defaults to the folder containing this script. + +.PARAMETER Channel +The channel of KoreBuild to download. Overrides the value from the config file. + +.PARAMETER DotNetHome +The directory where .NET Core tools will be stored. + +.PARAMETER ToolsSource +The base url where build tools can be downloaded. Overrides the value from the config file. + +.PARAMETER Update +Updates KoreBuild to the latest version even if a lock file is present. + +.PARAMETER ConfigFile +The path to the configuration file that stores values. Defaults to version.xml. + +.PARAMETER MSBuildArgs +Arguments to be passed to MSBuild + +.NOTES +This function will create a file $PSScriptRoot/korebuild-lock.txt. This lock file can be committed to source, but does not have to be. +When the lockfile is not present, KoreBuild will create one using latest available version from $Channel. + +The $ConfigFile is expected to be an XML file. It is optional, and the configuration values in it are optional as well. + +.EXAMPLE +Example config file: +```xml + + + + dev + https://aspnetcore.blob.core.windows.net/buildtools + + +``` +#> +[CmdletBinding(PositionalBinding = $false)] +param( + [string]$Path = $PSScriptRoot, + [Alias('c')] + [string]$Channel, + [Alias('d')] + [string]$DotNetHome, + [Alias('s')] + [string]$ToolsSource, + [Alias('u')] + [switch]$Update, + [string]$ConfigFile = (Join-Path $PSScriptRoot 'version.xml'), + [Parameter(ValueFromRemainingArguments = $true)] + [string[]]$MSBuildArgs +) + +Set-StrictMode -Version 2 +$ErrorActionPreference = 'Stop' + +# +# Functions +# + +function Get-KoreBuild { + + $lockFile = Join-Path $Path 'korebuild-lock.txt' + + if (!(Test-Path $lockFile) -or $Update) { + Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile + } + + $version = Get-Content $lockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1 + if (!$version) { + Write-Error "Failed to parse version from $lockFile. Expected a line that begins with 'version:'" + } + $version = $version.TrimStart('version:').Trim() + $korebuildPath = Join-Paths $DotNetHome ('buildtools', 'korebuild', $version) + + if (!(Test-Path $korebuildPath)) { + Write-Host -ForegroundColor Magenta "Downloading KoreBuild $version" + New-Item -ItemType Directory -Path $korebuildPath | Out-Null + $remotePath = "$ToolsSource/korebuild/artifacts/$version/korebuild.$version.zip" + + try { + $tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip" + Get-RemoteFile $remotePath $tmpfile + if (Get-Command -Name 'Expand-Archive' -ErrorAction Ignore) { + # Use built-in commands where possible as they are cross-plat compatible + Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath } - else - { - $exception = $_.Exception - throw $exception + else { + # Fallback to old approach for old installations of PowerShell + Add-Type -AssemblyName System.IO.Compression.FileSystem + [System.IO.Compression.ZipFile]::ExtractToDirectory($tmpfile, $korebuildPath) } } + catch { + Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore + throw + } + finally { + Remove-Item $tmpfile -ErrorAction Ignore + } } + + return $korebuildPath } -cd $PSScriptRoot - -$repoFolder = $PSScriptRoot -$env:REPO_FOLDER = $repoFolder - -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" -if ($env:KOREBUILD_ZIP) -{ - $koreBuildZip=$env:KOREBUILD_ZIP +function Join-Paths([string]$path, [string[]]$childPaths) { + $childPaths | ForEach-Object { $path = Join-Path $path $_ } + return $path } -$buildFolder = ".build" -$buildFile="$buildFolder\KoreBuild.ps1" - -if (!(Test-Path $buildFolder)) { - Write-Host "Downloading KoreBuild from $koreBuildZip" - - $tempFolder=$env:TEMP + "\KoreBuild-" + [guid]::NewGuid() - New-Item -Path "$tempFolder" -Type directory | Out-Null - - $localZipFile="$tempFolder\korebuild.zip" - - DownloadWithRetry -url $koreBuildZip -downloadLocation $localZipFile -retries 6 - - Add-Type -AssemblyName System.IO.Compression.FileSystem - [System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder) - - New-Item -Path "$buildFolder" -Type directory | Out-Null - copy-item "$tempFolder\**\build\*" $buildFolder -Recurse - - # Cleanup - if (Test-Path $tempFolder) { - Remove-Item -Recurse -Force $tempFolder +function Get-RemoteFile([string]$RemotePath, [string]$LocalPath) { + if ($RemotePath -notlike 'http*') { + Copy-Item $RemotePath $LocalPath + return } + + $retries = 10 + while ($retries -gt 0) { + $retries -= 1 + try { + Invoke-WebRequest -UseBasicParsing -Uri $RemotePath -OutFile $LocalPath + return + } + catch { + Write-Verbose "Request failed. $retries retries remaining" + } + } + + Write-Error "Download failed: '$RemotePath'." } -&"$buildFile" @args +# +# Main +# + +# Load configuration or set defaults + +if (Test-Path $ConfigFile) { + [xml] $config = Get-Content $ConfigFile + if (!($Channel)) { [string] $Channel = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildChannel' } + if (!($ToolsSource)) { [string] $ToolsSource = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildToolsSource' } +} + +if (!$DotNetHome) { + $DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } ` + elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} ` + elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}` + else { Join-Path $PSScriptRoot '.dotnet'} +} + +if (!$Channel) { $Channel = 'dev' } +if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' } + +# Execute + +$korebuildPath = Get-KoreBuild +Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1') + +try { + Install-Tools $ToolsSource $DotNetHome + Invoke-RepositoryBuild $Path @MSBuildArgs +} +finally { + Remove-Module 'KoreBuild' -ErrorAction Ignore +} diff --git a/build.sh b/build.sh index b0bcadb579..ab590e62f1 100755 --- a/build.sh +++ b/build.sh @@ -1,46 +1,196 @@ #!/usr/bin/env bash -repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $repoFolder -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/dev.zip" -if [ ! -z $KOREBUILD_ZIP ]; then - koreBuildZip=$KOREBUILD_ZIP -fi +set -euo pipefail -buildFolder=".build" -buildFile="$buildFolder/KoreBuild.sh" +# +# variables +# -if test ! -d $buildFolder; then - echo "Downloading KoreBuild from $koreBuildZip" +RESET="\033[0m" +RED="\033[0;31m" +MAGENTA="\033[0;95m" +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +[ -z "${DOTNET_HOME:-}"] && DOTNET_HOME="$HOME/.dotnet" +config_file="$DIR/version.xml" +verbose=false +update=false +repo_path="$DIR" +channel='' +tools_source='' - tempFolder="/tmp/KoreBuild-$(uuidgen)" - mkdir $tempFolder +# +# Functions +# +__usage() { + echo "Usage: $(basename ${BASH_SOURCE[0]}) [options] [[--] ...]" + echo "" + echo "Arguments:" + echo " ... Arguments passed to MSBuild. Variable number of arguments allowed." + echo "" + echo "Options:" + echo " --verbose Show verbose output." + echo " -c|--channel The channel of KoreBuild to download. Overrides the value from the config file.." + echo " --config-file TThe path to the configuration file that stores values. Defaults to version.xml." + echo " -d|--dotnet-home The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet." + echo " --path The directory to build. Defaults to the directory containing the script." + echo " -s|--tools-source The base url where build tools can be downloaded. Overrides the value from the config file." + echo " -u|--update Update to the latest KoreBuild even if the lock file is present." + echo "" + echo "Description:" + echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be." + echo " When the lockfile is not present, KoreBuild will create one using latest available version from \$channel." - localZipFile="$tempFolder/korebuild.zip" - - retries=6 - until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null) - do - echo "Failed to download '$koreBuildZip'" - if [ "$retries" -le 0 ]; then - exit 1 - fi - retries=$((retries - 1)) - echo "Waiting 10 seconds before retrying. Retries left: $retries" - sleep 10s - done - - unzip -q -d $tempFolder $localZipFile - - mkdir $buildFolder - cp -r $tempFolder/**/build/** $buildFolder - - chmod +x $buildFile - - # Cleanup - if test -d $tempFolder; then - rm -rf $tempFolder + if [[ "${1:-}" != '--no-exit' ]]; then + exit 2 fi +} + +get_korebuild() { + local lock_file="$repo_path/korebuild-lock.txt" + if [ ! -f $lock_file ] || [ "$update" = true ]; then + __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" $lock_file + fi + local version="$(grep 'version:*' -m 1 $lock_file)" + if [[ "$version" == '' ]]; then + __error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'" + return 1 + fi + version="$(echo ${version#version:} | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version" + + { + if [ ! -d "$korebuild_path" ]; then + mkdir -p "$korebuild_path" + local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip" + tmpfile="$(mktemp)" + echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}" + if __get_remote_file $remote_path $tmpfile; then + unzip -q -d "$korebuild_path" $tmpfile + fi + rm $tmpfile || true + fi + + source "$korebuild_path/KoreBuild.sh" + } || { + if [ -d "$korebuild_path" ]; then + echo "Cleaning up after failed installation" + rm -rf "$korebuild_path" || true + fi + return 1 + } +} + +__error() { + echo -e "${RED}$@${RESET}" 1>&2 +} + +__machine_has() { + hash "$1" > /dev/null 2>&1 + return $? +} + +__get_remote_file() { + local remote_path=$1 + local local_path=$2 + + if [[ "$remote_path" != 'http'* ]]; then + cp $remote_path $local_path + return 0 + fi + + failed=false + if __machine_has wget; then + wget --tries 10 --quiet -O $local_path $remote_path || failed=true + fi + + if [ "$failed" = true ] && __machine_has curl; then + failed=false + curl --retry 10 -sSL -f --create-dirs -o $local_path $remote_path || failed=true + fi + + if [ "$failed" = true ]; then + __error "Download failed: $remote_path" 1>&2 + return 1 + fi +} + +__read_dom () { local IFS=\> ; read -d \< ENTITY CONTENT ;} + +# +# main +# + +while [[ $# > 0 ]]; do + case $1 in + -\?|-h|--help) + __usage --no-exit + exit 0 + ;; + -c|--channel|-Channel) + shift + channel=${1:-} + [ -z "$channel" ] && __usage + ;; + --config-file|-ConfigFile) + shift + config_file="${1:-}" + [ -z "$config_file" ] && __usage + ;; + -d|--dotnet-home|-DotNetHome) + shift + DOTNET_HOME=${1:-} + [ -z "$DOTNET_HOME" ] && __usage + ;; + --path|-Path) + shift + repo_path="${1:-}" + [ -z "$repo_path" ] && __usage + ;; + -s|--tools-source|-ToolsSource) + shift + tools_source="${1:-}" + [ -z "$tools_source" ] && __usage + ;; + -u|--update|-Update) + update=true + ;; + --verbose|-Verbose) + verbose=true + ;; + --) + shift + break + ;; + *) + break + ;; + esac + shift +done + +if ! __machine_has unzip; then + __error 'Missing required command: unzip' + exit 1 fi -$buildFile -r $repoFolder "$@" +if ! __machine_has curl && ! __machine_has wget; then + __error 'Missing required command. Either wget or curl is required.' + exit 1 +fi + +if [ -f $config_file ]; then + comment=false + while __read_dom; do + if [ "$comment" = true ]; then [[ $CONTENT == *'-->'* ]] && comment=false ; continue; fi + if [[ $ENTITY == '!--'* ]]; then comment=true; continue; fi + if [ -z "$channel" ] && [[ $ENTITY == "KoreBuildChannel" ]]; then channel=$CONTENT; fi + if [ -z "$tools_source" ] && [[ $ENTITY == "KoreBuildToolsSource" ]]; then tools_source=$CONTENT; fi + done < $config_file +fi + +[ -z "$channel" ] && channel='dev' +[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools' + +get_korebuild +install_tools "$tools_source" "$DOTNET_HOME" +invoke_repository_build "$repo_path" $@ diff --git a/build/common.props b/build/common.props index ce6035fb12..f49ac0662a 100644 --- a/build/common.props +++ b/build/common.props @@ -1,6 +1,6 @@ - + Microsoft ASP.NET Core diff --git a/version.props b/version.xml similarity index 51% rename from version.props rename to version.xml index b32d3db0a8..3c05022b7d 100644 --- a/version.props +++ b/version.xml @@ -1,7 +1,8 @@ - + + dev 2.1.0 preview1 - \ No newline at end of file + From 78768e38c89ef17acd1b111270ac41566224a3ba Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 26 Jul 2017 10:27:37 -0700 Subject: [PATCH 740/846] Fix syntax warning when running build.sh on older versions of bash [ci skip] --- build.sh | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/build.sh b/build.sh index ab590e62f1..5568c6182a 100755 --- a/build.sh +++ b/build.sh @@ -10,7 +10,7 @@ RESET="\033[0m" RED="\033[0;31m" MAGENTA="\033[0;95m" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -[ -z "${DOTNET_HOME:-}"] && DOTNET_HOME="$HOME/.dotnet" +[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet" config_file="$DIR/version.xml" verbose=false update=false @@ -22,7 +22,7 @@ tools_source='' # Functions # __usage() { - echo "Usage: $(basename ${BASH_SOURCE[0]}) [options] [[--] ...]" + echo "Usage: $(basename "${BASH_SOURCE[0]}") [options] [[--] ...]" echo "" echo "Arguments:" echo " ... Arguments passed to MSBuild. Variable number of arguments allowed." @@ -46,16 +46,17 @@ __usage() { } get_korebuild() { + local version local lock_file="$repo_path/korebuild-lock.txt" - if [ ! -f $lock_file ] || [ "$update" = true ]; then - __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" $lock_file + if [ ! -f "$lock_file" ] || [ "$update" = true ]; then + __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" fi - local version="$(grep 'version:*' -m 1 $lock_file)" + version="$(grep 'version:*' -m 1 "$lock_file")" if [[ "$version" == '' ]]; then __error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'" return 1 fi - version="$(echo ${version#version:} | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version" { @@ -64,10 +65,10 @@ get_korebuild() { local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip" tmpfile="$(mktemp)" echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}" - if __get_remote_file $remote_path $tmpfile; then - unzip -q -d "$korebuild_path" $tmpfile + if __get_remote_file "$remote_path" "$tmpfile"; then + unzip -q -d "$korebuild_path" "$tmpfile" fi - rm $tmpfile || true + rm "$tmpfile" || true fi source "$korebuild_path/KoreBuild.sh" @@ -81,7 +82,7 @@ get_korebuild() { } __error() { - echo -e "${RED}$@${RESET}" 1>&2 + echo -e "${RED}$*${RESET}" 1>&2 } __machine_has() { @@ -94,18 +95,18 @@ __get_remote_file() { local local_path=$2 if [[ "$remote_path" != 'http'* ]]; then - cp $remote_path $local_path + cp "$remote_path" "$local_path" return 0 fi failed=false if __machine_has wget; then - wget --tries 10 --quiet -O $local_path $remote_path || failed=true + wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true fi if [ "$failed" = true ] && __machine_has curl; then failed=false - curl --retry 10 -sSL -f --create-dirs -o $local_path $remote_path || failed=true + curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true fi if [ "$failed" = true ]; then @@ -114,13 +115,13 @@ __get_remote_file() { fi } -__read_dom () { local IFS=\> ; read -d \< ENTITY CONTENT ;} +__read_dom () { local IFS=\> ; read -r -d \< ENTITY CONTENT ;} # # main # -while [[ $# > 0 ]]; do +while [[ $# -gt 0 ]]; do case $1 in -\?|-h|--help) __usage --no-exit @@ -128,7 +129,7 @@ while [[ $# > 0 ]]; do ;; -c|--channel|-Channel) shift - channel=${1:-} + channel="${1:-}" [ -z "$channel" ] && __usage ;; --config-file|-ConfigFile) @@ -138,7 +139,7 @@ while [[ $# > 0 ]]; do ;; -d|--dotnet-home|-DotNetHome) shift - DOTNET_HOME=${1:-} + DOTNET_HOME="${1:-}" [ -z "$DOTNET_HOME" ] && __usage ;; --path|-Path) @@ -178,14 +179,14 @@ if ! __machine_has curl && ! __machine_has wget; then exit 1 fi -if [ -f $config_file ]; then +if [ -f "$config_file" ]; then comment=false while __read_dom; do if [ "$comment" = true ]; then [[ $CONTENT == *'-->'* ]] && comment=false ; continue; fi if [[ $ENTITY == '!--'* ]]; then comment=true; continue; fi if [ -z "$channel" ] && [[ $ENTITY == "KoreBuildChannel" ]]; then channel=$CONTENT; fi if [ -z "$tools_source" ] && [[ $ENTITY == "KoreBuildToolsSource" ]]; then tools_source=$CONTENT; fi - done < $config_file + done < "$config_file" fi [ -z "$channel" ] && channel='dev' @@ -193,4 +194,4 @@ fi get_korebuild install_tools "$tools_source" "$DOTNET_HOME" -invoke_repository_build "$repo_path" $@ +invoke_repository_build "$repo_path" "$@" From a8270a4901b3a4dbf73be1c025e9a34ecdf173bf Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Fri, 14 Jul 2017 18:06:06 -0700 Subject: [PATCH 741/846] Removes quotes from names in ContentDispositionHeaderValue --- .../ContentDispositionHeaderValue.cs | 5 +++-- .../ContentDispositionHeaderValueTest.cs | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index ff9faf066b..b9292ac1a8 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -73,6 +73,7 @@ namespace Microsoft.Net.Http.Headers set { SetName(NameString, value); } } + public StringSegment FileName { get { return GetName(FileNameString); } @@ -337,7 +338,7 @@ namespace Microsoft.Net.Http.Headers // Gets a parameter of the given name and attempts to decode it if necessary. // Returns null if the parameter is not present or the raw value if the encoding is incorrect. - private string GetName(string parameter) + private StringSegment GetName(string parameter) { var nameParameter = NameValueHeaderValue.Find(_parameters, parameter); if (nameParameter != null) @@ -359,7 +360,7 @@ namespace Microsoft.Net.Http.Headers return result; } // May not have been encoded - return nameParameter.Value.ToString(); + return HeaderUtilities.RemoveQuotes(nameParameter.Value); } return null; } diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index 17f9623347..ad1f7fce1f 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -152,7 +152,7 @@ namespace Microsoft.Net.Http.Headers Assert.Equal(1, contentDisposition.Parameters.Count); Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.Parameters.First().Value); - Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.FileName); + Assert.Equal("=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=", contentDisposition.FileName); contentDisposition.FileName = "new_name"; Assert.Equal("new_name", contentDisposition.FileName); @@ -560,6 +560,19 @@ namespace Microsoft.Net.Http.Headers Assert.Throws(() => ContentDispositionHeaderValue.Parse(input)); } + [Fact] + public void HeaderNamesWithQuotes_ExpectNamesToNotHaveQuotes() + { + var contentDispositionLine = "form-data; name =\"dotnet\"; filename=\"example.png\""; + var expectedName = "dotnet"; + var expectedFileName = "example.png"; + + var result = ContentDispositionHeaderValue.Parse(contentDispositionLine); + + Assert.Equal(expectedName, result.Name); + Assert.Equal(expectedFileName, result.FileName); + } + public class ContentDispositionValue { public ContentDispositionValue(string value, string description, bool valid) From 057fc816fab1062700959cdaad2a32e9d85efca6 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 12 Jul 2017 17:59:10 -0700 Subject: [PATCH 742/846] Refactor to HttpRequest/Response Streams --- build/dependencies.props | 1 + .../HttpRequestStreamReader.cs | 75 ++++-------- .../HttpResponseStreamWriter.cs | 71 ++++++----- .../HttpRequestStreamReaderTest.cs | 87 ++++++++++++++ .../HttpResponseStreamWriterTest.cs | 110 ++++++++++++++++++ ...osoft.AspNetCore.WebUtilities.Tests.csproj | 1 + 6 files changed, 255 insertions(+), 90 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 3c71bd378d..4e451e9dc7 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,6 +3,7 @@ 2.1.0-* 4.4.0-* 2.1.1-* + 4.7.49 2.0.0-* 2.0.0-* 2.0.0-* diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs index 24ee35936c..3f9478c5de 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs @@ -32,6 +32,7 @@ namespace Microsoft.AspNetCore.WebUtilities private int _bytesRead; private bool _isBlocked; + private bool _disposed; public HttpRequestStreamReader(Stream stream, Encoding encoding) : this(stream, encoding, DefaultBufferSize, ArrayPool.Shared, ArrayPool.Shared) @@ -50,44 +51,23 @@ namespace Microsoft.AspNetCore.WebUtilities ArrayPool bytePool, ArrayPool charPool) { - if (stream == null) - { - throw new ArgumentNullException(nameof(stream)); - } - - if (!stream.CanRead) - { - throw new ArgumentException(Resources.HttpRequestStreamReader_StreamNotReadable, nameof(stream)); - } - - if (encoding == null) - { - throw new ArgumentNullException(nameof(encoding)); - } - - if (bytePool == null) - { - throw new ArgumentNullException(nameof(bytePool)); - } - - if (charPool == null) - { - throw new ArgumentNullException(nameof(charPool)); - } + _stream = stream ?? throw new ArgumentNullException(nameof(stream)); + _encoding = encoding ?? throw new ArgumentNullException(nameof(encoding)); + _bytePool = bytePool ?? throw new ArgumentNullException(nameof(bytePool)); + _charPool = charPool ?? throw new ArgumentNullException(nameof(charPool)); if (bufferSize <= 0) { throw new ArgumentOutOfRangeException(nameof(bufferSize)); } + if (!stream.CanRead) + { + throw new ArgumentException(Resources.HttpRequestStreamReader_StreamNotReadable, nameof(stream)); + } - _stream = stream; - _encoding = encoding; _byteBufferSize = bufferSize; - _bytePool = bytePool; - _charPool = charPool; _decoder = encoding.GetDecoder(); - _byteBuffer = _bytePool.Rent(bufferSize); try @@ -98,33 +78,24 @@ namespace Microsoft.AspNetCore.WebUtilities catch { _bytePool.Return(_byteBuffer); - _byteBuffer = null; if (_charBuffer != null) { _charPool.Return(_charBuffer); - _charBuffer = null; } + + throw; } } protected override void Dispose(bool disposing) { - if (disposing && _stream != null) + if (disposing && !_disposed) { - _stream = null; + _disposed = true; - if (_bytePool != null) - { - _bytePool.Return(_byteBuffer); - _byteBuffer = null; - } - - if (_charPool != null) - { - _charPool.Return(_charBuffer); - _charBuffer = null; - } + _bytePool.Return(_byteBuffer); + _charPool.Return(_charBuffer); } base.Dispose(disposing); @@ -132,9 +103,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override int Peek() { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpRequestStreamReader)); } if (_charBufferIndex == _charsRead) @@ -150,9 +121,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override int Read() { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpRequestStreamReader)); } if (_charBufferIndex == _charsRead) @@ -183,9 +154,9 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentOutOfRangeException(nameof(count)); } - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpRequestStreamReader)); } var charsRead = 0; @@ -246,9 +217,9 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ArgumentOutOfRangeException(nameof(count)); } - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpRequestStreamReader)); } if (_charBufferIndex == _charsRead && await ReadIntoBufferAsync() == 0) diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs index 4356693d58..050088ccb7 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs @@ -28,6 +28,7 @@ namespace Microsoft.AspNetCore.WebUtilities private char[] _charBuffer; private int _charBufferCount; + private bool _disposed; public HttpResponseStreamWriter(Stream stream, Encoding encoding) : this(stream, encoding, DefaultBufferSize, ArrayPool.Shared, ArrayPool.Shared) @@ -46,15 +47,19 @@ namespace Microsoft.AspNetCore.WebUtilities ArrayPool bytePool, ArrayPool charPool) { - if (!stream.CanWrite) - { - throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); - } - + _stream = stream ?? throw new ArgumentNullException(nameof(stream)); Encoding = encoding ?? throw new ArgumentNullException(nameof(encoding)); _bytePool = bytePool ?? throw new ArgumentNullException(nameof(bytePool)); _charPool = charPool ?? throw new ArgumentNullException(nameof(charPool)); - _stream = stream ?? throw new ArgumentNullException(nameof(stream)); + + if (bufferSize <= 0) + { + throw new ArgumentOutOfRangeException(nameof(bufferSize)); + } + if (!_stream.CanWrite) + { + throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); + } _charBufferSize = bufferSize; @@ -69,12 +74,10 @@ namespace Microsoft.AspNetCore.WebUtilities catch { charPool.Return(_charBuffer); - _charBuffer = null; if (_byteBuffer != null) { bytePool.Return(_byteBuffer); - _byteBuffer = null; } throw; @@ -85,9 +88,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override void Write(char value) { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } if (_charBufferCount == _charBufferSize) @@ -101,9 +104,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override void Write(char[] values, int index, int count) { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } if (values == null) @@ -124,9 +127,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override void Write(string value) { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } if (value == null) @@ -149,9 +152,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override async Task WriteAsync(char value) { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } if (_charBufferCount == _charBufferSize) @@ -165,9 +168,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override async Task WriteAsync(char[] values, int index, int count) { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } if (values == null) @@ -188,9 +191,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override async Task WriteAsync(string value) { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } if (value == null) @@ -216,9 +219,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override void Flush() { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } FlushInternal(flushEncoder: true); @@ -226,9 +229,9 @@ namespace Microsoft.AspNetCore.WebUtilities public override Task FlushAsync() { - if (_stream == null) + if (_disposed) { - throw new ObjectDisposedException("stream"); + throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } return FlushInternalAsync(flushEncoder: true); @@ -236,29 +239,21 @@ namespace Microsoft.AspNetCore.WebUtilities protected override void Dispose(bool disposing) { - if (disposing && _stream != null) + if (disposing && !_disposed) { + _disposed = true; try { FlushInternal(flushEncoder: true); } finally { - _stream = null; - - if (_bytePool != null) - { - _bytePool.Return(_byteBuffer); - _byteBuffer = null; - } - - if (_charPool != null) - { - _charPool.Return(_charBuffer); - _charBuffer = null; - } + _bytePool.Return(_byteBuffer); + _charPool.Return(_charBuffer); } } + + base.Dispose(disposing); } // Note: our FlushInternal method does NOT flush the underlying stream. This would result in diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs index 82163c2b54..ee4d2f2bdc 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs @@ -1,12 +1,16 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Moq; +using System; +using System.Buffers; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Xunit; + namespace Microsoft.AspNetCore.WebUtilities.Test { public class HttpResponseStreamReaderTest @@ -191,6 +195,64 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Null(eol); } + [Theory] + [MemberData(nameof(HttpRequestNullData))] + public static void NullInputsInConstructor_ExpectArgumentNullException(Stream stream, Encoding encoding, ArrayPool bytePool, ArrayPool charPool) + { + Assert.Throws(() => + { + var httpRequestStreamReader = new HttpRequestStreamReader(stream, encoding, 1, bytePool, charPool); + }); + } + + + + [Theory] + [InlineData(0)] + [InlineData(-1)] + public static void NegativeOrZeroBufferSize_ExpectArgumentOutOfRangeException(int size) + { + Assert.Throws(() => + { + var httpRequestStreamReader = new HttpRequestStreamReader(new MemoryStream(), Encoding.UTF8, size, ArrayPool.Shared, ArrayPool.Shared); + }); + } + + [Fact] + public static void StreamCannotRead_ExpectArgumentException() + { + var mockStream = new Mock(); + mockStream.Setup(m => m.CanRead).Returns(false); + Assert.Throws(() => + { + var httpRequestStreamReader = new HttpRequestStreamReader(mockStream.Object, Encoding.UTF8, 1, ArrayPool.Shared, ArrayPool.Shared); + }); + } + + [Theory] + [MemberData(nameof(HttpRequestDisposeData))] + public static void StreamDisposed_ExpectedObjectDisposedException(Action action) + { + var httpRequestStreamReader = new HttpRequestStreamReader(new MemoryStream(), Encoding.UTF8, 10, ArrayPool.Shared, ArrayPool.Shared); + httpRequestStreamReader.Dispose(); + + Assert.Throws(() => + { + action(httpRequestStreamReader); + }); + } + + [Fact] + public static async Task StreamDisposed_ExpectObjectDisposedExceptionAsync() + { + var httpRequestStreamReader = new HttpRequestStreamReader(new MemoryStream(), Encoding.UTF8, 10, ArrayPool.Shared, ArrayPool.Shared); + httpRequestStreamReader.Dispose(); + + await Assert.ThrowsAsync(() => + { + return httpRequestStreamReader.ReadAsync(new char[10], 0, 1); + }); + } private static HttpRequestStreamReader CreateReader() { var stream = new MemoryStream(); @@ -221,5 +283,30 @@ namespace Microsoft.AspNetCore.WebUtilities.Test return new MemoryStream(data.ToArray()); } + private static IEnumerable HttpRequestNullData() + { + yield return new object[] { null, Encoding.UTF8, ArrayPool.Shared, ArrayPool.Shared }; + yield return new object[] { new MemoryStream(), null, ArrayPool.Shared, ArrayPool.Shared }; + yield return new object[] { new MemoryStream(), Encoding.UTF8, null, ArrayPool.Shared }; + yield return new object[] { new MemoryStream(), Encoding.UTF8, ArrayPool.Shared, null }; + } + + private static IEnumerable HttpRequestDisposeData() + { + yield return new object[] { new Action((httpRequestStreamReader) => + { + var res = httpRequestStreamReader.Read(); + })}; + yield return new object[] { new Action((httpRequestStreamReader) => + { + var res = httpRequestStreamReader.Read(new char[10], 0, 1); + })}; + + yield return new object[] { new Action((httpRequestStreamReader) => + { + var res = httpRequestStreamReader.Peek(); + })}; + + } } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index 10bd4bda3f..d0c94f9739 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -1,8 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Moq; using System; using System.Buffers; +using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; @@ -405,6 +407,65 @@ namespace Microsoft.AspNetCore.WebUtilities.Test Assert.Equal(content, actualContent); } + [Theory] + [MemberData(nameof(HttpResponseStreamWriterData))] + public static void NullInputsInConstructor_ExpectArgumentNullException(Stream stream, Encoding encoding, ArrayPool bytePool, ArrayPool charPool) + { + Assert.Throws(() => + { + var httpRequestStreamReader = new HttpResponseStreamWriter(stream, encoding, 1, bytePool, charPool); + }); + } + + [Theory] + [InlineData(0)] + [InlineData(-1)] + public static void NegativeOrZeroBufferSize_ExpectArgumentOutOfRangeException(int size) + { + Assert.Throws(() => + { + var httpRequestStreamReader = new HttpRequestStreamReader(new MemoryStream(), Encoding.UTF8, size, ArrayPool.Shared, ArrayPool.Shared); + }); + } + + [Fact] + public static void StreamCannotRead_ExpectArgumentException() + { + var mockStream = new Mock(); + mockStream.Setup(m => m.CanWrite).Returns(false); + Assert.Throws(() => + { + var httpRequestStreamReader = new HttpRequestStreamReader(mockStream.Object, Encoding.UTF8, 1, ArrayPool.Shared, ArrayPool.Shared); + }); + } + + [Theory] + [MemberData(nameof(HttpResponseDisposeData))] + public static void StreamDisposed_ExpectedObjectDisposedException(Action action) + { + var httpResponseStreamWriter = new HttpResponseStreamWriter(new MemoryStream(), Encoding.UTF8, 10, ArrayPool.Shared, ArrayPool.Shared); + httpResponseStreamWriter.Dispose(); + + Assert.Throws(() => + { + action(httpResponseStreamWriter); + }); + } + + [Theory] + [MemberData(nameof(HttpResponseDisposeDataAsync))] + public static async Task StreamDisposed_ExpectedObjectDisposedExceptionAsync(Func function) + { + var httpResponseStreamWriter = new HttpResponseStreamWriter(new MemoryStream(), Encoding.UTF8, 10, ArrayPool.Shared, ArrayPool.Shared); + httpResponseStreamWriter.Dispose(); + + await Assert.ThrowsAsync(() => + { + return function(httpResponseStreamWriter); + }); + } + + private class TestMemoryStream : MemoryStream { public int FlushCallCount { get; private set; } @@ -459,5 +520,54 @@ namespace Microsoft.AspNetCore.WebUtilities.Test base.Dispose(disposing); } } + + private static IEnumerable HttpResponseStreamWriterData() + { + yield return new object[] { null, Encoding.UTF8, ArrayPool.Shared, ArrayPool.Shared }; + yield return new object[] { new MemoryStream(), null, ArrayPool.Shared, ArrayPool.Shared }; + yield return new object[] { new MemoryStream(), Encoding.UTF8, null, ArrayPool.Shared }; + yield return new object[] { new MemoryStream(), Encoding.UTF8, ArrayPool.Shared, null }; + } + + private static IEnumerable HttpResponseDisposeData() + { + yield return new object[] { new Action((httpResponseStreamWriter) => + { + httpResponseStreamWriter.Write('a'); + })}; + yield return new object[] { new Action((httpResponseStreamWriter) => + { + httpResponseStreamWriter.Write(new char[] { 'a', 'b' }, 0, 1); + })}; + + yield return new object[] { new Action((httpResponseStreamWriter) => + { + httpResponseStreamWriter.Write("hello"); + })}; + yield return new object[] { new Action((httpResponseStreamWriter) => + { + httpResponseStreamWriter.Flush(); + })}; + } + private static IEnumerable HttpResponseDisposeDataAsync() + { + yield return new object[] { new Func(async (httpResponseStreamWriter) => + { + await httpResponseStreamWriter.WriteAsync('a'); + })}; + yield return new object[] { new Func(async (httpResponseStreamWriter) => + { + await httpResponseStreamWriter.WriteAsync(new char[] { 'a', 'b' }, 0, 1); + })}; + + yield return new object[] { new Func(async (httpResponseStreamWriter) => + { + await httpResponseStreamWriter.WriteAsync("hello"); + })}; + yield return new object[] { new Func(async (httpResponseStreamWriter) => + { + await httpResponseStreamWriter.FlushAsync(); + })}; + } } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index c37aac336e..66a940aed2 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -13,6 +13,7 @@ + From 06ef218c1c950a472ba22f444377ec846d8bd56a Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 2 Aug 2017 12:44:45 -0700 Subject: [PATCH 743/846] Update __get_remote_file logic --- build.sh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/build.sh b/build.sh index 5568c6182a..8eace4c20d 100755 --- a/build.sh +++ b/build.sh @@ -99,17 +99,16 @@ __get_remote_file() { return 0 fi - failed=false + local succeeded=false if __machine_has wget; then - wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true + wget --tries 10 --quiet -O "$local_path" "$remote_path" && succeeded=true fi - if [ "$failed" = true ] && __machine_has curl; then - failed=false - curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true + if [ "$succeeded" = false ] && __machine_has curl; then + curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" && succeeded=true fi - if [ "$failed" = true ]; then + if [ "$succeeded" = false ]; then __error "Download failed: $remote_path" 1>&2 return 1 fi From 637b57a8ae58684802d5417caf2d6f584bf828c4 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 2 Aug 2017 14:31:59 -0700 Subject: [PATCH 744/846] Ensure fallback to curl after failed wget --- build.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index 8eace4c20d..11cdbe5504 100755 --- a/build.sh +++ b/build.sh @@ -99,16 +99,19 @@ __get_remote_file() { return 0 fi - local succeeded=false + local failed=false if __machine_has wget; then - wget --tries 10 --quiet -O "$local_path" "$remote_path" && succeeded=true + wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true + else + failed=true fi - if [ "$succeeded" = false ] && __machine_has curl; then - curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" && succeeded=true + if [ "$failed" = true ] && __machine_has curl; then + failed=false + curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true fi - if [ "$succeeded" = false ]; then + if [ "$failed" = true ]; then __error "Download failed: $remote_path" 1>&2 return 1 fi From 5ec8a7134eaec5e878771e69b5b9b9c913ef9afe Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Mon, 7 Aug 2017 14:29:33 -0700 Subject: [PATCH 745/846] Adds FormFeature quoted boundary test --- .../Features/FormFeatureTests.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs index 9cf4f872ce..591f46a43e 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs @@ -49,11 +49,15 @@ namespace Microsoft.AspNetCore.Http.Features private const string MultipartContentType = "multipart/form-data; boundary=WebKitFormBoundary5pDRpGheQXaM8k3T"; + private const string MultipartContentTypeWithSpecialCharacters = "multipart/form-data; boundary=\"WebKitFormBoundary/:5pDRpGheQXaM8k3T\""; + private const string EmptyMultipartForm = "--WebKitFormBoundary5pDRpGheQXaM8k3T--"; // Note that CRLF (\r\n) is required. You can't use multi-line C# strings here because the line breaks on Linux are just LF. private const string MultipartFormEnd = "--WebKitFormBoundary5pDRpGheQXaM8k3T--\r\n"; + private const string MultipartFormEndWithSpecialCharacters = "--WebKitFormBoundary/:5pDRpGheQXaM8k3T--\r\n"; + private const string MultipartFormField = "--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + "Content-Disposition: form-data; name=\"description\"\r\n" + "\r\n" + @@ -71,6 +75,12 @@ namespace Microsoft.AspNetCore.Http.Features "\r\n" + "Hello World\r\n"; + private const string MultipartFormFileSpecialCharacters = "--WebKitFormBoundary/:5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"description\"\r\n" + +"\r\n" + +"Foo\r\n"; + + private const string MultipartFormWithField = MultipartFormField + MultipartFormEnd; @@ -88,6 +98,10 @@ namespace Microsoft.AspNetCore.Http.Features MultipartFormEncodedFilename + MultipartFormEnd; + private const string MultipartFormWithSpecialCharacters = + MultipartFormFileSpecialCharacters + + MultipartFormEndWithSpecialCharacters; + [Theory] [InlineData(true)] [InlineData(false)] @@ -208,6 +222,43 @@ namespace Microsoft.AspNetCore.Http.Features await responseFeature.CompleteAsync(); } + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task ReadFormAsync_MultipartWithFileAndQuotedBoundaryString_ReturnsParsedFormCollection(bool bufferRequest) + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithSpecialCharacters); + var context = new DefaultHttpContext(); + var responseFeature = new FakeResponseFeature(); + context.Features.Set(responseFeature); + context.Request.ContentType = MultipartContentTypeWithSpecialCharacters; + context.Request.Body = new NonSeekableReadStream(formContent); + + IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest }); + context.Features.Set(formFeature); + + var formCollection = context.Request.Form; + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.Features.Get(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formCollection, formFeature.Form); + Assert.Same(formCollection, await context.Request.ReadFormAsync()); + + // Content + Assert.Equal(1, formCollection.Count); + Assert.Equal("Foo", formCollection["description"]); + + Assert.NotNull(formCollection.Files); + Assert.Equal(0, formCollection.Files.Count); + + // Cleanup + await responseFeature.CompleteAsync(); + } + [Theory] [InlineData(true)] [InlineData(false)] From 594f55947f4c1d0a9d3122e3f39bcfa81199b12a Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Thu, 10 Aug 2017 18:01:30 -0700 Subject: [PATCH 746/846] Keep ResponseCookie options on delete. (#905) --- .../Internal/ResponseCookies.cs | 3 ++ .../ResponseCookiesTest.cs | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs index 04dc5b947e..85e006dc8e 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs @@ -129,6 +129,9 @@ namespace Microsoft.AspNetCore.Http.Internal Path = options.Path, Domain = options.Domain, Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), + Secure = options.Secure, + HttpOnly = options.HttpOnly, + SameSite = options.SameSite }); } } diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index 6e13a72ff0..3693a42866 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Text; using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.ObjectPool; @@ -27,6 +28,35 @@ namespace Microsoft.AspNetCore.Http.Tests Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); } + [Fact] + public void DeleteCookieWithCookieOptionsShouldKeepPropertiesOfCookieOptions() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers, null); + var testcookie = "TestCookie"; + var time = new DateTimeOffset(2000, 1, 1, 1, 1, 1, 1, TimeSpan.Zero); + var options = new CookieOptions + { + Secure = true, + HttpOnly = true, + Path = "/", + Expires = time, + Domain = "example.com", + SameSite = SameSiteMode.Lax + }; + + cookies.Delete(testcookie, options); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(testcookie, cookieHeaderValues[0]); + Assert.Contains("path=/", cookieHeaderValues[0]); + Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); + Assert.Contains("secure", cookieHeaderValues[0]); + Assert.Contains("httponly", cookieHeaderValues[0]); + Assert.Contains("samesite", cookieHeaderValues[0]); + } + [Fact] public void NoParamsDeleteRemovesCookieCreatedByAdd() { From 27b0f60f09f5b8a91a1d0706c3a2ec94ee00eee9 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Sat, 19 Aug 2017 22:09:22 -0700 Subject: [PATCH 747/846] ForbidAsync now uses correct Schemes method (#918) * ForbidAsync now uses correct Schemes method * comment * adds tests --- .../AuthenticationService.cs | 6 +-- .../AuthenticationServiceTests.cs | 52 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index 54bdd82d5a..9a8223d013 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -113,11 +113,11 @@ namespace Microsoft.AspNetCore.Authentication { if (scheme == null) { - var defaultChallengeScheme = await Schemes.GetDefaultChallengeSchemeAsync(); - scheme = defaultChallengeScheme?.Name; + var defaultForbidScheme = await Schemes.GetDefaultForbidSchemeAsync(); + scheme = defaultForbidScheme?.Name; if (scheme == null) { - throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultChallengeScheme found."); + throw new InvalidOperationException($"No authenticationScheme was specified, and there was no DefaultForbidScheme found."); } } diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs index c9fe57d970..292c56f50c 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs @@ -122,6 +122,20 @@ namespace Microsoft.AspNetCore.Authentication await Assert.ThrowsAsync(() => context.SignInAsync(new ClaimsPrincipal())); } + [Fact] + public async Task ServicesWithDefaultForbidMethod_CallsForbidMethod() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("forbid", "whatever"); + o.DefaultForbidScheme = "forbid"; + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.ForbidAsync(); + } + private class BaseHandler : IAuthenticationHandler { @@ -245,5 +259,43 @@ namespace Microsoft.AspNetCore.Authentication } } + private class ForbidHandler : IAuthenticationHandler, IAuthenticationRequestHandler, IAuthenticationSignInHandler, IAuthenticationSignOutHandler + { + public Task AuthenticateAsync() + { + throw new NotImplementedException(); + } + + public Task ChallengeAsync(AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + + public Task ForbidAsync(AuthenticationProperties properties) + { + return Task.FromResult(0); + } + + public Task HandleRequestAsync() + { + throw new NotImplementedException(); + } + + public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) + { + return Task.FromResult(0); + } + + public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + + public Task SignOutAsync(AuthenticationProperties properties) + { + throw new NotImplementedException(); + } + } + } } From 5b58a6a71d6525009091f86b2391292ab46a1fc4 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 22 Aug 2017 16:29:13 -0700 Subject: [PATCH 748/846] Upgrade to xunit 2.3.0-beta4 --- build/dependencies.props | 5 ++- .../TokenExtensionTests.cs | 2 +- .../PathStringTests.cs | 40 +++++++++++-------- .../UseMiddlewareTest.cs | 4 +- .../DefaultHttpContextTests.cs | 6 +-- .../Microsoft.AspNetCore.Owin.Tests.csproj | 1 + .../HttpRequestStreamReaderTest.cs | 5 ++- .../HttpResponseStreamWriterTest.cs | 7 ++-- .../MultipartReaderTests.cs | 18 ++++----- .../QueryHelpersTests.cs | 2 +- .../CookieHeaderValueTest.cs | 33 ++++++++------- .../DateParserTest.cs | 10 ++--- .../RangeItemHeaderValueTest.cs | 2 +- .../SetCookieHeaderValueTest.cs | 33 ++++++++------- 14 files changed, 87 insertions(+), 81 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 4e451e9dc7..a5fb570275 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -7,7 +7,8 @@ 2.0.0-* 2.0.0-* 2.0.0-* - 15.3.0-* - 2.3.0-beta2-* + 15.3.0 + 0.6.1 + 2.3.0-beta4-build3742 diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs index 21b78e5276..7215d526e9 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs @@ -53,7 +53,7 @@ namespace Microsoft.AspNetCore.Authentication Assert.Null(props.GetTokenValue("One")); Assert.Null(props.GetTokenValue("Two")); Assert.Null(props.GetTokenValue("Three")); - Assert.Equal(1, props.GetTokens().Count()); + Assert.Single(props.GetTokens()); } [Fact] diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index ad070afa02..2d3c6e23f0 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -138,8 +138,7 @@ namespace Microsoft.AspNetCore.Http var source = new PathString(sourcePath); var test = new PathString(testPath); - PathString remaining; - var result = source.StartsWithSegments(test, out remaining); + var result = source.StartsWithSegments(test, out var remaining); Assert.Equal(expectedResult, result); } @@ -181,26 +180,33 @@ namespace Microsoft.AspNetCore.Http var source = new PathString(sourcePath); var test = new PathString(testPath); - PathString remaining; - var result = source.StartsWithSegments(test, comparison, out remaining); + var result = source.StartsWithSegments(test, comparison, out var remaining); Assert.Equal(expectedResult, result); } [Theory] - [InlineData("unreserved", "/abc123.-_~", "/abc123.-_~")] - [InlineData("colon", "/:", "/:")] - [InlineData("at", "/@", "/@")] - [InlineData("sub-delims", "/!$&'()*+,;=", "/!$&'()*+,;=")] - [InlineData("reserved", "/?#[]", "/%3F%23%5B%5D")] - [InlineData("pct-encoding", "/单行道", "/%E5%8D%95%E8%A1%8C%E9%81%93")] - [InlineData("mixed1", "/index/单行道=(x*y)[abc]", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D")] - [InlineData("mixed2", "/index/单行道=(x*y)[abc]_", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D_")] - [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/", "/http%3a%2f%2f%5Bfoo%5D%3A5000/")] - [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/%", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%25")] - [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/%2", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%252")] - [InlineData("encoded", "/http%3a%2f%2f[foo]%3A5000/%2F", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%2F")] - public void ToUriComponentEscapeCorrectly(string category, string input, string expected) + // unreserved + [InlineData("/abc123.-_~", "/abc123.-_~")] + // colon + [InlineData("/:", "/:")] + // at + [InlineData("/@", "/@")] + // sub-delims + [InlineData("/!$&'()*+,;=", "/!$&'()*+,;=")] + // reserved + [InlineData("/?#[]", "/%3F%23%5B%5D")] + // pct-encoding + [InlineData("/单行道", "/%E5%8D%95%E8%A1%8C%E9%81%93")] + // mixed + [InlineData("/index/单行道=(x*y)[abc]", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D")] + [InlineData("/index/单行道=(x*y)[abc]_", "/index/%E5%8D%95%E8%A1%8C%E9%81%93=(x*y)%5Babc%5D_")] + // encoded + [InlineData("/http%3a%2f%2f[foo]%3A5000/", "/http%3a%2f%2f%5Bfoo%5D%3A5000/")] + [InlineData("/http%3a%2f%2f[foo]%3A5000/%", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%25")] + [InlineData("/http%3a%2f%2f[foo]%3A5000/%2", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%252")] + [InlineData("/http%3a%2f%2f[foo]%3A5000/%2F", "/http%3a%2f%2f%5Bfoo%5D%3A5000/%2F")] + public void ToUriComponentEscapeCorrectly(string input, string expected) { var path = new PathString(input); diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index 7bf6ad4a74..342aa54a06 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -227,8 +227,8 @@ namespace Microsoft.AspNetCore.Http Assert.True(Assert.IsType(context.Items["after"])); Assert.NotNull(middlewareFactory.Created); Assert.NotNull(middlewareFactory.Released); - Assert.IsType(typeof(Middleware), middlewareFactory.Created); - Assert.IsType(typeof(Middleware), middlewareFactory.Released); + Assert.IsType(middlewareFactory.Created); + Assert.IsType(middlewareFactory.Released); Assert.Same(middlewareFactory.Created, middlewareFactory.Released); } diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index 6463880f6e..33f73cf191 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -84,21 +84,21 @@ namespace Microsoft.AspNetCore.Http { var context = new DefaultHttpContext(new FeatureCollection()); Assert.NotNull(context.User); - Assert.Equal(1, context.User.Identities.Count()); + Assert.Single(context.User.Identities); Assert.True(object.ReferenceEquals(context.User, context.User)); Assert.False(context.User.Identity.IsAuthenticated); Assert.True(string.IsNullOrEmpty(context.User.Identity.AuthenticationType)); context.User = null; Assert.NotNull(context.User); - Assert.Equal(1, context.User.Identities.Count()); + Assert.Single(context.User.Identities); Assert.True(object.ReferenceEquals(context.User, context.User)); Assert.False(context.User.Identity.IsAuthenticated); Assert.True(string.IsNullOrEmpty(context.User.Identity.AuthenticationType)); context.User = new ClaimsPrincipal(); Assert.NotNull(context.User); - Assert.Equal(0, context.User.Identities.Count()); + Assert.Empty(context.User.Identities); Assert.True(object.ReferenceEquals(context.User, context.User)); Assert.Null(context.User.Identity); diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 47fc0bafde..5ec662d085 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -15,6 +15,7 @@ + diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs index ee4d2f2bdc..062342fa4c 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs @@ -283,7 +283,8 @@ namespace Microsoft.AspNetCore.WebUtilities.Test return new MemoryStream(data.ToArray()); } - private static IEnumerable HttpRequestNullData() + + public static IEnumerable HttpRequestNullData() { yield return new object[] { null, Encoding.UTF8, ArrayPool.Shared, ArrayPool.Shared }; yield return new object[] { new MemoryStream(), null, ArrayPool.Shared, ArrayPool.Shared }; @@ -291,7 +292,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test yield return new object[] { new MemoryStream(), Encoding.UTF8, ArrayPool.Shared, null }; } - private static IEnumerable HttpRequestDisposeData() + public static IEnumerable HttpRequestDisposeData() { yield return new object[] { new Action((httpRequestStreamReader) => { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index d0c94f9739..7847e1384e 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -521,7 +521,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test } } - private static IEnumerable HttpResponseStreamWriterData() + public static IEnumerable HttpResponseStreamWriterData() { yield return new object[] { null, Encoding.UTF8, ArrayPool.Shared, ArrayPool.Shared }; yield return new object[] { new MemoryStream(), null, ArrayPool.Shared, ArrayPool.Shared }; @@ -529,7 +529,7 @@ namespace Microsoft.AspNetCore.WebUtilities.Test yield return new object[] { new MemoryStream(), Encoding.UTF8, ArrayPool.Shared, null }; } - private static IEnumerable HttpResponseDisposeData() + public static IEnumerable HttpResponseDisposeData() { yield return new object[] { new Action((httpResponseStreamWriter) => { @@ -549,7 +549,8 @@ namespace Microsoft.AspNetCore.WebUtilities.Test httpResponseStreamWriter.Flush(); })}; } - private static IEnumerable HttpResponseDisposeDataAsync() + + public static IEnumerable HttpResponseDisposeDataAsync() { yield return new object[] { new Func(async (httpResponseStreamWriter) => { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs index 90c2ffdfcb..d66ea98fed 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs @@ -113,7 +113,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); @@ -156,7 +156,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); @@ -173,7 +173,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); @@ -190,7 +190,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); @@ -216,7 +216,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); @@ -242,7 +242,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); @@ -289,7 +289,7 @@ namespace Microsoft.AspNetCore.WebUtilities //first section can be read successfully var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); var read = section.Body.Read(buffer, 0, buffer.Length); Assert.Equal("text default", GetString(buffer, read)); @@ -336,7 +336,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\" filename=\"a\uFFFD!.txt\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); @@ -371,7 +371,7 @@ namespace Microsoft.AspNetCore.WebUtilities var section = await reader.ReadNextSectionAsync(); Assert.NotNull(section); - Assert.Equal(1, section.Headers.Count); + Assert.Single(section.Headers); Assert.Equal("form-data; name=\"text\" filename=\"a\uFFFDU.txt\"", section.Headers["Content-Disposition"][0]); var buffer = new MemoryStream(); await section.Body.CopyToAsync(buffer); diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs index fde7ece69b..5607ab87aa 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs @@ -49,7 +49,7 @@ namespace Microsoft.AspNetCore.WebUtilities public void ParseQueryWithEmptyKeyWorks() { var collection = QueryHelpers.ParseQuery("?=value1&="); - Assert.Equal(1, collection.Count); + Assert.Single(collection); Assert.Equal(new[] { "value1", "" }, collection[""]); } diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs index 4b320c0e06..416441991d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -223,9 +223,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(CookieHeaderDataSet))] public void CookieHeaderValue_TryParse_AcceptsValidValues(CookieHeaderValue cookie, string expectedValue) { - CookieHeaderValue header; - var result = CookieHeaderValue.TryParse(expectedValue, out header); - Assert.True(result); + Assert.True(CookieHeaderValue.TryParse(expectedValue, out var header)); Assert.Equal(cookie, header); Assert.Equal(expectedValue, header.ToString()); @@ -242,10 +240,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(InvalidCookieHeaderDataSet))] public void CookieHeaderValue_TryParse_RejectsInvalidValues(string value) { - CookieHeaderValue header; - var result = CookieHeaderValue.TryParse(value, out header); - - Assert.False(result); + Assert.False(CookieHeaderValue.TryParse(value, out var _)); } [Theory] @@ -270,8 +265,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(ListOfCookieHeaderDataSet))] public void CookieHeaderValue_TryParseList_AcceptsValidValues(IList cookies, string[] input) { - IList results; - var result = CookieHeaderValue.TryParseList(input, out results); + var result = CookieHeaderValue.TryParseList(input, out var results); Assert.True(result); Assert.Equal(cookies, results); @@ -281,8 +275,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(ListOfCookieHeaderDataSet))] public void CookieHeaderValue_TryParseStrictList_AcceptsValidValues(IList cookies, string[] input) { - IList results; - var result = CookieHeaderValue.TryParseStrictList(input, out results); + var result = CookieHeaderValue.TryParseStrictList(input, out var results); Assert.True(result); Assert.Equal(cookies, results); @@ -301,25 +294,31 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(ListWithInvalidCookieHeaderDataSet))] public void CookieHeaderValue_TryParseList_ExcludesInvalidValues(IList cookies, string[] input) { - IList results; - var result = CookieHeaderValue.TryParseList(input, out results); + var result = CookieHeaderValue.TryParseList(input, out var results); Assert.Equal(cookies, results); Assert.Equal(cookies?.Count > 0, result); } [Theory] [MemberData(nameof(ListWithInvalidCookieHeaderDataSet))] - public void CookieHeaderValue_ParseStrictList_ThrowsForAnyInvalidValues(IList cookies, string[] input) + public void CookieHeaderValue_ParseStrictList_ThrowsForAnyInvalidValues( +#pragma warning disable xUnit1026 // Theory methods should use all of their parameters + IList cookies, +#pragma warning restore xUnit1026 // Theory methods should use all of their parameters + string[] input) { Assert.Throws(() => CookieHeaderValue.ParseStrictList(input)); } [Theory] [MemberData(nameof(ListWithInvalidCookieHeaderDataSet))] - public void CookieHeaderValue_TryParseStrictList_FailsForAnyInvalidValues(IList cookies, string[] input) + public void CookieHeaderValue_TryParseStrictList_FailsForAnyInvalidValues( +#pragma warning disable xUnit1026 // Theory methods should use all of their parameters + IList cookies, +#pragma warning restore xUnit1026 // Theory methods should use all of their parameters + string[] input) { - IList results; - var result = CookieHeaderValue.TryParseStrictList(input, out results); + var result = CookieHeaderValue.TryParseStrictList(input, out var results); Assert.Null(results); Assert.False(result); } diff --git a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs index 83fec06c46..5c211c4368 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs @@ -15,12 +15,11 @@ namespace Microsoft.Net.Http.Headers { // We don't need to validate all possible date values, since they're already tested in HttpRuleParserTest. // Just make sure the parser calls HttpRuleParser methods correctly. - DateTimeOffset result; - Assert.True(HeaderUtilities.TryParseDate(input, out result)); + Assert.True(HeaderUtilities.TryParseDate(input, out var result)); Assert.Equal(expected, result); } - private static IEnumerable ValidStringData() + public static IEnumerable ValidStringData() { yield return new object[] { "Tue, 15 Nov 1994 08:12:31 GMT", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero) }; yield return new object[] { " Sunday, 06-Nov-94 08:49:37 GMT ", new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero) }; @@ -32,12 +31,11 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(InvalidStringData))] public void TryParse_SetOfInvalidValueStrings_ReturnsFalse(string input) { - DateTimeOffset result; - Assert.False(HeaderUtilities.TryParseDate(input, out result)); + Assert.False(HeaderUtilities.TryParseDate(input, out var result)); Assert.Equal(new DateTimeOffset(), result); } - private static IEnumerable InvalidStringData() + public static IEnumerable InvalidStringData() { yield return new object[] { null }; yield return new object[] { string.Empty }; diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs index b8818752ac..95598f0a46 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs @@ -136,7 +136,7 @@ namespace Microsoft.Net.Http.Headers Assert.True(RangeHeaderValue.TryParse("byte=" + input, out result), input); var ranges = result.Ranges.ToArray(); - Assert.Equal(1, ranges.Length); + Assert.Single(ranges); var range = ranges.First(); diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index 2a84397bb8..e7e8bf045a 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -326,9 +326,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(SetCookieHeaderDataSet))] public void SetCookieHeaderValue_TryParse_AcceptsValidValues(SetCookieHeaderValue cookie, string expectedValue) { - SetCookieHeaderValue header; - bool result = SetCookieHeaderValue.TryParse(expectedValue, out header); - Assert.True(result); + Assert.True(SetCookieHeaderValue.TryParse(expectedValue, out var header)); Assert.Equal(cookie, header); Assert.Equal(expectedValue, header.ToString()); @@ -345,10 +343,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(InvalidSetCookieHeaderDataSet))] public void SetCookieHeaderValue_TryParse_RejectsInvalidValues(string value) { - SetCookieHeaderValue header; - bool result = SetCookieHeaderValue.TryParse(value, out header); - - Assert.False(result); + Assert.False(SetCookieHeaderValue.TryParse(value, out var _)); } [Theory] @@ -364,8 +359,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(ListOfSetCookieHeaderDataSet))] public void SetCookieHeaderValue_TryParseList_AcceptsValidValues(IList cookies, string[] input) { - IList results; - bool result = SetCookieHeaderValue.TryParseList(input, out results); + bool result = SetCookieHeaderValue.TryParseList(input, out var results); Assert.True(result); Assert.Equal(cookies, results); @@ -384,8 +378,7 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(ListOfSetCookieHeaderDataSet))] public void SetCookieHeaderValue_TryParseStrictList_AcceptsValidValues(IList cookies, string[] input) { - IList results; - bool result = SetCookieHeaderValue.TryParseStrictList(input, out results); + bool result = SetCookieHeaderValue.TryParseStrictList(input, out var results); Assert.True(result); Assert.Equal(cookies, results); @@ -404,25 +397,31 @@ namespace Microsoft.Net.Http.Headers [MemberData(nameof(ListWithInvalidSetCookieHeaderDataSet))] public void SetCookieHeaderValue_TryParseList_ExcludesInvalidValues(IList cookies, string[] input) { - IList results; - bool result = SetCookieHeaderValue.TryParseList(input, out results); + bool result = SetCookieHeaderValue.TryParseList(input, out var results); Assert.Equal(cookies, results); Assert.Equal(cookies?.Count > 0, result); } [Theory] [MemberData(nameof(ListWithInvalidSetCookieHeaderDataSet))] - public void SetCookieHeaderValue_ParseStrictList_ThrowsForAnyInvalidValues(IList cookies, string[] input) + public void SetCookieHeaderValue_ParseStrictList_ThrowsForAnyInvalidValues( +#pragma warning disable xUnit1026 // Theory methods should use all of their parameters + IList cookies, +#pragma warning restore xUnit1026 // Theory methods should use all of their parameters + string[] input) { Assert.Throws(() => SetCookieHeaderValue.ParseStrictList(input)); } [Theory] [MemberData(nameof(ListWithInvalidSetCookieHeaderDataSet))] - public void SetCookieHeaderValue_TryParseStrictList_FailsForAnyInvalidValues(IList cookies, string[] input) + public void SetCookieHeaderValue_TryParseStrictList_FailsForAnyInvalidValues( +#pragma warning disable xUnit1026 // Theory methods should use all of their parameters + IList cookies, +#pragma warning restore xUnit1026 // Theory methods should use all of their parameters + string[] input) { - IList results; - bool result = SetCookieHeaderValue.TryParseStrictList(input, out results); + bool result = SetCookieHeaderValue.TryParseStrictList(input, out var results); Assert.Null(results); Assert.False(result); } From 6657f4cf36b1790b365f1c80e58c1eed39f8d11b Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Tue, 22 Aug 2017 16:57:04 -0700 Subject: [PATCH 749/846] Adds MaxAge property to CookieOptions/Builder (#904) --- .../CookieBuilder.cs | 6 ++++++ .../CookieOptions.cs | 6 ++++++ .../Internal/ResponseCookies.cs | 1 + .../CookieBuilderTests.cs | 10 ++++++++++ .../ResponseCookiesTest.cs | 19 +++++++++++++++++-- 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs index f0cdc3adf1..203a7a0402 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs @@ -67,6 +67,11 @@ namespace Microsoft.AspNetCore.Http /// public virtual TimeSpan? Expiration { get; set; } + /// + /// Gets or sets the max-age for the cookie. + /// + public virtual TimeSpan? MaxAge { get; set; } + /// /// Creates the cookie options from the given . /// @@ -92,6 +97,7 @@ namespace Microsoft.AspNetCore.Http Path = Path ?? "/", SameSite = SameSite, HttpOnly = HttpOnly, + MaxAge = MaxAge, Domain = Domain, Secure = SecurePolicy == CookieSecurePolicy.Always || (SecurePolicy == CookieSecurePolicy.SameAsRequest && context.Request.IsHttps), Expires = Expiration.HasValue ? expiresFrom.Add(Expiration.Value) : default(DateTimeOffset?) diff --git a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs index 017b6520fb..e01a759c8f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs @@ -53,5 +53,11 @@ namespace Microsoft.AspNetCore.Http /// /// true if a cookie must not be accessible by client-side script; otherwise, false. public bool HttpOnly { get; set; } + + /// + /// Gets or sets the max-age for the cookie. + /// + /// The max-age date and time for the cookie. + public TimeSpan? MaxAge { get; set; } } } diff --git a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs index 85e006dc8e..7c6e3e033b 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs @@ -61,6 +61,7 @@ namespace Microsoft.AspNetCore.Http.Internal Domain = options.Domain, Path = options.Path, Expires = options.Expires, + MaxAge = options.MaxAge, Secure = options.Secure, SameSite = (Net.Http.Headers.SameSiteMode)options.SameSite, HttpOnly = options.HttpOnly diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs index 386374b211..dd540ccc1b 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs @@ -38,6 +38,16 @@ namespace Microsoft.AspNetCore.Http.Abstractions.Tests Assert.Equal(now.AddHours(1), options.Expires); } + [Fact] + public void ComputesMaxAge() + { + Assert.Null(new CookieBuilder().Build(new DefaultHttpContext()).MaxAge); + + var now = TimeSpan.FromHours(1); + var options = new CookieBuilder { MaxAge = now }.Build(new DefaultHttpContext()); + Assert.Equal(now, options.MaxAge); + } + [Fact] public void CookieBuilderPreservesDefaultPath() { diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index 3693a42866..8ab9dd1c64 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Text; using Microsoft.AspNetCore.Http.Internal; -using Microsoft.Extensions.ObjectPool; using Microsoft.Net.Http.Headers; using Xunit; @@ -74,6 +72,23 @@ namespace Microsoft.AspNetCore.Http.Tests Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); } + [Fact] + public void ProvidesMaxAgeWithCookieOptionsArgumentExpectMaxAgeToBeSet() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers, null); + var cookieOptions = new CookieOptions(); + var maxAgeTime = TimeSpan.FromHours(1); + cookieOptions.MaxAge = TimeSpan.FromHours(1); + var testcookie = "TestCookie"; + + cookies.Append(testcookie, testcookie, cookieOptions); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.Contains($"max-age={maxAgeTime.TotalSeconds.ToString()}", cookieHeaderValues[0]); + } + public static TheoryData EscapesKeyValuesBeforeSettingCookieData { get From ce68ec23c05739af52f2e59649dd94b66bc30f13 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Thu, 24 Aug 2017 12:47:02 -0700 Subject: [PATCH 750/846] Using WebEncoders' Base64Url encode/decode functionality --- .../Base64UrlTextEncoder.cs | 78 +------------------ .../Base64UrlTextEncoderTests.cs | 68 ---------------- .../WebEncodersTests.cs | 22 +++++- 3 files changed, 23 insertions(+), 145 deletions(-) delete mode 100644 test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs b/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs index a972fa8b9c..304ee6522f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs @@ -1,10 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Text; -using Microsoft.Extensions.Primitives; - namespace Microsoft.AspNetCore.WebUtilities { public static class Base64UrlTextEncoder @@ -17,8 +13,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// Base64 encoded string modified with non-URL encodable characters public static string Encode(byte[] data) { - var encodedValue = Convert.ToBase64String(data); - return EncodeInternal(encodedValue); + return WebEncoders.Base64UrlEncode(data); } /// @@ -29,76 +24,7 @@ namespace Microsoft.AspNetCore.WebUtilities /// The decoded data. public static byte[] Decode(string text) { - return Convert.FromBase64String(DecodeToBase64String(text)); - } - - // To enable unit testing - internal static string EncodeInternal(string base64EncodedString) - { - var length = base64EncodedString.Length; - while (length > 0 && base64EncodedString[length - 1] == '=') - { - length--; - } - - if (length == 0) - { - return string.Empty; - } - - var inplaceStringBuilder = new InplaceStringBuilder(length); - for (var i = 0; i < length; i++) - { - if (base64EncodedString[i] == '+') - { - inplaceStringBuilder.Append('-'); - } - else if (base64EncodedString[i] == '/') - { - inplaceStringBuilder.Append('_'); - } - else - { - inplaceStringBuilder.Append(base64EncodedString[i]); - } - } - - return inplaceStringBuilder.ToString(); - } - - // To enable unit testing - internal static string DecodeToBase64String(string text) - { - if (string.IsNullOrEmpty(text)) - { - return text; - } - - var padLength = 3 - ((text.Length + 3) % 4); - var inplaceStringBuilder = new InplaceStringBuilder(capacity: text.Length + padLength); - - for (var i = 0; i < text.Length; i++) - { - if (text[i] == '-') - { - inplaceStringBuilder.Append('+'); - } - else if (text[i] == '_') - { - inplaceStringBuilder.Append('/'); - } - else - { - inplaceStringBuilder.Append(text[i]); - } - } - - for (var i = 0; i < padLength; i++) - { - inplaceStringBuilder.Append('='); - } - - return inplaceStringBuilder.ToString(); + return WebEncoders.Base64UrlDecode(text); } } } diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs deleted file mode 100644 index b91a8f47eb..0000000000 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Base64UrlTextEncoderTests.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.AspNetCore.WebUtilities -{ - public class Base64UrlTextEncoderTests - { - [Fact] - public void DataOfVariousLengthRoundTripCorrectly() - { - for (int length = 0; length != 256; ++length) - { - var data = new byte[length]; - for (int index = 0; index != length; ++index) - { - data[index] = (byte)(5 + length + (index * 23)); - } - string text = Base64UrlTextEncoder.Encode(data); - byte[] result = Base64UrlTextEncoder.Decode(text); - - for (int index = 0; index != length; ++index) - { - Assert.Equal(data[index], result[index]); - } - } - } - - [Theory] - [InlineData("", "")] - [InlineData("+", "-")] - [InlineData("/", "_")] - [InlineData("=", "")] - [InlineData("==", "")] - [InlineData("a+b+c+==", "a-b-c-")] - [InlineData("a/b/c==", "a_b_c")] - [InlineData("a+b/c==", "a-b_c")] - [InlineData("a+b/c", "a-b_c")] - [InlineData("abcd", "abcd")] - public void EncodeInternal_Replaces_UrlEncodableCharacters(string base64EncodedValue, string expectedValue) - { - // Arrange & Act - var result = Base64UrlTextEncoder.EncodeInternal(base64EncodedValue); - - // Assert - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineData("_", "/===")] - [InlineData("-", "+===")] - [InlineData("a-b-c", "a+b+c===")] - [InlineData("a_b_c_d", "a/b/c/d=")] - [InlineData("a-b_c", "a+b/c===")] - [InlineData("a-b_c-d", "a+b/c+d=")] - [InlineData("abcd", "abcd")] - public void DecodeToBase64String_ReturnsValid_Base64String(string text, string expectedValue) - { - // Arrange & Act - var actual = Base64UrlTextEncoder.DecodeToBase64String(text); - - // Assert - Assert.Equal(expectedValue, actual); - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs index a4c4d15571..bb7f71248f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs @@ -2,13 +2,13 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Linq; using Xunit; namespace Microsoft.AspNetCore.WebUtilities { public class WebEncodersTests { + [Theory] [InlineData("", 1, 0)] [InlineData("", 0, 1)] @@ -41,5 +41,25 @@ namespace Microsoft.AspNetCore.WebUtilities var retVal = WebEncoders.Base64UrlEncode(input, offset, count); }); } + + [Fact] + public void DataOfVariousLengthRoundTripCorrectly() + { + for (int length = 0; length != 256; ++length) + { + var data = new byte[length]; + for (int index = 0; index != length; ++index) + { + data[index] = (byte)(5 + length + (index * 23)); + } + string text = WebEncoders.Base64UrlEncode(data); + byte[] result = WebEncoders.Base64UrlDecode(text); + + for (int index = 0; index != length; ++index) + { + Assert.Equal(data[index], result[index]); + } + } + } } } From e97e6546c2d21556386b3d79fee6c73c047d9842 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Tue, 29 Aug 2017 10:20:56 -0700 Subject: [PATCH 751/846] Add structured syntax suffixes and facets to MediaTypeHeaderValue (#921) --- .../MediaTypeHeaderValue.cs | 333 ++++++++++++++---- .../MediaTypeHeaderValueComparer.cs | 39 +- .../MediaTypeHeaderValueComparerTests.cs | 6 + .../MediaTypeHeaderValueTest.cs | 133 +++++++ 4 files changed, 448 insertions(+), 63 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index bfda2aac81..32074b44cc 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -11,10 +11,22 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.Net.Http.Headers { + /// + /// Representation of the media type header. See . + /// public class MediaTypeHeaderValue { - private const string CharsetString = "charset"; private const string BoundaryString = "boundary"; + private const string CharsetString = "charset"; + private const string MatchesAllString = "*/*"; + private const string QualityString = "q"; + private const string WildcardString = "*"; + + private const char ForwardSlashCharacter = '/'; + private const char PeriodCharacter = '.'; + private const char PlusCharacter = '+'; + + private static readonly char[] PeriodCharacterArray = new char[] { PeriodCharacter }; private static readonly HttpHeaderParser SingleValueParser = new GenericHeaderParser(false, GetMediaTypeLength); @@ -31,18 +43,33 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } + /// + /// Initializes a instance. + /// + /// A representation of a media type. + /// The text provided must be a single media type without parameters. public MediaTypeHeaderValue(StringSegment mediaType) { - CheckMediaTypeFormat(mediaType, "mediaType"); + CheckMediaTypeFormat(mediaType, nameof(mediaType)); _mediaType = mediaType; } + /// + /// Initializes a instance. + /// + /// A representation of a media type. + /// The text provided must be a single media type without parameters. + /// The with the quality of the media type. public MediaTypeHeaderValue(StringSegment mediaType, double quality) : this(mediaType) { Quality = quality; } + /// + /// Gets or sets the value of the charset parameter. Returns + /// if there is no charset. + /// public StringSegment Charset { get @@ -77,6 +104,10 @@ namespace Microsoft.Net.Http.Headers } } + /// + /// Gets or sets the value of the Encoding parameter. Setting the Encoding will set + /// the to . + /// public Encoding Encoding { get @@ -109,6 +140,10 @@ namespace Microsoft.Net.Http.Headers } } + /// + /// Gets or sets the value of the boundary parameter. Returns + /// if there is no boundary. + /// public StringSegment Boundary { get @@ -141,6 +176,10 @@ namespace Microsoft.Net.Http.Headers } } + /// + /// Gets or sets the media type's parameters. Returns an empty + /// if there are no parameters. + /// public IList Parameters { get @@ -160,6 +199,10 @@ namespace Microsoft.Net.Http.Headers } } + /// + /// Gets or sets the value of the quality parameter. Returns null + /// if there is no quality. + /// public double? Quality { get { return HeaderUtilities.GetQuality(_parameters); } @@ -170,55 +213,155 @@ namespace Microsoft.Net.Http.Headers } } + /// + /// Gets or sets the value of the media type. Returns + /// if there is no media type. + /// + /// + /// For the media type "application/json", the property gives the value + /// "application/json". + /// public StringSegment MediaType { get { return _mediaType; } set { HeaderUtilities.ThrowIfReadOnly(IsReadOnly); - CheckMediaTypeFormat(value, "value"); + CheckMediaTypeFormat(value, nameof(value)); _mediaType = value; } } + /// + /// Gets the type of the . + /// + /// + /// For the media type "application/json", the property gives the value "application". + /// + /// See for more details on the type. public StringSegment Type { get { - return _mediaType.Subsegment(0, _mediaType.IndexOf('/')); + return _mediaType.Subsegment(0, _mediaType.IndexOf(ForwardSlashCharacter)); } } + /// + /// Gets the subtype of the . + /// + /// + /// For the media type "application/vnd.example+json", the property gives the value + /// "vnd.example+json". + /// + /// See for more details on the subtype. public StringSegment SubType { get { - return _mediaType.Subsegment(_mediaType.IndexOf('/') + 1); + return _mediaType.Subsegment(_mediaType.IndexOf(ForwardSlashCharacter) + 1); } } /// - /// MediaType = "*/*" + /// Gets subtype of the , excluding any structured syntax suffix. Returns + /// if there is no subtype without suffix. /// - public bool MatchesAllTypes + /// + /// For the media type "application/vnd.example+json", the property gives the value + /// "vnd.example". + /// + public StringSegment SubTypeWithoutSuffix { get { - return MediaType.Equals("*/*", StringComparison.Ordinal); + var subType = SubType; + var startOfSuffix = subType.LastIndexOf(PlusCharacter); + if (startOfSuffix == -1) + { + return subType; + } + else + { + return subType.Subsegment(0, startOfSuffix); + } } } /// - /// SubType = "*" + /// Gets the structured syntax suffix of the if it has one. + /// See The RFC documentation on structured syntaxes. /// - public bool MatchesAllSubTypes + /// + /// For the media type "application/vnd.example+json", the property gives the value + /// "json". + /// + public StringSegment Suffix { get { - return SubType.Equals("*", StringComparison.Ordinal); + var subType = SubType; + var startOfSuffix = subType.LastIndexOf(PlusCharacter); + if (startOfSuffix == -1) + { + return default(StringSegment); + } + else + { + return subType.Subsegment(startOfSuffix + 1); + } } } + + /// + /// Get a of facets of the . Facets are a + /// period separated list of StringSegments in the . + /// See The RFC documentation on facets. + /// + /// + /// For the media type "application/vnd.example+json", the property gives the value: + /// {"vnd", "example"} + /// + public IEnumerable Facets + { + get + { + return SubTypeWithoutSuffix.Split(PeriodCharacterArray); + } + } + + /// + /// Gets whether this matches all types. + /// + public bool MatchesAllTypes => MediaType.Equals(MatchesAllString, StringComparison.Ordinal); + + /// + /// Gets whether this matches all subtypes. + /// + /// + /// For the media type "application/*", this property is true. + /// + /// + /// For the media type "application/json", this property is false. + /// + public bool MatchesAllSubTypes => SubType.Equals(WildcardString, StringComparison.Ordinal); + + /// + /// Gets whether this matches all subtypes, ignoring any structured syntax suffix. + /// + /// + /// For the media type "application/*+json", this property is true. + /// + /// + /// For the media type "application/vnd.example+json", this property is false. + /// + public bool MatchesAllSubTypesWithoutSuffix => + SubTypeWithoutSuffix.Equals(WildcardString, StringComparison.OrdinalIgnoreCase); + + /// + /// Gets whether the is readonly. + /// public bool IsReadOnly { get { return _isReadOnly; } @@ -247,56 +390,14 @@ namespace Microsoft.Net.Http.Headers } // "text/plain" is a subset of "text/plain", "text/*" and "*/*". "*/*" is a subset only of "*/*". - if (!Type.Equals(otherMediaType.Type, comparisonType: StringComparison.OrdinalIgnoreCase)) - { - if (!otherMediaType.MatchesAllTypes) - { - return false; - } - } - else if (!SubType.Equals(otherMediaType.SubType, comparisonType: StringComparison.OrdinalIgnoreCase)) - { - if (!otherMediaType.MatchesAllSubTypes) - { - return false; - } - } - - // "text/plain; charset=utf-8; level=1" is a subset of "text/plain; charset=utf-8". In turn - // "text/plain; charset=utf-8" is a subset of "text/plain". - if (otherMediaType._parameters != null && otherMediaType._parameters.Count != 0) - { - // Make sure all parameters in the potential superset are included locally. Fine to have additional - // parameters locally; they make this one more specific. - foreach (var parameter in otherMediaType._parameters) - { - if (parameter.Name.Equals("q", StringComparison.OrdinalIgnoreCase)) - { - // "q" and later parameters are not involved in media type matching. Quoting the RFC: The first - // "q" parameter (if any) separates the media-range parameter(s) from the accept-params. - break; - } - - var localParameter = NameValueHeaderValue.Find(_parameters, parameter.Name); - if (localParameter == null) - { - // Not found. - return false; - } - - if (!StringSegment.Equals(parameter.Value, localParameter.Value, StringComparison.OrdinalIgnoreCase)) - { - return false; - } - } - } - - return true; + return MatchesType(otherMediaType) && + MatchesSubtype(otherMediaType) && + MatchesParameters(otherMediaType); } /// /// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components, - /// while avoiding the cost of revalidating the components. + /// while avoiding the cost of re-validating the components. /// /// A deep copy. public MediaTypeHeaderValue Copy() @@ -314,7 +415,7 @@ namespace Microsoft.Net.Http.Headers /// /// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components, - /// while avoiding the cost of revalidating the components. This copy is read-only. + /// while avoiding the cost of re-validating the components. This copy is read-only. /// /// A deep, read-only, copy. public MediaTypeHeaderValue CopyAsReadOnly() @@ -362,33 +463,67 @@ namespace Microsoft.Net.Http.Headers return StringSegmentComparer.OrdinalIgnoreCase.GetHashCode(_mediaType) ^ NameValueHeaderValue.GetHashCode(_parameters); } + /// + /// Takes a media type and parses it into the and its associated parameters. + /// + /// The with the media type. + /// The parsed . public static MediaTypeHeaderValue Parse(StringSegment input) { var index = 0; return SingleValueParser.ParseValue(input, ref index); } + /// + /// Takes a media type, which can include parameters, and parses it into the and its associated parameters. + /// + /// The with the media type. The media type constructed here must not have an y + /// The parsed + /// True if the value was successfully parsed. public static bool TryParse(StringSegment input, out MediaTypeHeaderValue parsedValue) { var index = 0; return SingleValueParser.TryParseValue(input, ref index, out parsedValue); } + /// + /// Takes an of and parses it into the and its associated parameters. + /// + /// A list of media types + /// The parsed . public static IList ParseList(IList inputs) { return MultipleValueParser.ParseValues(inputs); } + /// + /// Takes an of and parses it into the and its associated parameters. + /// Throws if there is invalid data in a string. + /// + /// A list of media types + /// The parsed . public static IList ParseStrictList(IList inputs) { return MultipleValueParser.ParseStrictValues(inputs); } + /// + /// Takes an of and parses it into the and its associated parameters. + /// + /// A list of media types + /// The parsed . + /// True if the value was successfully parsed. public static bool TryParseList(IList inputs, out IList parsedValues) { return MultipleValueParser.TryParseValues(inputs, out parsedValues); } + /// + /// Takes an of and parses it into the and its associated parameters. + /// + /// A list of media types + /// The parsed . + /// True if the value was successfully parsed. public static bool TryParseStrictList(IList inputs, out IList parsedValues) { return MultipleValueParser.TryParseStrictValues(inputs, out parsedValues); @@ -481,7 +616,7 @@ namespace Microsoft.Net.Http.Headers } else { - mediaType = input.Substring(startIndex, typeLength) + "/" + input.Substring(current, subtypeLength); + mediaType = input.Substring(startIndex, typeLength) + ForwardSlashCharacter + input.Substring(current, subtypeLength); } return mediaTypeLength; @@ -502,5 +637,85 @@ namespace Microsoft.Net.Http.Headers throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid media type '{0}'.", mediaType)); } } + + private bool MatchesType(MediaTypeHeaderValue set) + { + return set.MatchesAllTypes || + set.Type.Equals(Type, StringComparison.OrdinalIgnoreCase); + } + + private bool MatchesSubtype(MediaTypeHeaderValue set) + { + if (set.MatchesAllSubTypes) + { + return true; + } + if (set.Suffix.HasValue) + { + if (Suffix.HasValue) + { + return MatchesSubtypeWithoutSuffix(set) && MatchesSubtypeSuffix(set); + } + else + { + return false; + } + } + else + { + return set.SubType.Equals(SubType, StringComparison.OrdinalIgnoreCase); + } + } + + private bool MatchesSubtypeWithoutSuffix(MediaTypeHeaderValue set) + { + return set.MatchesAllSubTypesWithoutSuffix || + set.SubTypeWithoutSuffix.Equals(SubTypeWithoutSuffix, StringComparison.OrdinalIgnoreCase); + } + + private bool MatchesParameters(MediaTypeHeaderValue set) + { + if (set._parameters != null && set._parameters.Count != 0) + { + // Make sure all parameters in the potential superset are included locally. Fine to have additional + // parameters locally; they make this one more specific. + foreach (var parameter in set._parameters) + { + if (parameter.Name.Equals(WildcardString, StringComparison.OrdinalIgnoreCase)) + { + // A parameter named "*" has no effect on media type matching, as it is only used as an indication + // that the entire media type string should be treated as a wildcard. + continue; + } + + if (parameter.Name.Equals(QualityString, StringComparison.OrdinalIgnoreCase)) + { + // "q" and later parameters are not involved in media type matching. Quoting the RFC: The first + // "q" parameter (if any) separates the media-range parameter(s) from the accept-params. + break; + } + + var localParameter = NameValueHeaderValue.Find(_parameters, parameter.Name); + if (localParameter == null) + { + // Not found. + return false; + } + + if (!StringSegment.Equals(parameter.Value, localParameter.Value, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } + } + return true; + } + + private bool MatchesSubtypeSuffix(MediaTypeHeaderValue set) + { + // We don't have support for wildcards on suffixes alone (e.g., "application/entity+*") + // because there's no clear use case for it. + return set.Suffix.Equals(Suffix, StringComparison.OrdinalIgnoreCase); + } } } diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs index 21ab21f71e..cc34640988 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs @@ -28,11 +28,15 @@ namespace Microsoft.Net.Http.Headers /// /// Performs comparisons based on the arguments' quality values /// (aka their "q-value"). Values with identical q-values are considered equal (i.e. the result is 0) - /// with the exception that subtype wildcards are considered less than specific media types and full - /// wildcards are considered less than subtype wildcards. This allows callers to sort a sequence of - /// following their q-values in the order of specific - /// media types, subtype wildcards, and last any full wildcards. + /// with the exception that suffixed subtype wildcards are considered less than subtype wildcards, subtype wildcards + /// are considered less than specific media types and full wildcards are considered less than + /// subtype wildcards. This allows callers to sort a sequence of following + /// their q-values in the order of specific media types, subtype wildcards, and last any full wildcards. /// + /// + /// If we had a list of media types (comma separated): { text/*;q=0.8, text/*+json;q=0.8, */*;q=1, */*;q=0.8, text/plain;q=0.8 } + /// Sorting them using Compare would return: { */*;q=0.8, text/*;q=0.8, text/*+json;q=0.8, text/plain;q=0.8, */*;q=1 } + /// public int Compare(MediaTypeHeaderValue mediaType1, MediaTypeHeaderValue mediaType2) { if (object.ReferenceEquals(mediaType1, mediaType2)) @@ -62,6 +66,14 @@ namespace Microsoft.Net.Http.Headers { return 1; } + else if (mediaType1.MatchesAllSubTypesWithoutSuffix && !mediaType2.MatchesAllSubTypesWithoutSuffix) + { + return -1; + } + else if (!mediaType1.MatchesAllSubTypesWithoutSuffix && mediaType2.MatchesAllSubTypesWithoutSuffix) + { + return 1; + } } else if (!mediaType1.SubType.Equals(mediaType2.SubType, StringComparison.OrdinalIgnoreCase)) { @@ -73,6 +85,25 @@ namespace Microsoft.Net.Http.Headers { return 1; } + else if (mediaType1.MatchesAllSubTypesWithoutSuffix && !mediaType2.MatchesAllSubTypesWithoutSuffix) + { + return -1; + } + else if (!mediaType1.MatchesAllSubTypesWithoutSuffix && mediaType2.MatchesAllSubTypesWithoutSuffix) + { + return 1; + } + } + else if (!mediaType1.Suffix.Equals(mediaType2.Suffix, StringComparison.OrdinalIgnoreCase)) + { + if (mediaType1.MatchesAllSubTypesWithoutSuffix) + { + return -1; + } + else if (mediaType2.MatchesAllSubTypesWithoutSuffix) + { + return 1; + } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs index 44d723cd9e..3ce2702ec6 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs @@ -18,8 +18,10 @@ namespace Microsoft.Net.Http.Headers { "application/*", "text/plain", + "text/*+json;q=0.8", "text/plain;q=1.0", "text/plain", + "text/*+json;q=0.6", "text/plain;q=0", "*/*;q=0.8", "*/*;q=1", @@ -27,6 +29,7 @@ namespace Microsoft.Net.Http.Headers "text/plain;q=0.8", "text/*;q=0.8", "text/*;q=0.6", + "text/*+json;q=0.4", "text/*;q=1.0", "*/*;q=0.4", "text/plain;q=0.6", @@ -43,10 +46,13 @@ namespace Microsoft.Net.Http.Headers "text/*;q=1.0", "*/*;q=1", "text/plain;q=0.8", + "text/*+json;q=0.8", "text/*;q=0.8", "*/*;q=0.8", "text/plain;q=0.6", + "text/*+json;q=0.6", "text/*;q=0.6", + "text/*+json;q=0.4", "*/*;q=0.4", "text/plain;q=0", } diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 1d5c9e9f65..75cccabc9c 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.Net.Http.Headers @@ -39,6 +40,68 @@ namespace Microsoft.Net.Http.Headers AssertFormatException("text/plain;charset=utf-8"); // ctor takes only media-type name, no parameters } + public static TheoryData MediaTypesWithSuffixes => + new TheoryData + { + // See https://tools.ietf.org/html/rfc6838#section-4.2 for allowed names spec + { "application/json", "json", null }, + { "application/json+", "json", "" }, + { "application/+json", "", "json" }, + { "application/entitytype+json", "entitytype", "json" }, + { "applica+tion/entitytype+json", "entitytype", "json" }, + }; + + [Theory] + [MemberData(nameof(MediaTypesWithSuffixes))] + public void Ctor_CanParseSuffixedMediaTypes(string mediaType, string expectedSubTypeWithoutSuffix, string expectedSubTypeSuffix) + { + var result = new MediaTypeHeaderValue(mediaType); + + Assert.Equal(new StringSegment(expectedSubTypeWithoutSuffix), result.SubTypeWithoutSuffix); // TODO consider overloading to have SubTypeWithoutSuffix? + Assert.Equal(new StringSegment(expectedSubTypeSuffix), result.Suffix); + } + + public static TheoryData MediaTypesWithSuffixesAndSpaces => + new TheoryData + { + // See https://tools.ietf.org/html/rfc6838#section-4.2 for allowed names spec + { " application / json+xml", "json", "xml" }, + { " application / vnd.com-pany.some+entity!.v2+js.#$&^_n ; q=\"0.3+1\"", "vnd.com-pany.some+entity!.v2", "js.#$&^_n"}, + { " application/ +json", "", "json" }, + { " application/ entitytype+json ", "entitytype", "json" }, + { " applica+tion/ entitytype+json ", "entitytype", "json" } + }; + + [Theory] + [MemberData(nameof(MediaTypesWithSuffixesAndSpaces))] + public void Parse_CanParseSuffixedMediaTypes(string mediaType, string expectedSubTypeWithoutSuffix, string expectedSubTypeSuffix) + { + var result = MediaTypeHeaderValue.Parse(mediaType); + + Assert.Equal(new StringSegment(expectedSubTypeWithoutSuffix), result.SubTypeWithoutSuffix); // TODO consider overloading to have SubTypeWithoutSuffix? + Assert.Equal(new StringSegment(expectedSubTypeSuffix), result.Suffix); + } + + [Theory] + [InlineData("*/*", true)] + [InlineData("text/*", true)] + [InlineData("text/*+suffix", true)] + [InlineData("text/*+", true)] + [InlineData("text/*+*", true)] + [InlineData("text/json+suffix", false)] + [InlineData("*/json+*", false)] + public void MatchesAllSubTypesWithoutSuffix_ReturnsExpectedResult(string value, bool expectedReturnValue) + { + // Arrange + var mediaType = new MediaTypeHeaderValue(value); + + // Act + var result = mediaType.MatchesAllSubTypesWithoutSuffix; + + // Assert + Assert.Equal(expectedReturnValue, result); + } + [Fact] public void Ctor_MediaTypeValidFormat_SuccessfullyCreated() { @@ -644,6 +707,8 @@ namespace Microsoft.Net.Http.Headers [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/plain;foo=bar;q=0.0;charset=utf-8")] // different order of parameters [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/*;charset=utf-8;foo=bar;q=0.0")] [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "*/*;charset=utf-8;foo=bar;q=0.0")] + [InlineData("application/json;v=2", "application/json;*")] + [InlineData("application/json;v=2;charset=utf-8", "application/json;v=2;*")] public void IsSubsetOf_PositiveCases(string mediaType1, string mediaType2) { // Arrange @@ -681,6 +746,74 @@ namespace Microsoft.Net.Http.Headers Assert.False(isSubset); } + [Theory] + [InlineData("application/entity+json", "application/entity+json")] + [InlineData("application/*+json", "application/entity+json")] + [InlineData("application/*+json", "application/*+json")] + [InlineData("application/*", "application/*+JSON")] + [InlineData("application/vnd.github+json", "application/vnd.github+json")] + [InlineData("application/*", "application/entity+JSON")] + [InlineData("*/*", "application/entity+json")] + public void IsSubsetOfWithSuffixes_PositiveCases(string set, string subset) + { + // Arrange + var setMediaType = MediaTypeHeaderValue.Parse(set); + var subSetMediaType = MediaTypeHeaderValue.Parse(subset); + + // Act + var result = subSetMediaType.IsSubsetOf(setMediaType); + + // Assert + Assert.True(result); + } + + [Theory] + [InlineData("application/entity+json", "application/entity+txt")] + [InlineData("application/entity+json", "application/entity.v2+json")] + [InlineData("application/*+json", "application/entity+txt")] + [InlineData("application/*+*", "application/json")] + [InlineData("application/entity+*", "application/entity+json")] // We don't allow suffixes to be wildcards + [InlineData("application/*+*", "application/entity+json")] // We don't allow suffixes to be wildcards + public void IsSubSetOfWithSuffixes_NegativeCases(string set, string subset) + { + // Arrange + var setMediaType = MediaTypeHeaderValue.Parse(set); + var subSetMediaType = MediaTypeHeaderValue.Parse(subset); + + // Act + var result = subSetMediaType.IsSubsetOf(setMediaType); + + // Assert + Assert.False(result); + } + + public static TheoryData> MediaTypesWithFacets => + new TheoryData> + { + { "application/vdn.github", + new List(){ "vdn", "github" } }, + { "application/vdn.github+json", + new List(){ "vdn", "github" } }, + { "application/vdn.github.v3+json", + new List(){ "vdn", "github", "v3" } }, + { "application/vdn.github.+json", + new List(){ "vdn", "github", "" } }, + }; + + [Theory] + [MemberData(nameof(MediaTypesWithFacets))] + public void Facets_TestPositiveCases(string input, List expected) + { + // Arrange + var mediaType = MediaTypeHeaderValue.Parse(input); + + // Act + var result = mediaType.Facets; + + // Assert + Assert.Equal(expected, result); + } + private void CheckValidParse(string input, MediaTypeHeaderValue expectedResult) { var result = MediaTypeHeaderValue.Parse(input); From 9c699f74b0ee34d6ced343397e8279e1cadee873 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 29 Aug 2017 12:41:50 -0700 Subject: [PATCH 752/846] Use Directory.Build.props/targets --- appveyor.yml => .appveyor.yml | 0 build/common.props => Directory.Build.props | 12 ++++-------- Directory.Build.targets | 2 ++ HttpAbstractions.sln | 14 ++++++++++++-- samples/SampleApp/SampleApp.csproj | 2 -- src/Directory.Build.props | 7 +++++++ ...t.AspNetCore.Authentication.Abstractions.csproj | 1 - ...Microsoft.AspNetCore.Authentication.Core.csproj | 2 -- .../Microsoft.AspNetCore.Http.Abstractions.csproj | 2 -- .../Microsoft.AspNetCore.Http.Extensions.csproj | 4 +--- .../Microsoft.AspNetCore.Http.Features.csproj | 4 +--- .../Microsoft.AspNetCore.Http.csproj | 4 +--- .../Microsoft.AspNetCore.Owin.csproj | 2 -- .../Microsoft.AspNetCore.WebUtilities.csproj | 2 -- .../Microsoft.Net.Http.Headers.csproj | 4 +--- test/Directory.Build.props | 13 +++++++++++++ ...soft.AspNetCore.Authentication.Core.Test.csproj | 12 ++++++------ ...osoft.AspNetCore.Http.Abstractions.Tests.csproj | 9 --------- ...crosoft.AspNetCore.Http.Extensions.Tests.csproj | 5 ----- ...Microsoft.AspNetCore.Http.Features.Tests.csproj | 8 -------- .../Microsoft.AspNetCore.Http.Tests.csproj | 8 -------- .../Microsoft.AspNetCore.Owin.Tests.csproj | 6 ------ .../Microsoft.AspNetCore.WebUtilities.Tests.csproj | 9 --------- .../Microsoft.Net.Http.Headers.Tests.csproj | 8 -------- 24 files changed, 48 insertions(+), 92 deletions(-) rename appveyor.yml => .appveyor.yml (100%) rename build/common.props => Directory.Build.props (60%) create mode 100644 Directory.Build.targets create mode 100644 src/Directory.Build.props create mode 100644 test/Directory.Build.props diff --git a/appveyor.yml b/.appveyor.yml similarity index 100% rename from appveyor.yml rename to .appveyor.yml diff --git a/build/common.props b/Directory.Build.props similarity index 60% rename from build/common.props rename to Directory.Build.props index f49ac0662a..a4bb7b29a3 100644 --- a/build/common.props +++ b/Directory.Build.props @@ -1,19 +1,15 @@ - - - + + + Microsoft ASP.NET Core https://github.com/aspnet/HttpAbstractions git - $(MSBuildThisFileDirectory)Key.snk + $(MSBuildThisFileDirectory)build\Key.snk true true $(VersionSuffix)-$(BuildNumber) true - - - - diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000000..f75adf7e4d --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,2 @@ + + diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 0a68e1e4c6..b4607ecdba 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,10 +1,16 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26228.9 +VisualStudioVersion = 15.0.26730.10 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" + ProjectSection(SolutionItems) = preProject + src\Directory.Build.props = src\Directory.Build.props + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" + ProjectSection(SolutionItems) = preProject + test\Directory.Build.props = test\Directory.Build.props + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" EndProject @@ -45,6 +51,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution build.cmd = build.cmd build.ps1 = build.ps1 build.sh = build.sh + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets NuGet.config = NuGet.config README.md = README.md version.xml = version.xml @@ -52,7 +60,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{ED7BCAC5-2796-44BD-9954-7C248263BC8B}" ProjectSection(SolutionItems) = preProject - build\common.props = build\common.props build\dependencies.props = build\dependencies.props build\Key.snk = build\Key.snk EndProjectSection @@ -290,4 +297,7 @@ Global {73CA3145-91BD-4DA5-BC74-40008DE7EA98} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D9A9994D-F09F-4209-861B-4A9036485D1F} + EndGlobalSection EndGlobal diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index 33c06e5810..139ec716fb 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 Exe diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000000..d704a37df9 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj index a332a50bb3..f19eca7621 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -1,5 +1,4 @@  - ASP.NET Core common types used by the various authentication components. netstandard2.0 diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj index 5b7ed721d7..38a6951f6c 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj @@ -1,7 +1,5 @@  - - ASP.NET Core common types used by the various authentication middleware components. netstandard2.0 diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index 0e87594e50..18255e05ca 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -1,7 +1,5 @@  - - ASP.NET Core HTTP object model for HTTP requests and responses and also common extension methods for registering middleware in an IApplicationBuilder. diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index 869d392b14..d6e4c1045c 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -1,6 +1,4 @@ - - - + ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index a6ebb2411f..9f882f0fe0 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -1,6 +1,4 @@ - - - + ASP.NET Core HTTP feature interface definitions. diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index 82aeb9cf86..1a0936874f 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -1,6 +1,4 @@ - - - + ASP.NET Core default HTTP feature implementations. diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj index 8c3b67f000..4a7c48cf8e 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj +++ b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj @@ -1,7 +1,5 @@  - - ASP.NET Core component for running OWIN middleware in an ASP.NET Core application, and to run ASP.NET Core middleware in an OWIN application. netstandard2.0 diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index 1508370a09..7413aec75f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -1,7 +1,5 @@  - - ASP.NET Core utilities, such as for working with forms, multipart messages, and query strings. netstandard2.0 diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 521dd7caa1..6eb060cff7 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -1,6 +1,4 @@ - - - + HTTP header parser implementations. diff --git a/test/Directory.Build.props b/test/Directory.Build.props new file mode 100644 index 0000000000..948e2f60fc --- /dev/null +++ b/test/Directory.Build.props @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index d438974331..ae41276931 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -1,16 +1,16 @@  - netcoreapp2.0;net461 netcoreapp2.0 + - - - - - + + + + + diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index 34dd0337e3..e47d0f44fb 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 netcoreapp2.0 @@ -11,11 +9,4 @@ - - - - - - - diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index ecb6c6615f..8d62fae46e 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 netcoreapp2.0 @@ -14,9 +12,6 @@ - - - diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index cf542d9cc5..363ff65dff 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 netcoreapp2.0 @@ -11,10 +9,4 @@ - - - - - - diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 4e244a483b..e47d0f44fb 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 netcoreapp2.0 @@ -11,10 +9,4 @@ - - - - - - diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 5ec662d085..e988423c3f 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 netcoreapp2.0 @@ -14,10 +12,6 @@ - - - - diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index 66a940aed2..eb60215ac4 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 netcoreapp2.0 @@ -11,11 +9,4 @@ - - - - - - - diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index c1c4924b80..08c199eaec 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -1,7 +1,5 @@  - - netcoreapp2.0;net461 netcoreapp2.0 @@ -11,10 +9,4 @@ - - - - - - From e5825641cef0c2ad4f06e9fa618f918cab4fa4e1 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 29 Aug 2017 12:43:13 -0700 Subject: [PATCH 753/846] Use PackageLineup to manage PackageReference versions --- Directory.Build.props | 1 - Directory.Build.targets | 14 +++++++++++++- NuGet.config | 1 - build/dependencies.props | 14 -------------- build/repo.props | 6 ++++++ src/Directory.Build.props | 2 +- ...t.AspNetCore.Authentication.Abstractions.csproj | 4 ++-- .../Microsoft.AspNetCore.Http.Abstractions.csproj | 4 ++-- .../Microsoft.AspNetCore.Http.Extensions.csproj | 4 ++-- .../Microsoft.AspNetCore.Http.Features.csproj | 2 +- .../Microsoft.AspNetCore.Http.csproj | 6 +++--- .../Microsoft.AspNetCore.WebUtilities.csproj | 4 ++-- .../Microsoft.Net.Http.Headers.csproj | 4 ++-- test/Directory.Build.props | 14 +++++++------- ...soft.AspNetCore.Authentication.Core.Test.csproj | 2 +- ...crosoft.AspNetCore.Http.Extensions.Tests.csproj | 2 +- .../Microsoft.AspNetCore.Owin.Tests.csproj | 2 +- 17 files changed, 44 insertions(+), 42 deletions(-) delete mode 100644 build/dependencies.props create mode 100644 build/repo.props diff --git a/Directory.Build.props b/Directory.Build.props index a4bb7b29a3..4230c339d8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,4 @@  - diff --git a/Directory.Build.targets b/Directory.Build.targets index f75adf7e4d..bc118fd907 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,2 +1,14 @@ - + + + + <_BootstrapperFile Condition=" $([MSBuild]::IsOSUnixLike()) ">build.sh + <_BootstrapperFile Condition="! $([MSBuild]::IsOSUnixLike()) ">build.cmd + <_BootstrapperError> + Package references have not been pinned. Run './$(_BootstrapperFile) /t:Pin'. + Also, you can run './$(_BootstrapperFile) /t:Restore' which will pin *and* restore packages. '$(_BootstrapperFile)' can be found in '$(MSBuildThisFileDirectory)'. + + + + + diff --git a/NuGet.config b/NuGet.config index 4e8a1f6de1..20060c934e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -3,7 +3,6 @@ - diff --git a/build/dependencies.props b/build/dependencies.props deleted file mode 100644 index a5fb570275..0000000000 --- a/build/dependencies.props +++ /dev/null @@ -1,14 +0,0 @@ - - - 2.1.0-* - 4.4.0-* - 2.1.1-* - 4.7.49 - 2.0.0-* - 2.0.0-* - 2.0.0-* - 15.3.0 - 0.6.1 - 2.3.0-beta4-build3742 - - diff --git a/build/repo.props b/build/repo.props new file mode 100644 index 0000000000..13fe1c296a --- /dev/null +++ b/build/repo.props @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d704a37df9..9d9a3de33a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,6 +2,6 @@ - + diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj index f19eca7621..1a4701fdc2 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -13,8 +13,8 @@ - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index 18255e05ca..57fb8a1fdc 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -19,8 +19,8 @@ Microsoft.AspNetCore.Http.HttpResponse - - + + diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index d6e4c1045c..6c65cad216 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index 9f882f0fe0..8a647e18ab 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index 1a0936874f..779aba760b 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -16,9 +16,9 @@ - - - + + + diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index 7413aec75f..b252f5b97c 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 6eb060cff7..65eca4b080 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/test/Directory.Build.props b/test/Directory.Build.props index 948e2f60fc..231f872916 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -2,12 +2,12 @@ - - - - - - - + + + + + + + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index ae41276931..0440840cbc 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -10,7 +10,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 8d62fae46e..34c7b47938 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index e988423c3f..584b939585 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -11,7 +11,7 @@ - + From 1e8a22dae3dd2828bcaca936821be8efa47824e2 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 30 Aug 2017 14:03:12 -0700 Subject: [PATCH 754/846] NameValueHeaderValue Escaping/Unescaping quoted-strings and helpers (#913) --- .../HeaderUtilities.cs | 122 +++++++++++++++++- .../NameValueHeaderValue.cs | 25 +++- .../HeaderUtilitiesTest.cs | 71 ++++++++++ .../NameValueHeaderValueTest.cs | 81 ++++++++++++ 4 files changed, 297 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index abcf102076..20b4319252 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -594,13 +594,133 @@ namespace Microsoft.Net.Http.Headers public static StringSegment RemoveQuotes(StringSegment input) { - if (!StringSegment.IsNullOrEmpty(input) && input.Length >= 2 && input[0] == '"' && input[input.Length - 1] == '"') + if (IsQuoted(input)) { input = input.Subsegment(1, input.Length - 2); } return input; } + public static bool IsQuoted(StringSegment input) + { + return !StringSegment.IsNullOrEmpty(input) && input.Length >= 2 && input[0] == '"' && input[input.Length - 1] == '"'; + } + + /// + /// Given a quoted-string as defined by the RFC specification, + /// removes quotes and unescapes backslashes and quotes. This assumes that the input is a valid quoted-string. + /// + /// The quoted-string to be unescaped. + /// An unescaped version of the quoted-string. + public static StringSegment UnescapeAsQuotedString(StringSegment input) + { + input = RemoveQuotes(input); + + // First pass to calculate the size of the InplaceStringBuilder + var backSlashCount = CountBackslashesForDecodingQuotedString(input); + + if (backSlashCount == 0) + { + return input; + } + + var stringBuilder = new InplaceStringBuilder(input.Length - backSlashCount); + + for (var i = 0; i < input.Length; i++) + { + if (i < input.Length - 1 && input[i] == '\\') + { + // If there is an backslash character as the last character in the string, + // we will assume that it should be included literally in the unescaped string + // Ex: "hello\\" => "hello\\" + // Also, if a sender adds a quoted pair like '\\''n', + // we will assume it is over escaping and just add a n to the string. + // Ex: "he\\llo" => "hello" + stringBuilder.Append(input[i + 1]); + i++; + continue; + } + stringBuilder.Append(input[i]); + } + + return stringBuilder.ToString(); + } + + private static int CountBackslashesForDecodingQuotedString(StringSegment input) + { + var numberBackSlashes = 0; + for (var i = 0; i < input.Length; i++) + { + if (i < input.Length - 1 && input[i] == '\\') + { + // If there is an backslash character as the last character in the string, + // we will assume that it should be included literally in the unescaped string + // Ex: "hello\\" => "hello\\" + // Also, if a sender adds a quoted pair like '\\''n', + // we will assume it is over escaping and just add a n to the string. + // Ex: "he\\llo" => "hello" + if (input[i + 1] == '\\') + { + // Only count escaped backslashes once + i++; + } + numberBackSlashes++; + } + } + return numberBackSlashes; + } + + /// + /// Escapes a as a quoted-string, which is defined by + /// the RFC specification. + /// + /// + /// This will add a backslash before each backslash and quote and add quotes + /// around the input. Assumes that the input does not have quotes around it, + /// as this method will add them. Throws if the input contains any invalid escape characters, + /// as defined by rfc7230. + /// + /// The input to be escaped. + /// An escaped version of the quoted-string. + public static StringSegment EscapeAsQuotedString(StringSegment input) + { + // By calling this, we know that the string requires quotes around it to be a valid token. + var backSlashCount = CountAndCheckCharactersNeedingBackslashesWhenEncoding(input); + + var stringBuilder = new InplaceStringBuilder(input.Length + backSlashCount + 2); // 2 for quotes + stringBuilder.Append('\"'); + + for (var i = 0; i < input.Length; i++) + { + if (input[i] == '\\' || input[i] == '\"') + { + stringBuilder.Append('\\'); + } + else if ((input[i] <= 0x1F || input[i] == 0x7F) && input[i] != 0x09) + { + // Control characters are not allowed in a quoted-string, which include all characters + // below 0x1F (except for 0x09 (TAB)) and 0x7F. + throw new FormatException($"Invalid control character '{input[i]}' in input."); + } + stringBuilder.Append(input[i]); + } + stringBuilder.Append('\"'); + return stringBuilder.ToString(); + } + + private static int CountAndCheckCharactersNeedingBackslashesWhenEncoding(StringSegment input) + { + var numberOfCharactersNeedingEscaping = 0; + for (var i = 0; i < input.Length; i++) + { + if (input[i] == '\\' || input[i] == '\"') + { + numberOfCharactersNeedingEscaping++; + } + } + return numberOfCharactersNeedingEscaping; + } + internal static void ThrowIfReadOnly(bool isReadOnly) { if (isReadOnly) diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index 76b48e0093..ba197e986c 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; +using System.Globalization; using System.Text; using Microsoft.Extensions.Primitives; @@ -142,6 +143,28 @@ namespace Microsoft.Net.Http.Headers } } + public StringSegment GetUnescapedValue() + { + if (!HeaderUtilities.IsQuoted(_value)) + { + return _value; + } + return HeaderUtilities.UnescapeAsQuotedString(_value); + } + + public void SetAndEscapeValue(StringSegment value) + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + if (StringSegment.IsNullOrEmpty(value) || (GetValueLength(value, 0) == value.Length)) + { + _value = value; + } + else + { + Value = HeaderUtilities.EscapeAsQuotedString(value); + } + } + public static NameValueHeaderValue Parse(StringSegment input) { var index = 0; @@ -390,7 +413,7 @@ namespace Microsoft.Net.Http.Headers // Either value is null/empty or a valid token/quoted string if (!(StringSegment.IsNullOrEmpty(value) || (GetValueLength(value, 0) == value.Length))) { - throw new FormatException(string.Format(System.Globalization.CultureInfo.InvariantCulture, "The header value is invalid: '{0}'", value)); + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "The header value is invalid: '{0}'", value)); } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs index 6af446ce25..b72796d618 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -210,5 +210,76 @@ namespace Microsoft.Net.Http.Headers Assert.True(HeaderUtilities.TryParseNonNegativeInt32(valueString, out value)); Assert.Equal(expected, value); } + + [Theory] + [InlineData("\"hello\"", "hello")] + [InlineData("\"hello", "\"hello")] + [InlineData("hello\"", "hello\"")] + [InlineData("\"\"hello\"\"", "\"hello\"")] + public void RemoveQuotes_BehaviorCheck(string input, string expected) + { + var actual = HeaderUtilities.RemoveQuotes(input); + + Assert.Equal(expected, actual); + } + [Theory] + [InlineData("\"hello\"", true)] + [InlineData("\"hello", false)] + [InlineData("hello\"", false)] + [InlineData("\"\"hello\"\"", true)] + public void IsQuoted_BehaviorCheck(string input, bool expected) + { + var actual = HeaderUtilities.IsQuoted(input); + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData("value", "value")] + [InlineData("\"value\"", "value")] + [InlineData("\"hello\\\\\"", "hello\\")] + [InlineData("\"hello\\\"\"", "hello\"")] + [InlineData("\"hello\\\"foo\\\\bar\\\\baz\\\\\"", "hello\"foo\\bar\\baz\\")] + [InlineData("\"quoted value\"", "quoted value")] + [InlineData("\"quoted\\\"valuewithquote\"", "quoted\"valuewithquote")] + [InlineData("\"hello\\\"", "hello\\")] + public void UnescapeAsQuotedString_BehaviorCheck(string input, string expected) + { + var actual = HeaderUtilities.UnescapeAsQuotedString(input); + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData("value", "\"value\"")] + [InlineData("23", "\"23\"")] + [InlineData(";;;", "\";;;\"")] + [InlineData("\"value\"", "\"\\\"value\\\"\"")] + [InlineData("unquoted \"value", "\"unquoted \\\"value\"")] + [InlineData("value\\morevalues\\evenmorevalues", "\"value\\\\morevalues\\\\evenmorevalues\"")] + // We have to assume that the input needs to be quoted here + [InlineData("\"\"double quoted string\"\"", "\"\\\"\\\"double quoted string\\\"\\\"\"")] + [InlineData("\t", "\"\t\"")] + public void SetAndEscapeValue_BehaviorCheck(string input, string expected) + { + var actual = HeaderUtilities.EscapeAsQuotedString(input); + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData("\n")] + [InlineData("\b")] + [InlineData("\r")] + public void SetAndEscapeValue_ControlCharactersThrowFormatException(string input) + { + Assert.Throws(() => { var actual = HeaderUtilities.EscapeAsQuotedString(input); }); + } + + [Fact] + public void SetAndEscapeValue_ThrowsFormatExceptionOnDelCharacter() + { + Assert.Throws(() => { var actual = HeaderUtilities.EscapeAsQuotedString($"{(char)0x7F}"); }); + } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index 8310fa2864..cac18debbb 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -575,6 +575,87 @@ namespace Microsoft.Net.Http.Headers Assert.False(NameValueHeaderValue.TryParseStrictList(inputs, out results)); } + [Theory] + [InlineData("value", "value")] + [InlineData("\"value\"", "value")] + [InlineData("\"hello\\\\\"", "hello\\")] + [InlineData("\"hello\\\"\"", "hello\"")] + [InlineData("\"hello\\\"foo\\\\bar\\\\baz\\\\\"", "hello\"foo\\bar\\baz\\")] + [InlineData("\"quoted value\"", "quoted value")] + [InlineData("\"quoted\\\"valuewithquote\"", "quoted\"valuewithquote")] + [InlineData("\"hello\\\"", "hello\\")] + public void GetUnescapedValue_ReturnsExpectedValue(string input, string expected) + { + var header = new NameValueHeaderValue("test", input); + + var actual = header.GetUnescapedValue(); + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData("value", "value")] + [InlineData("23", "23")] + [InlineData(";;;", "\";;;\"")] + [InlineData("\"value\"", "\"value\"")] + [InlineData("\"assumes already encoded \\\"\"", "\"assumes already encoded \\\"\"")] + [InlineData("unquoted \"value", "\"unquoted \\\"value\"")] + [InlineData("value\\morevalues\\evenmorevalues", "\"value\\\\morevalues\\\\evenmorevalues\"")] + // We have to assume that the input needs to be quoted here + [InlineData("\"\"double quoted string\"\"", "\"\\\"\\\"double quoted string\\\"\\\"\"")] + [InlineData("\t", "\"\t\"")] + public void SetAndEscapeValue_ReturnsExpectedValue(string input, string expected) + { + var header = new NameValueHeaderValue("test"); + header.SetAndEscapeValue(input); + + var actual = header.Value; + + Assert.Equal(expected, actual); + } + + + [Theory] + [InlineData("\n")] + [InlineData("\b")] + [InlineData("\r")] + public void SetAndEscapeValue_ThrowsOnInvalidValues(string input) + { + var header = new NameValueHeaderValue("test"); + Assert.Throws(() => header.SetAndEscapeValue(input)); + } + + [Theory] + [InlineData("value")] + [InlineData("\"value\\\\morevalues\\\\evenmorevalues\"")] + [InlineData("\"quoted \\\"value\"")] + public void GetAndSetEncodeValueRoundTrip_ReturnsExpectedValue(string input) + { + var header = new NameValueHeaderValue("test"); + header.Value = input; + var valueHeader = header.GetUnescapedValue(); + header.SetAndEscapeValue(valueHeader); + + var actual = header.Value; + + Assert.Equal(input, actual); + } + + [Theory] + [InlineData("val\\nue")] + [InlineData("val\\bue")] + public void OverescapingValuesDoNotRoundTrip(string input) + { + var header = new NameValueHeaderValue("test"); + header.SetAndEscapeValue(input); + var valueHeader = header.GetUnescapedValue(); + + var actual = header.Value; + + Assert.NotEqual(input, actual); + } + + #region Helper methods private void CheckValidParse(string input, NameValueHeaderValue expectedResult) From 2b9516703b14cbd9104124de80241e8933c774d0 Mon Sep 17 00:00:00 2001 From: smarts Date: Tue, 12 Sep 2017 13:53:04 -0700 Subject: [PATCH 755/846] Update comments to use correct class name. (#937) --- .../Internal/QueryCollection.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs index 643034deaf..620de44a92 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs @@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Http.Internal /// /// Get or sets the associated value from the collection as a single string. /// - /// The header name. + /// The key name. /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. public StringValues this[string key] { @@ -66,9 +66,9 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -94,10 +94,10 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -108,11 +108,11 @@ namespace Microsoft.AspNetCore.Http.Internal } /// - /// Retrieves a value from the dictionary. + /// Retrieves a value from the collection. /// - /// The header name. + /// The key. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) From 5128efe0e88eaa176d4231ff62d754de59bb0edd Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 13 Sep 2017 07:19:52 +0200 Subject: [PATCH 756/846] Fix HTTP capitalization in comment (#931) --- .../Authentication/AuthenticationProperties.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs index 6e883efb7e..881b24fff5 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -67,7 +67,7 @@ namespace Microsoft.AspNetCore.Http.Authentication } /// - /// Gets or sets the full path or absolute URI to be used as an http redirect response value. + /// Gets or sets the full path or absolute URI to be used as an HTTP redirect response value. /// public string RedirectUri { From bab16971ae3fe0d117154ab2697b25b5b2056657 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 20 Sep 2017 13:04:06 -0700 Subject: [PATCH 757/846] Add comment for claims transform --- .../IClaimsTransformation.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs index 8371901506..0193d95783 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs @@ -12,7 +12,9 @@ namespace Microsoft.AspNetCore.Authentication public interface IClaimsTransformation { /// - /// Provides a central transformation point to change the specified principal. + /// Provides a central transformation point to change the specified principal. + /// Note: this will be run on each AuthenticateAsync call, so its safer to + /// return a new ClaimsPrincipal if your transformation is not idempotent. /// /// The to transform. /// The transformed principal. From 44df557d49e3725c7fad5088e1669841431f4775 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Thu, 21 Sep 2017 17:48:01 -0700 Subject: [PATCH 758/846] Increase Minimum Version of Visual Studio to 15.3.0 --- HttpAbstractions.sln | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index b4607ecdba..fc578eb8a3 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26730.10 -MinimumVisualStudioVersion = 10.0.40219.1 +MinimumVisualStudioVersion = 15.0.26730.03 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" ProjectSection(SolutionItems) = preProject src\Directory.Build.props = src\Directory.Build.props From 835ba2218a2fada35045515d8ced49c3bafc2148 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Mon, 25 Sep 2017 10:47:56 -0700 Subject: [PATCH 759/846] Update API check baselines to 2.0 --- .../baseline.netcore.json | 1734 +++++++++++++++++ .../baseline.netcore.json | 515 +++++ .../baseline.netcore.json | 1706 ++++++++++++++-- .../breakingchanges.netcore.json | 12 - .../baseline.netcore.json | 113 +- .../baseline.netcore.json | 154 +- .../breakingchanges.netcore.json | 32 - .../baseline.netcore.json | 117 +- .../breakingchanges.netcore.json | 12 - .../baseline.netcore.json | 13 +- .../baseline.netcore.json | 611 ++++-- .../breakingchanges.netcore.json | 7 - .../baseline.netcore.json | 485 ++++- .../breakingchanges.netcore.json | 412 ---- 14 files changed, 5000 insertions(+), 923 deletions(-) create mode 100644 src/Microsoft.AspNetCore.Authentication.Abstractions/baseline.netcore.json create mode 100644 src/Microsoft.AspNetCore.Authentication.Core/baseline.netcore.json delete mode 100644 src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json delete mode 100644 src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json delete mode 100644 src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json delete mode 100644 src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json delete mode 100644 src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/baseline.netcore.json b/src/Microsoft.AspNetCore.Authentication.Abstractions/baseline.netcore.json new file mode 100644 index 0000000000..2d1e7e00e4 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/baseline.netcore.json @@ -0,0 +1,1734 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Authentication.Abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticateResult", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Succeeded", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Ticket", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticationTicket", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Ticket", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationTicket" + } + ], + "ReturnType": "System.Void", + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticationProperties", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Failure", + "Parameters": [], + "ReturnType": "System.Exception", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Failure", + "Parameters": [ + { + "Name": "value", + "Type": "System.Exception" + } + ], + "ReturnType": "System.Void", + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_None", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_None", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Success", + "Parameters": [ + { + "Name": "ticket", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationTicket" + } + ], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticateResult", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "NoResult", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticateResult", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Fail", + "Parameters": [ + { + "Name": "failure", + "Type": "System.Exception" + } + ], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticateResult", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Fail", + "Parameters": [ + { + "Name": "failureMessage", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticateResult", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Protected", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTokenAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "tokenName", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTokenAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "tokenName", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationOptions", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Schemes", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SchemeMap", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AddScheme", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "configureBuilder", + "Type": "System.Action" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AddScheme", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "displayName", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [ + { + "ParameterName": "THandler", + "ParameterPosition": 0, + "BaseTypeOrInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationHandler" + ] + } + ] + }, + { + "Kind": "Method", + "Name": "get_DefaultScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DefaultScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DefaultAuthenticateScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DefaultAuthenticateScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DefaultSignInScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DefaultSignInScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DefaultSignOutScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DefaultSignOutScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DefaultChallengeScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DefaultChallengeScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DefaultForbidScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DefaultForbidScheme", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationProperties", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Items", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsPersistent", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsPersistent", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_RedirectUri", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_RedirectUri", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IssuedUtc", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IssuedUtc", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ExpiresUtc", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ExpiresUtc", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_AllowRefresh", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AllowRefresh", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "items", + "Type": "System.Collections.Generic.IDictionary" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationScheme", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DisplayName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HandlerType", + "Parameters": [], + "ReturnType": "System.Type", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + }, + { + "Name": "displayName", + "Type": "System.String" + }, + { + "Name": "handlerType", + "Type": "System.Type" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationSchemeBuilder", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_DisplayName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_DisplayName", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HandlerType", + "Parameters": [], + "ReturnType": "System.Type", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HandlerType", + "Parameters": [ + { + "Name": "value", + "Type": "System.Type" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticationScheme", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationTicket", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AuthenticationScheme", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Principal", + "Parameters": [], + "ReturnType": "System.Security.Claims.ClaimsPrincipal", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.AuthenticationProperties", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + }, + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationToken", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Name", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Value", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Value", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_OriginalPathBase", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_OriginalPathBase", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_OriginalPath", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_OriginalPath", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationHandler", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "InitializeAsync", + "Parameters": [ + { + "Name": "scheme", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationScheme" + }, + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetHandlerAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationRequestHandler", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationHandler" + ], + "Members": [ + { + "Kind": "Method", + "Name": "HandleRequestAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetAllSchemesAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task>", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetSchemeAsync", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultAuthenticateSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultChallengeSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultForbidSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultSignInSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultSignOutSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AddScheme", + "Parameters": [ + { + "Name": "scheme", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationScheme" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "RemoveScheme", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetRequestHandlerSchemesAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task>", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationService", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationSignInHandler", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationSignOutHandler" + ], + "Members": [ + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "user", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IAuthenticationSignOutHandler", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationHandler" + ], + "Members": [ + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.IClaimsTransformation", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "TransformAsync", + "Parameters": [ + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationTokenExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "StoreTokens", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + }, + { + "Name": "tokens", + "Type": "System.Collections.Generic.IEnumerable" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTokenValue", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + }, + { + "Name": "tokenName", + "Type": "System.String" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UpdateTokenValue", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + }, + { + "Name": "tokenName", + "Type": "System.String" + }, + { + "Name": "tokenValue", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTokens", + "Parameters": [ + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Collections.Generic.IEnumerable", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTokenAsync", + "Parameters": [ + { + "Name": "auth", + "Type": "Microsoft.AspNetCore.Authentication.IAuthenticationService" + }, + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "tokenName", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetTokenAsync", + "Parameters": [ + { + "Name": "auth", + "Type": "Microsoft.AspNetCore.Authentication.IAuthenticationService" + }, + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "tokenName", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Core/baseline.netcore.json b/src/Microsoft.AspNetCore.Authentication.Core/baseline.netcore.json new file mode 100644 index 0000000000..62aeb44738 --- /dev/null +++ b/src/Microsoft.AspNetCore.Authentication.Core/baseline.netcore.json @@ -0,0 +1,515 @@ +{ + "AssemblyIdentity": "Microsoft.AspNetCore.Authentication.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "Types": [ + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationFeature", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationFeature" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_OriginalPathBase", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_OriginalPathBase", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_OriginalPath", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.PathString", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_OriginalPath", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationFeature", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationHandlerProvider", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Schemes", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHandlerAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "authenticationScheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "schemes", + "Type": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider" + ], + "Members": [ + { + "Kind": "Method", + "Name": "GetDefaultAuthenticateSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultChallengeSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultForbidSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultSignInSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetDefaultSignOutSchemeAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetSchemeAsync", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetRequestHandlerSchemesAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task>", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AddScheme", + "Parameters": [ + { + "Name": "scheme", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationScheme" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "RemoveScheme", + "Parameters": [ + { + "Name": "name", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetAllSchemesAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task>", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "options", + "Type": "Microsoft.Extensions.Options.IOptions" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.AuthenticationService", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IAuthenticationService" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Schemes", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Handlers", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Transform", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Authentication.IClaimsTransformation", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AuthenticateAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationService", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ChallengeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationService", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ForbidAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationService", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignInAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationService", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SignOutAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "scheme", + "Type": "System.String" + }, + { + "Name": "properties", + "Type": "Microsoft.AspNetCore.Authentication.AuthenticationProperties" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IAuthenticationService", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "schemes", + "Type": "Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider" + }, + { + "Name": "handlers", + "Type": "Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider" + }, + { + "Name": "transform", + "Type": "Microsoft.AspNetCore.Authentication.IClaimsTransformation" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Authentication.NoopClaimsTransformation", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Authentication.IClaimsTransformation" + ], + "Members": [ + { + "Kind": "Method", + "Name": "TransformAsync", + "Parameters": [ + { + "Name": "principal", + "Type": "System.Security.Claims.ClaimsPrincipal" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Authentication.IClaimsTransformation", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.Extensions.DependencyInjection.AuthenticationCoreServiceCollectionExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AddAuthenticationCore", + "Parameters": [ + { + "Name": "services", + "Type": "Microsoft.Extensions.DependencyInjection.IServiceCollection" + } + ], + "ReturnType": "Microsoft.Extensions.DependencyInjection.IServiceCollection", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AddAuthenticationCore", + "Parameters": [ + { + "Name": "services", + "Type": "Microsoft.Extensions.DependencyInjection.IServiceCollection" + }, + { + "Name": "configureOptions", + "Type": "System.Action" + } + ], + "ReturnType": "Microsoft.Extensions.DependencyInjection.IServiceCollection", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + } + ] +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json index 4814d96431..c2eeac7fe9 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json @@ -1,75 +1,6 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ - { - "Name": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "Kind": "Interface", - "Abstract": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_ApplicationServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ApplicationServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ServerFeatures", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Use", - "Parameters": [ - { - "Name": "middleware", - "Type": "System.Func" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "New", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Build", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, { "Name": "Microsoft.AspNetCore.Builder.MapExtensions", "Visibility": "Public", @@ -264,6 +195,141 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Builder.UsePathBaseExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "UsePathBase", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "pathBase", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.UseWhenExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "UseWhen", + "Parameters": [ + { + "Name": "app", + "Type": "Microsoft.AspNetCore.Builder.IApplicationBuilder" + }, + { + "Name": "predicate", + "Type": "System.Func" + }, + { + "Name": "configuration", + "Type": "System.Action" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_ApplicationServices", + "Parameters": [], + "ReturnType": "System.IServiceProvider", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ApplicationServices", + "Parameters": [ + { + "Name": "value", + "Type": "System.IServiceProvider" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ServerFeatures", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Properties", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Use", + "Parameters": [ + { + "Name": "middleware", + "Type": "System.Func" + } + ], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "New", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Builder.Extensions.MapMiddleware", "Visibility": "Public", @@ -456,6 +522,44 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Builder.Extensions.UsePathBaseMiddleware", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Invoke", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "next", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + }, + { + "Name": "pathBase", + "Type": "Microsoft.AspNetCore.Http.PathString" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.ConnectionInfo", "Visibility": "Public", @@ -463,6 +567,31 @@ "Abstract": true, "ImplementedInterfaces": [], "Members": [ + { + "Kind": "Method", + "Name": "get_Id", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Id", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Abstract": true, + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_RemoteIpAddress", @@ -614,6 +743,214 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.CookieBuilder", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Name", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Path", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Path", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Domain", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Domain", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HttpOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_HttpOnly", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SameSite", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.SameSiteMode", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SameSite", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.SameSiteMode" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_SecurePolicy", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.CookieSecurePolicy", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SecurePolicy", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.CookieSecurePolicy" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Expiration", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Expiration", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.CookieOptions", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Build", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "expiresFrom", + "Type": "System.DateTimeOffset" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.CookieOptions", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.CookieSecurePolicy", "Visibility": "Public", @@ -645,6 +982,172 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Append", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.String[]", + "IsParams": true + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.String[]", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetCommaSeparatedValues", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.String[]", + "IsParams": true + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.HttpResponseWritingExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "text", + "Type": "System.String" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "response", + "Type": "Microsoft.AspNetCore.Http.HttpResponse" + }, + { + "Name": "text", + "Type": "System.String" + }, + { + "Name": "encoding", + "Type": "System.Text.Encoding" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.FragmentString", "Visibility": "Public", @@ -1250,6 +1753,234 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.HttpMethods", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "IsConnect", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsDelete", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsGet", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsHead", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsOptions", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsPatch", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsPost", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsPut", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsTrace", + "Parameters": [ + { + "Name": "method", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Connect", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Delete", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Get", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Head", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Options", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Patch", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Post", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Put", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "Trace", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.HttpRequest", "Visibility": "Public", @@ -1996,6 +2727,66 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.IMiddleware", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "InvokeAsync", + "Parameters": [ + { + "Name": "context", + "Type": "Microsoft.AspNetCore.Http.HttpContext" + }, + { + "Name": "next", + "Type": "Microsoft.AspNetCore.Http.RequestDelegate" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.IMiddlewareFactory", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "middlewareType", + "Type": "System.Type" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IMiddleware", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Release", + "Parameters": [ + { + "Name": "middleware", + "Type": "Microsoft.AspNetCore.Http.IMiddleware" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.PathString", "Visibility": "Public", @@ -2137,6 +2928,56 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "matched", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + }, + { + "Name": "remaining", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "StartsWithSegments", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.PathString" + }, + { + "Name": "comparisonType", + "Type": "System.StringComparison" + }, + { + "Name": "matched", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + }, + { + "Name": "remaining", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "Add", @@ -2735,6 +3576,39 @@ "Sealed": true, "ImplementedInterfaces": [], "Members": [ + { + "Kind": "Field", + "Name": "Status100Continue", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "100" + }, + { + "Kind": "Field", + "Name": "Status101SwitchingProtocols", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "101" + }, + { + "Kind": "Field", + "Name": "Status102Processing", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "102" + }, { "Kind": "Field", "Name": "Status200OK", @@ -2812,6 +3686,39 @@ "Constant": true, "Literal": "206" }, + { + "Kind": "Field", + "Name": "Status207MultiStatus", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "207" + }, + { + "Kind": "Field", + "Name": "Status208AlreadyReported", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "208" + }, + { + "Kind": "Field", + "Name": "Status226IMUsed", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "226" + }, { "Kind": "Field", "Name": "Status300MultipleChoices", @@ -2900,6 +3807,17 @@ "Constant": true, "Literal": "307" }, + { + "Kind": "Field", + "Name": "Status308PermanentRedirect", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "308" + }, { "Kind": "Field", "Name": "Status400BadRequest", @@ -3054,6 +3972,17 @@ "Constant": true, "Literal": "413" }, + { + "Kind": "Field", + "Name": "Status413PayloadTooLarge", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "413" + }, { "Kind": "Field", "Name": "Status414RequestUriTooLong", @@ -3065,6 +3994,17 @@ "Constant": true, "Literal": "414" }, + { + "Kind": "Field", + "Name": "Status414UriTooLong", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "414" + }, { "Kind": "Field", "Name": "Status415UnsupportedMediaType", @@ -3087,6 +4027,17 @@ "Constant": true, "Literal": "416" }, + { + "Kind": "Field", + "Name": "Status416RangeNotSatisfiable", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "416" + }, { "Kind": "Field", "Name": "Status417ExpectationFailed", @@ -3120,6 +4071,105 @@ "Constant": true, "Literal": "419" }, + { + "Kind": "Field", + "Name": "Status421MisdirectedRequest", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "421" + }, + { + "Kind": "Field", + "Name": "Status422UnprocessableEntity", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "422" + }, + { + "Kind": "Field", + "Name": "Status423Locked", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "423" + }, + { + "Kind": "Field", + "Name": "Status424FailedDependency", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "424" + }, + { + "Kind": "Field", + "Name": "Status426UpgradeRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "426" + }, + { + "Kind": "Field", + "Name": "Status428PreconditionRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "428" + }, + { + "Kind": "Field", + "Name": "Status429TooManyRequests", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "429" + }, + { + "Kind": "Field", + "Name": "Status431RequestHeaderFieldsTooLarge", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "431" + }, + { + "Kind": "Field", + "Name": "Status451UnavailableForLegalReasons", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "451" + }, { "Kind": "Field", "Name": "Status500InternalServerError", @@ -3196,6 +4246,50 @@ "GenericParameter": [], "Constant": true, "Literal": "506" + }, + { + "Kind": "Field", + "Name": "Status507InsufficientStorage", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "507" + }, + { + "Kind": "Field", + "Name": "Status508LoopDetected", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "508" + }, + { + "Kind": "Field", + "Name": "Status510NotExtended", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "510" + }, + { + "Kind": "Field", + "Name": "Status511NetworkAuthenticationRequired", + "Parameters": [], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "511" } ], "GenericParameters": [] @@ -3262,7 +4356,238 @@ "GenericParameters": [] }, { - "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryExtensions", + "Name": "Microsoft.AspNetCore.Http.Internal.HeaderSegment", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Formatting", + "Parameters": [], + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Data", + "Parameters": [], + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "formatting", + "Type": "Microsoft.Extensions.Primitives.StringSegment" + }, + { + "Name": "data", + "Type": "Microsoft.Extensions.Primitives.StringSegment" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerable", + "System.IEquatable" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IEquatable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Equals", + "Parameters": [ + { + "Name": "obj", + "Type": "System.Object" + } + ], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHashCode", + "Parameters": [], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Equality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "op_Inequality", + "Parameters": [ + { + "Name": "left", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" + }, + { + "Name": "right", + "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection+Enumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.ParsingHelpers", "Visibility": "Public", "Kind": "Class", "Abstract": true, @@ -3272,7 +4597,61 @@ "Members": [ { "Kind": "Method", - "Name": "Append", + "Name": "GetHeader", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHeaderSplit", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetHeaderUnmodified", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringValues", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetHeaderJoined", "Parameters": [ { "Name": "headers", @@ -3289,13 +4668,34 @@ ], "ReturnType": "System.Void", "Static": true, - "Extension": true, "Visibility": "Public", "GenericParameter": [] }, { "Kind": "Method", - "Name": "AppendCommaSeparatedValues", + "Name": "SetHeaderUnmodified", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" + }, + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "values", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AppendHeaderJoined", "Parameters": [ { "Name": "headers", @@ -3313,32 +4713,12 @@ ], "ReturnType": "System.Void", "Static": true, - "Extension": true, "Visibility": "Public", "GenericParameter": [] }, { "Kind": "Method", - "Name": "GetCommaSeparatedValues", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.String[]", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetCommaSeparatedValues", + "Name": "AppendHeaderUnmodified", "Parameters": [ { "Name": "headers", @@ -3350,77 +4730,11 @@ }, { "Name": "values", - "Type": "System.String[]", - "IsParams": true + "Type": "Microsoft.Extensions.Primitives.StringValues" } ], "ReturnType": "System.Void", "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.HttpResponseWritingExtensions", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "text", - "Type": "System.String" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "WriteAsync", - "Parameters": [ - { - "Name": "response", - "Type": "Microsoft.AspNetCore.Http.HttpResponse" - }, - { - "Name": "text", - "Type": "System.String" - }, - { - "Name": "encoding", - "Type": "System.Text.Encoding" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Static": true, - "Extension": true, "Visibility": "Public", "GenericParameter": [] } @@ -4023,6 +5337,74 @@ } ], "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection+Enumerator", + "Visibility": "Public", + "Kind": "Struct", + "Sealed": true, + "ImplementedInterfaces": [ + "System.Collections.Generic.IEnumerator" + ], + "Members": [ + { + "Kind": "Method", + "Name": "get_Current", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.Internal.HeaderSegment", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "MoveNext", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Reset", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.IEnumerator", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "headers", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] } ] } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json deleted file mode 100644 index ded45f5cc3..0000000000 --- a/src/Microsoft.AspNetCore.Http.Abstractions/breakingchanges.netcore.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "TypeId": "public abstract class Microsoft.AspNetCore.Http.ConnectionInfo", - "MemberId": "public abstract System.String get_Id()", - "Kind": "Addition" - }, - { - "TypeId": "public abstract class Microsoft.AspNetCore.Http.ConnectionInfo", - "MemberId": "public abstract System.Void set_Id(System.String value)", - "Kind": "Addition" - } - ] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json index 9b55f4ed4d..33ae6d9ef9 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryTypeExtensions", @@ -1283,6 +1283,33 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.Extensions.HttpRequestMultipartExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "GetMultipartBoundary", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.Extensions.QueryBuilder", "Visibility": "Public", @@ -1435,6 +1462,36 @@ "Static": true, "Visibility": "Public", "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyToAsync", + "Parameters": [ + { + "Name": "source", + "Type": "System.IO.Stream" + }, + { + "Name": "destination", + "Type": "System.IO.Stream" + }, + { + "Name": "count", + "Type": "System.Nullable" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + }, + { + "Name": "cancel", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] } ], "GenericParameters": [] @@ -1516,6 +1573,45 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "FromAbsolute", + "Parameters": [ + { + "Name": "uri", + "Type": "System.String" + }, + { + "Name": "scheme", + "Type": "System.String", + "Direction": "Out" + }, + { + "Name": "host", + "Type": "Microsoft.AspNetCore.Http.HostString", + "Direction": "Out" + }, + { + "Name": "path", + "Type": "Microsoft.AspNetCore.Http.PathString", + "Direction": "Out" + }, + { + "Name": "query", + "Type": "Microsoft.AspNetCore.Http.QueryString", + "Direction": "Out" + }, + { + "Name": "fragment", + "Type": "Microsoft.AspNetCore.Http.FragmentString", + "Direction": "Out" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "Encode", @@ -1545,6 +1641,21 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "GetEncodedPathAndQuery", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.String", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "GetDisplayUrl", diff --git a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json index d209ce2ee1..3c8fab88d3 100644 --- a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Http.CookieOptions", @@ -91,6 +91,27 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_SameSite", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.Http.SameSiteMode", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SameSite", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.AspNetCore.Http.SameSiteMode" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_HttpOnly", @@ -368,6 +389,25 @@ ], "ReturnType": "System.Void", "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] } ], "GenericParameters": [] @@ -611,14 +651,26 @@ { "Kind": "Method", "Name": "LoadAsync", - "Parameters": [], + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], "ReturnType": "System.Threading.Tasks.Task", "GenericParameter": [] }, { "Kind": "Method", "Name": "CommitAsync", - "Parameters": [], + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken", + "DefaultValue": "default(System.Threading.CancellationToken)" + } + ], "ReturnType": "System.Threading.Tasks.Task", "GenericParameter": [] }, @@ -677,6 +729,37 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.SameSiteMode", + "Visibility": "Public", + "Kind": "Enumeration", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "None", + "Parameters": [], + "GenericParameter": [], + "Literal": "0" + }, + { + "Kind": "Field", + "Name": "Lax", + "Parameters": [], + "GenericParameter": [], + "Literal": "1" + }, + { + "Kind": "Field", + "Name": "Strict", + "Parameters": [], + "GenericParameter": [], + "Literal": "2" + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.WebSocketAcceptContext", "Visibility": "Public", @@ -1160,6 +1243,35 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpBodyControlFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_AllowSynchronousIO", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_AllowSynchronousIO", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.Features.IHttpBufferingFeature", "Visibility": "Public", @@ -1289,6 +1401,42 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.Features.IHttpMaxRequestBodySizeFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_MaxRequestBodySize", + "Parameters": [], + "ReturnType": "System.Nullable", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MaxRequestBodySize", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.Features.IHttpRequestFeature", "Visibility": "Public", diff --git a/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json deleted file mode 100644 index 96eb5548c5..0000000000 --- a/src/Microsoft.AspNetCore.Http.Features/breakingchanges.netcore.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "TypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "MemberId": "System.Nullable get_ContentLength()", - "Kind": "Addition" - }, - { - "TypeId": "public interface Microsoft.AspNetCore.Http.IHeaderDictionary : System.Collections.Generic.IDictionary", - "MemberId": "System.Void set_ContentLength(System.Nullable value)", - "Kind": "Addition" - }, - { - "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", - "MemberId": "System.Threading.Tasks.Task CommitAsync()", - "Kind": "Removal" - }, - { - "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", - "MemberId": "System.Threading.Tasks.Task LoadAsync()", - "Kind": "Removal" - }, - { - "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", - "MemberId": "System.Threading.Tasks.Task CommitAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))", - "Kind": "Addition" - }, - { - "TypeId": "public interface Microsoft.AspNetCore.Http.ISession", - "MemberId": "System.Threading.Tasks.Task LoadAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))", - "Kind": "Addition" - } -] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/baseline.netcore.json b/src/Microsoft.AspNetCore.Http/baseline.netcore.json index a7bc95d6cb..92edd6acd7 100644 --- a/src/Microsoft.AspNetCore.Http/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder", @@ -690,6 +690,33 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_ContentLength", + "Parameters": [], + "ReturnType": "System.Nullable", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_ContentLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IHeaderDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_Count", @@ -1017,10 +1044,6 @@ "Kind": "Constructor", "Name": ".ctor", "Parameters": [ - { - "Name": "poolProvider", - "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" - }, { "Name": "formOptions", "Type": "Microsoft.Extensions.Options.IOptions" @@ -1033,10 +1056,6 @@ "Kind": "Constructor", "Name": ".ctor", "Parameters": [ - { - "Name": "poolProvider", - "Type": "Microsoft.Extensions.ObjectPool.ObjectPoolProvider" - }, { "Name": "formOptions", "Type": "Microsoft.Extensions.Options.IOptions" @@ -1052,6 +1071,61 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.MiddlewareFactory", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [ + "Microsoft.AspNetCore.Http.IMiddlewareFactory" + ], + "Members": [ + { + "Kind": "Method", + "Name": "Create", + "Parameters": [ + { + "Name": "middlewareType", + "Type": "System.Type" + } + ], + "ReturnType": "Microsoft.AspNetCore.Http.IMiddleware", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IMiddlewareFactory", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Release", + "Parameters": [ + { + "Name": "middleware", + "Type": "Microsoft.AspNetCore.Http.IMiddleware" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "Microsoft.AspNetCore.Http.IMiddlewareFactory", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "serviceProvider", + "Type": "System.IServiceProvider" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.RequestFormReaderExtensions", "Visibility": "Public", @@ -1193,6 +1267,31 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_Id", + "Parameters": [], + "ReturnType": "System.String", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Id", + "Parameters": [ + { + "Name": "value", + "Type": "System.String" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_RemoteIpAddress", diff --git a/src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json deleted file mode 100644 index 67515e0af1..0000000000 --- a/src/Microsoft.AspNetCore.Http/breakingchanges.netcore.json +++ /dev/null @@ -1,12 +0,0 @@ - [ - { - "TypeId": "public class Microsoft.AspNetCore.Http.HttpContextFactory : Microsoft.AspNetCore.Http.IHttpContextFactory", - "MemberId": "public .ctor(Microsoft.Extensions.ObjectPool.ObjectPoolProvider poolProvider, Microsoft.Extensions.Options.IOptions formOptions)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.AspNetCore.Http.HttpContextFactory : Microsoft.AspNetCore.Http.IHttpContextFactory", - "MemberId": "public .ctor(Microsoft.Extensions.ObjectPool.ObjectPoolProvider poolProvider, Microsoft.Extensions.Options.IOptions formOptions, Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor)", - "Kind": "Removal" - } - ] diff --git a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json index ec8635bdd3..c3d0a44572 100644 --- a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Builder.OwinExtensions", @@ -168,6 +168,17 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Constructor", "Name": ".ctor", diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json index 3cdbdbb3e6..0bf330cd73 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json @@ -1,6 +1,218 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ + { + "Name": "Microsoft.AspNetCore.WebUtilities.WebEncoders", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlDecode", + "Parameters": [ + { + "Name": "input", + "Type": "System.String" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "buffer", + "Type": "System.Char[]" + }, + { + "Name": "bufferOffset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetArraySizeRequiredToDecode", + "Parameters": [ + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Base64UrlEncode", + "Parameters": [ + { + "Name": "input", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "output", + "Type": "System.Char[]" + }, + { + "Name": "outputOffset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetArraySizeRequiredToEncode", + "Parameters": [ + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.Base64UrlTextEncoder", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "Encode", + "Parameters": [ + { + "Name": "data", + "Type": "System.Byte[]" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Decode", + "Parameters": [ + { + "Name": "text", + "Type": "System.String" + } + ], + "ReturnType": "System.Byte[]", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream", "Visibility": "Public", @@ -355,6 +567,136 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.FileMultipartSection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Section", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.WebUtilities.MultipartSection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileStream", + "Parameters": [], + "ReturnType": "System.IO.Stream", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_FileName", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + }, + { + "Name": "header", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.FormMultipartSection", + "Visibility": "Public", + "Kind": "Class", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_Section", + "Parameters": [], + "ReturnType": "Microsoft.AspNetCore.WebUtilities.MultipartSection", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Name", + "Parameters": [], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetValueAsync", + "Parameters": [], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + }, + { + "Name": "header", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.WebUtilities.FormReader", "Visibility": "Public", @@ -969,17 +1311,6 @@ ], "Visibility": "Public", "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "DefaultBufferSize", - "Parameters": [], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [], - "Constant": true, - "Literal": "1024" } ], "GenericParameters": [] @@ -1282,6 +1613,90 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.MultipartSectionConverterExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AsFileSection", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + } + ], + "ReturnType": "Microsoft.AspNetCore.WebUtilities.FileMultipartSection", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "AsFormDataSection", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + } + ], + "ReturnType": "Microsoft.AspNetCore.WebUtilities.FormMultipartSection", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GetContentDispositionHeader", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + } + ], + "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.MultipartSectionStreamExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "ReadAsStringAsync", + "Parameters": [ + { + "Name": "section", + "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.WebUtilities.QueryHelpers", "Visibility": "Public", @@ -1468,178 +1883,6 @@ } ], "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.WebUtilities.WebEncoders", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Base64UrlDecode", - "Parameters": [ - { - "Name": "input", - "Type": "System.String" - } - ], - "ReturnType": "System.Byte[]", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlDecode", - "Parameters": [ - { - "Name": "input", - "Type": "System.String" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Byte[]", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlDecode", - "Parameters": [ - { - "Name": "input", - "Type": "System.String" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "buffer", - "Type": "System.Char[]" - }, - { - "Name": "bufferOffset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Byte[]", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetArraySizeRequiredToDecode", - "Parameters": [ - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlEncode", - "Parameters": [ - { - "Name": "input", - "Type": "System.Byte[]" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlEncode", - "Parameters": [ - { - "Name": "input", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Base64UrlEncode", - "Parameters": [ - { - "Name": "input", - "Type": "System.Byte[]" - }, - { - "Name": "offset", - "Type": "System.Int32" - }, - { - "Name": "output", - "Type": "System.Char[]" - }, - { - "Name": "outputOffset", - "Type": "System.Int32" - }, - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetArraySizeRequiredToEncode", - "Parameters": [ - { - "Name": "count", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Int32", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] } ] } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json b/src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json deleted file mode 100644 index c1f57ccf9f..0000000000 --- a/src/Microsoft.AspNetCore.WebUtilities/breakingchanges.netcore.json +++ /dev/null @@ -1,7 +0,0 @@ -[ - { - "TypeId": "public class Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter : System.IO.TextWriter", - "MemberId": "public const System.Int32 DefaultBufferSize = 1024", - "Kind": "Removal" - } -] diff --git a/src/Microsoft.Net.Http.Headers/baseline.netcore.json b/src/Microsoft.Net.Http.Headers/baseline.netcore.json index 71355f27a7..f68dd6ee1e 100644 --- a/src/Microsoft.Net.Http.Headers/baseline.netcore.json +++ b/src/Microsoft.Net.Http.Headers/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.Net.Http.Headers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.Net.Http.Headers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", @@ -32,7 +32,7 @@ "Kind": "Method", "Name": "get_NoCacheHeaders", "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", + "ReturnType": "System.Collections.Generic.ICollection", "Visibility": "Public", "GenericParameter": [] }, @@ -250,7 +250,7 @@ "Kind": "Method", "Name": "get_PrivateHeaders", "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", + "ReturnType": "System.Collections.Generic.ICollection", "Visibility": "Public", "GenericParameter": [] }, @@ -345,7 +345,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", @@ -359,7 +359,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -378,6 +378,126 @@ "Parameters": [], "Visibility": "Public", "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "PublicString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "PrivateString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "MaxAgeString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "SharedMaxAgeString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "NoCacheString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "NoStoreString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "MaxStaleString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "MinFreshString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "NoTransformString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "OnlyIfCachedString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "MustRevalidateString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Field", + "Name": "ProxyRevalidateString", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "ReadOnly": true, + "Visibility": "Public", + "GenericParameter": [] } ], "GenericParameters": [] @@ -392,7 +512,7 @@ "Kind": "Method", "Name": "get_DispositionType", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -402,7 +522,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -421,7 +541,7 @@ "Kind": "Method", "Name": "get_Name", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -431,7 +551,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -442,7 +562,7 @@ "Kind": "Method", "Name": "get_FileName", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -452,7 +572,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -463,7 +583,7 @@ "Kind": "Method", "Name": "get_FileNameStar", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -473,7 +593,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -570,7 +690,7 @@ "Parameters": [ { "Name": "fileName", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -583,7 +703,7 @@ "Parameters": [ { "Name": "fileName", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -631,7 +751,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", @@ -645,7 +765,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -664,7 +784,7 @@ "Parameters": [ { "Name": "dispositionType", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -673,6 +793,48 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValueIdentityExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "IsFileDisposition", + "Parameters": [ + { + "Name": "header", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsFormDisposition", + "Parameters": [ + { + "Name": "header", + "Type": "Microsoft.Net.Http.Headers.ContentDispositionHeaderValue" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", "Visibility": "Public", @@ -683,7 +845,7 @@ "Kind": "Method", "Name": "get_Unit", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -693,7 +855,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -781,7 +943,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.ContentRangeHeaderValue", @@ -795,7 +957,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -869,7 +1031,7 @@ "Kind": "Method", "Name": "get_Name", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -879,7 +1041,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -890,7 +1052,7 @@ "Kind": "Method", "Name": "get_Value", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -900,7 +1062,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -923,7 +1085,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.CookieHeaderValue", @@ -937,7 +1099,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -1047,7 +1209,7 @@ "Parameters": [ { "Name": "name", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -1059,11 +1221,11 @@ "Parameters": [ { "Name": "name", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -1091,7 +1253,7 @@ "Kind": "Method", "Name": "get_Tag", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -1138,13 +1300,30 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "Compare", + "Parameters": [ + { + "Name": "other", + "Type": "Microsoft.Net.Http.Headers.EntityTagHeaderValue" + }, + { + "Name": "useStrongComparison", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "Parse", "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.EntityTagHeaderValue", @@ -1158,7 +1337,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -1243,7 +1422,7 @@ "Parameters": [ { "Name": "tag", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -1255,7 +1434,7 @@ "Parameters": [ { "Name": "tag", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "isWeak", @@ -1451,7 +1630,7 @@ "Visibility": "Public", "GenericParameter": [], "Constant": true, - "Literal": "\"ContentMD5\"" + "Literal": "\"Content-MD5\"" }, { "Kind": "Field", @@ -1886,11 +2065,71 @@ "Members": [ { "Kind": "Method", - "Name": "TryParseInt64", + "Name": "TryParseSeconds", + "Parameters": [ + { + "Name": "headerValues", + "Type": "Microsoft.Extensions.Primitives.StringValues" + }, + { + "Name": "targetValue", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "System.Nullable", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsCacheDirective", + "Parameters": [ + { + "Name": "cacheControlDirectives", + "Type": "Microsoft.Extensions.Primitives.StringValues" + }, + { + "Name": "targetDirectives", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseNonNegativeInt32", "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" + }, + { + "Name": "result", + "Type": "System.Int32", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryParseNonNegativeInt64", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "result", @@ -1905,7 +2144,7 @@ }, { "Kind": "Method", - "Name": "FormatInt64", + "Name": "FormatNonNegativeInt64", "Parameters": [ { "Name": "value", @@ -1923,7 +2162,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "result", @@ -1950,16 +2189,34 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "FormatDate", + "Parameters": [ + { + "Name": "dateTime", + "Type": "System.DateTimeOffset" + }, + { + "Name": "quoted", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "RemoveQuotes", "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Static": true, "Visibility": "Public", "GenericParameter": [] @@ -1977,7 +2234,7 @@ "Kind": "Method", "Name": "get_Charset", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -1987,7 +2244,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -2019,7 +2276,7 @@ "Kind": "Method", "Name": "get_Boundary", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2029,7 +2286,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -2069,7 +2326,7 @@ "Kind": "Method", "Name": "get_MediaType", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2079,7 +2336,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -2090,7 +2347,7 @@ "Kind": "Method", "Name": "get_Type", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2098,7 +2355,7 @@ "Kind": "Method", "Name": "get_SubType", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2196,7 +2453,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.MediaTypeHeaderValue", @@ -2210,7 +2467,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -2295,7 +2552,7 @@ "Parameters": [ { "Name": "mediaType", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -2307,7 +2564,7 @@ "Parameters": [ { "Name": "mediaType", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "quality", @@ -2370,7 +2627,7 @@ "Kind": "Method", "Name": "get_Name", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2378,7 +2635,7 @@ "Kind": "Method", "Name": "get_Value", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2388,7 +2645,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -2450,7 +2707,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.NameValueHeaderValue", @@ -2464,7 +2721,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -2563,7 +2820,7 @@ }, { "Name": "name", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.NameValueHeaderValue", @@ -2577,7 +2834,7 @@ "Parameters": [ { "Name": "name", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -2589,11 +2846,11 @@ "Parameters": [ { "Name": "name", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -2665,7 +2922,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.RangeConditionHeaderValue", @@ -2679,7 +2936,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -2741,7 +2998,7 @@ "Kind": "Method", "Name": "get_Unit", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2751,7 +3008,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -2807,7 +3064,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.RangeHeaderValue", @@ -2821,7 +3078,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -2936,6 +3193,37 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.Net.Http.Headers.SameSiteMode", + "Visibility": "Public", + "Kind": "Enumeration", + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Field", + "Name": "None", + "Parameters": [], + "GenericParameter": [], + "Literal": "0" + }, + { + "Kind": "Field", + "Name": "Lax", + "Parameters": [], + "GenericParameter": [], + "Literal": "1" + }, + { + "Kind": "Field", + "Name": "Strict", + "Parameters": [], + "GenericParameter": [], + "Literal": "2" + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.Net.Http.Headers.SetCookieHeaderValue", "Visibility": "Public", @@ -2946,7 +3234,7 @@ "Kind": "Method", "Name": "get_Name", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2956,7 +3244,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -2967,7 +3255,7 @@ "Kind": "Method", "Name": "get_Value", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -2977,7 +3265,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -3030,7 +3318,7 @@ "Kind": "Method", "Name": "get_Domain", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -3040,7 +3328,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -3051,7 +3339,7 @@ "Kind": "Method", "Name": "get_Path", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -3061,7 +3349,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "System.Void", @@ -3089,6 +3377,27 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_SameSite", + "Parameters": [], + "ReturnType": "Microsoft.Net.Http.Headers.SameSiteMode", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_SameSite", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Net.Http.Headers.SameSiteMode" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_HttpOnly", @@ -3139,7 +3448,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.SetCookieHeaderValue", @@ -3153,7 +3462,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -3263,7 +3572,7 @@ "Parameters": [ { "Name": "name", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -3275,11 +3584,11 @@ "Parameters": [ { "Name": "name", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -3298,7 +3607,7 @@ "Kind": "Method", "Name": "get_Value", "Parameters": [], - "ReturnType": "System.String", + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", "Visibility": "Public", "GenericParameter": [] }, @@ -3351,7 +3660,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "ReturnType": "Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", @@ -3365,7 +3674,7 @@ "Parameters": [ { "Name": "input", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "parsedValue", @@ -3450,7 +3759,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" } ], "Visibility": "Public", @@ -3462,7 +3771,7 @@ "Parameters": [ { "Name": "value", - "Type": "System.String" + "Type": "Microsoft.Extensions.Primitives.StringSegment" }, { "Name": "quality", diff --git a/src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json b/src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json deleted file mode 100644 index 6748ae1f1e..0000000000 --- a/src/Microsoft.Net.Http.Headers/breakingchanges.netcore.json +++ /dev/null @@ -1,412 +0,0 @@ -[ - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public .ctor(System.String dispositionType)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.ContentDispositionHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.ContentDispositionHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.String get_DispositionType()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.String get_FileName()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.String get_FileNameStar()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.String get_Name()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.Void set_DispositionType(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.Void set_FileName(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.Void set_FileNameStar(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.Void set_Name(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.Void SetHttpFileName(System.String fileName)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentDispositionHeaderValue", - "MemberId": "public System.Void SetMimeFileName(System.String fileName)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public .ctor(System.String mediaType)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public .ctor(System.String mediaType, System.Double quality)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.MediaTypeHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.MediaTypeHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.String get_Boundary()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.String get_Charset()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.String get_MediaType()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.String get_SubType()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.String get_Type()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.Void set_Boundary(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.Void set_Charset(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.MediaTypeHeaderValue", - "MemberId": "public System.Void set_MediaType(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public .ctor(System.String name)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public .ctor(System.String name, System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.CookieHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.CookieHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public System.String get_Name()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public System.String get_Value()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public System.Void set_Name(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CookieHeaderValue", - "MemberId": "public System.Void set_Value(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public .ctor(System.String name)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public .ctor(System.String name, System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.NameValueHeaderValue Find(System.Collections.Generic.IList values, System.String name)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.NameValueHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.NameValueHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public System.String get_Name()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public System.String get_Value()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.NameValueHeaderValue", - "MemberId": "public System.Void set_Value(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public .ctor(System.String name)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public .ctor(System.String name, System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.SetCookieHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.SetCookieHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.String get_Domain()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.String get_Name()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.String get_Path()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.String get_Value()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.Void set_Domain(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.Void set_Name(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.Void set_Path(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.SetCookieHeaderValue", - "MemberId": "public System.Void set_Value(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", - "MemberId": "public .ctor(System.String tag)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", - "MemberId": "public .ctor(System.String tag, System.Boolean isWeak)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.EntityTagHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.EntityTagHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.EntityTagHeaderValue", - "MemberId": "public System.String get_Tag()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", - "MemberId": "public .ctor(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", - "MemberId": "public .ctor(System.String value, System.Double quality)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.StringWithQualityHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.StringWithQualityHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.StringWithQualityHeaderValue", - "MemberId": "public System.String get_Value()", - "Kind": "Removal" - }, - { - "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderNames", - "MemberId": "public const System.String ContentMD5 = \"ContentMD5\"", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.CacheControlHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.CacheControlHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", - "MemberId": "public System.Collections.Generic.ICollection get_NoCacheHeaders()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.CacheControlHeaderValue", - "MemberId": "public System.Collections.Generic.ICollection get_PrivateHeaders()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.ContentRangeHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.ContentRangeHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", - "MemberId": "public System.String get_Unit()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.ContentRangeHeaderValue", - "MemberId": "public System.Void set_Unit(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.RangeConditionHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.RangeConditionHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.RangeConditionHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.RangeConditionHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", - "MemberId": "public static Microsoft.Net.Http.Headers.RangeHeaderValue Parse(System.String input)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", - "MemberId": "public static System.Boolean TryParse(System.String input, out Microsoft.Net.Http.Headers.RangeHeaderValue parsedValue)", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", - "MemberId": "public System.String get_Unit()", - "Kind": "Removal" - }, - { - "TypeId": "public class Microsoft.Net.Http.Headers.RangeHeaderValue", - "MemberId": "public System.Void set_Unit(System.String value)", - "Kind": "Removal" - }, - { - "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", - "MemberId": "public static System.Boolean TryParseDate(System.String input, out System.DateTimeOffset result)", - "Kind": "Removal" - }, - { - "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", - "MemberId": "public static System.Boolean TryParseInt64(System.String value, out System.Int64 result)", - "Kind": "Removal" - }, - { - "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", - "MemberId": "public static System.String FormatInt64(System.Int64 value)", - "Kind": "Removal" - }, - { - "TypeId": "public static class Microsoft.Net.Http.Headers.HeaderUtilities", - "MemberId": "public static System.String RemoveQuotes(System.String input)", - "Kind": "Removal" - } -] \ No newline at end of file From 321639b0eb2098a6fe3b0d763f48ac3ed025a688 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 6 Jul 2017 12:25:54 -0700 Subject: [PATCH 760/846] Add AuthenticationProperties to AuthenticateResult for failures. --- .../AuthenticateResult.cs | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs index 1da6a0b94d..5982143bcb 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// Additional state values for the authentication session. /// - public AuthenticationProperties Properties => Ticket?.Properties; + public AuthenticationProperties Properties { get; protected set; } /// /// Holds failure information from the authentication. @@ -54,7 +54,7 @@ namespace Microsoft.AspNetCore.Authentication { throw new ArgumentNullException(nameof(ticket)); } - return new AuthenticateResult() { Ticket = ticket }; + return new AuthenticateResult() { Ticket = ticket, Properties = ticket.Properties }; } /// @@ -76,14 +76,32 @@ namespace Microsoft.AspNetCore.Authentication return new AuthenticateResult() { Failure = failure }; } + /// + /// Indicates that there was a failure during authentication. + /// + /// The failure exception. + /// Additional state values for the authentication session. + /// The result. + public static AuthenticateResult Fail(Exception failure, AuthenticationProperties properties) + { + return new AuthenticateResult() { Failure = failure, Properties = properties }; + } + /// /// Indicates that there was a failure during authentication. /// /// The failure message. /// The result. public static AuthenticateResult Fail(string failureMessage) - { - return new AuthenticateResult() { Failure = new Exception(failureMessage) }; - } + => Fail(new Exception(failureMessage)); + + /// + /// Indicates that there was a failure during authentication. + /// + /// The failure message. + /// Additional state values for the authentication session. + /// The result. + public static AuthenticateResult Fail(string failureMessage, AuthenticationProperties properties) + => Fail(new Exception(failureMessage), properties); } } From b0d91c17f1a5e91b2deaf4f83013119f43f70f53 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Fri, 29 Sep 2017 15:14:46 -0700 Subject: [PATCH 761/846] Add Strict-Transport-Security header name (#944) --- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index 379630744e..24a3d99f77 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -46,6 +46,7 @@ namespace Microsoft.Net.Http.Headers public const string RetryAfter = "Retry-After"; public const string Server = "Server"; public const string SetCookie = "Set-Cookie"; + public const string StrictTransportSecurity = "Strict-Transport-Security"; public const string TE = "TE"; public const string Trailer = "Trailer"; public const string TransferEncoding = "Transfer-Encoding"; From d6a3c3f83e0abb54472f19103bf385ca9d8ead5f Mon Sep 17 00:00:00 2001 From: Henk Mollema Date: Mon, 2 Oct 2017 17:31:12 +0200 Subject: [PATCH 762/846] Add helper to register IHttpContextAccessor (#947) --- .../HttpServiceCollectionExtensions.cs | 31 +++++++++++++++++ .../HttpServiceCollectionExtensionsTests.cs | 33 +++++++++++++++++++ .../Microsoft.AspNetCore.Http.Tests.csproj | 4 +++ 3 files changed, 68 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http/HttpServiceCollectionExtensions.cs create mode 100644 test/Microsoft.AspNetCore.Http.Tests/HttpServiceCollectionExtensionsTests.cs diff --git a/src/Microsoft.AspNetCore.Http/HttpServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.Http/HttpServiceCollectionExtensions.cs new file mode 100644 index 0000000000..cccfe6d4e6 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/HttpServiceCollectionExtensions.cs @@ -0,0 +1,31 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// Extension methods for configuring HttpContext services. + /// + public static class HttpServiceCollectionExtensions + { + /// + /// Adds a default implementation for the service. + /// + /// The . + /// The service collection. + public static IServiceCollection AddHttpContextAccessor(this IServiceCollection services) + { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + + services.TryAddSingleton(); + return services; + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpServiceCollectionExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpServiceCollectionExtensionsTests.cs new file mode 100644 index 0000000000..a317e99346 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpServiceCollectionExtensionsTests.cs @@ -0,0 +1,33 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNetCore.Http.Tests +{ + public class HttpServiceCollectionExtensionsTests + { + [Fact] + public void AddHttpContextAccessor_AddsWithCorrectLifetime() + { + // Arrange + var services = new ServiceCollection(); + + // Act + services.AddHttpContextAccessor(); + + // Assert + var descriptor = services[0]; + Assert.Equal(ServiceLifetime.Singleton, descriptor.Lifetime); + Assert.Equal(typeof(HttpContextAccessor), descriptor.ImplementationType); + } + + [Fact] + public void AddHttpContextAccessor_ThrowsWithoutServices() + { + Assert.Throws("services", () => HttpServiceCollectionExtensions.AddHttpContextAccessor(null)); + } + } +} diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index e47d0f44fb..8e5a9fd0ba 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -9,4 +9,8 @@ + + + + From 8dc80c54ad714c51faf8b96f2162af03a8980433 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 5 Oct 2017 17:13:26 -0700 Subject: [PATCH 763/846] Minor test code changes to resolve xUnit2013 build error --- .../HeaderDictionaryTests.cs | 2 +- .../Internal/DefaultHttpRequestTests.cs | 4 ++-- .../ResponseCookiesTest.cs | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index f9cd2488ab..46f8a89e06 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Http { "Header1", "Value1" } }); - Assert.Equal(1, headers.Count); + Assert.Single(headers); Assert.Equal(new[] { "Header1" }, headers.Keys); Assert.True(headers.ContainsKey("header1")); Assert.False(headers.ContainsKey("header2")); diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs index 4afc7bd04d..dbe1d54dd0 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs @@ -166,9 +166,9 @@ namespace Microsoft.AspNetCore.Http.Internal { var request = new DefaultHttpContext().Request; var cookieHeaders = request.Headers["Cookie"]; - Assert.Equal(0, cookieHeaders.Count); + Assert.Empty(cookieHeaders); var cookies0 = request.Cookies; - Assert.Equal(0, cookies0.Count); + Assert.Empty(cookies0); Assert.Null(cookies0["key0"]); Assert.False(cookies0.ContainsKey("key0")); diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index 8ab9dd1c64..5e5c44f89d 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Http.Tests cookies.Delete(testcookie); var cookieHeaderValues = headers[HeaderNames.SetCookie]; - Assert.Equal(1, cookieHeaderValues.Count); + Assert.Single(cookieHeaderValues); Assert.StartsWith(testcookie, cookieHeaderValues[0]); Assert.Contains("path=/", cookieHeaderValues[0]); Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); @@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.Http.Tests cookies.Delete(testcookie, options); var cookieHeaderValues = headers[HeaderNames.SetCookie]; - Assert.Equal(1, cookieHeaderValues.Count); + Assert.Single(cookieHeaderValues); Assert.StartsWith(testcookie, cookieHeaderValues[0]); Assert.Contains("path=/", cookieHeaderValues[0]); Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); @@ -66,7 +66,7 @@ namespace Microsoft.AspNetCore.Http.Tests cookies.Delete(testcookie); var cookieHeaderValues = headers[HeaderNames.SetCookie]; - Assert.Equal(1, cookieHeaderValues.Count); + Assert.Single(cookieHeaderValues); Assert.StartsWith(testcookie, cookieHeaderValues[0]); Assert.Contains("path=/", cookieHeaderValues[0]); Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); @@ -85,7 +85,7 @@ namespace Microsoft.AspNetCore.Http.Tests cookies.Append(testcookie, testcookie, cookieOptions); var cookieHeaderValues = headers[HeaderNames.SetCookie]; - Assert.Equal(1, cookieHeaderValues.Count); + Assert.Single(cookieHeaderValues); Assert.Contains($"max-age={maxAgeTime.TotalSeconds.ToString()}", cookieHeaderValues[0]); } @@ -117,7 +117,7 @@ namespace Microsoft.AspNetCore.Http.Tests cookies.Append(key, value); var cookieHeaderValues = headers[HeaderNames.SetCookie]; - Assert.Equal(1, cookieHeaderValues.Count); + Assert.Single(cookieHeaderValues); Assert.StartsWith(expected, cookieHeaderValues[0]); } } From badaa7393b76b44401c2e3a8f8e566bf6732f563 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 9 Oct 2017 20:58:37 +0200 Subject: [PATCH 764/846] Add header names for CORS (#951) --- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index 24a3d99f77..1002efdeda 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -10,6 +10,14 @@ namespace Microsoft.Net.Http.Headers public const string AcceptEncoding = "Accept-Encoding"; public const string AcceptLanguage = "Accept-Language"; public const string AcceptRanges = "Accept-Ranges"; + public const string AccessControlAllowCredentials = "Access-Control-Allow-Credentials"; + public const string AccessControlAllowHeaders = "Access-Control-Allow-Headers"; + public const string AccessControlAllowMethods = "Access-Control-Allow-Methods"; + public const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; + public const string AccessControlExposeHeaders = "Access-Control-Expose-Headers"; + public const string AccessControlMaxAge = "Access-Control-Max-Age"; + public const string AccessControlRequestHeaders = "Access-Control-Request-Headers"; + public const string AccessControlRequestMethod = "Access-Control-Request-Method"; public const string Age = "Age"; public const string Allow = "Allow"; public const string Authorization = "Authorization"; @@ -38,6 +46,7 @@ namespace Microsoft.Net.Http.Headers public const string LastModified = "Last-Modified"; public const string Location = "Location"; public const string MaxForwards = "Max-Forwards"; + public const string Origin = "Origin"; public const string Pragma = "Pragma"; public const string ProxyAuthenticate = "Proxy-Authenticate"; public const string ProxyAuthorization = "Proxy-Authorization"; From beffc94826b7565b54f558127c53d5cf938ecaca Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Wed, 20 Sep 2017 13:20:35 -0700 Subject: [PATCH 765/846] Update bootstrappers --- .appveyor.yml | 4 +- build.cmd | 2 +- build.sh | 197 +------------------------------------- run.cmd | 2 + build.ps1 => run.ps1 | 56 +++++++---- run.sh | 223 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 266 insertions(+), 218 deletions(-) create mode 100644 run.cmd rename build.ps1 => run.ps1 (73%) create mode 100755 run.sh diff --git a/.appveyor.yml b/.appveyor.yml index 31efd8196f..46038786c9 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,4 +1,4 @@ -init: +init: - git config --global core.autocrlf true branches: only: @@ -7,7 +7,7 @@ branches: - dev - /^(.*\/)?ci-.*$/ build_script: - - ps: .\build.ps1 + - ps: .\run.ps1 default-build clone_depth: 1 environment: global: diff --git a/build.cmd b/build.cmd index b6c8d24864..c0050bda12 100644 --- a/build.cmd +++ b/build.cmd @@ -1,2 +1,2 @@ @ECHO OFF -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" +PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' default-build %*; exit $LASTEXITCODE" diff --git a/build.sh b/build.sh index 11cdbe5504..98a4b22765 100755 --- a/build.sh +++ b/build.sh @@ -1,199 +1,8 @@ #!/usr/bin/env bash set -euo pipefail - -# -# variables -# - -RESET="\033[0m" -RED="\033[0;31m" -MAGENTA="\033[0;95m" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet" -config_file="$DIR/version.xml" -verbose=false -update=false -repo_path="$DIR" -channel='' -tools_source='' -# -# Functions -# -__usage() { - echo "Usage: $(basename "${BASH_SOURCE[0]}") [options] [[--] ...]" - echo "" - echo "Arguments:" - echo " ... Arguments passed to MSBuild. Variable number of arguments allowed." - echo "" - echo "Options:" - echo " --verbose Show verbose output." - echo " -c|--channel The channel of KoreBuild to download. Overrides the value from the config file.." - echo " --config-file TThe path to the configuration file that stores values. Defaults to version.xml." - echo " -d|--dotnet-home The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet." - echo " --path The directory to build. Defaults to the directory containing the script." - echo " -s|--tools-source The base url where build tools can be downloaded. Overrides the value from the config file." - echo " -u|--update Update to the latest KoreBuild even if the lock file is present." - echo "" - echo "Description:" - echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be." - echo " When the lockfile is not present, KoreBuild will create one using latest available version from \$channel." - - if [[ "${1:-}" != '--no-exit' ]]; then - exit 2 - fi -} - -get_korebuild() { - local version - local lock_file="$repo_path/korebuild-lock.txt" - if [ ! -f "$lock_file" ] || [ "$update" = true ]; then - __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" - fi - version="$(grep 'version:*' -m 1 "$lock_file")" - if [[ "$version" == '' ]]; then - __error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'" - return 1 - fi - version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version" - - { - if [ ! -d "$korebuild_path" ]; then - mkdir -p "$korebuild_path" - local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip" - tmpfile="$(mktemp)" - echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}" - if __get_remote_file "$remote_path" "$tmpfile"; then - unzip -q -d "$korebuild_path" "$tmpfile" - fi - rm "$tmpfile" || true - fi - - source "$korebuild_path/KoreBuild.sh" - } || { - if [ -d "$korebuild_path" ]; then - echo "Cleaning up after failed installation" - rm -rf "$korebuild_path" || true - fi - return 1 - } -} - -__error() { - echo -e "${RED}$*${RESET}" 1>&2 -} - -__machine_has() { - hash "$1" > /dev/null 2>&1 - return $? -} - -__get_remote_file() { - local remote_path=$1 - local local_path=$2 - - if [[ "$remote_path" != 'http'* ]]; then - cp "$remote_path" "$local_path" - return 0 - fi - - local failed=false - if __machine_has wget; then - wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true - else - failed=true - fi - - if [ "$failed" = true ] && __machine_has curl; then - failed=false - curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true - fi - - if [ "$failed" = true ]; then - __error "Download failed: $remote_path" 1>&2 - return 1 - fi -} - -__read_dom () { local IFS=\> ; read -r -d \< ENTITY CONTENT ;} - -# -# main -# - -while [[ $# -gt 0 ]]; do - case $1 in - -\?|-h|--help) - __usage --no-exit - exit 0 - ;; - -c|--channel|-Channel) - shift - channel="${1:-}" - [ -z "$channel" ] && __usage - ;; - --config-file|-ConfigFile) - shift - config_file="${1:-}" - [ -z "$config_file" ] && __usage - ;; - -d|--dotnet-home|-DotNetHome) - shift - DOTNET_HOME="${1:-}" - [ -z "$DOTNET_HOME" ] && __usage - ;; - --path|-Path) - shift - repo_path="${1:-}" - [ -z "$repo_path" ] && __usage - ;; - -s|--tools-source|-ToolsSource) - shift - tools_source="${1:-}" - [ -z "$tools_source" ] && __usage - ;; - -u|--update|-Update) - update=true - ;; - --verbose|-Verbose) - verbose=true - ;; - --) - shift - break - ;; - *) - break - ;; - esac - shift -done - -if ! __machine_has unzip; then - __error 'Missing required command: unzip' - exit 1 -fi - -if ! __machine_has curl && ! __machine_has wget; then - __error 'Missing required command. Either wget or curl is required.' - exit 1 -fi - -if [ -f "$config_file" ]; then - comment=false - while __read_dom; do - if [ "$comment" = true ]; then [[ $CONTENT == *'-->'* ]] && comment=false ; continue; fi - if [[ $ENTITY == '!--'* ]]; then comment=true; continue; fi - if [ -z "$channel" ] && [[ $ENTITY == "KoreBuildChannel" ]]; then channel=$CONTENT; fi - if [ -z "$tools_source" ] && [[ $ENTITY == "KoreBuildToolsSource" ]]; then tools_source=$CONTENT; fi - done < "$config_file" -fi - -[ -z "$channel" ] && channel='dev' -[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools' - -get_korebuild -install_tools "$tools_source" "$DOTNET_HOME" -invoke_repository_build "$repo_path" "$@" +# Call "sync" between "chmod" and execution to prevent "text file busy" error in Docker (aufs) +chmod +x "$DIR/run.sh"; sync +"$DIR/run.sh" default-build "$@" diff --git a/run.cmd b/run.cmd new file mode 100644 index 0000000000..d52d5c7e68 --- /dev/null +++ b/run.cmd @@ -0,0 +1,2 @@ +@ECHO OFF +PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' %*; exit $LASTEXITCODE" diff --git a/build.ps1 b/run.ps1 similarity index 73% rename from build.ps1 rename to run.ps1 index d5eb4d5cf2..49c2899856 100644 --- a/build.ps1 +++ b/run.ps1 @@ -3,10 +3,13 @@ <# .SYNOPSIS -Build this repository +Executes KoreBuild commands. .DESCRIPTION -Downloads korebuild if required. Then builds the repository. +Downloads korebuild if required. Then executes the KoreBuild command. To see available commands, execute with `-Command help`. + +.PARAMETER Command +The KoreBuild command to run. .PARAMETER Path The folder to build. Defaults to the folder containing this script. @@ -24,31 +27,32 @@ The base url where build tools can be downloaded. Overrides the value from the c Updates KoreBuild to the latest version even if a lock file is present. .PARAMETER ConfigFile -The path to the configuration file that stores values. Defaults to version.xml. +The path to the configuration file that stores values. Defaults to korebuild.json. -.PARAMETER MSBuildArgs -Arguments to be passed to MSBuild +.PARAMETER Arguments +Arguments to be passed to the command .NOTES This function will create a file $PSScriptRoot/korebuild-lock.txt. This lock file can be committed to source, but does not have to be. When the lockfile is not present, KoreBuild will create one using latest available version from $Channel. -The $ConfigFile is expected to be an XML file. It is optional, and the configuration values in it are optional as well. +The $ConfigFile is expected to be an JSON file. It is optional, and the configuration values in it are optional as well. Any options set +in the file are overridden by command line parameters. .EXAMPLE Example config file: -```xml - - - - dev - https://aspnetcore.blob.core.windows.net/buildtools - - +```json +{ + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", + "channel": "dev", + "toolsSource": "https://aspnetcore.blob.core.windows.net/buildtools" +} ``` #> [CmdletBinding(PositionalBinding = $false)] param( + [Parameter(Mandatory=$true, Position = 0)] + [string]$Command, [string]$Path = $PSScriptRoot, [Alias('c')] [string]$Channel, @@ -58,9 +62,9 @@ param( [string]$ToolsSource, [Alias('u')] [switch]$Update, - [string]$ConfigFile = (Join-Path $PSScriptRoot 'version.xml'), + [string]$ConfigFile, [Parameter(ValueFromRemainingArguments = $true)] - [string[]]$MSBuildArgs + [string[]]$Arguments ) Set-StrictMode -Version 2 @@ -147,10 +151,20 @@ function Get-RemoteFile([string]$RemotePath, [string]$LocalPath) { # Load configuration or set defaults +$Path = Resolve-Path $Path +if (!$ConfigFile) { $ConfigFile = Join-Path $Path 'korebuild.json' } + if (Test-Path $ConfigFile) { - [xml] $config = Get-Content $ConfigFile - if (!($Channel)) { [string] $Channel = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildChannel' } - if (!($ToolsSource)) { [string] $ToolsSource = Select-Xml -Xml $config -XPath '/Project/PropertyGroup/KoreBuildToolsSource' } + try { + $config = Get-Content -Raw -Encoding UTF8 -Path $ConfigFile | ConvertFrom-Json + if ($config) { + if (!($Channel) -and (Get-Member -Name 'channel' -InputObject $config)) { [string] $Channel = $config.channel } + if (!($ToolsSource) -and (Get-Member -Name 'toolsSource' -InputObject $config)) { [string] $ToolsSource = $config.toolsSource} + } + } catch { + Write-Warning "$ConfigFile could not be read. Its settings will be ignored." + Write-Warning $Error[0] + } } if (!$DotNetHome) { @@ -169,8 +183,8 @@ $korebuildPath = Get-KoreBuild Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1') try { - Install-Tools $ToolsSource $DotNetHome - Invoke-RepositoryBuild $Path @MSBuildArgs + Set-KoreBuildSettings -ToolsSource $ToolsSource -DotNetHome $DotNetHome -RepoPath $Path -ConfigFile $ConfigFile + Invoke-KoreBuildCommand $Command @Arguments } finally { Remove-Module 'KoreBuild' -ErrorAction Ignore diff --git a/run.sh b/run.sh new file mode 100755 index 0000000000..c278423acc --- /dev/null +++ b/run.sh @@ -0,0 +1,223 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# +# variables +# + +RESET="\033[0m" +RED="\033[0;31m" +YELLOW="\033[0;33m" +MAGENTA="\033[0;95m" +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet" +verbose=false +update=false +repo_path="$DIR" +channel='' +tools_source='' + +# +# Functions +# +__usage() { + echo "Usage: $(basename "${BASH_SOURCE[0]}") command [options] [[--] ...]" + echo "" + echo "Arguments:" + echo " command The command to be run." + echo " ... Arguments passed to the command. Variable number of arguments allowed." + echo "" + echo "Options:" + echo " --verbose Show verbose output." + echo " -c|--channel The channel of KoreBuild to download. Overrides the value from the config file.." + echo " --config-file The path to the configuration file that stores values. Defaults to korebuild.json." + echo " -d|--dotnet-home The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet." + echo " --path The directory to build. Defaults to the directory containing the script." + echo " -s|--tools-source|-ToolsSource The base url where build tools can be downloaded. Overrides the value from the config file." + echo " -u|--update Update to the latest KoreBuild even if the lock file is present." + echo "" + echo "Description:" + echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be." + echo " When the lockfile is not present, KoreBuild will create one using latest available version from \$channel." + + if [[ "${1:-}" != '--no-exit' ]]; then + exit 2 + fi +} + +get_korebuild() { + local version + local lock_file="$repo_path/korebuild-lock.txt" + if [ ! -f "$lock_file" ] || [ "$update" = true ]; then + __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" + fi + version="$(grep 'version:*' -m 1 "$lock_file")" + if [[ "$version" == '' ]]; then + __error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'" + return 1 + fi + version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version" + + { + if [ ! -d "$korebuild_path" ]; then + mkdir -p "$korebuild_path" + local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip" + tmpfile="$(mktemp)" + echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}" + if __get_remote_file "$remote_path" "$tmpfile"; then + unzip -q -d "$korebuild_path" "$tmpfile" + fi + rm "$tmpfile" || true + fi + + source "$korebuild_path/KoreBuild.sh" + } || { + if [ -d "$korebuild_path" ]; then + echo "Cleaning up after failed installation" + rm -rf "$korebuild_path" || true + fi + return 1 + } +} + +__error() { + echo -e "${RED}error: $*${RESET}" 1>&2 +} + +__warn() { + echo -e "${YELLOW}warning: $*${RESET}" +} + +__machine_has() { + hash "$1" > /dev/null 2>&1 + return $? +} + +__get_remote_file() { + local remote_path=$1 + local local_path=$2 + + if [[ "$remote_path" != 'http'* ]]; then + cp "$remote_path" "$local_path" + return 0 + fi + + local failed=false + if __machine_has wget; then + wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true + else + failed=true + fi + + if [ "$failed" = true ] && __machine_has curl; then + failed=false + curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true + fi + + if [ "$failed" = true ]; then + __error "Download failed: $remote_path" 1>&2 + return 1 + fi +} + +# +# main +# + +command="${1:-}" +shift + +while [[ $# -gt 0 ]]; do + case $1 in + -\?|-h|--help) + __usage --no-exit + exit 0 + ;; + -c|--channel|-Channel) + shift + channel="${1:-}" + [ -z "$channel" ] && __usage + ;; + --config-file|-ConfigFile) + shift + config_file="${1:-}" + [ -z "$config_file" ] && __usage + if [ ! -f "$config_file" ]; then + __error "Invalid value for --config-file. $config_file does not exist." + exit 1 + fi + ;; + -d|--dotnet-home|-DotNetHome) + shift + DOTNET_HOME="${1:-}" + [ -z "$DOTNET_HOME" ] && __usage + ;; + --path|-Path) + shift + repo_path="${1:-}" + [ -z "$repo_path" ] && __usage + ;; + -s|--tools-source|-ToolsSource) + shift + tools_source="${1:-}" + [ -z "$tools_source" ] && __usage + ;; + -u|--update|-Update) + update=true + ;; + --verbose|-Verbose) + verbose=true + ;; + --) + shift + break + ;; + *) + break + ;; + esac + shift +done + +if ! __machine_has unzip; then + __error 'Missing required command: unzip' + exit 1 +fi + +if ! __machine_has curl && ! __machine_has wget; then + __error 'Missing required command. Either wget or curl is required.' + exit 1 +fi + +[ -z "${config_file:-}" ] && config_file="$repo_path/korebuild.json" +if [ -f "$config_file" ]; then + if __machine_has jq ; then + if jq '.' "$config_file" >/dev/null ; then + config_channel="$(jq -r 'select(.channel!=null) | .channel' "$config_file")" + config_tools_source="$(jq -r 'select(.toolsSource!=null) | .toolsSource' "$config_file")" + else + __warn "$config_file is invalid JSON. Its settings will be ignored." + fi + elif __machine_has python ; then + if python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'))" >/dev/null ; then + config_channel="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" + config_tools_source="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" + else + __warn "$config_file is invalid JSON. Its settings will be ignored." + fi + else + __warn 'Missing required command: jq or pyton. Could not parse the JSON file. Its settings will be ignored.' + fi + + [ ! -z "${config_channel:-}" ] && channel="$config_channel" + [ ! -z "${config_tools_source:-}" ] && tools_source="$config_tools_source" +fi + +[ -z "$channel" ] && channel='dev' +[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools' + +get_korebuild +set_korebuildsettings "$tools_source" "$DOTNET_HOME" "$repo_path" "$config_file" +invoke_korebuild_command "$command" "$@" From 01b4530fa78a073c23eb61bacab918c60479b692 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 12 Oct 2017 06:30:29 +0200 Subject: [PATCH 766/846] Add Content-Security-Policy (#950) * Add Content-Security-Policy * Add Content-Security-Policy-Report-Only * Fix previous edit --- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index 1002efdeda..b38bff58a2 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -30,6 +30,8 @@ namespace Microsoft.Net.Http.Headers public const string ContentLocation = "Content-Location"; public const string ContentMD5 = "Content-MD5"; public const string ContentRange = "Content-Range"; + public const string ContentSecurityPolicy = "Content-Security-Policy"; + public const string ContentSecurityPolicyReportOnly = "Content-Security-Policy-Report-Only"; public const string ContentType = "Content-Type"; public const string Cookie = "Cookie"; public const string Date = "Date"; From 75a7552360cc1bfed1a56aad2180f730e5ba24cc Mon Sep 17 00:00:00 2001 From: Jonathan Date: Thu, 12 Oct 2017 20:00:23 +0200 Subject: [PATCH 767/846] Add Referer to GetTypedHeaders (#949) * Add a Referer property * Add Uri to KnownParsers * Add property for Origin * Add Origin * Encode the URI From feedback from Tratcher * Inline the var 'out' declaration * Remove Origin Since it does not cleanly map to a Uri object since it can contain multiple values. * Took back that whitespace * Reverted * Add using for UriHelper.Encode --- .../HeaderDictionaryTypeExtensions.cs | 2 +- .../RequestHeaders.cs | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 6863d61e0e..1723ee6fd5 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -284,4 +284,4 @@ namespace Microsoft.AspNetCore.Http return null; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs index ddd125985e..12246922d4 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Http.Headers @@ -261,6 +262,23 @@ namespace Microsoft.AspNetCore.Http.Headers } } + public Uri Referer + { + get + { + Uri uri; + if (Uri.TryCreate(Headers[HeaderNames.Referer], UriKind.RelativeOrAbsolute, out uri)) + { + return uri; + } + return null; + } + set + { + Headers.Set(HeaderNames.Referer, value == null ? null : UriHelper.Encode(value)); + } + } + public T Get(string name) { return Headers.Get(name); @@ -311,4 +329,4 @@ namespace Microsoft.AspNetCore.Http.Headers Headers.AppendList(name, values); } } -} \ No newline at end of file +} From a491f48fc8e16b21aea09aac9f4f4e2020873b3d Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Mon, 16 Oct 2017 12:49:48 -0700 Subject: [PATCH 768/846] Add RepositoryRoot --- Directory.Build.props | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 4230c339d8..74cd028d93 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,10 +1,11 @@ - + Microsoft ASP.NET Core https://github.com/aspnet/HttpAbstractions git + $(MSBuildThisFileDirectory) $(MSBuildThisFileDirectory)build\Key.snk true true From c0f937239a0a099b73c67c96ab9e1c875952f67f Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 1 Nov 2017 09:32:44 -0700 Subject: [PATCH 769/846] Pin tool and package versions to make builds more repeatable Part of aspnet/Universe#575 --- .gitignore | 1 - Directory.Build.props | 6 ++--- Directory.Build.targets | 17 +++--------- NuGet.config | 1 + build/dependencies.props | 27 +++++++++++++++++++ build/repo.props | 9 ++++--- korebuild-lock.txt | 2 ++ korebuild.json | 4 +++ src/Directory.Build.props | 4 +-- ...NetCore.Authentication.Abstractions.csproj | 4 +-- ...rosoft.AspNetCore.Http.Abstractions.csproj | 4 +-- ...icrosoft.AspNetCore.Http.Extensions.csproj | 4 +-- .../Microsoft.AspNetCore.Http.Features.csproj | 2 +- .../Microsoft.AspNetCore.Http.csproj | 6 ++--- .../Microsoft.AspNetCore.WebUtilities.csproj | 4 +-- .../Microsoft.Net.Http.Headers.csproj | 4 +-- test/Directory.Build.props | 16 +++++------ ...AspNetCore.Authentication.Core.Test.csproj | 2 +- ...ft.AspNetCore.Http.Extensions.Tests.csproj | 2 +- .../Microsoft.AspNetCore.Http.Tests.csproj | 2 +- .../Microsoft.AspNetCore.Owin.Tests.csproj | 2 +- version.props | 10 +++++++ version.xml | 8 ------ 23 files changed, 84 insertions(+), 57 deletions(-) create mode 100644 build/dependencies.props create mode 100644 korebuild-lock.txt create mode 100644 korebuild.json create mode 100644 version.props delete mode 100644 version.xml diff --git a/.gitignore b/.gitignore index bac5b75057..d5717b3f3f 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,3 @@ project.lock.json /.vs/ .vscode/ global.json -korebuild-lock.txt diff --git a/Directory.Build.props b/Directory.Build.props index 74cd028d93..651b7f515d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,5 +1,6 @@ - - + + + Microsoft ASP.NET Core @@ -9,7 +10,6 @@ $(MSBuildThisFileDirectory)build\Key.snk true true - $(VersionSuffix)-$(BuildNumber) true diff --git a/Directory.Build.targets b/Directory.Build.targets index bc118fd907..e83ff95e39 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,14 +1,5 @@ - - - - <_BootstrapperFile Condition=" $([MSBuild]::IsOSUnixLike()) ">build.sh - <_BootstrapperFile Condition="! $([MSBuild]::IsOSUnixLike()) ">build.cmd - <_BootstrapperError> - Package references have not been pinned. Run './$(_BootstrapperFile) /t:Pin'. - Also, you can run './$(_BootstrapperFile) /t:Restore' which will pin *and* restore packages. '$(_BootstrapperFile)' can be found in '$(MSBuildThisFileDirectory)'. - - - - - + + + $(MicrosoftNETCoreApp20PackageVersion) + diff --git a/NuGet.config b/NuGet.config index 20060c934e..4e8a1f6de1 100644 --- a/NuGet.config +++ b/NuGet.config @@ -3,6 +3,7 @@ + diff --git a/build/dependencies.props b/build/dependencies.props new file mode 100644 index 0000000000..a28bce64f7 --- /dev/null +++ b/build/dependencies.props @@ -0,0 +1,27 @@ + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + 2.1.0-preview1-15549 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.1.0-preview1-27488 + 2.0.0 + 15.3.0 + 4.7.49 + 4.4.0 + 4.4.0 + 0.7.0 + 2.3.0 + 2.3.0 + + + diff --git a/build/repo.props b/build/repo.props index 13fe1c296a..b55e651b87 100644 --- a/build/repo.props +++ b/build/repo.props @@ -1,6 +1,7 @@  - - - - + + + Internal.AspNetCore.Universe.Lineup + https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json + diff --git a/korebuild-lock.txt b/korebuild-lock.txt new file mode 100644 index 0000000000..45463cc71e --- /dev/null +++ b/korebuild-lock.txt @@ -0,0 +1,2 @@ +version:2.1.0-preview1-15549 +commithash:f570e08585fec510dd60cd4bfe8795388b757a95 diff --git a/korebuild.json b/korebuild.json new file mode 100644 index 0000000000..bd5d51a51b --- /dev/null +++ b/korebuild.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", + "channel": "dev" +} diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 9d9a3de33a..4b89a431e7 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - + - + diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj index 1a4701fdc2..234ff58f3f 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -13,8 +13,8 @@ - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj index 57fb8a1fdc..d4a9eff0e6 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -19,8 +19,8 @@ Microsoft.AspNetCore.Http.HttpResponse - - + + diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj index 6c65cad216..91ce5adabc 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj index 8a647e18ab..22acd694c5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj index 779aba760b..162315a7a6 100644 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj @@ -16,9 +16,9 @@ - - - + + + diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj index b252f5b97c..c87de05b2a 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj index 65eca4b080..106a568d18 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/test/Directory.Build.props b/test/Directory.Build.props index 231f872916..b9ebade8ca 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -1,13 +1,13 @@ - + - - - - - - - + + + + + + + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index 0440840cbc..567dd35298 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -10,7 +10,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index 34c7b47938..b47b67dbe4 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 8e5a9fd0ba..1bd4953668 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 584b939585..210b31eeb3 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/version.props b/version.props new file mode 100644 index 0000000000..5c4a7c32d1 --- /dev/null +++ b/version.props @@ -0,0 +1,10 @@ + + + 2.1.0 + preview1 + $(VersionPrefix) + $(VersionPrefix)-$(VersionSuffix)-final + t000 + $(VersionSuffix)-$(BuildNumber) + + diff --git a/version.xml b/version.xml deleted file mode 100644 index 3c05022b7d..0000000000 --- a/version.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - dev - 2.1.0 - preview1 - - From e2dcbea4ecd5655392b6cce534eac820c508c699 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 3 Nov 2017 15:52:59 -0700 Subject: [PATCH 770/846] #907 Clarify the encoding requirements for Response.Redirect. (#956) --- src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs index 626139183e..8a1e5d4908 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs @@ -94,13 +94,15 @@ namespace Microsoft.AspNetCore.Http /// /// Returns a temporary redirect response (HTTP 302) to the client. /// - /// The URL to redirect the client to. + /// The URL to redirect the client to. This must be properly encoded for use in http headers + /// where only ASCII characters are allowed. public virtual void Redirect(string location) => Redirect(location, permanent: false); /// /// Returns a redirect response (HTTP 301 or HTTP 302) to the client. /// - /// The URL to redirect the client to. + /// The URL to redirect the client to. This must be properly encoded for use in http headers + /// where only ASCII characters are allowed. /// True if the redirect is permanent (301), otherwise false (302). public abstract void Redirect(string location, bool permanent); } From f287c46bad4fca409f60bc7328159cb8ddc5ad72 Mon Sep 17 00:00:00 2001 From: azechi Date: Tue, 7 Nov 2017 11:38:01 +0900 Subject: [PATCH 771/846] Fix exception message for AuthenticationScheme (#960) --- .../AuthenticationScheme.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs index 7969877550..a72dc893ed 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs @@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Authentication } if (!typeof(IAuthenticationHandler).IsAssignableFrom(handlerType)) { - throw new ArgumentException("handlerType must implement IAuthenticationSchemeHandler."); + throw new ArgumentException("handlerType must implement IAuthenticationHandler."); } Name = name; From 3e3772eecd4cc57399c28a3f899e6b0406ef2e1b Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Nov 2017 20:03:49 -0800 Subject: [PATCH 772/846] Implement read-only HeaderDictionary (#958) --- .../HeaderDictionary.cs | 38 +++++++++++-------- .../HeaderDictionaryTests.cs | 35 +++++++++++++++++ 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index b0224d25ee..841cfa2642 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -58,13 +58,13 @@ namespace Microsoft.AspNetCore.Http } return StringValues.Empty; } - set { if (key == null) { throw new ArgumentNullException(nameof(key)); } + ThrowIfReadOnly(); if (StringValues.IsNullOrEmpty(value)) { @@ -90,7 +90,11 @@ namespace Microsoft.AspNetCore.Http StringValues IDictionary.this[string key] { get { return Store[key]; } - set { this[key] = value; } + set + { + ThrowIfReadOnly(); + this[key] = value; + } } public long? ContentLength @@ -110,6 +114,7 @@ namespace Microsoft.AspNetCore.Http } set { + ThrowIfReadOnly(); if (value.HasValue) { this[HeaderNames.ContentLength] = HeaderUtilities.FormatNonNegativeInt64(value.Value); @@ -125,25 +130,13 @@ namespace Microsoft.AspNetCore.Http /// Gets the number of elements contained in the ;. /// /// The number of elements contained in the . - public int Count - { - get - { - return Store?.Count ?? 0; - } - } + public int Count => Store?.Count ?? 0; /// /// Gets a value that indicates whether the is in read-only mode. /// /// true if the is in read-only mode; otherwise, false. - public bool IsReadOnly - { - get - { - return false; - } - } + public bool IsReadOnly { get; set; } public ICollection Keys { @@ -179,6 +172,7 @@ namespace Microsoft.AspNetCore.Http { throw new ArgumentNullException("The key is null"); } + ThrowIfReadOnly(); if (Store == null) { Store = new Dictionary(1, StringComparer.OrdinalIgnoreCase); @@ -197,6 +191,7 @@ namespace Microsoft.AspNetCore.Http { throw new ArgumentNullException(nameof(key)); } + ThrowIfReadOnly(); if (Store == null) { @@ -210,6 +205,7 @@ namespace Microsoft.AspNetCore.Http /// public void Clear() { + ThrowIfReadOnly(); Store?.Clear(); } @@ -270,6 +266,7 @@ namespace Microsoft.AspNetCore.Http /// true if the specified object was removed from the collection; otherwise, false. public bool Remove(KeyValuePair item) { + ThrowIfReadOnly(); if (Store == null) { return false; @@ -291,6 +288,7 @@ namespace Microsoft.AspNetCore.Http /// true if the specified object was removed from the collection; otherwise, false. public bool Remove(string key) { + ThrowIfReadOnly(); if (Store == null) { return false; @@ -356,6 +354,14 @@ namespace Microsoft.AspNetCore.Http return Store.GetEnumerator(); } + private void ThrowIfReadOnly() + { + if (IsReadOnly) + { + throw new InvalidOperationException("The response headers cannot be modified because the response has already started."); + } + } + public struct Enumerator : IEnumerator> { // Do NOT make this readonly, or MoveNext will not work diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index 46f8a89e06..03d642a018 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -68,5 +68,40 @@ namespace Microsoft.AspNetCore.Http var result = headers.GetCommaSeparatedValues("Header1"); Assert.Equal(new[] { "Value1", "Value2" }, result); } + + [Fact] + public void ReadActionsWorkWhenReadOnly() + { + var headers = new HeaderDictionary( + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Header1", "Value1" } + }); + + headers.IsReadOnly = true; + + Assert.Single(headers); + Assert.Equal(new[] { "Header1" }, headers.Keys); + Assert.True(headers.ContainsKey("header1")); + Assert.False(headers.ContainsKey("header2")); + Assert.Equal("Value1", headers["header1"]); + Assert.Equal(new[] { "Value1" }, headers["header1"].ToArray()); + } + + [Fact] + public void WriteActionsThrowWhenReadOnly() + { + var headers = new HeaderDictionary(); + headers.IsReadOnly = true; + + Assert.Throws(() => headers["header1"] = "value1"); + Assert.Throws(() => ((IDictionary)headers)["header1"] = "value1"); + Assert.Throws(() => headers.ContentLength = 12); + Assert.Throws(() => headers.Add(new KeyValuePair("header1", "value1"))); + Assert.Throws(() => headers.Add("header1", "value1")); + Assert.Throws(() => headers.Clear()); + Assert.Throws(() => headers.Remove(new KeyValuePair("header1", "value1"))); + Assert.Throws(() => headers.Remove("header1")); + } } } \ No newline at end of file From 231f3a44b1ad1605b14b59af21fe149eaf479785 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 13 Nov 2017 15:12:20 -0800 Subject: [PATCH 773/846] Update samples and tests to target netcoreapp2.1 --- Directory.Build.props | 4 ++++ korebuild-lock.txt | 4 ++-- samples/SampleApp/SampleApp.csproj | 2 +- test/Directory.Build.props | 7 +++++++ .../Microsoft.AspNetCore.Authentication.Core.Test.csproj | 3 +-- .../Microsoft.AspNetCore.Http.Abstractions.Tests.csproj | 3 +-- .../Microsoft.AspNetCore.Http.Extensions.Tests.csproj | 3 +-- .../Microsoft.AspNetCore.Http.Features.Tests.csproj | 3 +-- .../Microsoft.AspNetCore.Http.Tests.csproj | 3 +-- .../Microsoft.AspNetCore.Owin.Tests.csproj | 3 +-- .../Microsoft.AspNetCore.WebUtilities.Tests.csproj | 3 +-- .../Microsoft.Net.Http.Headers.Tests.csproj | 3 +-- 12 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 651b7f515d..f05ac88a6a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,4 +1,8 @@  + + diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 45463cc71e..95f4613014 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15549 -commithash:f570e08585fec510dd60cd4bfe8795388b757a95 +version:2.1.0-preview1-15567 +commithash:903e3104807b1bb8cddd28bdef205b1e2dc021d1 diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj index 139ec716fb..0447897f43 100644 --- a/samples/SampleApp/SampleApp.csproj +++ b/samples/SampleApp/SampleApp.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0;net461 + netcoreapp2.1;net461 Exe diff --git a/test/Directory.Build.props b/test/Directory.Build.props index b9ebade8ca..63e288811c 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -1,6 +1,13 @@ + + netcoreapp2.1 + $(DeveloperBuildTestTfms) + netcoreapp2.1;netcoreapp2.0 + $(StandardTestTfms);net461 + + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj index 567dd35298..ed845e613c 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index e47d0f44fb..9666582be1 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj index b47b67dbe4..caadc69657 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj index 363ff65dff..07abe20b5e 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj index 1bd4953668..aa428320cd 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj index 210b31eeb3..6fc9763aa4 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj index eb60215ac4..44d201e5b2 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj index 08c199eaec..d1acc289b4 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj @@ -1,8 +1,7 @@  - netcoreapp2.0;net461 - netcoreapp2.0 + $(StandardTestTfms) From 476333771cb7399af13c1368982e2b8abb4318ac Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 16 Nov 2017 09:17:57 -0800 Subject: [PATCH 774/846] #955 Print available scheme names in exception message for invalid scheme (#961) --- .../AuthenticationService.cs | 126 ++++++++++++++++-- .../AuthenticationServiceTests.cs | 66 ++++++++- 2 files changed, 177 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index 9a8223d013..ea9bb9d135 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; @@ -62,7 +63,7 @@ namespace Microsoft.AspNetCore.Authentication var handler = await Handlers.GetHandlerAsync(context, scheme); if (handler == null) { - throw new InvalidOperationException($"No authentication handler is configured to authenticate for the scheme: {scheme}"); + throw await CreateMissingHandlerException(scheme); } var result = await handler.AuthenticateAsync(); @@ -96,7 +97,7 @@ namespace Microsoft.AspNetCore.Authentication var handler = await Handlers.GetHandlerAsync(context, scheme); if (handler == null) { - throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + throw await CreateMissingHandlerException(scheme); } await handler.ChallengeAsync(properties); @@ -124,7 +125,7 @@ namespace Microsoft.AspNetCore.Authentication var handler = await Handlers.GetHandlerAsync(context, scheme); if (handler == null) { - throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {scheme}"); + throw await CreateMissingHandlerException(scheme); } await handler.ForbidAsync(properties); @@ -155,13 +156,19 @@ namespace Microsoft.AspNetCore.Authentication } } - var handler = await Handlers.GetHandlerAsync(context, scheme) as IAuthenticationSignInHandler; + var handler = await Handlers.GetHandlerAsync(context, scheme); if (handler == null) { - throw new InvalidOperationException($"No IAuthenticationSignInHandler is configured to handle sign in for the scheme: {scheme}"); + throw await CreateMissingSignInHandlerException(scheme); } - await handler.SignInAsync(principal, properties); + var signInHandler = handler as IAuthenticationSignInHandler; + if (signInHandler == null) + { + throw await CreateMismatchedSignInHandlerException(scheme, handler); + } + + await signInHandler.SignInAsync(principal, properties); } /// @@ -183,13 +190,114 @@ namespace Microsoft.AspNetCore.Authentication } } - var handler = await Handlers.GetHandlerAsync(context, scheme) as IAuthenticationSignOutHandler; + var handler = await Handlers.GetHandlerAsync(context, scheme); if (handler == null) { - throw new InvalidOperationException($"No IAuthenticationSignOutHandler is configured to handle sign out for the scheme: {scheme}"); + throw await CreateMissingSignOutHandlerException(scheme); } - await handler.SignOutAsync(properties); + var signOutHandler = handler as IAuthenticationSignOutHandler; + if (signOutHandler == null) + { + throw await CreateMismatchedSignOutHandlerException(scheme, handler); + } + + await signOutHandler.SignOutAsync(properties); + } + + private async Task CreateMissingHandlerException(string scheme) + { + var schemes = string.Join(", ", (await Schemes.GetAllSchemesAsync()).Select(sch => sch.Name)); + + var footer = $" Did you forget to call AddAuthentication().Add[SomeAuthHandler](\"{scheme}\",...)?"; + + if (string.IsNullOrEmpty(schemes)) + { + return new InvalidOperationException( + $"No authentication handlers are registered." + footer); + } + + return new InvalidOperationException( + $"No authentication handler is registered for the scheme '{scheme}'. The registered schemes are: {schemes}." + footer); + } + + private async Task GetAllSignInSchemeNames() + { + return string.Join(", ", (await Schemes.GetAllSchemesAsync()) + .Where(sch => typeof(IAuthenticationSignInHandler).IsAssignableFrom(sch.HandlerType)) + .Select(sch => sch.Name)); + } + + private async Task CreateMissingSignInHandlerException(string scheme) + { + var schemes = await GetAllSignInSchemeNames(); + + // CookieAuth is the only implementation of sign-in. + var footer = $" Did you forget to call AddAuthentication().AddCookies(\"{scheme}\",...)?"; + + if (string.IsNullOrEmpty(schemes)) + { + return new InvalidOperationException( + $"No sign-in authentication handlers are registered." + footer); + } + + return new InvalidOperationException( + $"No sign-in authentication handler is registered for the scheme '{scheme}'. The registered sign-in schemes are: {schemes}." + footer); + } + + private async Task CreateMismatchedSignInHandlerException(string scheme, IAuthenticationHandler handler) + { + var schemes = await GetAllSignInSchemeNames(); + + var mismatchError = $"The authentication handler registered for scheme '{scheme}' is '{handler.GetType().Name}' which cannot be used for SignInAsync. "; + + if (string.IsNullOrEmpty(schemes)) + { + // CookieAuth is the only implementation of sign-in. + return new InvalidOperationException(mismatchError + + $"Did you intended to call AddAuthentication().AddCookies(\"Cookies\") and SignInAsync(\"Cookies\",...)?"); + } + + return new InvalidOperationException(mismatchError + $"The registered sign-in schemes are: {schemes}."); + } + + private async Task GetAllSignOutSchemeNames() + { + return string.Join(", ", (await Schemes.GetAllSchemesAsync()) + .Where(sch => typeof(IAuthenticationSignOutHandler).IsAssignableFrom(sch.HandlerType)) + .Select(sch => sch.Name)); + } + + private async Task CreateMissingSignOutHandlerException(string scheme) + { + var schemes = await GetAllSignOutSchemeNames(); + + var footer = $" Did you forget to call AddAuthentication().AddCookies(\"{scheme}\",...)?"; + + if (string.IsNullOrEmpty(schemes)) + { + // CookieAuth is the most common implementation of sign-out, but OpenIdConnect and WsFederation also support it. + return new InvalidOperationException($"No sign-out authentication handlers are registered." + footer); + } + + return new InvalidOperationException( + $"No sign-out authentication handler is registered for the scheme '{scheme}'. The registered sign-out schemes are: {schemes}." + footer); + } + + private async Task CreateMismatchedSignOutHandlerException(string scheme, IAuthenticationHandler handler) + { + var schemes = await GetAllSignOutSchemeNames(); + + var mismatchError = $"The authentication handler registered for scheme '{scheme}' is '{handler.GetType().Name}' which cannot be used for {nameof(SignOutAsync)}. "; + + if (string.IsNullOrEmpty(schemes)) + { + // CookieAuth is the most common implementation of sign-out, but OpenIdConnect and WsFederation also support it. + return new InvalidOperationException(mismatchError + + $"Did you intended to call AddAuthentication().AddCookies(\"Cookies\") and {nameof(SignOutAsync)}(\"Cookies\",...)?"); + } + + return new InvalidOperationException(mismatchError + $"The registered sign-out schemes are: {schemes}."); } } } diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs index 292c56f50c..e21ea40d51 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs @@ -12,6 +12,51 @@ namespace Microsoft.AspNetCore.Authentication { public class AuthenticationServiceTests { + [Fact] + public async Task AuthenticateThrowsForSchemeMismatch() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("base", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.AuthenticateAsync("base"); + var ex = await Assert.ThrowsAsync(() => context.AuthenticateAsync("missing")); + Assert.Contains("base", ex.Message); + } + + [Fact] + public async Task ChallengeThrowsForSchemeMismatch() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("base", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.ChallengeAsync("base"); + var ex = await Assert.ThrowsAsync(() => context.ChallengeAsync("missing")); + Assert.Contains("base", ex.Message); + } + + [Fact] + public async Task ForbidThrowsForSchemeMismatch() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("base", "whatever"); + }).BuildServiceProvider(); + var context = new DefaultHttpContext(); + context.RequestServices = services; + + await context.ForbidAsync("base"); + var ex = await Assert.ThrowsAsync(() => context.ForbidAsync("missing")); + Assert.Contains("base", ex.Message); + } + [Fact] public async Task CanOnlySignInIfSupported() { @@ -26,9 +71,13 @@ namespace Microsoft.AspNetCore.Authentication context.RequestServices = services; await context.SignInAsync("uber", new ClaimsPrincipal(), null); - await Assert.ThrowsAsync(() => context.SignInAsync("base", new ClaimsPrincipal(), null)); + var ex = await Assert.ThrowsAsync(() => context.SignInAsync("base", new ClaimsPrincipal(), null)); + Assert.Contains("uber", ex.Message); + Assert.Contains("signin", ex.Message); await context.SignInAsync("signin", new ClaimsPrincipal(), null); - await Assert.ThrowsAsync(() => context.SignInAsync("signout", new ClaimsPrincipal(), null)); + ex = await Assert.ThrowsAsync(() => context.SignInAsync("signout", new ClaimsPrincipal(), null)); + Assert.Contains("uber", ex.Message); + Assert.Contains("signin", ex.Message); } [Fact] @@ -45,7 +94,9 @@ namespace Microsoft.AspNetCore.Authentication context.RequestServices = services; await context.SignOutAsync("uber"); - await Assert.ThrowsAsync(() => context.SignOutAsync("base")); + var ex = await Assert.ThrowsAsync(() => context.SignOutAsync("base")); + Assert.Contains("uber", ex.Message); + Assert.Contains("signout", ex.Message); await context.SignOutAsync("signout"); await context.SignOutAsync("signin"); } @@ -64,8 +115,10 @@ namespace Microsoft.AspNetCore.Authentication await context.AuthenticateAsync(); await context.ChallengeAsync(); await context.ForbidAsync(); - await Assert.ThrowsAsync(() => context.SignOutAsync()); - await Assert.ThrowsAsync(() => context.SignInAsync(new ClaimsPrincipal())); + var ex = await Assert.ThrowsAsync(() => context.SignOutAsync()); + Assert.Contains("cannot be used for SignOutAsync", ex.Message); + ex = await Assert.ThrowsAsync(() => context.SignInAsync(new ClaimsPrincipal())); + Assert.Contains("cannot be used for SignInAsync", ex.Message); } [Fact] @@ -119,7 +172,8 @@ namespace Microsoft.AspNetCore.Authentication await context.ChallengeAsync(); await context.ForbidAsync(); await context.SignOutAsync(); - await Assert.ThrowsAsync(() => context.SignInAsync(new ClaimsPrincipal())); + var ex = await Assert.ThrowsAsync(() => context.SignInAsync(new ClaimsPrincipal())); + Assert.Contains("cannot be used for SignInAsync", ex.Message); } [Fact] From 93d96e17b7c9af501b83c28703651c5c333a7189 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 17 Nov 2017 13:00:25 -0800 Subject: [PATCH 775/846] Use MicrosoftNETCoreApp21PackageVersion to determine the runtime framework in netcoreapp2.1 --- Directory.Build.targets | 1 + build/dependencies.props | 1 + 2 files changed, 2 insertions(+) diff --git a/Directory.Build.targets b/Directory.Build.targets index e83ff95e39..894b1d0cf8 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,6 @@  $(MicrosoftNETCoreApp20PackageVersion) + $(MicrosoftNETCoreApp21PackageVersion) diff --git a/build/dependencies.props b/build/dependencies.props index a28bce64f7..cd2fe02336 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -15,6 +15,7 @@ 2.1.0-preview1-27488 2.1.0-preview1-27488 2.0.0 + 2.1.0-preview1-25907-02 15.3.0 4.7.49 4.4.0 From 9f2cb49ac18b8d5a2bf783154374aaa21f11c503 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 20 Nov 2017 12:15:57 -0800 Subject: [PATCH 776/846] Use MSBuild to set NuGet feeds instead of NuGet.config --- Directory.Build.props | 1 + NuGet.config | 4 +--- build/sources.props | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 build/sources.props diff --git a/Directory.Build.props b/Directory.Build.props index f05ac88a6a..e2aa6a105b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -5,6 +5,7 @@ + Microsoft ASP.NET Core diff --git a/NuGet.config b/NuGet.config index 4e8a1f6de1..e32bddfd51 100644 --- a/NuGet.config +++ b/NuGet.config @@ -2,8 +2,6 @@ - - - + diff --git a/build/sources.props b/build/sources.props new file mode 100644 index 0000000000..c03f3ddb60 --- /dev/null +++ b/build/sources.props @@ -0,0 +1,16 @@ + + + + + $(DotNetRestoreSources) + + $(RestoreSources); + https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json; + https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; + + + $(RestoreSources); + https://api.nuget.org/v3/index.json; + + + From 1e0655c52a4d7003d40bb573452fdb9ac304863f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 21 Nov 2017 15:47:52 -0800 Subject: [PATCH 777/846] Replace aspnetcore-ci-dev feed with aspnetcore-dev --- build/dependencies.props | 24 ++++++++++++------------ build/repo.props | 2 +- build/sources.props | 2 +- korebuild-lock.txt | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index cd2fe02336..d0ff2601f9 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,19 +1,19 @@ - + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview1-15549 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 - 2.1.0-preview1-27488 + 2.1.0-preview1-15576 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 + 2.1.0-preview1-27644 2.0.0 2.1.0-preview1-25907-02 15.3.0 diff --git a/build/repo.props b/build/repo.props index b55e651b87..07c5f08325 100644 --- a/build/repo.props +++ b/build/repo.props @@ -2,6 +2,6 @@ Internal.AspNetCore.Universe.Lineup - https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json + https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json diff --git a/build/sources.props b/build/sources.props index c03f3ddb60..9feff29d09 100644 --- a/build/sources.props +++ b/build/sources.props @@ -5,7 +5,7 @@ $(DotNetRestoreSources) $(RestoreSources); - https://dotnet.myget.org/F/aspnetcore-ci-dev/api/v3/index.json; + https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 95f4613014..1a99066b7c 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15567 -commithash:903e3104807b1bb8cddd28bdef205b1e2dc021d1 +version:2.1.0-preview1-15576 +commithash:2f3856d2ba4f659fcb9253215b83946a06794a27 From 24acad7b902d9257e0586684106b322cba50f837 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 29 Nov 2017 14:09:26 -0800 Subject: [PATCH 778/846] Specify runtime versions to install --- build/repo.props | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build/repo.props b/build/repo.props index 07c5f08325..78b0ce5879 100644 --- a/build/repo.props +++ b/build/repo.props @@ -1,7 +1,14 @@  + + Internal.AspNetCore.Universe.Lineup https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json + + + + + From 940c71eaf8f8d82d7cb9e2aa71098ae0b39ff79a Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Thu, 30 Nov 2017 15:51:33 -0600 Subject: [PATCH 779/846] Correct spelling in summary (#975) --- .../IMiddlewareFactory.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs index be5af344f2..5d9fda8a75 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace Microsoft.AspNetCore.Http { /// - /// Provides methods to create middlware. + /// Provides methods to create middleware. /// public interface IMiddlewareFactory { From cb6cf16b7a67465afac8ac3a1333bac51d16f07f Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Fri, 1 Dec 2017 10:23:50 -0800 Subject: [PATCH 780/846] Update bootstrappers --- run.ps1 | 17 +++++++++++------ run.sh | 30 +++++++++++++++++++----------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/run.ps1 b/run.ps1 index 49c2899856..27dcf848f8 100644 --- a/run.ps1 +++ b/run.ps1 @@ -29,6 +29,9 @@ Updates KoreBuild to the latest version even if a lock file is present. .PARAMETER ConfigFile The path to the configuration file that stores values. Defaults to korebuild.json. +.PARAMETER ToolsSourceSuffix +The Suffix to append to the end of the ToolsSource. Useful for query strings in blob stores. + .PARAMETER Arguments Arguments to be passed to the command @@ -51,7 +54,7 @@ Example config file: #> [CmdletBinding(PositionalBinding = $false)] param( - [Parameter(Mandatory=$true, Position = 0)] + [Parameter(Mandatory = $true, Position = 0)] [string]$Command, [string]$Path = $PSScriptRoot, [Alias('c')] @@ -63,6 +66,7 @@ param( [Alias('u')] [switch]$Update, [string]$ConfigFile, + [string]$ToolsSourceSuffix, [Parameter(ValueFromRemainingArguments = $true)] [string[]]$Arguments ) @@ -79,7 +83,7 @@ function Get-KoreBuild { $lockFile = Join-Path $Path 'korebuild-lock.txt' if (!(Test-Path $lockFile) -or $Update) { - Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile + Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile $ToolsSourceSuffix } $version = Get-Content $lockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1 @@ -96,7 +100,7 @@ function Get-KoreBuild { try { $tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip" - Get-RemoteFile $remotePath $tmpfile + Get-RemoteFile $remotePath $tmpfile $ToolsSourceSuffix if (Get-Command -Name 'Expand-Archive' -ErrorAction Ignore) { # Use built-in commands where possible as they are cross-plat compatible Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath @@ -124,7 +128,7 @@ function Join-Paths([string]$path, [string[]]$childPaths) { return $path } -function Get-RemoteFile([string]$RemotePath, [string]$LocalPath) { +function Get-RemoteFile([string]$RemotePath, [string]$LocalPath, [string]$RemoteSuffix) { if ($RemotePath -notlike 'http*') { Copy-Item $RemotePath $LocalPath return @@ -134,7 +138,7 @@ function Get-RemoteFile([string]$RemotePath, [string]$LocalPath) { while ($retries -gt 0) { $retries -= 1 try { - Invoke-WebRequest -UseBasicParsing -Uri $RemotePath -OutFile $LocalPath + Invoke-WebRequest -UseBasicParsing -Uri $($RemotePath + $RemoteSuffix) -OutFile $LocalPath return } catch { @@ -161,7 +165,8 @@ if (Test-Path $ConfigFile) { if (!($Channel) -and (Get-Member -Name 'channel' -InputObject $config)) { [string] $Channel = $config.channel } if (!($ToolsSource) -and (Get-Member -Name 'toolsSource' -InputObject $config)) { [string] $ToolsSource = $config.toolsSource} } - } catch { + } + catch { Write-Warning "$ConfigFile could not be read. Its settings will be ignored." Write-Warning $Error[0] } diff --git a/run.sh b/run.sh index c278423acc..834961fc3a 100755 --- a/run.sh +++ b/run.sh @@ -17,6 +17,7 @@ update=false repo_path="$DIR" channel='' tools_source='' +tools_source_suffix='' # # Functions @@ -29,13 +30,14 @@ __usage() { echo " ... Arguments passed to the command. Variable number of arguments allowed." echo "" echo "Options:" - echo " --verbose Show verbose output." - echo " -c|--channel The channel of KoreBuild to download. Overrides the value from the config file.." - echo " --config-file The path to the configuration file that stores values. Defaults to korebuild.json." - echo " -d|--dotnet-home The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet." - echo " --path The directory to build. Defaults to the directory containing the script." - echo " -s|--tools-source|-ToolsSource The base url where build tools can be downloaded. Overrides the value from the config file." - echo " -u|--update Update to the latest KoreBuild even if the lock file is present." + echo " --verbose Show verbose output." + echo " -c|--channel The channel of KoreBuild to download. Overrides the value from the config file.." + echo " --config-file The path to the configuration file that stores values. Defaults to korebuild.json." + echo " -d|--dotnet-home The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet." + echo " --path The directory to build. Defaults to the directory containing the script." + echo " -s|--tools-source|-ToolsSource The base url where build tools can be downloaded. Overrides the value from the config file." + echo " --tools-source-suffix|-ToolsSourceSuffix The suffix to append to tools-source. Useful for query strings." + echo " -u|--update Update to the latest KoreBuild even if the lock file is present." echo "" echo "Description:" echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be." @@ -50,7 +52,7 @@ get_korebuild() { local version local lock_file="$repo_path/korebuild-lock.txt" if [ ! -f "$lock_file" ] || [ "$update" = true ]; then - __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" + __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" "$tools_source_suffix" fi version="$(grep 'version:*' -m 1 "$lock_file")" if [[ "$version" == '' ]]; then @@ -66,7 +68,7 @@ get_korebuild() { local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip" tmpfile="$(mktemp)" echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}" - if __get_remote_file "$remote_path" "$tmpfile"; then + if __get_remote_file "$remote_path" "$tmpfile" "$tools_source_suffix"; then unzip -q -d "$korebuild_path" "$tmpfile" fi rm "$tmpfile" || true @@ -98,6 +100,7 @@ __machine_has() { __get_remote_file() { local remote_path=$1 local local_path=$2 + local remote_path_suffix=$3 if [[ "$remote_path" != 'http'* ]]; then cp "$remote_path" "$local_path" @@ -106,14 +109,14 @@ __get_remote_file() { local failed=false if __machine_has wget; then - wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true + wget --tries 10 --quiet -O "$local_path" "${remote_path}${remote_path_suffix}" || failed=true else failed=true fi if [ "$failed" = true ] && __machine_has curl; then failed=false - curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true + curl --retry 10 -sSL -f --create-dirs -o "$local_path" "${remote_path}${remote_path_suffix}" || failed=true fi if [ "$failed" = true ]; then @@ -164,6 +167,11 @@ while [[ $# -gt 0 ]]; do tools_source="${1:-}" [ -z "$tools_source" ] && __usage ;; + --tools-source-suffix|-ToolsSourceSuffix) + shift + tools_source_suffix="${1:-}" + [ -z "$tools_source_suffix" ] && __usage + ;; -u|--update|-Update) update=true ;; From 2476c4476218262fed4ab28e0f4cc17885b2df2b Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sun, 10 Dec 2017 12:48:59 -0800 Subject: [PATCH 781/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 34 +++++++++++++++++----------------- korebuild-lock.txt | 4 ++-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index d0ff2601f9..623373c14c 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,26 +3,26 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview1-15576 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 - 2.1.0-preview1-27644 + 2.1.0-preview1-15618 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 + 2.1.0-preview1-27773 2.0.0 - 2.1.0-preview1-25907-02 + 2.1.0-preview1-25915-01 15.3.0 4.7.49 - 4.4.0 - 4.4.0 - 0.7.0 - 2.3.0 - 2.3.0 + 4.5.0-preview1-25914-04 + 4.5.0-preview1-25914-04 + 0.8.0 + 2.3.1 + 2.3.1 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 1a99066b7c..e7cce93009 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15576 -commithash:2f3856d2ba4f659fcb9253215b83946a06794a27 +version:2.1.0-preview1-15618 +commithash:00ce1383114015fe89b221146036e59e6bc11219 From 4fdeeb31311bb8cca8b62ed9ea4407c10b30518c Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Wed, 13 Dec 2017 20:50:13 +0000 Subject: [PATCH 782/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 28 ++++++++++++++-------------- korebuild-lock.txt | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 623373c14c..a01787334a 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview1-15618 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 - 2.1.0-preview1-27773 + 2.1.0-preview1-15626 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 + 2.1.0-preview1-27807 2.0.0 - 2.1.0-preview1-25915-01 + 2.1.0-preview1-26008-01 15.3.0 4.7.49 - 4.5.0-preview1-25914-04 - 4.5.0-preview1-25914-04 + 4.5.0-preview1-26006-06 + 4.5.0-preview1-26006-06 0.8.0 2.3.1 2.3.1 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index e7cce93009..8d52a6128c 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15618 -commithash:00ce1383114015fe89b221146036e59e6bc11219 +version:2.1.0-preview1-15626 +commithash:fd6410e9c90c428bc01238372303ad09cb9ec889 From d104129d5732028848a3d8006489d5df6968ee0f Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Mon, 18 Dec 2017 17:04:45 -0800 Subject: [PATCH 783/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index a01787334a..589d1cee3a 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,22 +4,22 @@ 2.1.0-preview1-15626 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 - 2.1.0-preview1-27807 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 + 2.1.0-preview1-27849 2.0.0 - 2.1.0-preview1-26008-01 + 2.1.0-preview1-26016-05 15.3.0 4.7.49 - 4.5.0-preview1-26006-06 - 4.5.0-preview1-26006-06 + 4.5.0-preview1-26016-05 + 4.5.0-preview1-26016-05 0.8.0 2.3.1 2.3.1 From 150bb3faf413226d053777bbc72618fb284a6970 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Mon, 18 Dec 2017 18:40:11 -0800 Subject: [PATCH 784/846] Add BindingAddress to HttpAbstractions (#977) --- .../Internal/BindingAddress.cs | 155 ++++++++++++++++++ .../Internal/Constants.cs | 1 + .../Internal/BindingAddressTests.cs | 70 ++++++++ 3 files changed, 226 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http/Internal/BindingAddress.cs create mode 100644 test/Microsoft.AspNetCore.Http.Tests/Internal/BindingAddressTests.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/BindingAddress.cs b/src/Microsoft.AspNetCore.Http/Internal/BindingAddress.cs new file mode 100644 index 0000000000..492fa23dbe --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/Internal/BindingAddress.cs @@ -0,0 +1,155 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Globalization; + +namespace Microsoft.AspNetCore.Http.Internal +{ + public class BindingAddress + { + public string Host { get; private set; } + public string PathBase { get; private set; } + public int Port { get; internal set; } + public string Scheme { get; private set; } + + public bool IsUnixPipe + { + get + { + return Host.StartsWith(Constants.UnixPipeHostPrefix, StringComparison.Ordinal); + } + } + + public string UnixPipePath + { + get + { + if (!IsUnixPipe) + { + throw new InvalidOperationException("Binding address is not a unix pipe."); + } + + return Host.Substring(Constants.UnixPipeHostPrefix.Length - 1); + } + } + + public override string ToString() + { + if (IsUnixPipe) + { + return Scheme.ToLowerInvariant() + "://" + Host.ToLowerInvariant(); + } + else + { + return Scheme.ToLowerInvariant() + "://" + Host.ToLowerInvariant() + ":" + Port.ToString(CultureInfo.InvariantCulture) + PathBase.ToString(CultureInfo.InvariantCulture); + } + } + + public override int GetHashCode() + { + return ToString().GetHashCode(); + } + + public override bool Equals(object obj) + { + var other = obj as BindingAddress; + if (other == null) + { + return false; + } + return string.Equals(Scheme, other.Scheme, StringComparison.OrdinalIgnoreCase) + && string.Equals(Host, other.Host, StringComparison.OrdinalIgnoreCase) + && Port == other.Port + && PathBase == other.PathBase; + } + + public static BindingAddress Parse(string address) + { + address = address ?? string.Empty; + + int schemeDelimiterStart = address.IndexOf("://", StringComparison.Ordinal); + if (schemeDelimiterStart < 0) + { + throw new FormatException($"Invalid url: '{address}'"); + } + int schemeDelimiterEnd = schemeDelimiterStart + "://".Length; + + var isUnixPipe = address.IndexOf(Constants.UnixPipeHostPrefix, schemeDelimiterEnd, StringComparison.Ordinal) == schemeDelimiterEnd; + + int pathDelimiterStart; + int pathDelimiterEnd; + if (!isUnixPipe) + { + pathDelimiterStart = address.IndexOf("/", schemeDelimiterEnd, StringComparison.Ordinal); + pathDelimiterEnd = pathDelimiterStart; + } + else + { + pathDelimiterStart = address.IndexOf(":", schemeDelimiterEnd + Constants.UnixPipeHostPrefix.Length, StringComparison.Ordinal); + pathDelimiterEnd = pathDelimiterStart + ":".Length; + } + + if (pathDelimiterStart < 0) + { + pathDelimiterStart = pathDelimiterEnd = address.Length; + } + + var serverAddress = new BindingAddress(); + serverAddress.Scheme = address.Substring(0, schemeDelimiterStart); + + var hasSpecifiedPort = false; + if (!isUnixPipe) + { + int portDelimiterStart = address.LastIndexOf(":", pathDelimiterStart - 1, pathDelimiterStart - schemeDelimiterEnd, StringComparison.Ordinal); + if (portDelimiterStart >= 0) + { + int portDelimiterEnd = portDelimiterStart + ":".Length; + + string portString = address.Substring(portDelimiterEnd, pathDelimiterStart - portDelimiterEnd); + int portNumber; + if (int.TryParse(portString, NumberStyles.Integer, CultureInfo.InvariantCulture, out portNumber)) + { + hasSpecifiedPort = true; + serverAddress.Host = address.Substring(schemeDelimiterEnd, portDelimiterStart - schemeDelimiterEnd); + serverAddress.Port = portNumber; + } + } + + if (!hasSpecifiedPort) + { + if (string.Equals(serverAddress.Scheme, "http", StringComparison.OrdinalIgnoreCase)) + { + serverAddress.Port = 80; + } + else if (string.Equals(serverAddress.Scheme, "https", StringComparison.OrdinalIgnoreCase)) + { + serverAddress.Port = 443; + } + } + } + + if (!hasSpecifiedPort) + { + serverAddress.Host = address.Substring(schemeDelimiterEnd, pathDelimiterStart - schemeDelimiterEnd); + } + + if (string.IsNullOrEmpty(serverAddress.Host)) + { + throw new FormatException($"Invalid url: '{address}'"); + } + + if (address[address.Length - 1] == '/') + { + serverAddress.PathBase = address.Substring(pathDelimiterEnd, address.Length - pathDelimiterEnd - 1); + } + else + { + serverAddress.PathBase = address.Substring(pathDelimiterEnd); + } + + return serverAddress; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http/Internal/Constants.cs b/src/Microsoft.AspNetCore.Http/Internal/Constants.cs index 0d52a692d3..280011b3e0 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/Constants.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/Constants.cs @@ -7,6 +7,7 @@ namespace Microsoft.AspNetCore.Http.Internal { internal const string Http = "http"; internal const string Https = "https"; + internal const string UnixPipeHostPrefix = "unix:/"; internal static class BuilderProperties { diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/BindingAddressTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Internal/BindingAddressTests.cs new file mode 100644 index 0000000000..3bca310e82 --- /dev/null +++ b/test/Microsoft.AspNetCore.Http.Tests/Internal/BindingAddressTests.cs @@ -0,0 +1,70 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +namespace Microsoft.AspNetCore.Http.Internal.Tests +{ + public class BindingAddressTests + { + [Theory] + [InlineData("")] + [InlineData("5000")] + [InlineData("//noscheme")] + public void FromUriThrowsForUrlsWithoutSchemeDelimiter(string url) + { + Assert.Throws(() => BindingAddress.Parse(url)); + } + + [Theory] + [InlineData("://")] + [InlineData("://:5000")] + [InlineData("http://")] + [InlineData("http://:5000")] + [InlineData("http:///")] + [InlineData("http:///:5000")] + [InlineData("http:////")] + [InlineData("http:////:5000")] + public void FromUriThrowsForUrlsWithoutHost(string url) + { + Assert.Throws(() => BindingAddress.Parse(url)); + } + + [Theory] + [InlineData("://emptyscheme", "", "emptyscheme", 0, "", "://emptyscheme:0")] + [InlineData("http://+", "http", "+", 80, "", "http://+:80")] + [InlineData("http://*", "http", "*", 80, "", "http://*:80")] + [InlineData("http://localhost", "http", "localhost", 80, "", "http://localhost:80")] + [InlineData("http://www.example.com", "http", "www.example.com", 80, "", "http://www.example.com:80")] + [InlineData("https://www.example.com", "https", "www.example.com", 443, "", "https://www.example.com:443")] + [InlineData("http://www.example.com/", "http", "www.example.com", 80, "", "http://www.example.com:80")] + [InlineData("http://www.example.com/foo?bar=baz", "http", "www.example.com", 80, "/foo?bar=baz", "http://www.example.com:80/foo?bar=baz")] + [InlineData("http://www.example.com:5000", "http", "www.example.com", 5000, "", null)] + [InlineData("https://www.example.com:5000", "https", "www.example.com", 5000, "", null)] + [InlineData("http://www.example.com:5000/", "http", "www.example.com", 5000, "", "http://www.example.com:5000")] + [InlineData("http://www.example.com:NOTAPORT", "http", "www.example.com:NOTAPORT", 80, "", "http://www.example.com:notaport:80")] + [InlineData("https://www.example.com:NOTAPORT", "https", "www.example.com:NOTAPORT", 443, "", "https://www.example.com:notaport:443")] + [InlineData("http://www.example.com:NOTAPORT/", "http", "www.example.com:NOTAPORT", 80, "", "http://www.example.com:notaport:80")] + [InlineData("http://foo:/tmp/kestrel-test.sock:5000/doesn't/matter", "http", "foo:", 80, "/tmp/kestrel-test.sock:5000/doesn't/matter", "http://foo::80/tmp/kestrel-test.sock:5000/doesn't/matter")] + [InlineData("http://unix:foo/tmp/kestrel-test.sock", "http", "unix:foo", 80, "/tmp/kestrel-test.sock", "http://unix:foo:80/tmp/kestrel-test.sock")] + [InlineData("http://unix:5000/tmp/kestrel-test.sock", "http", "unix", 5000, "/tmp/kestrel-test.sock", "http://unix:5000/tmp/kestrel-test.sock")] + [InlineData("http://unix:/tmp/kestrel-test.sock", "http", "unix:/tmp/kestrel-test.sock", 0, "", null)] + [InlineData("https://unix:/tmp/kestrel-test.sock", "https", "unix:/tmp/kestrel-test.sock", 0, "", null)] + [InlineData("http://unix:/tmp/kestrel-test.sock:", "http", "unix:/tmp/kestrel-test.sock", 0, "", "http://unix:/tmp/kestrel-test.sock")] + [InlineData("http://unix:/tmp/kestrel-test.sock:/", "http", "unix:/tmp/kestrel-test.sock", 0, "", "http://unix:/tmp/kestrel-test.sock")] + [InlineData("http://unix:/tmp/kestrel-test.sock:5000/doesn't/matter", "http", "unix:/tmp/kestrel-test.sock", 0, "5000/doesn't/matter", "http://unix:/tmp/kestrel-test.sock")] + public void UrlsAreParsedCorrectly(string url, string scheme, string host, int port, string pathBase, string toString) + { + var serverAddress = BindingAddress.Parse(url); + + Assert.Equal(scheme, serverAddress.Scheme); + Assert.Equal(host, serverAddress.Host); + Assert.Equal(port, serverAddress.Port); + Assert.Equal(pathBase, serverAddress.PathBase); + + Assert.Equal(toString ?? url, serverAddress.ToString()); + } + } +} From db3c3ba589cc85c354a76423ee6d138272a7c3f8 Mon Sep 17 00:00:00 2001 From: user1336 Date: Thu, 21 Dec 2017 17:50:32 +0100 Subject: [PATCH 785/846] Ensure HeaderDictionary store is initialized consistently (#979) --- .../HeaderDictionary.cs | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 841cfa2642..bc0b7a26ce 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -32,11 +32,19 @@ namespace Microsoft.AspNetCore.Http public HeaderDictionary(int capacity) { - Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); + EnsureStore(capacity); } private Dictionary Store { get; set; } + private void EnsureStore(int capacity) + { + if (Store == null) + { + Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); + } + } + /// /// Get or sets the associated value from the collection as a single string. /// @@ -72,11 +80,7 @@ namespace Microsoft.AspNetCore.Http } else { - if (Store == null) - { - Store = new Dictionary(1, StringComparer.OrdinalIgnoreCase); - } - + EnsureStore(1); Store[key] = value; } } @@ -173,10 +177,7 @@ namespace Microsoft.AspNetCore.Http throw new ArgumentNullException("The key is null"); } ThrowIfReadOnly(); - if (Store == null) - { - Store = new Dictionary(1, StringComparer.OrdinalIgnoreCase); - } + EnsureStore(1); Store.Add(item.Key, item.Value); } @@ -192,11 +193,7 @@ namespace Microsoft.AspNetCore.Http throw new ArgumentNullException(nameof(key)); } ThrowIfReadOnly(); - - if (Store == null) - { - Store = new Dictionary(1); - } + EnsureStore(1); Store.Add(key, value); } From 9aaaefbb1bd096b7ab061a77c659bb697fe4e25c Mon Sep 17 00:00:00 2001 From: lundog Date: Fri, 22 Dec 2017 12:55:06 -0700 Subject: [PATCH 786/846] Initialize RequestCookieCollection case insensitive (#981) * Initialize RequestCookieCollection case insensitive * Call RequestCookieCollection constructor directly --- .../Internal/RequestCookieCollection.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs index ca85fd1d04..4af0a65246 100644 --- a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs @@ -71,7 +71,8 @@ namespace Microsoft.AspNetCore.Http.Internal return Empty; } - var store = new Dictionary(cookies.Count); + var collection = new RequestCookieCollection(cookies.Count); + var store = collection.Store; for (var i = 0; i < cookies.Count; i++) { var cookie = cookies[i]; @@ -80,7 +81,7 @@ namespace Microsoft.AspNetCore.Http.Internal store[name] = value; } - return new RequestCookieCollection(store); + return collection; } return Empty; } From ac702f68189dca89b621dc9f144d03b2677c090e Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Thu, 16 Nov 2017 21:27:05 -0800 Subject: [PATCH 787/846] Add the cookie IsEssential flag and feature --- .../CookieBuilder.cs | 7 ++++ .../CookieOptions.cs | 6 +++ .../ITrackingConsentFeature.cs | 39 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs index 203a7a0402..ce89e5b054 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs @@ -72,6 +72,12 @@ namespace Microsoft.AspNetCore.Http /// public virtual TimeSpan? MaxAge { get; set; } + /// + /// Indicates if this cookie is essential for the application to function correctly. If true then + /// consent policy checks may be bypassed. The default value is false. + /// + public virtual bool IsEssential { get; set; } + /// /// Creates the cookie options from the given . /// @@ -99,6 +105,7 @@ namespace Microsoft.AspNetCore.Http HttpOnly = HttpOnly, MaxAge = MaxAge, Domain = Domain, + IsEssential = IsEssential, Secure = SecurePolicy == CookieSecurePolicy.Always || (SecurePolicy == CookieSecurePolicy.SameAsRequest && context.Request.IsHttps), Expires = Expiration.HasValue ? expiresFrom.Add(Expiration.Value) : default(DateTimeOffset?) }; diff --git a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs index e01a759c8f..27141a32f2 100644 --- a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs @@ -59,5 +59,11 @@ namespace Microsoft.AspNetCore.Http /// /// The max-age date and time for the cookie. public TimeSpan? MaxAge { get; set; } + + /// + /// Indicates if this cookie is essential for the application to function correctly. If true then + /// consent policy checks may be bypassed. The default value is false. + /// + public bool IsEssential { get; set; } } } diff --git a/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs new file mode 100644 index 0000000000..9e5108db43 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs @@ -0,0 +1,39 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Http.Features +{ + /// + /// Used to query, grant, and withdraw user consent regarding the storage of user + /// information related to site activity and functionality. + /// + public interface ITrackingConsentFeature + { + /// + /// Indicates if consent is required for the given request. + /// + bool IsConsentNeeded { get; } + + /// + /// Indicates if consent was given. + /// + bool HasConsent { get; } + + /// + /// Indicates either if consent has been given or if consent is not required. + /// + bool CanTrack { get; } + + /// + /// Grants consent for this request. If the response has not yet started then + /// this will also grant consent for future requests. + /// + void GrantConsent(); + + /// + /// Withdraws consent for this request. If the response has not yet started then + /// this will also withdraw consent for future requests. + /// + void WithdrawConsent(); + } +} From 32bfa03875b9e702ea046a19ac151e804778f208 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 28 Dec 2017 08:35:04 -0800 Subject: [PATCH 788/846] Fix comment and exception typos. (#983) --- .../AuthenticationService.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs index ea9bb9d135..3e46df2f24 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Authentication /// /// The . /// The . - /// The The . + /// The . public AuthenticationService(IAuthenticationSchemeProvider schemes, IAuthenticationHandlerProvider handlers, IClaimsTransformation transform) { Schemes = schemes; @@ -255,7 +255,7 @@ namespace Microsoft.AspNetCore.Authentication { // CookieAuth is the only implementation of sign-in. return new InvalidOperationException(mismatchError - + $"Did you intended to call AddAuthentication().AddCookies(\"Cookies\") and SignInAsync(\"Cookies\",...)?"); + + $"Did you forget to call AddAuthentication().AddCookies(\"Cookies\") and SignInAsync(\"Cookies\",...)?"); } return new InvalidOperationException(mismatchError + $"The registered sign-in schemes are: {schemes}."); @@ -294,7 +294,7 @@ namespace Microsoft.AspNetCore.Authentication { // CookieAuth is the most common implementation of sign-out, but OpenIdConnect and WsFederation also support it. return new InvalidOperationException(mismatchError - + $"Did you intended to call AddAuthentication().AddCookies(\"Cookies\") and {nameof(SignOutAsync)}(\"Cookies\",...)?"); + + $"Did you forget to call AddAuthentication().AddCookies(\"Cookies\") and {nameof(SignOutAsync)}(\"Cookies\",...)?"); } return new InvalidOperationException(mismatchError + $"The registered sign-out schemes are: {schemes}."); From b2a87f1b1aa6b52f511c6f8df552b9494f06ea19 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sun, 31 Dec 2017 21:06:12 +0000 Subject: [PATCH 789/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 22 +++++++++++----------- korebuild-lock.txt | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 589d1cee3a..4ca7eca9a9 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,17 +3,17 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview1-15626 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 - 2.1.0-preview1-27849 + 2.1.0-preview1-15651 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 + 2.1.0-preview1-27942 2.0.0 2.1.0-preview1-26016-05 15.3.0 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 8d52a6128c..7c2e97aa79 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15626 -commithash:fd6410e9c90c428bc01238372303ad09cb9ec889 +version:2.1.0-preview1-15651 +commithash:ebf2365121c2c6a6a0fbfa9b0f37bb5effc89323 From 63c2f43ce563ff1d76b416a73ce0db766c8393fb Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Tue, 2 Jan 2018 09:38:51 -0800 Subject: [PATCH 790/846] AuthenticationProperties code cleanup --- .../AuthenticationProperties.cs | 180 +++++++----------- 1 file changed, 66 insertions(+), 114 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs index 609b6fad58..9d1e670ea8 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs @@ -46,24 +46,8 @@ namespace Microsoft.AspNetCore.Authentication /// public bool IsPersistent { - get { return Items.ContainsKey(IsPersistentKey); } - set - { - if (Items.ContainsKey(IsPersistentKey)) - { - if (!value) - { - Items.Remove(IsPersistentKey); - } - } - else - { - if (value) - { - Items.Add(IsPersistentKey, string.Empty); - } - } - } + get => GetString(IsPersistentKey) != null; + set => SetString(IsPersistentKey, value ? string.Empty : null); } /// @@ -71,25 +55,8 @@ namespace Microsoft.AspNetCore.Authentication /// public string RedirectUri { - get - { - string value; - return Items.TryGetValue(RedirectUriKey, out value) ? value : null; - } - set - { - if (value != null) - { - Items[RedirectUriKey] = value; - } - else - { - if (Items.ContainsKey(RedirectUriKey)) - { - Items.Remove(RedirectUriKey); - } - } - } + get => GetString(RedirectUriKey); + set => SetString(RedirectUriKey, value); } /// @@ -97,33 +64,8 @@ namespace Microsoft.AspNetCore.Authentication /// public DateTimeOffset? IssuedUtc { - get - { - string value; - if (Items.TryGetValue(IssuedUtcKey, out value)) - { - DateTimeOffset dateTimeOffset; - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) - { - return dateTimeOffset; - } - } - return null; - } - set - { - if (value.HasValue) - { - Items[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); - } - else - { - if (Items.ContainsKey(IssuedUtcKey)) - { - Items.Remove(IssuedUtcKey); - } - } - } + get => GetDateTimeOffset(IssuedUtcKey); + set => SetDateTimeOffset(IssuedUtcKey, value); } /// @@ -131,33 +73,8 @@ namespace Microsoft.AspNetCore.Authentication /// public DateTimeOffset? ExpiresUtc { - get - { - string value; - if (Items.TryGetValue(ExpiresUtcKey, out value)) - { - DateTimeOffset dateTimeOffset; - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) - { - return dateTimeOffset; - } - } - return null; - } - set - { - if (value.HasValue) - { - Items[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); - } - else - { - if (Items.ContainsKey(ExpiresUtcKey)) - { - Items.Remove(ExpiresUtcKey); - } - } - } + get => GetDateTimeOffset(ExpiresUtcKey); + set => SetDateTimeOffset(ExpiresUtcKey, value); } /// @@ -165,32 +82,67 @@ namespace Microsoft.AspNetCore.Authentication /// public bool? AllowRefresh { - get + get => GetBool(RefreshKey); + set => SetBool(RefreshKey, value); + } + + private string GetString(string key) + { + return Items.TryGetValue(key, out string value) ? value : null; + } + + private void SetString(string key, string value) + { + if (value != null) { - string value; - if (Items.TryGetValue(RefreshKey, out value)) - { - bool refresh; - if (bool.TryParse(value, out refresh)) - { - return refresh; - } - } - return null; + Items[key] = value; } - set + else if (Items.ContainsKey(key)) { - if (value.HasValue) - { - Items[RefreshKey] = value.Value.ToString(); - } - else - { - if (Items.ContainsKey(RefreshKey)) - { - Items.Remove(RefreshKey); - } - } + Items.Remove(key); + } + } + + private bool? GetBool(string key) + { + if (Items.TryGetValue(key, out string value) && bool.TryParse(value, out bool refresh)) + { + return refresh; + } + return null; + } + + private void SetBool(string key, bool? value) + { + if (value.HasValue) + { + Items[key] = value.Value.ToString(); + } + else if (Items.ContainsKey(key)) + { + Items.Remove(key); + } + } + + private DateTimeOffset? GetDateTimeOffset(string key) + { + if (Items.TryGetValue(key, out string value) + && DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out DateTimeOffset dateTimeOffset)) + { + return dateTimeOffset; + } + return null; + } + + private void SetDateTimeOffset(string key, DateTimeOffset? value) + { + if (value.HasValue) + { + Items[key] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + } + else if (Items.ContainsKey(key)) + { + Items.Remove(key); } } } From 524a0227e5b7945b9520855d37881dabf7e5da32 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 2 Jan 2018 13:55:20 -0800 Subject: [PATCH 791/846] Create ISSUE_TEMPLATE.md --- .github/ISSUE_TEMPLATE.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..101a084f0a --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,3 @@ +THIS ISSUE TRACKER IS CLOSED - please log new issues here: https://github.com/aspnet/Home/issues + +For information about this change, see https://github.com/aspnet/Announcements/issues/283 From 2803541f53223f0c6c8ec743ae1291968fbb2125 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Thu, 4 Jan 2018 01:12:47 +0000 Subject: [PATCH 792/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 4ca7eca9a9..ea0e140f7b 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,16 +4,16 @@ 2.1.0-preview1-15651 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 - 2.1.0-preview1-27942 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 + 2.1.0-preview1-27965 2.0.0 2.1.0-preview1-26016-05 15.3.0 From ce6934126513f1da9e46b8d695fedb2ddf261ae1 Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Fri, 5 Jan 2018 12:04:50 -0800 Subject: [PATCH 793/846] Add ITrackingConsentFeature.CreateConsentCookie --- .../ITrackingConsentFeature.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs index 9e5108db43..e7fbeaeaf3 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs @@ -35,5 +35,10 @@ namespace Microsoft.AspNetCore.Http.Features /// this will also withdraw consent for future requests. /// void WithdrawConsent(); + + /// + /// Creates a consent cookie for use when granting consent from a javascript client. + /// + string CreateConsentCookie(); } } From 6558c2bd07dc3e40c477a33ee0ec4663a8ff81a7 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sat, 6 Jan 2018 14:44:37 -0800 Subject: [PATCH 794/846] Update dependencies.props [auto-updated: dependencies] --- korebuild-lock.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 7c2e97aa79..2146d006d7 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15651 -commithash:ebf2365121c2c6a6a0fbfa9b0f37bb5effc89323 +version:2.1.0-preview1-15661 +commithash:c9349d4c8a495d3085d9b879214d80f2f45e2193 From 345c4254d3f632b935ab3394f6cb09587c20af19 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 23 Jan 2018 15:31:13 -0800 Subject: [PATCH 795/846] Branching for 2.1.0-preview1 --- build/dependencies.props | 28 ++++++++++++++-------------- build/repo.props | 4 ++-- build/sources.props | 4 ++-- korebuild-lock.txt | 4 ++-- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index ea0e140f7b..6e417cff21 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview1-15651 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 + 2.1.0-preview1-15679 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 + 2.1.0-preview1-28153 2.0.0 - 2.1.0-preview1-26016-05 + 2.1.0-preview1-26115-03 15.3.0 4.7.49 - 4.5.0-preview1-26016-05 - 4.5.0-preview1-26016-05 + 4.5.0-preview1-26112-01 + 4.5.0-preview1-26112-01 0.8.0 2.3.1 2.3.1 diff --git a/build/repo.props b/build/repo.props index 78b0ce5879..d94ff7d00d 100644 --- a/build/repo.props +++ b/build/repo.props @@ -1,10 +1,10 @@ - + Internal.AspNetCore.Universe.Lineup - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json + https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json diff --git a/build/sources.props b/build/sources.props index 9feff29d09..5d66393335 100644 --- a/build/sources.props +++ b/build/sources.props @@ -1,11 +1,11 @@ - + $(DotNetRestoreSources) $(RestoreSources); - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; + https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json; https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 2146d006d7..a474bc0e35 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15661 -commithash:c9349d4c8a495d3085d9b879214d80f2f45e2193 +version:2.1.0-preview1-15679 +commithash:5347461137cb45a77ddcc0b55b2478092de43338 From 2f109938d2cfba7a7498b2c792a33c975302b003 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 24 Jan 2018 15:00:27 -0800 Subject: [PATCH 796/846] Updating version to preview2 --- version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.props b/version.props index 5c4a7c32d1..370d5ababd 100644 --- a/version.props +++ b/version.props @@ -1,7 +1,7 @@ 2.1.0 - preview1 + preview2 $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final t000 From 44d5bf074fd72886f2a6880b8cf27ff8826399cf Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 25 Jan 2018 13:51:54 -0800 Subject: [PATCH 797/846] Change MiddlewareFactory to type activate IMiddleware as a fallback (#988) - This eases the transition and learning when you discover there's an interface for middleware. --- .../MiddlewareFactory.cs | 2 +- .../UseMiddlewareTest.cs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs index 5e5cd285f4..49f120160c 100644 --- a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs +++ b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Http public IMiddleware Create(Type middlewareType) { - return _serviceProvider.GetRequiredService(middlewareType) as IMiddleware; + return ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider, middlewareType) as IMiddleware; } public void Release(IMiddleware middleware) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index 342aa54a06..b40e1a3f08 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -232,6 +232,23 @@ namespace Microsoft.AspNetCore.Http Assert.Same(middlewareFactory.Created, middlewareFactory.Released); } + [Fact] + public async Task UseMiddlewareWithIMiddlewareAndMiddlewareFactoryTypeActivates() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(Middleware)); + var app = builder.Build(); + var context = new DefaultHttpContext(); + var sp = new DummyServiceProvider(); + var middlewareFactory = new MiddlewareFactory(sp); + sp.AddService(typeof(IMiddlewareFactory), middlewareFactory); + context.RequestServices = sp; + await app(context); + Assert.True(Assert.IsType(context.Items["before"])); + Assert.True(Assert.IsType(context.Items["after"])); + } + public class Middleware : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) From 2326783a04d4532fce57a5799957a6c5e86291f1 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Thu, 25 Jan 2018 10:05:36 -0800 Subject: [PATCH 798/846] Have definitive values for TheoryData --- .../HeaderUtilitiesTest.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs index b72796d618..848190b02e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs @@ -29,31 +29,31 @@ namespace Microsoft.Net.Http.Headers { var data = new TheoryData(); - var now = DateTimeOffset.Now; + var date = new DateTimeOffset(new DateTime(2018, 1, 1, 1, 1, 1)); foreach (var quoted in new[] { true, false }) { - data.Add(now, quoted); + data.Add(date, quoted); for (var i = 1; i < 60; i++) { - data.Add(now.AddSeconds(i), quoted); - data.Add(now.AddMinutes(i), quoted); + data.Add(date.AddSeconds(i), quoted); + data.Add(date.AddMinutes(i), quoted); } - for (var i = 1; i < DateTime.DaysInMonth(now.Year, now.Month); i++) + for (var i = 1; i < DateTime.DaysInMonth(date.Year, date.Month); i++) { - data.Add(now.AddDays(i), quoted); + data.Add(date.AddDays(i), quoted); } for (var i = 1; i < 11; i++) { - data.Add(now.AddMonths(i), quoted); + data.Add(date.AddMonths(i), quoted); } for (var i = 1; i < 5; i++) { - data.Add(now.AddYears(i), quoted); + data.Add(date.AddYears(i), quoted); } } From 9f64c69a2a1005aed3b044209bbb228210d9a510 Mon Sep 17 00:00:00 2001 From: Michael Hawkins Date: Sun, 28 Jan 2018 22:27:47 +0000 Subject: [PATCH 799/846] Disambiguates IFormFile name docs (#935) --- src/Microsoft.AspNetCore.Http.Features/IFormFile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Http.Features/IFormFile.cs b/src/Microsoft.AspNetCore.Http.Features/IFormFile.cs index 7cb569d79f..f52e71bfee 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IFormFile.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IFormFile.cs @@ -33,7 +33,7 @@ namespace Microsoft.AspNetCore.Http long Length { get; } /// - /// Gets the name from the Content-Disposition header. + /// Gets the form field name from the Content-Disposition header. /// string Name { get; } From 6cd313fcfaa81448fff2b65e74c9aa765dbdcff8 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 30 Jan 2018 10:28:52 -0800 Subject: [PATCH 800/846] Revert "Change MiddlewareFactory to type activate IMiddleware as a fallback (#988)" (#991) This reverts commit 44d5bf074fd72886f2a6880b8cf27ff8826399cf. --- .../MiddlewareFactory.cs | 2 +- .../UseMiddlewareTest.cs | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs index 49f120160c..5e5cd285f4 100644 --- a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs +++ b/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Http public IMiddleware Create(Type middlewareType) { - return ActivatorUtilities.GetServiceOrCreateInstance(_serviceProvider, middlewareType) as IMiddleware; + return _serviceProvider.GetRequiredService(middlewareType) as IMiddleware; } public void Release(IMiddleware middleware) diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index b40e1a3f08..342aa54a06 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -232,23 +232,6 @@ namespace Microsoft.AspNetCore.Http Assert.Same(middlewareFactory.Created, middlewareFactory.Released); } - [Fact] - public async Task UseMiddlewareWithIMiddlewareAndMiddlewareFactoryTypeActivates() - { - var mockServiceProvider = new DummyServiceProvider(); - var builder = new ApplicationBuilder(mockServiceProvider); - builder.UseMiddleware(typeof(Middleware)); - var app = builder.Build(); - var context = new DefaultHttpContext(); - var sp = new DummyServiceProvider(); - var middlewareFactory = new MiddlewareFactory(sp); - sp.AddService(typeof(IMiddlewareFactory), middlewareFactory); - context.RequestServices = sp; - await app(context); - Assert.True(Assert.IsType(context.Items["before"])); - Assert.True(Assert.IsType(context.Items["after"])); - } - public class Middleware : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) From e8d69911fdc568d241f86f76b0cfac76de33a86d Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Wed, 31 Jan 2018 11:55:43 -0800 Subject: [PATCH 801/846] Adding Http2 headers to HeaderNames class (#992) --- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index b38bff58a2..fe79d242e8 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -20,6 +20,7 @@ namespace Microsoft.Net.Http.Headers public const string AccessControlRequestMethod = "Access-Control-Request-Method"; public const string Age = "Age"; public const string Allow = "Allow"; + public const string Authority = ":authority"; public const string Authorization = "Authorization"; public const string CacheControl = "Cache-Control"; public const string Connection = "Connection"; @@ -48,15 +49,19 @@ namespace Microsoft.Net.Http.Headers public const string LastModified = "Last-Modified"; public const string Location = "Location"; public const string MaxForwards = "Max-Forwards"; + public const string Method = ":method"; public const string Origin = "Origin"; + public const string Path = ":path"; public const string Pragma = "Pragma"; public const string ProxyAuthenticate = "Proxy-Authenticate"; public const string ProxyAuthorization = "Proxy-Authorization"; public const string Range = "Range"; public const string Referer = "Referer"; public const string RetryAfter = "Retry-After"; + public const string Scheme = ":scheme"; public const string Server = "Server"; public const string SetCookie = "Set-Cookie"; + public const string Status = ":status"; public const string StrictTransportSecurity = "Strict-Transport-Security"; public const string TE = "TE"; public const string Trailer = "Trailer"; From 3e99312192b9444d16dff4d98885cfa4c8953be6 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 31 Jan 2018 15:01:11 -0800 Subject: [PATCH 802/846] Update dependencies.props to 2.1.0-preview-28193, build tools to 2.1.0-preview1-1010 [ci skip] Scripted changes: - updated travis and appveyor.yml files to only build dev, ci, and release branches - updated dependencies.props - updated korebuild-lock.txt - updated korebuild.json to release/2.1 channel --- .appveyor.yml | 15 +++++++-------- .travis.yml | 23 ++++++++++++----------- build/dependencies.props | 28 ++++++++++++++-------------- korebuild-lock.txt | 4 ++-- korebuild.json | 4 ++-- 5 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 46038786c9..4eea96ab69 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,18 +1,17 @@ init: - - git config --global core.autocrlf true +- git config --global core.autocrlf true branches: only: - - master - - release - - dev - - /^(.*\/)?ci-.*$/ + - dev + - /^release\/.*$/ + - /^(.*\/)?ci-.*$/ build_script: - - ps: .\run.ps1 default-build +- ps: .\run.ps1 default-build clone_depth: 1 environment: global: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true DOTNET_CLI_TELEMETRY_OPTOUT: 1 -test: off -deploy: off +test: 'off' +deploy: 'off' os: Visual Studio 2017 diff --git a/.travis.yml b/.travis.yml index b10be14215..64bdbb4441 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,24 +3,25 @@ sudo: false dist: trusty env: global: - - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - - DOTNET_CLI_TELEMETRY_OPTOUT: 1 + - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + - DOTNET_CLI_TELEMETRY_OPTOUT: 1 mono: none os: - - linux - - osx +- linux +- osx osx_image: xcode8.2 addons: apt: packages: - - libunwind8 + - libunwind8 branches: only: - - master - - release - - dev - - /^(.*\/)?ci-.*$/ + - dev + - /^release\/.*$/ + - /^(.*\/)?ci-.*$/ before_install: - - if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/; fi +- if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; ln -s + /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib + /usr/local/lib/; fi script: - - ./build.sh +- ./build.sh diff --git a/build/dependencies.props b/build/dependencies.props index 6e417cff21..7e7292e9a6 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview1-15679 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 - 2.1.0-preview1-28153 + 2.1.0-preview1-1010 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 + 2.1.0-preview1-28193 2.0.0 - 2.1.0-preview1-26115-03 + 2.1.0-preview1-26122-01 15.3.0 4.7.49 - 4.5.0-preview1-26112-01 - 4.5.0-preview1-26112-01 + 4.5.0-preview1-26119-06 + 4.5.0-preview1-26119-06 0.8.0 2.3.1 2.3.1 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index a474bc0e35..851bfbf203 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15679 -commithash:5347461137cb45a77ddcc0b55b2478092de43338 +version:2.1.0-preview1-1010 +commithash:75ca924dfbd673c38841025b04c4dcd93b84f56d diff --git a/korebuild.json b/korebuild.json index bd5d51a51b..678d8bb948 100644 --- a/korebuild.json +++ b/korebuild.json @@ -1,4 +1,4 @@ { - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", - "channel": "dev" + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/release/2.1/tools/korebuild.schema.json", + "channel": "release/2.1" } From fd385a3c54326a72090b8f1898ee635f5d80c1ca Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Thu, 1 Feb 2018 03:30:18 +0000 Subject: [PATCH 803/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 28 ++++++++++++++-------------- korebuild-lock.txt | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index ea0e140f7b..08c2620135 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview1-15651 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 - 2.1.0-preview1-27965 + 2.1.0-preview2-15692 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 + 2.1.0-preview2-28215 2.0.0 - 2.1.0-preview1-26016-05 + 2.1.0-preview2-26130-04 15.3.0 4.7.49 - 4.5.0-preview1-26016-05 - 4.5.0-preview1-26016-05 + 4.5.0-preview2-26130-01 + 4.5.0-preview2-26130-01 0.8.0 2.3.1 2.3.1 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 2146d006d7..232cb858c2 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview1-15661 -commithash:c9349d4c8a495d3085d9b879214d80f2f45e2193 +version:2.1.0-preview2-15692 +commithash:5d9f445ce3f8492451a6f461df7e739bbed6a7f8 From 9119433ab778d7adf04c4601917809f2f4582a93 Mon Sep 17 00:00:00 2001 From: Hossam Barakat Date: Fri, 2 Feb 2018 01:22:08 +1100 Subject: [PATCH 804/846] Add the middleware name to the exception message UseMiddlewareNoInvokeMethod (#993) Addresses #927 Addresses aspnet/Home#2692 --- .../Extensions/UseMiddlewareExtensions.cs | 2 +- .../Properties/Resources.Designer.cs | 8 ++++---- src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx | 2 +- .../UseMiddlewareTest.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 88a79d7daa..c07fe1e9f1 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -71,7 +71,7 @@ namespace Microsoft.AspNetCore.Builder if (invokeMethods.Length == 0) { - throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName, InvokeAsyncMethodName)); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName, InvokeAsyncMethodName, middleware)); } var methodinfo = invokeMethods[0]; diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs index 0db61768ee..6af7d138be 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Http.Abstractions => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"), p0); /// - /// No public '{0}' or '{1}' method found. + /// No public '{0}' or '{1}' method found for middleware of type '{2}'. /// internal static string Exception_UseMiddlewareNoInvokeMethod { @@ -33,10 +33,10 @@ namespace Microsoft.AspNetCore.Http.Abstractions } /// - /// No public '{0}' or '{1}' method found. + /// No public '{0}' or '{1}' method found for middleware of type '{2}'. /// - internal static string FormatException_UseMiddlewareNoInvokeMethod(object p0, object p1) - => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0, p1); + internal static string FormatException_UseMiddlewareNoInvokeMethod(object p0, object p1, object p2) + => string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0, p1, p2); /// /// '{0}' or '{1}' does not return an object of type '{2}'. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx index 176d3a80c6..dfdfeaf7d1 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx @@ -121,7 +121,7 @@ '{0}' is not available. - No public '{0}' or '{1}' method found. + No public '{0}' or '{1}' method found for middleware of type '{2}'. '{0}' or '{1}' does not return an object of type '{2}'. diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index 342aa54a06..07c1aa4e8d 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -83,7 +83,7 @@ namespace Microsoft.AspNetCore.Http Assert.Equal( Resources.FormatException_UseMiddlewareNoInvokeMethod( UseMiddlewareExtensions.InvokeMethodName, - UseMiddlewareExtensions.InvokeAsyncMethodName), + UseMiddlewareExtensions.InvokeAsyncMethodName, typeof(MiddlewareNoInvokeStub)), exception.Message); } From 51a7e83a23acb61fd63d7859ac6f206d13ef6d4f Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sat, 3 Feb 2018 02:46:21 +0000 Subject: [PATCH 805/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 22 +++++++++++----------- korebuild-lock.txt | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 08c2620135..877e91f843 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,17 +3,17 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15692 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 - 2.1.0-preview2-28215 + 2.1.0-preview2-15694 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 + 2.1.0-preview2-30020 2.0.0 2.1.0-preview2-26130-04 15.3.0 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 232cb858c2..6f294ef0e6 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15692 -commithash:5d9f445ce3f8492451a6f461df7e739bbed6a7f8 +version:2.1.0-preview2-15694 +commithash:f61af02b48e89592c9aadb7ebaebe84228666c3b From 450900d14cb9c49a00be04e157fd2f0e7888e304 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Mon, 5 Feb 2018 22:43:55 +0100 Subject: [PATCH 806/846] Added protected ctor to AuthenticationSchemeProvider (#990) --- .../AuthenticationSchemeProvider.cs | 39 +++++++++++------ .../AuthenticationSchemeProviderTests.cs | 43 +++++++++++++++++++ 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs index f5ec8e1598..050118d3c4 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs +++ b/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs @@ -15,13 +15,28 @@ namespace Microsoft.AspNetCore.Authentication public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider { /// - /// Constructor. + /// Creates an instance of + /// using the specified , /// /// The options. public AuthenticationSchemeProvider(IOptions options) + : this(options, new Dictionary(StringComparer.Ordinal)) + { + } + + /// + /// Creates an instance of + /// using the specified and . + /// + /// The options. + /// The dictionary used to store authentication schemes. + protected AuthenticationSchemeProvider(IOptions options, IDictionary schemes) { _options = options.Value; + _schemes = schemes ?? throw new ArgumentNullException(nameof(schemes)); + _requestHandlers = new List(); + foreach (var builder in _options.Schemes) { var scheme = builder.Build(); @@ -32,8 +47,8 @@ namespace Microsoft.AspNetCore.Authentication private readonly AuthenticationOptions _options; private readonly object _lock = new object(); - private IDictionary _map = new Dictionary(StringComparer.Ordinal); - private List _requestHandlers = new List(); + private readonly IDictionary _schemes; + private readonly List _requestHandlers; private Task GetDefaultSchemeAsync() => _options.DefaultScheme != null @@ -101,7 +116,7 @@ namespace Microsoft.AspNetCore.Authentication /// The name of the authenticationScheme. /// The scheme or null if not found. public virtual Task GetSchemeAsync(string name) - => Task.FromResult(_map.ContainsKey(name) ? _map[name] : null); + => Task.FromResult(_schemes.ContainsKey(name) ? _schemes[name] : null); /// /// Returns the schemes in priority order for request handling. @@ -116,13 +131,13 @@ namespace Microsoft.AspNetCore.Authentication /// The scheme. public virtual void AddScheme(AuthenticationScheme scheme) { - if (_map.ContainsKey(scheme.Name)) + if (_schemes.ContainsKey(scheme.Name)) { throw new InvalidOperationException("Scheme already exists: " + scheme.Name); } lock (_lock) { - if (_map.ContainsKey(scheme.Name)) + if (_schemes.ContainsKey(scheme.Name)) { throw new InvalidOperationException("Scheme already exists: " + scheme.Name); } @@ -130,7 +145,7 @@ namespace Microsoft.AspNetCore.Authentication { _requestHandlers.Add(scheme); } - _map[scheme.Name] = scheme; + _schemes[scheme.Name] = scheme; } } @@ -140,22 +155,22 @@ namespace Microsoft.AspNetCore.Authentication /// The name of the authenticationScheme being removed. public virtual void RemoveScheme(string name) { - if (!_map.ContainsKey(name)) + if (!_schemes.ContainsKey(name)) { return; } lock (_lock) { - if (_map.ContainsKey(name)) + if (_schemes.ContainsKey(name)) { - var scheme = _map[name]; + var scheme = _schemes[name]; _requestHandlers.Remove(scheme); - _map.Remove(name); + _schemes.Remove(name); } } } public virtual Task> GetAllSchemesAsync() - => Task.FromResult>(_map.Values); + => Task.FromResult>(_schemes.Values); } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs index 4fa0ea8782..82602000aa 100644 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs @@ -3,10 +3,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Xunit; namespace Microsoft.AspNetCore.Authentication @@ -117,6 +119,39 @@ namespace Microsoft.AspNetCore.Authentication Assert.NotNull(await provider.GetDefaultSignOutSchemeAsync()); } + [Fact] + public void SchemeRegistrationIsCaseSensitive() + { + var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o => + { + o.AddScheme("signin", "whatever"); + o.AddScheme("signin", "whatever"); + }).BuildServiceProvider(); + + var error = Assert.Throws(() => services.GetRequiredService()); + + Assert.Contains("Scheme already exists: signin", error.Message); + } + + [Fact] + public async Task LookupUsesProvidedStringComparer() + { + var services = new ServiceCollection().AddOptions() + .AddSingleton() + .AddAuthenticationCore(o => o.AddScheme("signin", "whatever")) + .BuildServiceProvider(); + + var provider = services.GetRequiredService(); + + var a = await provider.GetSchemeAsync("signin"); + var b = await provider.GetSchemeAsync("SignIn"); + var c = await provider.GetSchemeAsync("SIGNIN"); + + Assert.NotNull(a); + Assert.Same(a, b); + Assert.Same(b, c); + } + private class Handler : IAuthenticationHandler { public Task AuthenticateAsync() @@ -160,5 +195,13 @@ namespace Microsoft.AspNetCore.Authentication throw new NotImplementedException(); } } + + private class IgnoreCaseSchemeProvider : AuthenticationSchemeProvider + { + public IgnoreCaseSchemeProvider(IOptions options) + : base(options, new Dictionary(StringComparer.OrdinalIgnoreCase)) + { + } + } } } From 672a5f3c76156a3da171fbec437cfc88c2a28423 Mon Sep 17 00:00:00 2001 From: Robert Miles Date: Mon, 5 Feb 2018 23:25:53 -0500 Subject: [PATCH 807/846] Allow null value in query string KVP per RFC 3986 (#994) * Allow null value in query string KVP per RFC 3986 * Tweaks per PR suggestions * Tweaks per PR suggestions, round 2 * Tweaks per PR suggestions, round 3 --- .../QueryString.cs | 49 +++++++++++-------- .../QueryStringTests.cs | 28 ++++++++++- 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs index cc779ab1b9..772df8dfd9 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs @@ -121,12 +121,12 @@ namespace Microsoft.AspNetCore.Http { throw new ArgumentNullException(nameof(name)); } - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - return new QueryString($"?{UrlEncoder.Default.Encode(name)}={UrlEncoder.Default.Encode(value)}"); + if (!string.IsNullOrEmpty(value)) + { + value = UrlEncoder.Default.Encode(value); + } + return new QueryString($"?{UrlEncoder.Default.Encode(name)}={value}"); } /// @@ -140,11 +140,8 @@ namespace Microsoft.AspNetCore.Http bool first = true; foreach (var pair in parameters) { - builder.Append(first ? "?" : "&"); + AppendKeyValuePair(builder, pair.Key, pair.Value, first); first = false; - builder.Append(UrlEncoder.Default.Encode(pair.Key)); - builder.Append("="); - builder.Append(UrlEncoder.Default.Encode(pair.Value)); } return new QueryString(builder.ToString()); @@ -159,15 +156,21 @@ namespace Microsoft.AspNetCore.Http { var builder = new StringBuilder(); bool first = true; + foreach (var pair in parameters) { + // If nothing in this pair.Values, append null value and continue + if (StringValues.IsNullOrEmpty(pair.Value)) + { + AppendKeyValuePair(builder, pair.Key, null, first); + first = false; + continue; + } + // Otherwise, loop through values in pair.Value foreach (var value in pair.Value) { - builder.Append(first ? "?" : "&"); + AppendKeyValuePair(builder, pair.Key, value, first); first = false; - builder.Append(UrlEncoder.Default.Encode(pair.Key)); - builder.Append("="); - builder.Append(UrlEncoder.Default.Encode(value)); } } @@ -195,10 +198,6 @@ namespace Microsoft.AspNetCore.Http { throw new ArgumentNullException(nameof(name)); } - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) { @@ -206,10 +205,7 @@ namespace Microsoft.AspNetCore.Http } var builder = new StringBuilder(Value); - builder.Append("&"); - builder.Append(UrlEncoder.Default.Encode(name)); - builder.Append("="); - builder.Append(UrlEncoder.Default.Encode(value)); + AppendKeyValuePair(builder, name, value, first: false); return new QueryString(builder.ToString()); } @@ -250,5 +246,16 @@ namespace Microsoft.AspNetCore.Http { return left.Add(right); } + + private static void AppendKeyValuePair(StringBuilder builder, string key, string value, bool first) + { + builder.Append(first ? "?" : "&"); + builder.Append(UrlEncoder.Default.Encode(key)); + builder.Append("="); + if (!string.IsNullOrEmpty(value)) + { + builder.Append(UrlEncoder.Default.Encode(value)); + } + } } } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs index 01532d45ab..8327f12509 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Testing; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNetCore.Http.Abstractions @@ -54,8 +55,10 @@ namespace Microsoft.AspNetCore.Http.Abstractions [InlineData("name", "value", "?name=value")] [InlineData("na me", "val ue", "?na%20me=val%20ue")] [InlineData("name", "", "?name=")] + [InlineData("name", null, "?name=")] [InlineData("", "value", "?=value")] [InlineData("", "", "?=")] + [InlineData("", null, "?=")] public void CreateNameValue_Success(string name, string value, string exepcted) { var query = QueryString.Create(name, value); @@ -70,8 +73,24 @@ namespace Microsoft.AspNetCore.Http.Abstractions new KeyValuePair("key1", "value1"), new KeyValuePair("key2", "value2"), new KeyValuePair("key3", "value3"), + new KeyValuePair("key4", null), + new KeyValuePair("key5", "") }); - Assert.Equal("?key1=value1&key2=value2&key3=value3", query.Value); + Assert.Equal("?key1=value1&key2=value2&key3=value3&key4=&key5=", query.Value); + } + + [Fact] + public void CreateFromListStringValues_Success() + { + var query = QueryString.Create(new[] + { + new KeyValuePair("key1", new StringValues("value1")), + new KeyValuePair("key2", new StringValues("value2")), + new KeyValuePair("key3", new StringValues("value3")), + new KeyValuePair("key4", new StringValues()), + new KeyValuePair("key5", new StringValues("")), + }); + Assert.Equal("?key1=value1&key2=value2&key3=value3&key4=&key5=", query.Value); } [Theory] @@ -94,11 +113,18 @@ namespace Microsoft.AspNetCore.Http.Abstractions [Theory] [InlineData("", "", "", "?=")] + [InlineData("", "", null, "?=")] [InlineData("?", "", "", "?=")] + [InlineData("?", "", null, "?=")] [InlineData("?", "name2", "value2", "?name2=value2")] + [InlineData("?", "name2", "", "?name2=")] + [InlineData("?", "name2", null, "?name2=")] [InlineData("?name1=value1", "name2", "value2", "?name1=value1&name2=value2")] [InlineData("?name1=value1", "na me2", "val ue2", "?name1=value1&na%20me2=val%20ue2")] [InlineData("?name1=value1", "", "", "?name1=value1&=")] + [InlineData("?name1=value1", "", null, "?name1=value1&=")] + [InlineData("?name1=value1", "name2", "", "?name1=value1&name2=")] + [InlineData("?name1=value1", "name2", null, "?name1=value1&name2=")] public void AddNameValue_Success(string query1, string name2, string value2, string expected) { var q1 = new QueryString(query1); From 816ecf5cda2be2f8ed3bd6c0c06f57e8c74938a6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 6 Feb 2018 10:26:56 -0800 Subject: [PATCH 808/846] Reduce the amount of argument checking by flattening the call graph. (#995) --- .../SendFileResponseExtensions.cs | 119 ++++++++++-------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs index cbddfe97c9..74c0422ef4 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs @@ -22,8 +22,7 @@ namespace Microsoft.AspNetCore.Http /// /// The file. /// The . - public static Task SendFileAsync(this HttpResponse response, IFileInfo file, - CancellationToken cancellationToken = default(CancellationToken)) + public static Task SendFileAsync(this HttpResponse response, IFileInfo file, CancellationToken cancellationToken = default) { if (response == null) { @@ -34,7 +33,7 @@ namespace Microsoft.AspNetCore.Http throw new ArgumentNullException(nameof(file)); } - return response.SendFileAsync(file, 0, null, cancellationToken); + return SendFileAsyncCore(response, file, 0, null, cancellationToken); } /// @@ -46,8 +45,7 @@ namespace Microsoft.AspNetCore.Http /// The number of bytes to send, or null to send the remainder of the file. /// /// - public static async Task SendFileAsync(this HttpResponse response, IFileInfo file, long offset, long? count, - CancellationToken cancellationToken = default(CancellationToken)) + public static Task SendFileAsync(this HttpResponse response, IFileInfo file, long offset, long? count, CancellationToken cancellationToken = default) { if (response == null) { @@ -57,10 +55,62 @@ namespace Microsoft.AspNetCore.Http { throw new ArgumentNullException(nameof(file)); } - CheckRange(offset, count, file.Length); + return SendFileAsyncCore(response, file, offset, count, cancellationToken); + } + + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// The full path to the file. + /// The . + /// + public static Task SendFileAsync(this HttpResponse response, string fileName, CancellationToken cancellationToken = default) + { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (fileName == null) + { + throw new ArgumentNullException(nameof(fileName)); + } + + return SendFileAsyncCore(response, fileName, 0, null, cancellationToken); + } + + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// The full path to the file. + /// The offset in the file. + /// The number of bytes to send, or null to send the remainder of the file. + /// + /// + public static Task SendFileAsync(this HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken = default) + { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (fileName == null) + { + throw new ArgumentNullException(nameof(fileName)); + } + + return SendFileAsyncCore(response, fileName, offset, count, cancellationToken); + } + + private static async Task SendFileAsyncCore(HttpResponse response, IFileInfo file, long offset, long? count, CancellationToken cancellationToken) + { if (string.IsNullOrEmpty(file.PhysicalPath)) { + CheckRange(offset, count, file.Length); + using (var fileContent = file.CreateReadStream()) { if (offset > 0) @@ -76,63 +126,19 @@ namespace Microsoft.AspNetCore.Http } } - /// - /// Sends the given file using the SendFile extension. - /// - /// - /// The full path to the file. - /// The . - /// - public static Task SendFileAsync(this HttpResponse response, string fileName, - CancellationToken cancellationToken = default(CancellationToken)) + private static Task SendFileAsyncCore(HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken = default) { - if (response == null) - { - throw new ArgumentNullException(nameof(response)); - } - - if (fileName == null) - { - throw new ArgumentNullException(nameof(fileName)); - } - - return response.SendFileAsync(fileName, 0, null, cancellationToken); - } - - /// - /// Sends the given file using the SendFile extension. - /// - /// - /// The full path to the file. - /// The offset in the file. - /// The number of bytes to send, or null to send the remainder of the file. - /// - /// - public static Task SendFileAsync(this HttpResponse response, string fileName, long offset, long? count, - CancellationToken cancellationToken = default(CancellationToken)) - { - if (response == null) - { - throw new ArgumentNullException(nameof(response)); - } - - if (fileName == null) - { - throw new ArgumentNullException(nameof(fileName)); - } - var sendFile = response.HttpContext.Features.Get(); if (sendFile == null) { - return SendFileAsync(response.Body, fileName, offset, count, cancellationToken); + return SendFileAsyncCore(response.Body, fileName, offset, count, cancellationToken); } return sendFile.SendFileAsync(fileName, offset, count, cancellationToken); } // Not safe for overlapped writes. - private static async Task SendFileAsync(Stream outputStream, string fileName, long offset, long? count, - CancellationToken cancel = default(CancellationToken)) + private static async Task SendFileAsyncCore(Stream outputStream, string fileName, long offset, long? count, CancellationToken cancel = default) { cancel.ThrowIfCancellationRequested(); @@ -140,7 +146,6 @@ namespace Microsoft.AspNetCore.Http CheckRange(offset, count, fileInfo.Length); int bufferSize = 1024 * 16; - var fileStream = new FileStream( fileName, FileMode.Open, @@ -151,7 +156,11 @@ namespace Microsoft.AspNetCore.Http using (fileStream) { - fileStream.Seek(offset, SeekOrigin.Begin); + if (offset > 0) + { + fileStream.Seek(offset, SeekOrigin.Begin); + } + await StreamCopyOperation.CopyToAsync(fileStream, outputStream, count, cancel); } } From 7b9da556fb7dc83d10e0ebd2ce1771a54935cd27 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Sat, 20 Jan 2018 21:32:17 -0800 Subject: [PATCH 809/846] Add `HttpRequestRewindExtensions` - aspnet/Home#2684 - makes the `BufferingHelper` methods used in MVC and WebHooks `public` --- .../Extensions/HttpRequestRewindExtensions.cs | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Http/Extensions/HttpRequestRewindExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http/Extensions/HttpRequestRewindExtensions.cs b/src/Microsoft.AspNetCore.Http/Extensions/HttpRequestRewindExtensions.cs new file mode 100644 index 0000000000..557ee42155 --- /dev/null +++ b/src/Microsoft.AspNetCore.Http/Extensions/HttpRequestRewindExtensions.cs @@ -0,0 +1,91 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http.Internal; + +namespace Microsoft.AspNetCore.Http +{ + /// + /// Extension methods for enabling buffering in an . + /// + public static class HttpRequestRewindExtensions + { + /// + /// Ensure the can be read multiple times. Normally + /// buffers request bodies in memory; writes requests larger than 30K bytes to disk. + /// + /// The to prepare. + /// + /// Temporary files for larger requests are written to the location named in the ASPNETCORE_TEMP + /// environment variable, if any. If that environment variable is not defined, these files are written to the + /// current user's temporary folder. Files are automatically deleted at the end of their associated requests. + /// + public static void EnableBuffering(this HttpRequest request) + { + BufferingHelper.EnableRewind(request); + } + + /// + /// Ensure the can be read multiple times. Normally + /// buffers request bodies in memory; writes requests larger than bytes to + /// disk. + /// + /// The to prepare. + /// + /// The maximum size in bytes of the in-memory used to buffer the + /// stream. Larger request bodies are written to disk. + /// + /// + /// Temporary files for larger requests are written to the location named in the ASPNETCORE_TEMP + /// environment variable, if any. If that environment variable is not defined, these files are written to the + /// current user's temporary folder. Files are automatically deleted at the end of their associated requests. + /// + public static void EnableBuffering(this HttpRequest request, int bufferThreshold) + { + BufferingHelper.EnableRewind(request, bufferThreshold); + } + + /// + /// Ensure the can be read multiple times. Normally + /// buffers request bodies in memory; writes requests larger than 30K bytes to disk. + /// + /// The to prepare. + /// + /// The maximum size in bytes of the request body. An attempt to read beyond this limit will cause an + /// . + /// + /// + /// Temporary files for larger requests are written to the location named in the ASPNETCORE_TEMP + /// environment variable, if any. If that environment variable is not defined, these files are written to the + /// current user's temporary folder. Files are automatically deleted at the end of their associated requests. + /// + public static void EnableBuffering(this HttpRequest request, long bufferLimit) + { + BufferingHelper.EnableRewind(request, bufferLimit: bufferLimit); + } + + /// + /// Ensure the can be read multiple times. Normally + /// buffers request bodies in memory; writes requests larger than bytes to + /// disk. + /// + /// The to prepare. + /// + /// The maximum size in bytes of the in-memory used to buffer the + /// stream. Larger request bodies are written to disk. + /// + /// + /// The maximum size in bytes of the request body. An attempt to read beyond this limit will cause an + /// . + /// + /// + /// Temporary files for larger requests are written to the location named in the ASPNETCORE_TEMP + /// environment variable, if any. If that environment variable is not defined, these files are written to the + /// current user's temporary folder. Files are automatically deleted at the end of their associated requests. + /// + public static void EnableBuffering(this HttpRequest request, int bufferThreshold, long bufferLimit) + { + BufferingHelper.EnableRewind(request, bufferThreshold, bufferLimit); + } + } +} From 271612a899d6014232b2d5a695aa0b92122e4157 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Fri, 9 Feb 2018 11:43:21 -0800 Subject: [PATCH 810/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 22 +++++++++++----------- korebuild-lock.txt | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 877e91f843..4dbda8271b 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,17 +3,17 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15694 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 - 2.1.0-preview2-30020 + 2.1.0-preview2-15698 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 + 2.1.0-preview2-30066 2.0.0 2.1.0-preview2-26130-04 15.3.0 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 6f294ef0e6..3e2b56b91b 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15694 -commithash:f61af02b48e89592c9aadb7ebaebe84228666c3b +version:2.1.0-preview2-15698 +commithash:7216e5068cb1957e09d45fcbe58a744dd5c2de73 From f152b9863a5651755b8b9fef34e82a888562487e Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sun, 11 Feb 2018 12:24:40 -0800 Subject: [PATCH 811/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 4dbda8271b..d4fd6e1f3a 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,16 +4,16 @@ 2.1.0-preview2-15698 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 - 2.1.0-preview2-30066 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 + 2.1.0-preview2-30077 2.0.0 2.1.0-preview2-26130-04 15.3.0 @@ -22,7 +22,7 @@ 4.5.0-preview2-26130-01 0.8.0 2.3.1 - 2.3.1 + 2.4.0-beta.1.build3945 From d20d47924c7564116ea946e82a14f19ec1d64252 Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Fri, 9 Feb 2018 09:48:22 -0800 Subject: [PATCH 812/846] Add HostString.MatchesAny #2863 --- .../HostString.cs | 127 +++++++++++++----- .../HostStringTest.cs | 48 +++++++ 2 files changed, 144 insertions(+), 31 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs index 3ac23d9c40..9496b26bac 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs @@ -2,9 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Globalization; using Microsoft.AspNetCore.Http.Abstractions; using Microsoft.AspNetCore.Http.Internal; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Http { @@ -73,11 +75,9 @@ namespace Microsoft.AspNetCore.Http { get { - string host, port; + GetParts(_value, out var host, out var port); - GetParts(out host, out port); - - return host; + return host.ToString(); } } @@ -89,17 +89,15 @@ namespace Microsoft.AspNetCore.Http { get { - string host, port; - int p; + GetParts(_value, out var host, out var port); - GetParts(out host, out port); - - if (string.IsNullOrEmpty(port) || !int.TryParse(port, out p)) + if (!StringSegment.IsNullOrEmpty(port) + && int.TryParse(port.ToString(), NumberStyles.None, CultureInfo.InvariantCulture, out var p)) { - return null; + return p; } - return p; + return null; } } @@ -135,15 +133,14 @@ namespace Microsoft.AspNetCore.Http if (i != _value.Length) { - string host, port; - GetParts(out host, out port); + GetParts(_value, out var host, out var port); var mapping = new IdnMapping(); - host = mapping.GetAscii(host); + var encoded = mapping.GetAscii(host.Buffer, host.Offset, host.Length); - return string.IsNullOrEmpty(port) - ? host - : string.Concat(host, ":", port); + return StringSegment.IsNullOrEmpty(port) + ? encoded + : string.Concat(encoded, ":", port.ToString()); } return _value; @@ -208,6 +205,74 @@ namespace Microsoft.AspNetCore.Http UriComponents.HostAndPort, UriFormat.Unescaped)); } + /// + /// Matches the host portion of a host header value against a list of patterns. + /// The host may be the encoded punycode or decoded unicode form so long as the pattern + /// uses the same format. + /// + /// Host header value with or without a port. + /// A set of pattern to match, without ports. + /// + /// The port on the given value is ignored. The patterns should not have ports. + /// The patterns may be exact matches like "example.com", a top level wildcard "*" + /// that matches all hosts, or a subdomain wildcard like "*.example.com" that matches + /// "abc.example.com:443" but not "example.com:443". + /// Matching is case insensitive. + /// + /// + public static bool MatchesAny(StringSegment value, IList patterns) + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + if (patterns == null) + { + throw new ArgumentNullException(nameof(patterns)); + } + + // Drop the port + GetParts(value, out var host, out var port); + + for (int i = 0; i < port.Length; i++) + { + if (port[i] < '0' || '9' < port[i]) + { + throw new FormatException($"The given host value '{value}' has a malformed port."); + } + } + + for (int i = 0; i < patterns.Count; i++) + { + var pattern = patterns[i]; + + if (pattern == "*") + { + return true; + } + + if (StringSegment.Equals(pattern, host, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + // Sub-domain wildcards: *.example.com + if (pattern.StartsWith("*.", StringComparison.Ordinal) && host.Length >= pattern.Length) + { + // .example.com + var allowedRoot = pattern.Subsegment(1); + + var hostRoot = host.Subsegment(host.Length - allowedRoot.Length); + if (hostRoot.Equals(allowedRoot, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + } + + return false; + } + /// /// Compares the equality of the Value property, ignoring case. /// @@ -270,43 +335,43 @@ namespace Microsoft.AspNetCore.Http /// /// Parses the current value. IPv6 addresses will have brackets added if they are missing. /// - private void GetParts(out string host, out string port) + private static void GetParts(StringSegment value, out StringSegment host, out StringSegment port) { int index; port = null; host = null; - if (string.IsNullOrEmpty(_value)) + if (StringSegment.IsNullOrEmpty(value)) { return; } - else if ((index = _value.IndexOf(']')) >= 0) + else if ((index = value.IndexOf(']')) >= 0) { // IPv6 in brackets [::1], maybe with port - host = _value.Substring(0, index + 1); - - if ((index = _value.IndexOf(':', index + 1)) >= 0) + host = value.Subsegment(0, index + 1); + // Is there a colon and at least one character? + if (index + 2 < value.Length && value[index + 1] == ':') { - port = _value.Substring(index + 1); + port = value.Subsegment(index + 2); } } - else if ((index = _value.IndexOf(':')) >= 0 - && index < _value.Length - 1 - && _value.IndexOf(':', index + 1) >= 0) + else if ((index = value.IndexOf(':')) >= 0 + && index < value.Length - 1 + && value.IndexOf(':', index + 1) >= 0) { // IPv6 without brackets ::1 is the only type of host with 2 or more colons - host = $"[{_value}]"; + host = $"[{value}]"; port = null; } else if (index >= 0) { // Has a port - host = _value.Substring(0, index); - port = _value.Substring(index + 1); + host = value.Subsegment(0, index); + port = value.Subsegment(index + 1); } else { - host = _value; + host = value; port = null; } } diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs index d529ed76d2..85820f8ffc 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs @@ -1,7 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Testing; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNetCore.Http @@ -123,5 +125,51 @@ namespace Microsoft.AspNetCore.Http // Act and Assert Assert.NotEqual(hostString, new HostString(string.Empty)); } + + [Theory] + [InlineData("localHost", "localhost")] + [InlineData("localHost", "*")] // Any - Used by HttpSys + [InlineData("localhost:9090", "localHost")] + [InlineData("example.com:443", "example.com")] + [InlineData("foo.eXample.com:443", "*.exampLe.com")] + [InlineData("f.eXample.com:443", "*.exampLe.com")] + [InlineData("a.b.c.eXample.com:443", "*.exampLe.com")] + [InlineData("127.0.0.1", "127.0.0.1")] + [InlineData("127.0.0.1:443", "127.0.0.1")] + [InlineData("xn--c1yn36f:443", "xn--c1yn36f")] + [InlineData("點看", "點看")] + [InlineData("[::ABC]", "[::aBc]")] + [InlineData("[::1]:80", "[::1]")] + [InlineData("[::1]:", "[::1]")] + [InlineData("::1", "[::1]")] + public void HostMatches(string host, string pattern) + { + Assert.True(HostString.MatchesAny(host, new StringSegment[] { pattern })); + } + + [Theory] + [InlineData("example.com", "localhost")] + [InlineData("localhost:9090", "example.com")] + [InlineData(":80", "localhost")] + [InlineData(":", "localhost")] + [InlineData("example.com:443", "*.example.com")] + [InlineData(".example.com:443", "*.example.com")] + [InlineData("foo.com:443", "*.example.com")] + [InlineData("foo.example.com.bar:443", "*.example.com")] + [InlineData(".com:443", "*.com")] + [InlineData("xn--c1yn36f:443", "點看")] + [InlineData("[::1", "[::1]")] + [InlineData("[::1:80", "[::1]")] + [InlineData("::1", "::1")] // Brackets are added to the host before the comparison + public void HostDoesntMatch(string host, string pattern) + { + Assert.False(HostString.MatchesAny(host, new StringSegment[] { pattern })); + } + + [Fact] + public void HostMatchThrowsForBadPort() + { + Assert.Throws(() => HostString.MatchesAny("example.com:1abc", new StringSegment[] { "example.com" })); + } } } From 93b784766a068e6cd86cb074b2b78e5369b952a7 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sun, 18 Feb 2018 12:18:08 -0800 Subject: [PATCH 813/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 22 +++++++++++----------- korebuild-lock.txt | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index d4fd6e1f3a..9bd13a325c 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,17 +3,17 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15698 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 - 2.1.0-preview2-30077 + 2.1.0-preview2-15707 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 + 2.1.0-preview2-30131 2.0.0 2.1.0-preview2-26130-04 15.3.0 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 3e2b56b91b..89d0ad3d15 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15698 -commithash:7216e5068cb1957e09d45fcbe58a744dd5c2de73 +version:2.1.0-preview2-15707 +commithash:e74e53f129ab34332947fea7ac7b7591b027cb22 From ab0dbaa347e6d9c1535887e71f9c3523cb63a9b2 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 21 Feb 2018 18:26:57 -0800 Subject: [PATCH 814/846] Use FeatureBranchVersionSuffix when generating VersionSuffix --- version.props | 1 + 1 file changed, 1 insertion(+) diff --git a/version.props b/version.props index 370d5ababd..65c8a07e37 100644 --- a/version.props +++ b/version.props @@ -5,6 +5,7 @@ $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final t000 + $(VersionSuffix)-$([System.Text.RegularExpressions.Regex]::Replace('$(FeatureBranchVersionSuffix)', '[^\w-]', '-')) $(VersionSuffix)-$(BuildNumber) From b85ed9d5cd6cc174491bc84708093f16ddfc4e00 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 22 Feb 2018 10:44:59 -0800 Subject: [PATCH 815/846] Commas in doc comments --- .../Extensions/HeaderDictionaryExtensions.cs | 4 ++-- .../Internal/ParsingHelpers.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs index 65484981e0..0e31660dc2 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Http } /// - /// Quotes any values containing comas, and then coma joins all of the values with any existing values. + /// Quotes any values containing commas, and then comma joins all of the values with any existing values. /// /// The to use. /// The header name. @@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Http } /// - /// Quotes any values containing comas, and then coma joins all of the values. + /// Quotes any values containing commas, and then comma joins all of the values. /// /// The to use. /// The header name. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs index 59ffd2bf19..185fc40ac7 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs @@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Http.Internal } } - // Quote items that contain comas and are not already quoted. + // Quote items that contain commas and are not already quoted. private static string QuoteIfNeeded(string value) { if (!string.IsNullOrEmpty(value) && From 63c79635959224870a7b6a8aa95f425b52c83430 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Mon, 26 Feb 2018 11:02:00 -0800 Subject: [PATCH 816/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 24 ++++++++++++------------ korebuild-lock.txt | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 9bd13a325c..ffc80ce620 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,20 +3,20 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15707 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 - 2.1.0-preview2-30131 + 2.1.0-preview2-15721 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 + 2.1.0-preview2-30187 2.0.0 2.1.0-preview2-26130-04 - 15.3.0 + 15.6.0 4.7.49 4.5.0-preview2-26130-01 4.5.0-preview2-26130-01 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 89d0ad3d15..e6c7fddffa 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15707 -commithash:e74e53f129ab34332947fea7ac7b7591b027cb22 +version:2.1.0-preview2-15721 +commithash:f9bb4be59e39938ec59a6975257e26099b0d03c1 From 666437615b803751fe1fc23c2dbbbcf625208057 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 6 Mar 2018 10:03:57 -0800 Subject: [PATCH 817/846] Use dotnet-core feed in repos --- build/sources.props | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/sources.props b/build/sources.props index 9feff29d09..9215df9751 100644 --- a/build/sources.props +++ b/build/sources.props @@ -1,10 +1,11 @@ - + $(DotNetRestoreSources) $(RestoreSources); + https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; From 617ee97b21f881c38a4cbe32789189b747d8d3e8 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 6 Mar 2018 10:03:57 -0800 Subject: [PATCH 818/846] Prepend FeatureBranchVersionPrefix if FeatureBranchVersionSuffix is specified --- version.props | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/version.props b/version.props index 65c8a07e37..a11ea1ed52 100644 --- a/version.props +++ b/version.props @@ -5,7 +5,8 @@ $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final t000 - $(VersionSuffix)-$([System.Text.RegularExpressions.Regex]::Replace('$(FeatureBranchVersionSuffix)', '[^\w-]', '-')) + a- + $(FeatureBranchVersionPrefix)$(VersionSuffix)-$([System.Text.RegularExpressions.Regex]::Replace('$(FeatureBranchVersionSuffix)', '[^\w-]', '-')) $(VersionSuffix)-$(BuildNumber) From fbbbb16305f57025eca71964ac5d7c9f43c42150 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Thu, 8 Mar 2018 13:00:29 -0800 Subject: [PATCH 819/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 28 ++++++++++++++-------------- korebuild-lock.txt | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index ffc80ce620..f34a576d47 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15721 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 - 2.1.0-preview2-30187 + 2.1.0-preview2-15728 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 + 2.1.0-preview2-30272 2.0.0 - 2.1.0-preview2-26130-04 + 2.1.0-preview2-26225-03 15.6.0 4.7.49 - 4.5.0-preview2-26130-01 - 4.5.0-preview2-26130-01 + 4.5.0-preview2-26224-02 + 4.5.0-preview2-26224-02 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index e6c7fddffa..138d848db1 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15721 -commithash:f9bb4be59e39938ec59a6975257e26099b0d03c1 +version:2.1.0-preview2-15728 +commithash:393377068ddcf51dfee0536536d455f57a828b06 From c86fb52eb02f8933d5bcd5b79358e334973521b0 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 16 Mar 2018 11:14:44 -0700 Subject: [PATCH 820/846] Branching for 2.1.0-preview2 --- build/dependencies.props | 28 ++++++++++++++-------------- build/repo.props | 4 ++-- build/sources.props | 2 +- korebuild-lock.txt | 4 ++-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index f34a576d47..1c327bdc68 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15728 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 + 2.1.0-preview2-15742 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 + 2.1.0-preview2-30355 2.0.0 - 2.1.0-preview2-26225-03 + 2.1.0-preview2-26314-02 15.6.0 4.7.49 - 4.5.0-preview2-26224-02 - 4.5.0-preview2-26224-02 + 4.5.0-preview2-26313-01 + 4.5.0-preview2-26313-01 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/build/repo.props b/build/repo.props index 78b0ce5879..d94ff7d00d 100644 --- a/build/repo.props +++ b/build/repo.props @@ -1,10 +1,10 @@ - + Internal.AspNetCore.Universe.Lineup - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json + https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json diff --git a/build/sources.props b/build/sources.props index 9215df9751..36045f12b5 100644 --- a/build/sources.props +++ b/build/sources.props @@ -6,7 +6,7 @@ $(RestoreSources); https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; + https://dotnet.myget.org/F/aspnetcore-release/api/v3/index.json; https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 138d848db1..e40ef6651b 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15728 -commithash:393377068ddcf51dfee0536536d455f57a828b06 +version:2.1.0-preview2-15742 +commithash:21fbb0f2c3fe4a9216e2d59632b98cfd7d685962 From 29225ebc3a0f8ac19d6c86371791e5b2e2bd4488 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 16 Mar 2018 11:26:26 -0700 Subject: [PATCH 821/846] Update version prefix to preview3 --- version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.props b/version.props index a11ea1ed52..24f2b00a0a 100644 --- a/version.props +++ b/version.props @@ -1,7 +1,7 @@ 2.1.0 - preview2 + preview3 $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final t000 From f3ac1fac0ce93aac38a18e286989648108e14bb9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 16 Mar 2018 12:29:56 -0700 Subject: [PATCH 822/846] Update KoreBuild channel --- korebuild.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/korebuild.json b/korebuild.json index bd5d51a51b..678d8bb948 100644 --- a/korebuild.json +++ b/korebuild.json @@ -1,4 +1,4 @@ { - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", - "channel": "dev" + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/release/2.1/tools/korebuild.schema.json", + "channel": "release/2.1" } From f6f89554c9245716115fc7b87c32ae628f7fe0f4 Mon Sep 17 00:00:00 2001 From: richardhopton Date: Mon, 19 Mar 2018 09:09:57 -0700 Subject: [PATCH 823/846] Fix trimming line if CR not directly before LF (#1006) If the line contains a CR in any location than directly before the LF it would detect a valid line and then trim 2 characters from the end of the line, losing a "real" character. --- .../BufferedReadStream.cs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs index a6c4106d80..b72920df4d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs @@ -327,21 +327,12 @@ namespace Microsoft.AspNetCore.WebUtilities builder.WriteByte(b); _bufferOffset++; _bufferCount--; - if (b == CR) + if (b == LF && foundCR) { - foundCR = true; - } - else if (b == LF) - { - if (foundCR) - { - foundCRLF = true; - } - else - { - foundCR = false; - } + foundCRLF = true; + return; } + foundCR = b == CR; } private string DecodeLine(MemoryStream builder, bool foundCRLF) From f91db5b7943c011533b4ae3a9351f9cd4ebfb4d5 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Wed, 14 Mar 2018 15:34:01 -0700 Subject: [PATCH 824/846] Set 2.0 baselines --- build/dependencies.props | 2 +- korebuild-lock.txt | 4 +- .../baseline.netcore.json | 456 +--- .../baseline.netcore.json | 2 +- .../baseline.netcore.json | 2 +- .../baseline.netcore.json | 2137 +---------------- .../baseline.netcore.json | 2 +- .../baseline.netcore.json | 2 +- .../baseline.netcore.json | 2 +- 9 files changed, 10 insertions(+), 2599 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 1c327bdc68..2fd4823f38 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,7 +3,7 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15742 + 2.1.0-preview2-15743 2.1.0-preview2-30355 2.1.0-preview2-30355 2.1.0-preview2-30355 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index e40ef6651b..58dd4d4306 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15742 -commithash:21fbb0f2c3fe4a9216e2d59632b98cfd7d685962 +version:2.1.0-preview2-15743 +commithash:9e15cb6062ab5b9790d3fa699e018543a6950713 diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json index c2eeac7fe9..d7ef172836 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Builder.MapExtensions", @@ -4355,392 +4355,6 @@ ], "GenericParameters": [] }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.HeaderSegment", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.IEquatable" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Formatting", - "Parameters": [], - "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Data", - "Parameters": [], - "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IEquatable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "obj", - "Type": "System.Object" - } - ], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHashCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Equality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Inequality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegment" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "formatting", - "Type": "Microsoft.Extensions.Primitives.StringSegment" - }, - { - "Name": "data", - "Type": "Microsoft.Extensions.Primitives.StringSegment" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerable", - "System.IEquatable" - ], - "Members": [ - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "other", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IEquatable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Equals", - "Parameters": [ - { - "Name": "obj", - "Type": "System.Object" - } - ], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHashCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Equality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "op_Inequality", - "Parameters": [ - { - "Name": "left", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" - }, - { - "Name": "right", - "Type": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection" - } - ], - "ReturnType": "System.Boolean", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection+Enumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.ParsingHelpers", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "GetHeader", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHeaderSplit", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetHeaderUnmodified", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetHeaderJoined", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SetHeaderUnmodified", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AppendHeaderJoined", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "System.String[]", - "IsParams": true - } - ], - "ReturnType": "System.Void", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AppendHeaderUnmodified", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "values", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "ReturnType": "System.Void", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, { "Name": "Microsoft.AspNetCore.Http.Authentication.AuthenticateInfo", "Visibility": "Public", @@ -5337,74 +4951,6 @@ } ], "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.HeaderSegmentCollection+Enumerator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerator" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Current", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.HeaderSegment", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "MoveNext", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Reset", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.Extensions.Primitives.StringValues" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] } ] } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json index 33ae6d9ef9..92a4a49478 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryTypeExtensions", diff --git a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json index 3c8fab88d3..9fa1b94894 100644 --- a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Http.CookieOptions", diff --git a/src/Microsoft.AspNetCore.Http/baseline.netcore.json b/src/Microsoft.AspNetCore.Http/baseline.netcore.json index 92edd6acd7..0f2f607f6f 100644 --- a/src/Microsoft.AspNetCore.Http/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http/baseline.netcore.json @@ -1,132 +1,6 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ - { - "Name": "Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Builder.IApplicationBuilder" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_ApplicationServices", - "Parameters": [], - "ReturnType": "System.IServiceProvider", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ApplicationServices", - "Parameters": [ - { - "Name": "value", - "Type": "System.IServiceProvider" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ServerFeatures", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Features.IFeatureCollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Properties", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Use", - "Parameters": [ - { - "Name": "middleware", - "Type": "System.Func" - } - ], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "New", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Build", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.RequestDelegate", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Builder.IApplicationBuilder", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "serviceProvider", - "Type": "System.IServiceProvider" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "serviceProvider", - "Type": "System.IServiceProvider" - }, - { - "Name": "server", - "Type": "System.Object" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, { "Name": "Microsoft.AspNetCore.Http.DefaultHttpContext", "Visibility": "Public", @@ -1162,1754 +1036,6 @@ ], "GenericParameters": [] }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.BufferingHelper", - "Visibility": "Public", - "Kind": "Class", - "Abstract": true, - "Static": true, - "Sealed": true, - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "get_TempDirectory", - "Parameters": [], - "ReturnType": "System.String", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "EnableRewind", - "Parameters": [ - { - "Name": "request", - "Type": "Microsoft.AspNetCore.Http.HttpRequest" - }, - { - "Name": "bufferThreshold", - "Type": "System.Int32", - "DefaultValue": "30720" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable", - "DefaultValue": "default(System.Nullable)" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.HttpRequest", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "EnableRewind", - "Parameters": [ - { - "Name": "section", - "Type": "Microsoft.AspNetCore.WebUtilities.MultipartSection" - }, - { - "Name": "registerForDispose", - "Type": "System.Action" - }, - { - "Name": "bufferThreshold", - "Type": "System.Int32", - "DefaultValue": "30720" - }, - { - "Name": "bufferLimit", - "Type": "System.Nullable", - "DefaultValue": "default(System.Nullable)" - } - ], - "ReturnType": "Microsoft.AspNetCore.WebUtilities.MultipartSection", - "Static": true, - "Extension": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultConnectionInfo", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.ConnectionInfo", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Id", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Id", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemoteIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemoteIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_RemotePort", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_RemotePort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalIpAddress", - "Parameters": [], - "ReturnType": "System.Net.IPAddress", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalIpAddress", - "Parameters": [ - { - "Name": "value", - "Type": "System.Net.IPAddress" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_LocalPort", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_LocalPort", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ClientCertificate", - "Parameters": [], - "ReturnType": "System.Security.Cryptography.X509Certificates.X509Certificate2", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ClientCertificate", - "Parameters": [ - { - "Name": "value", - "Type": "System.Security.Cryptography.X509Certificates.X509Certificate2" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetClientCertificateAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpRequest", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.HttpRequest", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_PathBase", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_PathBase", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Path", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.PathString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Path", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.PathString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_QueryString", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.QueryString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_QueryString", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.QueryString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Method", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Method", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Scheme", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Scheme", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsHttps", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_IsHttps", - "Parameters": [ - { - "Name": "value", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Host", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HostString", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Host", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.HostString" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Query", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IQueryCollection", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Query", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IQueryCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Protocol", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Protocol", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Cookies", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IRequestCookieCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasFormContentType", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Form", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IFormCollection", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Form", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IFormCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ReadFormAsync", - "Parameters": [ - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.HttpResponse", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_StatusCode", - "Parameters": [], - "ReturnType": "System.Int32", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_StatusCode", - "Parameters": [ - { - "Name": "value", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Body", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Body", - "Parameters": [ - { - "Name": "value", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentLength", - "Parameters": [], - "ReturnType": "System.Nullable", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentLength", - "Parameters": [ - { - "Name": "value", - "Type": "System.Nullable" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Cookies", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IResponseCookies", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HasStarted", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnStarting", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OnCompleted", - "Parameters": [ - { - "Name": "callback", - "Type": "System.Func" - }, - { - "Name": "state", - "Type": "System.Object" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Redirect", - "Parameters": [ - { - "Name": "location", - "Type": "System.String" - }, - { - "Name": "permanent", - "Type": "System.Boolean" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.DefaultWebSocketManager", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.WebSocketManager", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsWebSocketRequest", - "Parameters": [], - "ReturnType": "System.Boolean", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_WebSocketRequestedProtocols", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IList", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AcceptWebSocketAsync", - "Parameters": [ - { - "Name": "subProtocol", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "features", - "Type": "Microsoft.AspNetCore.Http.Features.IFeatureCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.FormFile", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IFormFile" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_ContentDisposition", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentDisposition", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_ContentType", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_ContentType", - "Parameters": [ - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Headers", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.IHeaderDictionary", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "set_Headers", - "Parameters": [ - { - "Name": "value", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - } - ], - "ReturnType": "System.Void", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Length", - "Parameters": [], - "ReturnType": "System.Int64", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Name", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_FileName", - "Parameters": [], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "OpenReadStream", - "Parameters": [], - "ReturnType": "System.IO.Stream", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyTo", - "Parameters": [ - { - "Name": "target", - "Type": "System.IO.Stream" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyToAsync", - "Parameters": [ - { - "Name": "target", - "Type": "System.IO.Stream" - }, - { - "Name": "cancellationToken", - "Type": "System.Threading.CancellationToken", - "DefaultValue": "default(System.Threading.CancellationToken)" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFile", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "baseStream", - "Type": "System.IO.Stream" - }, - { - "Name": "baseStreamOffset", - "Type": "System.Int64" - }, - { - "Name": "length", - "Type": "System.Int64" - }, - { - "Name": "name", - "Type": "System.String" - }, - { - "Name": "fileName", - "Type": "System.String" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.FormFileCollection", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "System.Collections.Generic.List", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IFormFileCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetFile", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.IFormFile", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetFiles", - "Parameters": [ - { - "Name": "name", - "Type": "System.String" - } - ], - "ReturnType": "System.Collections.Generic.IReadOnlyList", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IFormFileCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.ItemsDictionary", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "System.Collections.Generic.IDictionary" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Items", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "items", - "Type": "System.Collections.Generic.IDictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IQueryCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "Microsoft.Extensions.Primitives.StringValues", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IQueryCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "store", - "Type": "System.Collections.Generic.Dictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "store", - "Type": "Microsoft.AspNetCore.Http.Internal.QueryCollection" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "capacity", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.QueryCollection", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IRequestCookieCollection" - ], - "Members": [ - { - "Kind": "Method", - "Name": "get_Item", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.String", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Parse", - "Parameters": [ - { - "Name": "values", - "Type": "System.Collections.Generic.IList" - } - ], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", - "Static": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IRequestCookieCollection", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "store", - "Type": "System.Collections.Generic.Dictionary" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "capacity", - "Type": "System.Int32" - } - ], - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Field", - "Name": "Empty", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection", - "Static": true, - "ReadOnly": true, - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.ResponseCookies", - "Visibility": "Public", - "Kind": "Class", - "ImplementedInterfaces": [ - "Microsoft.AspNetCore.Http.IResponseCookies" - ], - "Members": [ - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Append", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "System.String" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.CookieOptions" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Delete", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Delete", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "options", - "Type": "Microsoft.AspNetCore.Http.CookieOptions" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "Microsoft.AspNetCore.Http.IResponseCookies", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "headers", - "Type": "Microsoft.AspNetCore.Http.IHeaderDictionary" - }, - { - "Name": "builderPool", - "Type": "Microsoft.Extensions.ObjectPool.ObjectPool" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, { "Name": "Microsoft.AspNetCore.Http.Features.DefaultSessionFeature", "Visibility": "Public", @@ -4435,166 +2561,6 @@ ], "GenericParameters": [] }, - { - "Name": "Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager", - "Visibility": "Public", - "Kind": "Class", - "BaseType": "Microsoft.AspNetCore.Http.Authentication.AuthenticationManager", - "ImplementedInterfaces": [], - "Members": [ - { - "Kind": "Method", - "Name": "Initialize", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Uninitialize", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_HttpContext", - "Parameters": [], - "ReturnType": "Microsoft.AspNetCore.Http.HttpContext", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetAuthenticationSchemes", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerable", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "AuthenticateAsync", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "GetAuthenticateInfoAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ChallengeAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - }, - { - "Name": "behavior", - "Type": "Microsoft.AspNetCore.Http.Features.Authentication.ChallengeBehavior" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignInAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "principal", - "Type": "System.Security.Claims.ClaimsPrincipal" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "SignOutAsync", - "Parameters": [ - { - "Name": "authenticationScheme", - "Type": "System.String" - }, - { - "Name": "properties", - "Type": "Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties" - } - ], - "ReturnType": "System.Threading.Tasks.Task", - "Virtual": true, - "Override": true, - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Constructor", - "Name": ".ctor", - "Parameters": [ - { - "Name": "context", - "Type": "Microsoft.AspNetCore.Http.HttpContext" - } - ], - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, { "Name": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", "Visibility": "Public", @@ -4684,107 +2650,6 @@ } ], "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.QueryCollection+Enumerator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerator>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "MoveNext", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Current", - "Parameters": [], - "ReturnType": "System.Collections.Generic.KeyValuePair", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerator>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] - }, - { - "Name": "Microsoft.AspNetCore.Http.Internal.RequestCookieCollection+Enumerator", - "Visibility": "Public", - "Kind": "Struct", - "Sealed": true, - "ImplementedInterfaces": [ - "System.Collections.Generic.IEnumerator>" - ], - "Members": [ - { - "Kind": "Method", - "Name": "MoveNext", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Current", - "Parameters": [], - "ReturnType": "System.Collections.Generic.KeyValuePair", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerator>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Reset", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.IEnumerator", - "Visibility": "Public", - "GenericParameter": [] - } - ], - "GenericParameters": [] } ] } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json index c3d0a44572..50b5847f9e 100644 --- a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Builder.OwinExtensions", diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json index 0bf330cd73..e8334021d6 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.WebUtilities.WebEncoders", diff --git a/src/Microsoft.Net.Http.Headers/baseline.netcore.json b/src/Microsoft.Net.Http.Headers/baseline.netcore.json index f68dd6ee1e..b29b4825ee 100644 --- a/src/Microsoft.Net.Http.Headers/baseline.netcore.json +++ b/src/Microsoft.Net.Http.Headers/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.Net.Http.Headers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.Net.Http.Headers, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", From e5cffe685bdf6d2f5e6182385cf6626f444d9a0a Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Wed, 21 Mar 2018 09:35:11 -0700 Subject: [PATCH 825/846] Do not rely on the implicit StringValues to array converter. --- build/dependencies.props | 28 +++++++++---------- .../Extensions/HeaderDictionaryExtensions.cs | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index f34a576d47..fe1583adba 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,22 +4,22 @@ 2.1.0-preview2-15728 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 - 2.1.0-preview2-30272 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 + 2.1.0-preview3-30392 2.0.0 - 2.1.0-preview2-26225-03 - 15.6.0 + 2.1.0-preview2-26314-02 + 15.6.1 4.7.49 - 4.5.0-preview2-26224-02 - 4.5.0-preview2-26224-02 + 4.5.0-preview2-26313-01 + 4.5.0-preview2-26313-01 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs index 0e31660dc2..5cc06484a2 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.Http /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) { - return ParsingHelpers.GetHeaderSplit(headers, key); + return ParsingHelpers.GetHeaderSplit(headers, key).ToArray(); } /// From 72210e4078a7e92197ac83af64c5fe864d833984 Mon Sep 17 00:00:00 2001 From: Patrick Westerhoff Date: Fri, 23 Mar 2018 17:13:02 +0100 Subject: [PATCH 826/846] Add AuthenticationProperties.Parameters (#1008) Add a `Parameters` bag to the authentication properties that allow passing arbitrary parameters to an authentication handler. These values are not intended for serialization of persistence, only for flowing data between call sites. Also make existing `Items` collection helpers protected to allow them to be reused in subclasses, make string-based helpers public as a public way to work with the collection, and add helper methods to interact with the `Parameters` dictionary. --- .../AuthenticationProperties.cs | 91 ++++++-- .../AuthenticationPropertiesTests.cs | 207 ++++++++++++++++++ 2 files changed, 284 insertions(+), 14 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationPropertiesTests.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs index 9d1e670ea8..271329209a 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs +++ b/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs @@ -20,20 +20,29 @@ namespace Microsoft.AspNetCore.Authentication internal const string UtcDateTimeFormat = "r"; /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// public AuthenticationProperties() - : this(items: null) - { - } + : this(items: null, parameters: null) + { } /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// - /// + /// State values dictionary to use. public AuthenticationProperties(IDictionary items) + : this(items, parameters: null) + { } + + /// + /// Initializes a new instance of the class. + /// + /// State values dictionary to use. + /// Parameters dictionary to use. + public AuthenticationProperties(IDictionary items, IDictionary parameters) { Items = items ?? new Dictionary(StringComparer.Ordinal); + Parameters = parameters ?? new Dictionary(StringComparer.Ordinal); } /// @@ -41,6 +50,12 @@ namespace Microsoft.AspNetCore.Authentication /// public IDictionary Items { get; } + /// + /// Collection of parameters that are passed to the authentication handler. These are not intended for + /// serialization or persistence, only for flowing data between call sites. + /// + public IDictionary Parameters { get; } + /// /// Gets or sets whether the authentication session is persisted across multiple requests. /// @@ -86,12 +101,22 @@ namespace Microsoft.AspNetCore.Authentication set => SetBool(RefreshKey, value); } - private string GetString(string key) + /// + /// Get a string value from the collection. + /// + /// Property key. + /// Retrieved value or null if the property is not set. + public string GetString(string key) { return Items.TryGetValue(key, out string value) ? value : null; } - private void SetString(string key, string value) + /// + /// Set a string value in the collection. + /// + /// Property key. + /// Value to set or null to remove the property. + public void SetString(string key, string value) { if (value != null) { @@ -103,16 +128,44 @@ namespace Microsoft.AspNetCore.Authentication } } - private bool? GetBool(string key) + /// + /// Get a parameter from the collection. + /// + /// Parameter type. + /// Parameter key. + /// Retrieved value or the default value if the property is not set. + public T GetParameter(string key) + => Parameters.TryGetValue(key, out var obj) && obj is T value ? value : default; + + /// + /// Set a parameter value in the collection. + /// + /// Parameter type. + /// Parameter key. + /// Value to set. + public void SetParameter(string key, T value) + => Parameters[key] = value; + + /// + /// Get a bool value from the collection. + /// + /// Property key. + /// Retrieved value or null if the property is not set. + protected bool? GetBool(string key) { - if (Items.TryGetValue(key, out string value) && bool.TryParse(value, out bool refresh)) + if (Items.TryGetValue(key, out string value) && bool.TryParse(value, out bool boolValue)) { - return refresh; + return boolValue; } return null; } - private void SetBool(string key, bool? value) + /// + /// Set a bool value in the collection. + /// + /// Property key. + /// Value to set or null to remove the property. + protected void SetBool(string key, bool? value) { if (value.HasValue) { @@ -124,7 +177,12 @@ namespace Microsoft.AspNetCore.Authentication } } - private DateTimeOffset? GetDateTimeOffset(string key) + /// + /// Get a DateTimeOffset value from the collection. + /// + /// Property key. + /// Retrieved value or null if the property is not set. + protected DateTimeOffset? GetDateTimeOffset(string key) { if (Items.TryGetValue(key, out string value) && DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out DateTimeOffset dateTimeOffset)) @@ -134,7 +192,12 @@ namespace Microsoft.AspNetCore.Authentication return null; } - private void SetDateTimeOffset(string key, DateTimeOffset? value) + /// + /// Set a DateTimeOffset value in the collection. + /// + /// Property key. + /// Value to set or null to remove the property. + protected void SetDateTimeOffset(string key, DateTimeOffset? value) { if (value.HasValue) { diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationPropertiesTests.cs b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationPropertiesTests.cs new file mode 100644 index 0000000000..639c9b558e --- /dev/null +++ b/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationPropertiesTests.cs @@ -0,0 +1,207 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.AspNetCore.Authentication.Core.Test +{ + public class AuthenticationPropertiesTests + { + [Fact] + public void DefaultConstructor_EmptyCollections() + { + var props = new AuthenticationProperties(); + Assert.Empty(props.Items); + Assert.Empty(props.Parameters); + } + + [Fact] + public void ItemsConstructor_ReusesItemsDictionary() + { + var items = new Dictionary + { + ["foo"] = "bar", + }; + var props = new AuthenticationProperties(items); + Assert.Same(items, props.Items); + Assert.Empty(props.Parameters); + } + + [Fact] + public void FullConstructor_ReusesDictionaries() + { + var items = new Dictionary + { + ["foo"] = "bar", + }; + var parameters = new Dictionary + { + ["number"] = 1234, + ["list"] = new List { "a", "b", "c" }, + }; + var props = new AuthenticationProperties(items, parameters); + Assert.Same(items, props.Items); + Assert.Same(parameters, props.Parameters); + } + + [Fact] + public void GetSetString() + { + var props = new AuthenticationProperties(); + Assert.Null(props.GetString("foo")); + Assert.Equal(0, props.Items.Count); + + props.SetString("foo", "foo bar"); + Assert.Equal("foo bar", props.GetString("foo")); + Assert.Equal("foo bar", props.Items["foo"]); + Assert.Equal(1, props.Items.Count); + + props.SetString("foo", "foo baz"); + Assert.Equal("foo baz", props.GetString("foo")); + Assert.Equal("foo baz", props.Items["foo"]); + Assert.Equal(1, props.Items.Count); + + props.SetString("bar", "xy"); + Assert.Equal("xy", props.GetString("bar")); + Assert.Equal("xy", props.Items["bar"]); + Assert.Equal(2, props.Items.Count); + + props.SetString("bar", string.Empty); + Assert.Equal(string.Empty, props.GetString("bar")); + Assert.Equal(string.Empty, props.Items["bar"]); + + props.SetString("foo", null); + Assert.Null(props.GetString("foo")); + Assert.Equal(1, props.Items.Count); + } + + [Fact] + public void GetSetParameter_String() + { + var props = new AuthenticationProperties(); + Assert.Null(props.GetParameter("foo")); + Assert.Equal(0, props.Parameters.Count); + + props.SetParameter("foo", "foo bar"); + Assert.Equal("foo bar", props.GetParameter("foo")); + Assert.Equal("foo bar", props.Parameters["foo"]); + Assert.Equal(1, props.Parameters.Count); + + props.SetParameter("foo", null); + Assert.Null(props.GetParameter("foo")); + Assert.Null(props.Parameters["foo"]); + Assert.Equal(1, props.Parameters.Count); + } + + [Fact] + public void GetSetParameter_Int() + { + var props = new AuthenticationProperties(); + Assert.Null(props.GetParameter("foo")); + Assert.Equal(0, props.Parameters.Count); + + props.SetParameter("foo", 123); + Assert.Equal(123, props.GetParameter("foo")); + Assert.Equal(123, props.Parameters["foo"]); + Assert.Equal(1, props.Parameters.Count); + + props.SetParameter("foo", null); + Assert.Null(props.GetParameter("foo")); + Assert.Null(props.Parameters["foo"]); + Assert.Equal(1, props.Parameters.Count); + } + + [Fact] + public void GetSetParameter_Collection() + { + var props = new AuthenticationProperties(); + Assert.Null(props.GetParameter("foo")); + Assert.Equal(0, props.Parameters.Count); + + var list = new string[] { "a", "b", "c" }; + props.SetParameter>("foo", list); + Assert.Equal(new string[] { "a", "b", "c" }, props.GetParameter>("foo")); + Assert.Same(list, props.Parameters["foo"]); + Assert.Equal(1, props.Parameters.Count); + + props.SetParameter>("foo", null); + Assert.Null(props.GetParameter>("foo")); + Assert.Null(props.Parameters["foo"]); + Assert.Equal(1, props.Parameters.Count); + } + + [Fact] + public void IsPersistent_Test() + { + var props = new AuthenticationProperties(); + Assert.False(props.IsPersistent); + + props.IsPersistent = true; + Assert.True(props.IsPersistent); + Assert.Equal(string.Empty, props.Items.First().Value); + + props.Items.Clear(); + Assert.False(props.IsPersistent); + } + + [Fact] + public void RedirectUri_Test() + { + var props = new AuthenticationProperties(); + Assert.Null(props.RedirectUri); + + props.RedirectUri = "http://example.com"; + Assert.Equal("http://example.com", props.RedirectUri); + Assert.Equal("http://example.com", props.Items.First().Value); + + props.Items.Clear(); + Assert.Null(props.RedirectUri); + } + + [Fact] + public void IssuedUtc_Test() + { + var props = new AuthenticationProperties(); + Assert.Null(props.IssuedUtc); + + props.IssuedUtc = new DateTimeOffset(new DateTime(2018, 03, 21, 0, 0, 0, DateTimeKind.Utc)); + Assert.Equal(new DateTimeOffset(new DateTime(2018, 03, 21, 0, 0, 0, DateTimeKind.Utc)), props.IssuedUtc); + Assert.Equal("Wed, 21 Mar 2018 00:00:00 GMT", props.Items.First().Value); + + props.Items.Clear(); + Assert.Null(props.IssuedUtc); + } + + [Fact] + public void ExpiresUtc_Test() + { + var props = new AuthenticationProperties(); + Assert.Null(props.ExpiresUtc); + + props.ExpiresUtc = new DateTimeOffset(new DateTime(2018, 03, 19, 12, 34, 56, DateTimeKind.Utc)); + Assert.Equal(new DateTimeOffset(new DateTime(2018, 03, 19, 12, 34, 56, DateTimeKind.Utc)), props.ExpiresUtc); + Assert.Equal("Mon, 19 Mar 2018 12:34:56 GMT", props.Items.First().Value); + + props.Items.Clear(); + Assert.Null(props.ExpiresUtc); + } + + [Fact] + public void AllowRefresh_Test() + { + var props = new AuthenticationProperties(); + Assert.Null(props.AllowRefresh); + + props.AllowRefresh = true; + Assert.True(props.AllowRefresh); + Assert.Equal("True", props.Items.First().Value); + + props.AllowRefresh = false; + Assert.False(props.AllowRefresh); + Assert.Equal("False", props.Items.First().Value); + + props.Items.Clear(); + Assert.Null(props.AllowRefresh); + } + } +} From ed5c07063946f5d893b70000c8a5e224e8cf7ec8 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sun, 25 Mar 2018 15:39:44 -0700 Subject: [PATCH 827/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 22 +++++++++++----------- korebuild-lock.txt | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index fe1583adba..a3c842b01e 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,17 +3,17 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15728 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 - 2.1.0-preview3-30392 + 2.1.0-preview3-17001 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 + 2.1.0-preview3-32037 2.0.0 2.1.0-preview2-26314-02 15.6.1 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 138d848db1..3a326c7d58 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15728 -commithash:393377068ddcf51dfee0536536d455f57a828b06 +version:2.1.0-preview3-17001 +commithash:dda68c56abf0d3b911fe6a2315872c446b314585 From e80d0b000ac6b9a32ddaf01dc89b2c0b9a1d0523 Mon Sep 17 00:00:00 2001 From: Tornhoof Date: Tue, 27 Mar 2018 01:03:16 +0200 Subject: [PATCH 828/846] Make BufferedReadString public and add doc (#1011) --- .../BufferedReadStream.cs | 70 ++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs index b72920df4d..10f1465f3a 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs @@ -10,7 +10,11 @@ using System.Threading.Tasks; namespace Microsoft.AspNetCore.WebUtilities { - internal class BufferedReadStream : Stream + /// + /// A Stream that wraps another stream and allows reading lines. + /// The data is buffered in memory. + /// + public class BufferedReadStream : Stream { private const byte CR = (byte)'\r'; private const byte LF = (byte)'\n'; @@ -22,11 +26,22 @@ namespace Microsoft.AspNetCore.WebUtilities private int _bufferCount = 0; private bool _disposed; + /// + /// Creates a new stream. + /// + /// The stream to wrap. + /// Size of buffer in bytes. public BufferedReadStream(Stream inner, int bufferSize) : this(inner, bufferSize, ArrayPool.Shared) { } + /// + /// Creates a new stream. + /// + /// The stream to wrap. + /// Size of buffer in bytes. + /// ArrayPool for the buffer. public BufferedReadStream(Stream inner, int bufferSize, ArrayPool bytePool) { if (inner == null) @@ -39,36 +54,45 @@ namespace Microsoft.AspNetCore.WebUtilities _buffer = bytePool.Rent(bufferSize); } + /// + /// The currently buffered data. + /// public ArraySegment BufferedData { get { return new ArraySegment(_buffer, _bufferOffset, _bufferCount); } } + /// public override bool CanRead { get { return _inner.CanRead || _bufferCount > 0; } } + /// public override bool CanSeek { get { return _inner.CanSeek; } } + /// public override bool CanTimeout { get { return _inner.CanTimeout; } } + /// public override bool CanWrite { get { return _inner.CanWrite; } } + /// public override long Length { get { return _inner.Length; } } + /// public override long Position { get { return _inner.Position - _bufferCount; } @@ -112,6 +136,7 @@ namespace Microsoft.AspNetCore.WebUtilities } } + /// public override long Seek(long offset, SeekOrigin origin) { if (origin == SeekOrigin.Begin) @@ -129,11 +154,13 @@ namespace Microsoft.AspNetCore.WebUtilities return Position; } + /// public override void SetLength(long value) { _inner.SetLength(value); } + /// protected override void Dispose(bool disposing) { if (!_disposed) @@ -148,26 +175,31 @@ namespace Microsoft.AspNetCore.WebUtilities } } + /// public override void Flush() { _inner.Flush(); } + /// public override Task FlushAsync(CancellationToken cancellationToken) { return _inner.FlushAsync(cancellationToken); } + /// public override void Write(byte[] buffer, int offset, int count) { _inner.Write(buffer, offset, count); } + /// public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { return _inner.WriteAsync(buffer, offset, count, cancellationToken); } + /// public override int Read(byte[] buffer, int offset, int count) { ValidateBuffer(buffer, offset, count); @@ -185,6 +217,7 @@ namespace Microsoft.AspNetCore.WebUtilities return _inner.Read(buffer, offset, count); } + /// public async override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { ValidateBuffer(buffer, offset, count); @@ -202,6 +235,10 @@ namespace Microsoft.AspNetCore.WebUtilities return await _inner.ReadAsync(buffer, offset, count, cancellationToken); } + /// + /// Ensures that the buffer is not empty. + /// + /// Returns true if the buffer is not empty; false otherwise. public bool EnsureBuffered() { if (_bufferCount > 0) @@ -214,6 +251,11 @@ namespace Microsoft.AspNetCore.WebUtilities return _bufferCount > 0; } + /// + /// Ensures that the buffer is not empty. + /// + /// Cancellation token. + /// Returns true if the buffer is not empty; false otherwise. public async Task EnsureBufferedAsync(CancellationToken cancellationToken) { if (_bufferCount > 0) @@ -226,6 +268,11 @@ namespace Microsoft.AspNetCore.WebUtilities return _bufferCount > 0; } + /// + /// Ensures that a minimum amount of buffered data is available. + /// + /// Minimum amount of buffered data. + /// Returns true if the minimum amount of buffered data is available; false otherwise. public bool EnsureBuffered(int minCount) { if (minCount > _buffer.Length) @@ -253,6 +300,12 @@ namespace Microsoft.AspNetCore.WebUtilities return true; } + /// + /// Ensures that a minimum amount of buffered data is available. + /// + /// Minimum amount of buffered data. + /// Cancellation token. + /// Returns true if the minimum amount of buffered data is available; false otherwise. public async Task EnsureBufferedAsync(int minCount, CancellationToken cancellationToken) { if (minCount > _buffer.Length) @@ -280,6 +333,13 @@ namespace Microsoft.AspNetCore.WebUtilities return true; } + /// + /// Reads a line. A line is defined as a sequence of characters followed by + /// a carriage return immediately followed by a line feed. The resulting string does not + /// contain the terminating carriage return and line feed. + /// + /// Maximum allowed line length. + /// A line. public string ReadLine(int lengthLimit) { CheckDisposed(); @@ -300,6 +360,14 @@ namespace Microsoft.AspNetCore.WebUtilities } } + /// + /// Reads a line. A line is defined as a sequence of characters followed by + /// a carriage return immediately followed by a line feed. The resulting string does not + /// contain the terminating carriage return and line feed. + /// + /// Maximum allowed line length. + /// Cancellation token. + /// A line. public async Task ReadLineAsync(int lengthLimit, CancellationToken cancellationToken) { CheckDisposed(); From b97e40ff7dde747a743fe6eea818c8061aa06541 Mon Sep 17 00:00:00 2001 From: "Nate McMaster (automated)" Date: Wed, 28 Mar 2018 10:45:35 -0700 Subject: [PATCH 829/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 30 +++++++++++++++--------------- korebuild-lock.txt | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 2fd4823f38..fd6a5883a1 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview2-15743 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 - 2.1.0-preview2-30355 + 2.1.0-preview2-15749 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 + 2.1.0-preview2-30478 2.0.0 - 2.1.0-preview2-26314-02 - 15.6.0 + 2.1.0-preview2-26326-03 + 15.6.1 4.7.49 - 4.5.0-preview2-26313-01 - 4.5.0-preview2-26313-01 + 4.5.0-preview2-26326-04 + 4.5.0-preview2-26326-04 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 58dd4d4306..b8e036fe2c 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview2-15743 -commithash:9e15cb6062ab5b9790d3fa699e018543a6950713 +version:2.1.0-preview2-15749 +commithash:5544c9ab20fa5e24b9e155d8958a3c3b6f5f9df9 From ce49e95239cfca6f857716082fda767ee6590bf3 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Tue, 3 Apr 2018 22:27:07 +0000 Subject: [PATCH 830/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 28 ++++++++++++++-------------- korebuild-lock.txt | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index a3c842b01e..d86c59afcd 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview3-17001 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 - 2.1.0-preview3-32037 + 2.1.0-preview3-17002 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 + 2.1.0-preview3-32110 2.0.0 - 2.1.0-preview2-26314-02 + 2.1.0-preview3-26331-01 15.6.1 4.7.49 - 4.5.0-preview2-26313-01 - 4.5.0-preview2-26313-01 + 4.5.0-preview3-26331-02 + 4.5.0-preview3-26331-02 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 3a326c7d58..b3af0b8bce 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview3-17001 -commithash:dda68c56abf0d3b911fe6a2315872c446b314585 +version:2.1.0-preview3-17002 +commithash:b8e4e6ab104adc94c0719bb74229870e9b584a7f From a6bdb9b1ec6ed99978a508e71a7f131be7e4d9fb Mon Sep 17 00:00:00 2001 From: Nate Barbettini Date: Fri, 6 Apr 2018 08:09:48 -0700 Subject: [PATCH 831/846] Fix typos in code documentation (#1012) * Fix typos in code documentation * Add missing detail to code documentation --- .../HttpRequest.cs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs index 8df33f62ad..a4337b7766 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs @@ -18,13 +18,13 @@ namespace Microsoft.AspNetCore.Http public abstract HttpContext HttpContext { get; } /// - /// Gets or set the HTTP method. + /// Gets or sets the HTTP method. /// /// The HTTP method. public abstract string Method { get; set; } /// - /// Gets or set the HTTP request scheme. + /// Gets or sets the HTTP request scheme. /// /// The HTTP request scheme. public abstract string Scheme { get; set; } @@ -36,25 +36,25 @@ namespace Microsoft.AspNetCore.Http public abstract bool IsHttps { get; set; } /// - /// Gets or set the Host header. May include the port. + /// Gets or sets the Host header. May include the port. /// /// The Host header. public abstract HostString Host { get; set; } /// - /// Gets or set the RequestPathBase. + /// Gets or sets the RequestPathBase. /// /// The RequestPathBase. public abstract PathString PathBase { get; set; } /// - /// Gets or set the request path from RequestPath. + /// Gets or sets the request path from RequestPath. /// /// The request path from RequestPath. public abstract PathString Path { get; set; } /// - /// Gets or set the raw query string used to create the query collection in Request.Query. + /// Gets or sets the raw query string used to create the query collection in Request.Query. /// /// The raw query string. public abstract QueryString QueryString { get; set; } @@ -66,7 +66,7 @@ namespace Microsoft.AspNetCore.Http public abstract IQueryCollection Query { get; set; } /// - /// Gets or set the RequestProtocol. + /// Gets or sets the RequestProtocol. /// /// The RequestProtocol. public abstract string Protocol { get; set; } @@ -84,8 +84,9 @@ namespace Microsoft.AspNetCore.Http public abstract IRequestCookieCollection Cookies { get; set; } /// - /// Gets or sets the Content-Length header + /// Gets or sets the Content-Length header. /// + /// The value of the Content-Length header, if any. public abstract long? ContentLength { get; set; } /// @@ -95,14 +96,15 @@ namespace Microsoft.AspNetCore.Http public abstract string ContentType { get; set; } /// - /// Gets or set the RequestBody Stream. + /// Gets or sets the RequestBody Stream. /// /// The RequestBody Stream. public abstract Stream Body { get; set; } /// - /// Checks the content-type header for form types. + /// Checks the Content-Type header for form types. /// + /// true if the Content-Type header represents a form content type; otherwise, false. public abstract bool HasFormContentType { get; } /// From a5743b2fd4ee099cfe068c3c9819959c13340c20 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Sun, 15 Apr 2018 14:10:15 -0700 Subject: [PATCH 832/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 28 ++++++++++++++-------------- korebuild-lock.txt | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index d86c59afcd..2394821843 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,23 +3,23 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview3-17002 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 - 2.1.0-preview3-32110 + 2.1.0-preview3-17018 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 + 2.1.0-preview3-32233 2.0.0 - 2.1.0-preview3-26331-01 + 2.1.0-preview3-26413-05 15.6.1 4.7.49 - 4.5.0-preview3-26331-02 - 4.5.0-preview3-26331-02 + 4.5.0-preview3-26413-02 + 4.5.0-preview3-26413-02 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index b3af0b8bce..b419d767b9 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview3-17002 -commithash:b8e4e6ab104adc94c0719bb74229870e9b584a7f +version:2.1.0-preview3-17018 +commithash:af264ca131f212b5ba8aafbc5110fc0fc510a2be From e7055a11aec055799a49032635a2d4f0a9a5bb76 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Mon, 16 Apr 2018 16:57:39 -0700 Subject: [PATCH 833/846] Branching for 2.1.0-rc1 --- build/repo.props | 3 ++- korebuild.json | 4 ++-- version.props | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build/repo.props b/build/repo.props index 78b0ce5879..dab1601c88 100644 --- a/build/repo.props +++ b/build/repo.props @@ -1,9 +1,10 @@ - + Internal.AspNetCore.Universe.Lineup + 2.1.0-rc1-* https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json diff --git a/korebuild.json b/korebuild.json index bd5d51a51b..678d8bb948 100644 --- a/korebuild.json +++ b/korebuild.json @@ -1,4 +1,4 @@ { - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", - "channel": "dev" + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/release/2.1/tools/korebuild.schema.json", + "channel": "release/2.1" } diff --git a/version.props b/version.props index 24f2b00a0a..e27532787e 100644 --- a/version.props +++ b/version.props @@ -1,7 +1,7 @@ 2.1.0 - preview3 + rc1 $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final t000 From 7ddbde8b689cafba0236fd749cb04371cf78e5a9 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 19 Apr 2018 16:39:19 -0700 Subject: [PATCH 834/846] Set NETStandardImplicitPackageVersion via dependencies.props --- Directory.Build.targets | 1 + build/dependencies.props | 1 + 2 files changed, 2 insertions(+) diff --git a/Directory.Build.targets b/Directory.Build.targets index 894b1d0cf8..53b3f6e1da 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -2,5 +2,6 @@ $(MicrosoftNETCoreApp20PackageVersion) $(MicrosoftNETCoreApp21PackageVersion) + $(NETStandardLibrary20PackageVersion) diff --git a/build/dependencies.props b/build/dependencies.props index 2394821843..f921daa167 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -17,6 +17,7 @@ 2.0.0 2.1.0-preview3-26413-05 15.6.1 + 2.0.1 4.7.49 4.5.0-preview3-26413-02 4.5.0-preview3-26413-02 From ae960c06e5f8b50019c837c9ed1c26e317bb515b Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Thu, 19 Apr 2018 22:22:03 -0700 Subject: [PATCH 835/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 30 +++++++++++++++--------------- korebuild-lock.txt | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index f921daa167..a69c09b8d9 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,24 +3,24 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-preview3-17018 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 - 2.1.0-preview3-32233 + 2.1.0-rc1-15774 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 + 2.1.0-rc1-30613 2.0.0 - 2.1.0-preview3-26413-05 + 2.1.0-rc1-26419-02 15.6.1 - 2.0.1 4.7.49 - 4.5.0-preview3-26413-02 - 4.5.0-preview3-26413-02 + 2.0.1 + 4.5.0-rc1-26419-03 + 4.5.0-rc1-26419-03 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index b419d767b9..9d4ef8c888 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-preview3-17018 -commithash:af264ca131f212b5ba8aafbc5110fc0fc510a2be +version:2.1.0-rc1-15774 +commithash:ed5ca9de3c652347dbb0158a9a65eff3471d2114 From 65228ea374f497e9487c0528a23f509f42ff313b Mon Sep 17 00:00:00 2001 From: "Nate McMaster (automated)" Date: Mon, 30 Apr 2018 14:51:40 -0700 Subject: [PATCH 836/846] Bump version to 2.1.0-rtm --- version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.props b/version.props index e27532787e..b9552451d8 100644 --- a/version.props +++ b/version.props @@ -1,7 +1,7 @@ 2.1.0 - rc1 + rtm $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final t000 From 95a44cda4b956a8a57115be2a9b564b0961f5577 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Fri, 4 May 2018 07:35:31 -0700 Subject: [PATCH 837/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 30 +++++++++++++++--------------- korebuild-lock.txt | 4 ++-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index a69c09b8d9..54c870b9d5 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,24 +3,24 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-rc1-15774 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 - 2.1.0-rc1-30613 + 2.1.0-rtm-15783 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 + 2.1.0-rtm-30721 2.0.0 - 2.1.0-rc1-26419-02 + 2.1.0-rtm-26502-02 15.6.1 4.7.49 - 2.0.1 - 4.5.0-rc1-26419-03 - 4.5.0-rc1-26419-03 + 2.0.3 + 4.5.0-rtm-26502-02 + 4.5.0-rtm-26502-02 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 9d4ef8c888..3673744db9 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-rc1-15774 -commithash:ed5ca9de3c652347dbb0158a9a65eff3471d2114 +version:2.1.0-rtm-15783 +commithash:5fc2b2f607f542a2ffde11c19825e786fc1a3774 From c08f32096762a586a32c19b5ca2b8f9ab2387a32 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Tue, 29 May 2018 09:38:22 -0700 Subject: [PATCH 838/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 28 ++++++++++++++-------------- korebuild-lock.txt | 4 ++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 54c870b9d5..da5bceefb2 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,24 +3,24 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.0-rtm-15783 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 - 2.1.0-rtm-30721 + 2.1.1-rtm-15790 + 2.1.0 + 2.1.0 + 2.1.0 + 2.1.0 + 2.1.0 + 2.1.0 + 2.1.0 + 2.1.0 + 2.1.0 + 2.1.0 2.0.0 - 2.1.0-rtm-26502-02 + 2.1.0 15.6.1 4.7.49 2.0.3 - 4.5.0-rtm-26502-02 - 4.5.0-rtm-26502-02 + 4.5.0 + 4.5.0 0.8.0 2.3.1 2.4.0-beta.1.build3945 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index 3673744db9..cd5b409a1e 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.0-rtm-15783 -commithash:5fc2b2f607f542a2ffde11c19825e786fc1a3774 +version:2.1.1-rtm-15790 +commithash:274c65868e735f29f4078c1884c61c4371ee1fc0 From b8be770d371134f8f6618212569ed69c341daffe Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 09:11:35 -0700 Subject: [PATCH 839/846] Bumping version from 2.1.0 to 2.1.1 --- version.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.props b/version.props index b9552451d8..669c874829 100644 --- a/version.props +++ b/version.props @@ -1,6 +1,6 @@ - + - 2.1.0 + 2.1.1 rtm $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final From f47b5e9f9e29c16f002c86de6d908bafd4cd9783 Mon Sep 17 00:00:00 2001 From: "ASP.NET CI" Date: Tue, 12 Jun 2018 19:20:15 +0000 Subject: [PATCH 840/846] Update dependencies.props [auto-updated: dependencies] --- build/dependencies.props | 22 +++++++++++----------- korebuild-lock.txt | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index da5bceefb2..b377e30cdb 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,19 +3,19 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.1.1-rtm-15790 + 2.1.1-rtm-15793 2.1.0 - 2.1.0 - 2.1.0 - 2.1.0 - 2.1.0 - 2.1.0 - 2.1.0 - 2.1.0 - 2.1.0 - 2.1.0 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 2.0.0 - 2.1.0 + 2.1.1 15.6.1 4.7.49 2.0.3 diff --git a/korebuild-lock.txt b/korebuild-lock.txt index cd5b409a1e..bc84e0cd53 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.1-rtm-15790 -commithash:274c65868e735f29f4078c1884c61c4371ee1fc0 +version:2.1.1-rtm-15793 +commithash:988313f4b064d6c69fc6f7b845b6384a6af3447a From c367db622679b25f9b511c55e57d19a622d8a091 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Wed, 13 Jun 2018 10:55:33 -0700 Subject: [PATCH 841/846] Set 2.1 baselines --- .../baseline.netcore.json | 66 ++- .../baseline.netcore.json | 23 +- .../baseline.netcore.json | 118 +++- .../baseline.netcore.json | 544 +++++++++++------- .../baseline.netcore.json | 62 +- .../baseline.netcore.json | 386 ++++++++++++- .../baseline.netcore.json | 284 ++++++++- 7 files changed, 1228 insertions(+), 255 deletions(-) diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json index d7ef172836..f407fb08e6 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Builder.MapExtensions", @@ -910,6 +910,52 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_MaxAge", + "Parameters": [], + "ReturnType": "System.Nullable", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MaxAge", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsEssential", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsEssential", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "Build", @@ -1408,6 +1454,24 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "MatchesAny", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringSegment" + }, + { + "Name": "patterns", + "Type": "System.Collections.Generic.IList" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "Equals", diff --git a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json index 92a4a49478..286133ea54 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Extensions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Http.HeaderDictionaryTypeExtensions", @@ -772,6 +772,27 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_Referer", + "Parameters": [], + "ReturnType": "System.Uri", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Referer", + "Parameters": [ + { + "Name": "value", + "Type": "System.Uri" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "Get", diff --git a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json index 9fa1b94894..6af2ceccf9 100644 --- a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http.Features, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Http.CookieOptions", @@ -133,6 +133,48 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_MaxAge", + "Parameters": [], + "ReturnType": "System.Nullable", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_MaxAge", + "Parameters": [ + { + "Name": "value", + "Type": "System.Nullable" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsEssential", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_IsEssential", + "Parameters": [ + { + "Name": "value", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Constructor", "Name": ".ctor", @@ -807,6 +849,17 @@ "Microsoft.AspNetCore.Http.Features.IFeatureCollection" ], "Members": [ + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_Revision", @@ -864,17 +917,6 @@ "Visibility": "Public", "GenericParameter": [] }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerator>", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerable>", - "Visibility": "Public", - "GenericParameter": [] - }, { "Kind": "Method", "Name": "Get", @@ -2122,6 +2164,58 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.Features.ITrackingConsentFeature", + "Visibility": "Public", + "Kind": "Interface", + "Abstract": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_IsConsentNeeded", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_HasConsent", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanTrack", + "Parameters": [], + "ReturnType": "System.Boolean", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "GrantConsent", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WithdrawConsent", + "Parameters": [], + "ReturnType": "System.Void", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CreateConsentCookie", + "Parameters": [], + "ReturnType": "System.String", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.Features.Authentication.AuthenticateContext", "Visibility": "Public", diff --git a/src/Microsoft.AspNetCore.Http/baseline.netcore.json b/src/Microsoft.AspNetCore.Http/baseline.netcore.json index 0f2f607f6f..932bd2b6e4 100644 --- a/src/Microsoft.AspNetCore.Http/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Http/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Http, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Http.DefaultHttpContext", @@ -388,6 +388,94 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.Http.HttpRequestRewindExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "EnableBuffering", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnableBuffering", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "bufferThreshold", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnableBuffering", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "bufferLimit", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnableBuffering", + "Parameters": [ + { + "Name": "request", + "Type": "Microsoft.AspNetCore.Http.HttpRequest" + }, + { + "Name": "bufferThreshold", + "Type": "System.Int32" + }, + { + "Name": "bufferLimit", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.FormCollection", "Visibility": "Public", @@ -528,6 +616,202 @@ "Microsoft.AspNetCore.Http.IHeaderDictionary" ], "Members": [ + { + "Kind": "Method", + "Name": "get_Keys", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Values", + "Parameters": [], + "ReturnType": "System.Collections.Generic.ICollection", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ContainsKey", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "TryGetValue", + "Parameters": [ + { + "Name": "key", + "Type": "System.String" + }, + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringValues", + "Direction": "Out" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Count", + "Parameters": [], + "ReturnType": "System.Int32", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_IsReadOnly", + "Parameters": [], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Add", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Clear", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Contains", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "CopyTo", + "Parameters": [ + { + "Name": "array", + "Type": "System.Collections.Generic.KeyValuePair[]" + }, + { + "Name": "arrayIndex", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Remove", + "Parameters": [ + { + "Name": "item", + "Type": "System.Collections.Generic.KeyValuePair" + } + ], + "ReturnType": "System.Boolean", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.ICollection>", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_Item", @@ -593,197 +877,14 @@ }, { "Kind": "Method", - "Name": "get_Count", - "Parameters": [], - "ReturnType": "System.Int32", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_IsReadOnly", - "Parameters": [], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Keys", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "get_Values", - "Parameters": [], - "ReturnType": "System.Collections.Generic.ICollection", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", + "Name": "set_IsReadOnly", "Parameters": [ - { - "Name": "item", - "Type": "System.Collections.Generic.KeyValuePair" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Add", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, { "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues" + "Type": "System.Boolean" } ], "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Clear", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Contains", - "Parameters": [ - { - "Name": "item", - "Type": "System.Collections.Generic.KeyValuePair" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "ContainsKey", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "CopyTo", - "Parameters": [ - { - "Name": "array", - "Type": "System.Collections.Generic.KeyValuePair[]" - }, - { - "Name": "arrayIndex", - "Type": "System.Int32" - } - ], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Remove", - "Parameters": [ - { - "Name": "item", - "Type": "System.Collections.Generic.KeyValuePair" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.ICollection>", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Remove", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "TryGetValue", - "Parameters": [ - { - "Name": "key", - "Type": "System.String" - }, - { - "Name": "value", - "Type": "Microsoft.Extensions.Primitives.StringValues", - "Direction": "Out" - } - ], - "ReturnType": "System.Boolean", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IDictionary", "Visibility": "Public", "GenericParameter": [] }, @@ -2561,6 +2662,33 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.Extensions.DependencyInjection.HttpServiceCollectionExtensions", + "Visibility": "Public", + "Kind": "Class", + "Abstract": true, + "Static": true, + "Sealed": true, + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "AddHttpContextAccessor", + "Parameters": [ + { + "Name": "services", + "Type": "Microsoft.Extensions.DependencyInjection.IServiceCollection" + } + ], + "ReturnType": "Microsoft.Extensions.DependencyInjection.IServiceCollection", + "Static": true, + "Extension": true, + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.Http.FormCollection+Enumerator", "Visibility": "Public", @@ -2570,6 +2698,17 @@ "System.Collections.Generic.IEnumerator>" ], "Members": [ + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "MoveNext", @@ -2591,17 +2730,6 @@ "ImplementedInterface": "System.Collections.Generic.IEnumerator>", "Visibility": "Public", "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] } ], "GenericParameters": [] @@ -2615,6 +2743,17 @@ "System.Collections.Generic.IEnumerator>" ], "Members": [ + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "MoveNext", @@ -2636,17 +2775,6 @@ "ImplementedInterface": "System.Collections.Generic.IEnumerator>", "Visibility": "Public", "GenericParameter": [] - }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] } ], "GenericParameters": [] diff --git a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json index 50b5847f9e..8211307418 100644 --- a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.Owin/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.Owin, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.Builder.OwinExtensions", @@ -160,14 +160,6 @@ "System.Collections.Generic.IDictionary" ], "Members": [ - { - "Kind": "Method", - "Name": "get_FeatureMaps", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IDictionary", - "Visibility": "Public", - "GenericParameter": [] - }, { "Kind": "Method", "Name": "GetEnumerator", @@ -179,6 +171,14 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_FeatureMaps", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IDictionary", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Constructor", "Name": ".ctor", @@ -257,6 +257,17 @@ "Microsoft.AspNetCore.Owin.IOwinEnvironmentFeature" ], "Members": [ + { + "Kind": "Method", + "Name": "GetEnumerator", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerator>", + "Sealed": true, + "Virtual": true, + "ImplementedInterface": "System.Collections.Generic.IEnumerable>", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_Environment", @@ -432,17 +443,6 @@ } ] }, - { - "Kind": "Method", - "Name": "GetEnumerator", - "Parameters": [], - "ReturnType": "System.Collections.Generic.IEnumerator>", - "Sealed": true, - "Virtual": true, - "ImplementedInterface": "System.Collections.Generic.IEnumerable>", - "Visibility": "Public", - "GenericParameter": [] - }, { "Kind": "Method", "Name": "Dispose", @@ -558,6 +558,17 @@ "BaseType": "System.Net.WebSockets.WebSocket", "ImplementedInterfaces": [], "Members": [ + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "ImplementedInterface": "System.IDisposable", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_CloseStatus", @@ -700,17 +711,6 @@ "Visibility": "Public", "GenericParameter": [] }, - { - "Kind": "Method", - "Name": "Dispose", - "Parameters": [], - "ReturnType": "System.Void", - "Virtual": true, - "Override": true, - "ImplementedInterface": "System.IDisposable", - "Visibility": "Public", - "GenericParameter": [] - }, { "Kind": "Constructor", "Name": ".ctor", diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json index e8334021d6..896fe0fcb3 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json +++ b/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.AspNetCore.WebUtilities, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.AspNetCore.WebUtilities.WebEncoders", @@ -213,6 +213,390 @@ ], "GenericParameters": [] }, + { + "Name": "Microsoft.AspNetCore.WebUtilities.BufferedReadStream", + "Visibility": "Public", + "Kind": "Class", + "BaseType": "System.IO.Stream", + "ImplementedInterfaces": [], + "Members": [ + { + "Kind": "Method", + "Name": "get_BufferedData", + "Parameters": [], + "ReturnType": "System.ArraySegment", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanRead", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanSeek", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanTimeout", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_CanWrite", + "Parameters": [], + "ReturnType": "System.Boolean", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Length", + "Parameters": [], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Position", + "Parameters": [], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "set_Position", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Seek", + "Parameters": [ + { + "Name": "offset", + "Type": "System.Int64" + }, + { + "Name": "origin", + "Type": "System.IO.SeekOrigin" + } + ], + "ReturnType": "System.Int64", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetLength", + "Parameters": [ + { + "Name": "value", + "Type": "System.Int64" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Dispose", + "Parameters": [ + { + "Name": "disposing", + "Type": "System.Boolean" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Protected", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Flush", + "Parameters": [], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "FlushAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Write", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Void", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "WriteAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "Read", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Int32", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadAsync", + "Parameters": [ + { + "Name": "buffer", + "Type": "System.Byte[]" + }, + { + "Name": "offset", + "Type": "System.Int32" + }, + { + "Name": "count", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Virtual": true, + "Override": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnsureBuffered", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnsureBufferedAsync", + "Parameters": [ + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnsureBuffered", + "Parameters": [ + { + "Name": "minCount", + "Type": "System.Int32" + } + ], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EnsureBufferedAsync", + "Parameters": [ + { + "Name": "minCount", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadLine", + "Parameters": [ + { + "Name": "lengthLimit", + "Type": "System.Int32" + } + ], + "ReturnType": "System.String", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "ReadLineAsync", + "Parameters": [ + { + "Name": "lengthLimit", + "Type": "System.Int32" + }, + { + "Name": "cancellationToken", + "Type": "System.Threading.CancellationToken" + } + ], + "ReturnType": "System.Threading.Tasks.Task", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + } + ], + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Constructor", + "Name": ".ctor", + "Parameters": [ + { + "Name": "inner", + "Type": "System.IO.Stream" + }, + { + "Name": "bufferSize", + "Type": "System.Int32" + }, + { + "Name": "bytePool", + "Type": "System.Buffers.ArrayPool" + } + ], + "Visibility": "Public", + "GenericParameter": [] + } + ], + "GenericParameters": [] + }, { "Name": "Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream", "Visibility": "Public", diff --git a/src/Microsoft.Net.Http.Headers/baseline.netcore.json b/src/Microsoft.Net.Http.Headers/baseline.netcore.json index b29b4825ee..476f8150a7 100644 --- a/src/Microsoft.Net.Http.Headers/baseline.netcore.json +++ b/src/Microsoft.Net.Http.Headers/baseline.netcore.json @@ -1,5 +1,5 @@ { - "AssemblyIdentity": "Microsoft.Net.Http.Headers, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", + "AssemblyIdentity": "Microsoft.Net.Http.Headers, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60", "Types": [ { "Name": "Microsoft.Net.Http.Headers.CacheControlHeaderValue", @@ -1511,6 +1511,94 @@ "Constant": true, "Literal": "\"Accept-Ranges\"" }, + { + "Kind": "Field", + "Name": "AccessControlAllowCredentials", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Allow-Credentials\"" + }, + { + "Kind": "Field", + "Name": "AccessControlAllowHeaders", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Allow-Headers\"" + }, + { + "Kind": "Field", + "Name": "AccessControlAllowMethods", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Allow-Methods\"" + }, + { + "Kind": "Field", + "Name": "AccessControlAllowOrigin", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Allow-Origin\"" + }, + { + "Kind": "Field", + "Name": "AccessControlExposeHeaders", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Expose-Headers\"" + }, + { + "Kind": "Field", + "Name": "AccessControlMaxAge", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Max-Age\"" + }, + { + "Kind": "Field", + "Name": "AccessControlRequestHeaders", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Request-Headers\"" + }, + { + "Kind": "Field", + "Name": "AccessControlRequestMethod", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Access-Control-Request-Method\"" + }, { "Kind": "Field", "Name": "Age", @@ -1533,6 +1621,17 @@ "Constant": true, "Literal": "\"Allow\"" }, + { + "Kind": "Field", + "Name": "Authority", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\":authority\"" + }, { "Kind": "Field", "Name": "Authorization", @@ -1643,6 +1742,28 @@ "Constant": true, "Literal": "\"Content-Range\"" }, + { + "Kind": "Field", + "Name": "ContentSecurityPolicy", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Security-Policy\"" + }, + { + "Kind": "Field", + "Name": "ContentSecurityPolicyReportOnly", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Content-Security-Policy-Report-Only\"" + }, { "Kind": "Field", "Name": "ContentType", @@ -1819,6 +1940,39 @@ "Constant": true, "Literal": "\"Max-Forwards\"" }, + { + "Kind": "Field", + "Name": "Method", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\":method\"" + }, + { + "Kind": "Field", + "Name": "Origin", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Origin\"" + }, + { + "Kind": "Field", + "Name": "Path", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\":path\"" + }, { "Kind": "Field", "Name": "Pragma", @@ -1885,6 +2039,17 @@ "Constant": true, "Literal": "\"Retry-After\"" }, + { + "Kind": "Field", + "Name": "Scheme", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\":scheme\"" + }, { "Kind": "Field", "Name": "Server", @@ -1907,6 +2072,28 @@ "Constant": true, "Literal": "\"Set-Cookie\"" }, + { + "Kind": "Field", + "Name": "Status", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\":status\"" + }, + { + "Kind": "Field", + "Name": "StrictTransportSecurity", + "Parameters": [], + "ReturnType": "System.String", + "Static": true, + "Visibility": "Public", + "GenericParameter": [], + "Constant": true, + "Literal": "\"Strict-Transport-Security\"" + }, { "Kind": "Field", "Name": "TE", @@ -2220,6 +2407,48 @@ "Static": true, "Visibility": "Public", "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "IsQuoted", + "Parameters": [ + { + "Name": "input", + "Type": "Microsoft.Extensions.Primitives.StringSegment" + } + ], + "ReturnType": "System.Boolean", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "UnescapeAsQuotedString", + "Parameters": [ + { + "Name": "input", + "Type": "Microsoft.Extensions.Primitives.StringSegment" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "EscapeAsQuotedString", + "Parameters": [ + { + "Name": "input", + "Type": "Microsoft.Extensions.Primitives.StringSegment" + } + ], + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", + "Static": true, + "Visibility": "Public", + "GenericParameter": [] } ], "GenericParameters": [] @@ -2359,6 +2588,30 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_SubTypeWithoutSuffix", + "Parameters": [], + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Suffix", + "Parameters": [], + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "get_Facets", + "Parameters": [], + "ReturnType": "System.Collections.Generic.IEnumerable", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_MatchesAllTypes", @@ -2375,6 +2628,14 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "get_MatchesAllSubTypesWithoutSuffix", + "Parameters": [], + "ReturnType": "System.Boolean", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "get_IsReadOnly", @@ -2701,6 +2962,27 @@ "Visibility": "Public", "GenericParameter": [] }, + { + "Kind": "Method", + "Name": "GetUnescapedValue", + "Parameters": [], + "ReturnType": "Microsoft.Extensions.Primitives.StringSegment", + "Visibility": "Public", + "GenericParameter": [] + }, + { + "Kind": "Method", + "Name": "SetAndEscapeValue", + "Parameters": [ + { + "Name": "value", + "Type": "Microsoft.Extensions.Primitives.StringSegment" + } + ], + "ReturnType": "System.Void", + "Visibility": "Public", + "GenericParameter": [] + }, { "Kind": "Method", "Name": "Parse", From 78ce5dd2bef4e4d37fb23d2b76770421196e1085 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 27 Jun 2018 13:39:46 -0700 Subject: [PATCH 842/846] Bumping version from 2.1.1 to 2.1.2 --- version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.props b/version.props index 669c874829..478dfd16ed 100644 --- a/version.props +++ b/version.props @@ -1,6 +1,6 @@  - 2.1.1 + 2.1.2 rtm $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final From 6c98513f8384e550caa4da723d7fe9836b49ada5 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 11 Jul 2018 15:06:32 -0700 Subject: [PATCH 843/846] Reverting version from 2.1.2 back to 2.1.1 As a result of changing the way we apply servicing updates to aspnet core, this repo did not need the version bump because there are no planned product changes in this repo. --- version.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.props b/version.props index 478dfd16ed..669c874829 100644 --- a/version.props +++ b/version.props @@ -1,6 +1,6 @@  - 2.1.2 + 2.1.1 rtm $(VersionPrefix) $(VersionPrefix)-$(VersionSuffix)-final From a0bed5536afe46835be2856fdfb1212c26a4e391 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 11 Jul 2018 18:48:40 -0700 Subject: [PATCH 844/846] Updating dependencies to 2.1.2 and adding a section for pinned variable versions --- build/dependencies.props | 13 ++++++++++--- korebuild-lock.txt | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index b377e30cdb..fa1b1d7ea7 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -2,8 +2,10 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - 2.1.1-rtm-15793 + + + + 2.1.3-rtm-15802 2.1.0 2.1.1 2.1.1 @@ -15,7 +17,7 @@ 2.1.1 2.1.1 2.0.0 - 2.1.1 + 2.1.2 15.6.1 4.7.49 2.0.3 @@ -25,5 +27,10 @@ 2.3.1 2.4.0-beta.1.build3945 + + + + + diff --git a/korebuild-lock.txt b/korebuild-lock.txt index bc84e0cd53..251c227c83 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.1.1-rtm-15793 -commithash:988313f4b064d6c69fc6f7b845b6384a6af3447a +version:2.1.3-rtm-15802 +commithash:a7c08b45b440a7d2058a0aa1eaa3eb6ba811976a From d142d58eb43626961117136c51993d51dfb7371d Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 12 Jul 2018 11:53:31 -0700 Subject: [PATCH 845/846] Pin version variables to the ASP.NET Core 2.1.2 baseline This reverts our previous policy of cascading versions on all servicing updates. This moves variables into the 'pinned' section, and points them to the latest stable release (versions that were used at the time of the 2.1.2 release). --- build/dependencies.props | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index fa1b1d7ea7..6e61a4cb93 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -4,18 +4,8 @@ - + 2.1.3-rtm-15802 - 2.1.0 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 2.0.0 2.1.2 15.6.1 @@ -32,5 +22,16 @@ - - + + 2.1.0 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + 2.1.1 + + \ No newline at end of file From 0ef9993f46bff1ea7a9c4cc7c9fa6f603d065d20 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 19 Nov 2018 21:12:01 -0800 Subject: [PATCH 846/846] Reorganize source code in preparation to move into aspnet/AspNetCore Prior to reorganization, this source code was found in https://github.com/aspnet/http/tree/d142d58eb43626961117136c51993d51dfb7371d --- .appveyor.yml | 17 - .gitattributes | 52 --- .github/ISSUE_TEMPLATE.md | 3 - .gitignore | 32 -- .travis.yml | 27 -- CONTRIBUTING.md | 4 - Directory.Build.props | 20 -- Directory.Build.targets | 7 - HttpAbstractions.sln | 303 ------------------ LICENSE.txt | 14 - NuGet.config | 7 - NuGetPackageVerifier.json | 7 - README.md | 15 - build.cmd | 2 - build.sh | 8 - build/Key.snk | Bin 596 -> 0 bytes build/dependencies.props | 37 --- build/repo.props | 15 - build/sources.props | 17 - korebuild-lock.txt | 2 - korebuild.json | 4 - run.cmd | 2 - run.ps1 | 196 ----------- run.sh | 231 ------------- samples/SampleApp/SampleApp.csproj | 13 - src/Directory.Build.props | 7 - .../src}/AuthenticateResult.cs | 0 .../AuthenticationHttpContextExtensions.cs | 0 .../src}/AuthenticationOptions.cs | 0 .../src}/AuthenticationProperties.cs | 0 .../src}/AuthenticationScheme.cs | 0 .../src}/AuthenticationSchemeBuilder.cs | 0 .../src}/AuthenticationTicket.cs | 0 .../src}/AuthenticationToken.cs | 0 .../src}/IAuthenticationFeature.cs | 0 .../src}/IAuthenticationHandler.cs | 0 .../src}/IAuthenticationHandlerProvider.cs | 0 .../src}/IAuthenticationRequestHandler.cs | 0 .../src}/IAuthenticationSchemeProvider.cs | 0 .../src}/IAuthenticationService.cs | 0 .../src}/IAuthenticationSignInHandler.cs | 0 .../src}/IAuthenticationSignOutHandler.cs | 0 .../src}/IClaimsTransformation.cs | 0 ...NetCore.Authentication.Abstractions.csproj | 9 +- .../src}/TokenExtensions.cs | 0 .../src}/baseline.netcore.json | 0 ...ticationCoreServiceCollectionExtensions.cs | 0 .../src}/AuthenticationFeature.cs | 0 .../src}/AuthenticationHandlerProvider.cs | 0 .../src}/AuthenticationSchemeProvider.cs | 0 .../src}/AuthenticationService.cs | 0 ...soft.AspNetCore.Authentication.Core.csproj | 6 +- .../src}/NoopClaimsTransformation.cs | 0 .../src}/baseline.netcore.json | 0 .../test}/AuthenticationPropertiesTests.cs | 0 .../AuthenticationSchemeProviderTests.cs | 0 .../test}/AuthenticationServiceTests.cs | 0 ...AspNetCore.Authentication.Core.Test.csproj | 12 + .../test}/TokenExtensionTests.cs | 0 .../Headers/src}/BaseHeaderParser.cs | 0 .../Headers/src}/CacheControlHeaderValue.cs | 0 .../src}/ContentDispositionHeaderValue.cs | 0 ...ispositionHeaderValueIdentityExtensions.cs | 0 .../Headers/src}/ContentRangeHeaderValue.cs | 0 .../Headers/src}/CookieHeaderParser.cs | 0 .../Headers/src}/CookieHeaderValue.cs | 0 .../Headers/src}/DateTimeFormatter.cs | 0 .../Headers/src}/EntityTagHeaderValue.cs | 0 .../Headers/src}/GenericHeaderParser.cs | 0 .../Headers/src}/HeaderNames.cs | 0 .../Headers/src}/HeaderQuality.cs | 0 .../Headers/src}/HeaderUtilities.cs | 0 .../Headers/src}/HttpHeaderParser.cs | 0 .../Headers/src}/HttpParseResult.cs | 0 .../Headers/src}/HttpRuleParser.cs | 0 .../Headers/src}/MediaTypeHeaderValue.cs | 0 .../src}/MediaTypeHeaderValueComparer.cs | 0 .../src}/Microsoft.Net.Http.Headers.csproj | 4 +- .../Headers/src}/NameValueHeaderValue.cs | 0 .../Headers/src}/ObjectCollection.cs | 0 .../Headers/src}/Properties/AssemblyInfo.cs | 0 .../Headers/src}/RangeConditionHeaderValue.cs | 0 .../Headers/src}/RangeHeaderValue.cs | 0 .../Headers/src}/RangeItemHeaderValue.cs | 0 .../Headers/src}/SameSiteMode.cs | 0 .../Headers/src}/SetCookieHeaderValue.cs | 0 .../src}/StringWithQualityHeaderValue.cs | 0 .../StringWithQualityHeaderValueComparer.cs | 0 .../Headers/src}/baseline.netcore.json | 0 .../test}/CacheControlHeaderValueTest.cs | 0 .../ContentDispositionHeaderValueTest.cs | 0 .../test}/ContentRangeHeaderValueTest.cs | 0 .../Headers/test}/CookieHeaderValueTest.cs | 0 .../Http/Headers/test}/DateParserTest.cs | 0 .../Headers/test}/EntityTagHeaderValueTest.cs | 0 .../Http/Headers/test}/HeaderUtilitiesTest.cs | 0 .../MediaTypeHeaderValueComparerTests.cs | 0 .../Headers/test}/MediaTypeHeaderValueTest.cs | 0 .../Microsoft.Net.Http.Headers.Tests.csproj | 2 +- .../Headers/test}/NameValueHeaderValueTest.cs | 0 .../test}/RangeConditionHeaderValueTest.cs | 0 .../Headers/test}/RangeHeaderValueTest.cs | 0 .../Headers/test}/RangeItemHeaderValueTest.cs | 0 .../Headers/test}/SetCookieHeaderValueTest.cs | 0 ...tringWithQualityHeaderValueComparerTest.cs | 0 .../test}/StringWithQualityHeaderValueTest.cs | 0 .../src}/Authentication/AuthenticateInfo.cs | 0 .../AuthenticationDescription.cs | 0 .../Authentication/AuthenticationManager.cs | 0 .../AuthenticationProperties.cs | 0 .../Http.Abstractions/src}/ConnectionInfo.cs | 0 .../Http.Abstractions/src}/CookieBuilder.cs | 0 .../src}/CookieSecurePolicy.cs | 0 .../Extensions/HeaderDictionaryExtensions.cs | 0 .../HttpResponseWritingExtensions.cs | 0 .../src}/Extensions/MapExtensions.cs | 0 .../src}/Extensions/MapMiddleware.cs | 0 .../src}/Extensions/MapOptions.cs | 0 .../src}/Extensions/MapWhenExtensions.cs | 0 .../src}/Extensions/MapWhenMiddleware.cs | 0 .../src}/Extensions/MapWhenOptions.cs | 0 .../src}/Extensions/RunExtensions.cs | 0 .../src}/Extensions/UseExtensions.cs | 0 .../Extensions/UseMiddlewareExtensions.cs | 0 .../src}/Extensions/UsePathBaseExtensions.cs | 0 .../src}/Extensions/UsePathBaseMiddleware.cs | 0 .../src}/Extensions/UseWhenExtensions.cs | 0 .../Http.Abstractions/src}/FragmentString.cs | 0 .../Http.Abstractions/src}/HostString.cs | 0 .../Http.Abstractions/src}/HttpContext.cs | 0 .../Http.Abstractions/src}/HttpMethods.cs | 0 .../Http.Abstractions/src}/HttpRequest.cs | 0 .../Http.Abstractions/src}/HttpResponse.cs | 0 .../src}/IApplicationBuilder.cs | 0 .../src}/IHttpContextAccessor.cs | 0 .../src}/IHttpContextFactory.cs | 0 .../Http.Abstractions/src}/IMiddleware.cs | 0 .../src}/IMiddlewareFactory.cs | 0 .../src}/Internal/HeaderSegment.cs | 0 .../src}/Internal/HeaderSegmentCollection.cs | 0 .../src}/Internal/HostStringHelper.cs | 0 .../src}/Internal/ParsingHelpers.cs | 0 .../src}/Internal/PathStringHelper.cs | 0 ...rosoft.AspNetCore.Http.Abstractions.csproj | 9 +- .../Http.Abstractions/src}/PathString.cs | 0 .../src}/Properties/AssemblyInfo.cs | 0 .../src}/Properties/Resources.Designer.cs | 0 .../Http.Abstractions/src}/QueryString.cs | 0 .../Http.Abstractions/src}/RequestDelegate.cs | 0 .../Http.Abstractions/src}/Resources.resx | 0 .../Http.Abstractions/src}/StatusCodes.cs | 0 .../src}/WebSocketManager.cs | 0 .../src}/baseline.netcore.json | 0 .../test}/CookieBuilderTests.cs | 0 .../test}/FragmentStringTests.cs | 0 .../Http.Abstractions/test}/HostStringTest.cs | 0 .../HttpResponseWritingExtensionsTests.cs | 0 .../test}/MapPathMiddlewareTests.cs | 0 .../test}/MapPredicateMiddlewareTests.cs | 0 ....AspNetCore.Http.Abstractions.Tests.csproj | 2 +- .../test}/PathStringTests.cs | 0 .../test}/QueryStringTests.cs | 0 .../test}/UseMiddlewareTest.cs | 0 .../test}/UsePathBaseExtensionsTests.cs | 0 .../test}/UseWhenExtensionsTests.cs | 0 .../src}/HeaderDictionaryTypeExtensions.cs | 0 .../src}/HttpRequestMultipartExtensions.cs | 0 ...icrosoft.AspNetCore.Http.Extensions.csproj | 18 ++ .../Http.Extensions/src}/QueryBuilder.cs | 0 .../Http.Extensions/src}/RequestHeaders.cs | 0 .../src}/ResponseExtensions.cs | 0 .../Http.Extensions/src}/ResponseHeaders.cs | 0 .../src}/SendFileResponseExtensions.cs | 0 .../Http.Extensions/src}/SessionExtensions.cs | 0 .../src}/StreamCopyOperation.cs | 0 .../Http.Extensions/src}/UriHelper.cs | 0 .../src}/baseline.netcore.json | 0 .../HeaderDictionaryTypeExtensionsTest.cs | 0 ...ft.AspNetCore.Http.Extensions.Tests.csproj | 13 + .../test}/QueryBuilderTests.cs | 0 .../test}/ResponseExtensionTests.cs | 0 .../test}/SendFileResponseExtensionsTests.cs | 0 .../Http.Extensions/test}/UriHelperTests.cs | 0 .../Authentication/AuthenticateContext.cs | 0 .../src}/Authentication/ChallengeBehavior.cs | 0 .../src}/Authentication/ChallengeContext.cs | 0 .../Authentication/DescribeSchemesContext.cs | 0 .../Authentication/IAuthenticationHandler.cs | 0 .../IHttpAuthenticationFeature.cs | 0 .../src}/Authentication/SignInContext.cs | 0 .../src}/Authentication/SignOutContext.cs | 0 .../Http.Features/src}/CookieOptions.cs | 0 .../Http.Features/src}/FeatureCollection.cs | 0 .../Http.Features/src}/FeatureReference.cs | 0 .../Http.Features/src}/FeatureReferences.cs | 0 .../Http.Features/src}/IFeatureCollection.cs | 0 .../Http.Features/src}/IFormCollection.cs | 0 .../Http.Features/src}/IFormFeature.cs | 0 .../Http.Features/src}/IFormFile.cs | 0 .../Http.Features/src}/IFormFileCollection.cs | 0 .../Http.Features/src}/IHeaderDictionary.cs | 0 .../src}/IHttpBodyControlFeature.cs | 0 .../src}/IHttpBufferingFeature.cs | 0 .../src}/IHttpConnectionFeature.cs | 0 .../src}/IHttpMaxRequestBodySizeFeature.cs | 0 .../Http.Features/src}/IHttpRequestFeature.cs | 0 .../src}/IHttpRequestIdentifierFeature.cs | 0 .../src}/IHttpRequestLifetimeFeature.cs | 0 .../src}/IHttpResponseFeature.cs | 0 .../src}/IHttpSendFileFeature.cs | 0 .../Http.Features/src}/IHttpUpgradeFeature.cs | 0 .../src}/IHttpWebSocketFeature.cs | 0 .../Http.Features/src}/IItemsFeature.cs | 0 .../Http.Features/src}/IQueryCollection.cs | 0 .../Http.Features/src}/IQueryFeature.cs | 0 .../src}/IRequestCookieCollection.cs | 0 .../src}/IRequestCookiesFeature.cs | 0 .../Http.Features/src}/IResponseCookies.cs | 0 .../src}/IResponseCookiesFeature.cs | 0 .../src}/IServiceProvidersFeature.cs | 0 .../Http.Features/src}/ISession.cs | 0 .../Http.Features/src}/ISessionFeature.cs | 0 .../src}/ITlsConnectionFeature.cs | 0 .../src}/ITlsTokenBindingFeature.cs | 0 .../src}/ITrackingConsentFeature.cs | 0 .../Microsoft.AspNetCore.Http.Features.csproj | 2 +- .../Http.Features/src}/SameSiteMode.cs | 0 .../src}/WebSocketAcceptContext.cs | 0 .../Http.Features/src}/baseline.netcore.json | 0 .../Authentication/AuthenticateContextTest.cs | 0 .../test}/FeatureCollectionTests.cs | 0 .../Http/Http.Features/test}/IThing.cs | 0 ...soft.AspNetCore.Http.Features.Tests.csproj | 2 +- .../Http/Http.Features/test}/Thing.cs | 0 .../DefaultAuthenticationManager.cs | 0 .../Http/src}/DefaultHttpContext.cs | 0 .../Extensions/HttpRequestRewindExtensions.cs | 0 .../HttpAuthenticationFeature.cs | 0 .../src}/Features/DefaultSessionFeature.cs | 0 .../Http/src}/Features/FormFeature.cs | 0 .../Http/src}/Features/FormOptions.cs | 0 .../src}/Features/HttpConnectionFeature.cs | 0 .../Http/src}/Features/HttpRequestFeature.cs | 0 .../Features/HttpRequestIdentifierFeature.cs | 0 .../Features/HttpRequestLifetimeFeature.cs | 0 .../Http/src}/Features/HttpResponseFeature.cs | 0 .../Http/src}/Features/ItemsFeature.cs | 0 .../Http/src}/Features/QueryFeature.cs | 0 .../src}/Features/RequestCookiesFeature.cs | 0 .../src}/Features/ResponseCookiesFeature.cs | 0 .../src}/Features/ServiceProvidersFeature.cs | 0 .../src}/Features/TlsConnectionFeature.cs | 0 .../Http/src}/FormCollection.cs | 0 .../Http/src}/HeaderDictionary.cs | 0 .../Http/src}/HttpContextAccessor.cs | 0 .../Http/src}/HttpContextFactory.cs | 0 .../src}/HttpServiceCollectionExtensions.cs | 0 .../Http/src}/Internal/ApplicationBuilder.cs | 0 .../Http/src}/Internal/BindingAddress.cs | 0 .../Http/src}/Internal/BufferingHelper.cs | 0 .../Http/src}/Internal/Constants.cs | 0 .../src}/Internal/DefaultConnectionInfo.cs | 0 .../Http/src}/Internal/DefaultHttpRequest.cs | 0 .../Http/src}/Internal/DefaultHttpResponse.cs | 0 .../src}/Internal/DefaultWebSocketManager.cs | 0 .../Http/src}/Internal/FormFile.cs | 0 .../Http/src}/Internal/FormFileCollection.cs | 0 .../Http/src}/Internal/ItemsDictionary.cs | 0 .../Http/src}/Internal/QueryCollection.cs | 0 .../Http/src}/Internal/ReferenceReadStream.cs | 0 .../src}/Internal/RequestCookieCollection.cs | 0 .../Http/src}/Internal/ResponseCookies.cs | 0 .../Http/src/Microsoft.AspNetCore.Http.csproj | 21 ++ .../Http/src}/MiddlewareFactory.cs | 0 .../Http/src}/RequestFormReaderExtensions.cs | 0 .../Http/src}/baseline.netcore.json | 0 .../DefaultAuthenticationManagerTests.cs | 0 .../Http/test}/DefaultHttpContextTests.cs | 0 .../test}/Features/FakeResponseFeature.cs | 0 .../Http/test}/Features/FormFeatureTests.cs | 0 .../HttpRequestIdentifierFeatureTests.cs | 0 .../test}/Features/NonSeekableReadStream.cs | 0 .../Http/test}/Features/QueryFeatureTests.cs | 0 .../Http/Http/test}/HeaderDictionaryTests.cs | 0 .../Http/test}/HttpContextFactoryTests.cs | 0 .../HttpServiceCollectionExtensionsTests.cs | 0 .../test}/Internal/ApplicationBuilderTests.cs | 0 .../test}/Internal/BindingAddressTests.cs | 0 .../test}/Internal/BufferingHelperTests.cs | 0 .../test}/Internal/DefaultHttpRequestTests.cs | 0 .../Internal/DefaultHttpResponseTests.cs | 0 .../Microsoft.AspNetCore.Http.Tests.csproj | 12 + .../test}/RequestCookiesCollectionTests.cs | 0 .../Http/Http/test}/ResponseCookiesTest.cs | 0 .../Owin/src}/DictionaryStringArrayWrapper.cs | 0 .../src}/DictionaryStringValuesWrapper.cs | 0 .../Owin/src}/IOwinEnvironmentFeature.cs | 0 .../src}/Microsoft.AspNetCore.Owin.csproj | 2 +- .../Owin/src}/OwinConstants.cs | 0 .../Owin/src}/OwinEnvironment.cs | 0 .../Owin/src}/OwinEnvironmentFeature.cs | 0 .../Owin/src}/OwinExtensions.cs | 0 .../Owin/src}/OwinFeatureCollection.cs | 0 .../Owin/src}/Utilities.cs | 0 .../WebSockets/OwinWebSocketAcceptAdapter.cs | 0 .../WebSockets/OwinWebSocketAcceptContext.cs | 0 .../src}/WebSockets/OwinWebSocketAdapter.cs | 0 .../src}/WebSockets/WebSocketAcceptAdapter.cs | 0 .../Owin/src}/WebSockets/WebSocketAdapter.cs | 0 .../Owin/src}/baseline.netcore.json | 0 .../Microsoft.AspNetCore.Owin.Tests.csproj | 13 + .../Http/Owin/test}/OwinEnvironmentTests.cs | 0 .../Http/Owin/test}/OwinExtensionTests.cs | 0 .../Owin/test}/OwinFeatureCollectionTests.cs | 0 src/Http/README.md | 6 + .../WebUtilities/src}/Base64UrlTextEncoder.cs | 0 .../WebUtilities/src}/BufferedReadStream.cs | 0 .../src}/FileBufferingReadStream.cs | 0 .../WebUtilities/src}/FileMultipartSection.cs | 0 .../WebUtilities/src}/FormMultipartSection.cs | 0 .../WebUtilities/src}/FormReader.cs | 0 .../src}/HttpRequestStreamReader.cs | 0 .../src}/HttpResponseStreamWriter.cs | 0 .../WebUtilities/src}/KeyValueAccumulator.cs | 0 .../Microsoft.AspNetCore.WebUtilities.csproj | 9 +- .../WebUtilities/src}/MultipartBoundary.cs | 0 .../WebUtilities/src}/MultipartReader.cs | 0 .../src}/MultipartReaderStream.cs | 0 .../WebUtilities/src}/MultipartSection.cs | 0 .../MultipartSectionConverterExtensions.cs | 0 .../src}/MultipartSectionStreamExtensions.cs | 0 .../src}/Properties/AssemblyInfo.cs | 0 .../WebUtilities/src}/QueryHelpers.cs | 0 .../WebUtilities/src}/ReasonPhrases.cs | 0 .../WebUtilities/src}/Resources.Designer.cs | 0 .../WebUtilities/src}/Resources.resx | 0 .../src}/StreamHelperExtensions.cs | 0 .../WebUtilities/src}/baseline.netcore.json | 0 .../test}/FileBufferingReadStreamTests.cs | 0 .../WebUtilities/test}/FormReaderAsyncTest.cs | 0 .../WebUtilities/test}/FormReaderTests.cs | 0 .../test}/HttpRequestStreamReaderTest.cs | 0 .../test}/HttpResponseStreamWriterTest.cs | 0 ...osoft.AspNetCore.WebUtilities.Tests.csproj | 2 +- .../test}/MultipartReaderTests.cs | 0 .../test}/NonSeekableReadStream.cs | 0 .../WebUtilities/test}/QueryHelpersTests.cs | 0 .../WebUtilities/test}/WebEncodersTests.cs | 0 .../samples}/SampleApp/PooledHttpContext.cs | 0 .../SampleApp/PooledHttpContextFactory.cs | 0 .../Http/samples}/SampleApp/Program.cs | 0 src/Http/samples/SampleApp/SampleApp.csproj | 13 + ...icrosoft.AspNetCore.Http.Extensions.csproj | 21 -- .../Microsoft.AspNetCore.Http.csproj | 24 -- test/Directory.Build.props | 20 -- ...AspNetCore.Authentication.Core.Test.csproj | 15 - ...ft.AspNetCore.Http.Extensions.Tests.csproj | 16 - .../Microsoft.AspNetCore.Http.Tests.csproj | 15 - .../Microsoft.AspNetCore.Owin.Tests.csproj | 16 - version.props | 12 - 360 files changed, 128 insertions(+), 1210 deletions(-) delete mode 100644 .appveyor.yml delete mode 100644 .gitattributes delete mode 100644 .github/ISSUE_TEMPLATE.md delete mode 100644 .gitignore delete mode 100644 .travis.yml delete mode 100644 CONTRIBUTING.md delete mode 100644 Directory.Build.props delete mode 100644 Directory.Build.targets delete mode 100644 HttpAbstractions.sln delete mode 100644 LICENSE.txt delete mode 100644 NuGet.config delete mode 100644 NuGetPackageVerifier.json delete mode 100644 README.md delete mode 100644 build.cmd delete mode 100755 build.sh delete mode 100644 build/Key.snk delete mode 100644 build/dependencies.props delete mode 100644 build/repo.props delete mode 100644 build/sources.props delete mode 100644 korebuild-lock.txt delete mode 100644 korebuild.json delete mode 100644 run.cmd delete mode 100644 run.ps1 delete mode 100755 run.sh delete mode 100644 samples/SampleApp/SampleApp.csproj delete mode 100644 src/Directory.Build.props rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticateResult.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticationHttpContextExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticationOptions.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticationScheme.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticationSchemeBuilder.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticationTicket.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/AuthenticationToken.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationHandler.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationHandlerProvider.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationRequestHandler.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationSchemeProvider.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationService.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationSignInHandler.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IAuthenticationSignOutHandler.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/IClaimsTransformation.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/Microsoft.AspNetCore.Authentication.Abstractions.csproj (53%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/TokenExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Abstractions => Http/Authentication.Abstractions/src}/baseline.netcore.json (100%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/AuthenticationCoreServiceCollectionExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/AuthenticationFeature.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/AuthenticationHandlerProvider.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/AuthenticationSchemeProvider.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/AuthenticationService.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/Microsoft.AspNetCore.Authentication.Core.csproj (58%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/NoopClaimsTransformation.cs (100%) rename src/{Microsoft.AspNetCore.Authentication.Core => Http/Authentication.Core/src}/baseline.netcore.json (100%) rename {test/Microsoft.AspNetCore.Authentication.Core.Test => src/Http/Authentication.Core/test}/AuthenticationPropertiesTests.cs (100%) rename {test/Microsoft.AspNetCore.Authentication.Core.Test => src/Http/Authentication.Core/test}/AuthenticationSchemeProviderTests.cs (100%) rename {test/Microsoft.AspNetCore.Authentication.Core.Test => src/Http/Authentication.Core/test}/AuthenticationServiceTests.cs (100%) create mode 100644 src/Http/Authentication.Core/test/Microsoft.AspNetCore.Authentication.Core.Test.csproj rename {test/Microsoft.AspNetCore.Authentication.Core.Test => src/Http/Authentication.Core/test}/TokenExtensionTests.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/BaseHeaderParser.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/CacheControlHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/ContentDispositionHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/ContentDispositionHeaderValueIdentityExtensions.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/ContentRangeHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/CookieHeaderParser.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/CookieHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/DateTimeFormatter.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/EntityTagHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/GenericHeaderParser.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/HeaderNames.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/HeaderQuality.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/HeaderUtilities.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/HttpHeaderParser.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/HttpParseResult.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/HttpRuleParser.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/MediaTypeHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/MediaTypeHeaderValueComparer.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/Microsoft.Net.Http.Headers.csproj (66%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/NameValueHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/ObjectCollection.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/RangeConditionHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/RangeHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/RangeItemHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/SameSiteMode.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/SetCookieHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/StringWithQualityHeaderValue.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/StringWithQualityHeaderValueComparer.cs (100%) rename src/{Microsoft.Net.Http.Headers => Http/Headers/src}/baseline.netcore.json (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/CacheControlHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/ContentDispositionHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/ContentRangeHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/CookieHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/DateParserTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/EntityTagHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/HeaderUtilitiesTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/MediaTypeHeaderValueComparerTests.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/MediaTypeHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/Microsoft.Net.Http.Headers.Tests.csproj (62%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/NameValueHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/RangeConditionHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/RangeHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/RangeItemHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/SetCookieHeaderValueTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/StringWithQualityHeaderValueComparerTest.cs (100%) rename {test/Microsoft.Net.Http.Headers.Tests => src/Http/Headers/test}/StringWithQualityHeaderValueTest.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Authentication/AuthenticateInfo.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Authentication/AuthenticationDescription.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Authentication/AuthenticationManager.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Authentication/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/ConnectionInfo.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/CookieBuilder.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/CookieSecurePolicy.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/HeaderDictionaryExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/HttpResponseWritingExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/MapExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/MapMiddleware.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/MapOptions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/MapWhenExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/MapWhenMiddleware.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/MapWhenOptions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/RunExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/UseExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/UseMiddlewareExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/UsePathBaseExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/UsePathBaseMiddleware.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Extensions/UseWhenExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/FragmentString.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/HostString.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/HttpContext.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/HttpMethods.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/HttpRequest.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/HttpResponse.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/IApplicationBuilder.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/IHttpContextAccessor.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/IHttpContextFactory.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/IMiddleware.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/IMiddlewareFactory.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Internal/HeaderSegment.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Internal/HeaderSegmentCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Internal/HostStringHelper.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Internal/ParsingHelpers.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Internal/PathStringHelper.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Microsoft.AspNetCore.Http.Abstractions.csproj (61%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/PathString.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Properties/Resources.Designer.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/QueryString.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/RequestDelegate.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/Resources.resx (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/StatusCodes.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/WebSocketManager.cs (100%) rename src/{Microsoft.AspNetCore.Http.Abstractions => Http/Http.Abstractions/src}/baseline.netcore.json (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/CookieBuilderTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/FragmentStringTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/HostStringTest.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/HttpResponseWritingExtensionsTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/MapPathMiddlewareTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/MapPredicateMiddlewareTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj (63%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/PathStringTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/QueryStringTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/UseMiddlewareTest.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/UsePathBaseExtensionsTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Abstractions.Tests => src/Http/Http.Abstractions/test}/UseWhenExtensionsTests.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/HeaderDictionaryTypeExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/HttpRequestMultipartExtensions.cs (100%) create mode 100644 src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/QueryBuilder.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/RequestHeaders.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/ResponseExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/ResponseHeaders.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/SendFileResponseExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/SessionExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/StreamCopyOperation.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/UriHelper.cs (100%) rename src/{Microsoft.AspNetCore.Http.Extensions => Http/Http.Extensions/src}/baseline.netcore.json (100%) rename {test/Microsoft.AspNetCore.Http.Extensions.Tests => src/Http/Http.Extensions/test}/HeaderDictionaryTypeExtensionsTest.cs (100%) create mode 100644 src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj rename {test/Microsoft.AspNetCore.Http.Extensions.Tests => src/Http/Http.Extensions/test}/QueryBuilderTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Extensions.Tests => src/Http/Http.Extensions/test}/ResponseExtensionTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Extensions.Tests => src/Http/Http.Extensions/test}/SendFileResponseExtensionsTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Extensions.Tests => src/Http/Http.Extensions/test}/UriHelperTests.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/AuthenticateContext.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/ChallengeBehavior.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/ChallengeContext.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/DescribeSchemesContext.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/IAuthenticationHandler.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/IHttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/SignInContext.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Authentication/SignOutContext.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/CookieOptions.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/FeatureCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/FeatureReference.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/FeatureReferences.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IFeatureCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IFormCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IFormFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IFormFile.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHeaderDictionary.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpBodyControlFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpBufferingFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpMaxRequestBodySizeFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpRequestFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpResponseFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpSendFileFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpUpgradeFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IHttpWebSocketFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IItemsFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IQueryCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IQueryFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IRequestCookieCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IRequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/IServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/ISession.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/ISessionFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/ITlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/ITlsTokenBindingFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/ITrackingConsentFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/Microsoft.AspNetCore.Http.Features.csproj (76%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/SameSiteMode.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/WebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNetCore.Http.Features => Http/Http.Features/src}/baseline.netcore.json (100%) rename {test/Microsoft.AspNetCore.Http.Features.Tests => src/Http/Http.Features/test}/Authentication/AuthenticateContextTest.cs (100%) rename {test/Microsoft.AspNetCore.Http.Features.Tests => src/Http/Http.Features/test}/FeatureCollectionTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Features.Tests => src/Http/Http.Features/test}/IThing.cs (100%) rename {test/Microsoft.AspNetCore.Http.Features.Tests => src/Http/Http.Features/test}/Microsoft.AspNetCore.Http.Features.Tests.csproj (59%) rename {test/Microsoft.AspNetCore.Http.Features.Tests => src/Http/Http.Features/test}/Thing.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Authentication/DefaultAuthenticationManager.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/DefaultHttpContext.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Extensions/HttpRequestRewindExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/Authentication/HttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/DefaultSessionFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/FormFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/FormOptions.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/HttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/HttpRequestFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/HttpRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/HttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/HttpResponseFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/ItemsFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/QueryFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/RequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/ResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/ServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Features/TlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/FormCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/HeaderDictionary.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/HttpContextAccessor.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/HttpContextFactory.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/HttpServiceCollectionExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/ApplicationBuilder.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/BindingAddress.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/BufferingHelper.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/Constants.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/DefaultConnectionInfo.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/DefaultHttpRequest.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/DefaultHttpResponse.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/DefaultWebSocketManager.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/FormFile.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/FormFileCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/ItemsDictionary.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/QueryCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/ReferenceReadStream.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/RequestCookieCollection.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/Internal/ResponseCookies.cs (100%) create mode 100644 src/Http/Http/src/Microsoft.AspNetCore.Http.csproj rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/MiddlewareFactory.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/RequestFormReaderExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Http => Http/Http/src}/baseline.netcore.json (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Authentication/DefaultAuthenticationManagerTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/DefaultHttpContextTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Features/FakeResponseFeature.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Features/FormFeatureTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Features/HttpRequestIdentifierFeatureTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Features/NonSeekableReadStream.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Features/QueryFeatureTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/HeaderDictionaryTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/HttpContextFactoryTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/HttpServiceCollectionExtensionsTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Internal/ApplicationBuilderTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Internal/BindingAddressTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Internal/BufferingHelperTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Internal/DefaultHttpRequestTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/Internal/DefaultHttpResponseTests.cs (100%) create mode 100644 src/Http/Http/test/Microsoft.AspNetCore.Http.Tests.csproj rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/RequestCookiesCollectionTests.cs (100%) rename {test/Microsoft.AspNetCore.Http.Tests => src/Http/Http/test}/ResponseCookiesTest.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/DictionaryStringArrayWrapper.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/DictionaryStringValuesWrapper.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/IOwinEnvironmentFeature.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/Microsoft.AspNetCore.Owin.csproj (83%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/OwinConstants.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/OwinEnvironment.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/OwinEnvironmentFeature.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/OwinExtensions.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/OwinFeatureCollection.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/Utilities.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/WebSockets/OwinWebSocketAcceptAdapter.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/WebSockets/OwinWebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/WebSockets/OwinWebSocketAdapter.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/WebSockets/WebSocketAcceptAdapter.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/WebSockets/WebSocketAdapter.cs (100%) rename src/{Microsoft.AspNetCore.Owin => Http/Owin/src}/baseline.netcore.json (100%) create mode 100644 src/Http/Owin/test/Microsoft.AspNetCore.Owin.Tests.csproj rename {test/Microsoft.AspNetCore.Owin.Tests => src/Http/Owin/test}/OwinEnvironmentTests.cs (100%) rename {test/Microsoft.AspNetCore.Owin.Tests => src/Http/Owin/test}/OwinExtensionTests.cs (100%) rename {test/Microsoft.AspNetCore.Owin.Tests => src/Http/Owin/test}/OwinFeatureCollectionTests.cs (100%) create mode 100644 src/Http/README.md rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/Base64UrlTextEncoder.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/BufferedReadStream.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/FileBufferingReadStream.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/FileMultipartSection.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/FormMultipartSection.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/FormReader.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/HttpRequestStreamReader.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/HttpResponseStreamWriter.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/KeyValueAccumulator.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/Microsoft.AspNetCore.WebUtilities.csproj (56%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/MultipartBoundary.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/MultipartReader.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/MultipartReaderStream.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/MultipartSection.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/MultipartSectionConverterExtensions.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/MultipartSectionStreamExtensions.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/QueryHelpers.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/ReasonPhrases.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/Resources.Designer.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/Resources.resx (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/StreamHelperExtensions.cs (100%) rename src/{Microsoft.AspNetCore.WebUtilities => Http/WebUtilities/src}/baseline.netcore.json (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/FileBufferingReadStreamTests.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/FormReaderAsyncTest.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/FormReaderTests.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/HttpRequestStreamReaderTest.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/HttpResponseStreamWriterTest.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/Microsoft.AspNetCore.WebUtilities.Tests.csproj (59%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/MultipartReaderTests.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/NonSeekableReadStream.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/QueryHelpersTests.cs (100%) rename {test/Microsoft.AspNetCore.WebUtilities.Tests => src/Http/WebUtilities/test}/WebEncodersTests.cs (100%) rename {samples => src/Http/samples}/SampleApp/PooledHttpContext.cs (100%) rename {samples => src/Http/samples}/SampleApp/PooledHttpContextFactory.cs (100%) rename {samples => src/Http/samples}/SampleApp/Program.cs (100%) create mode 100644 src/Http/samples/SampleApp/SampleApp.csproj delete mode 100644 src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj delete mode 100644 src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj delete mode 100644 test/Directory.Build.props delete mode 100644 test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj delete mode 100644 test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj delete mode 100644 test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj delete mode 100644 version.props diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 4eea96ab69..0000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,17 +0,0 @@ -init: -- git config --global core.autocrlf true -branches: - only: - - dev - - /^release\/.*$/ - - /^(.*\/)?ci-.*$/ -build_script: -- ps: .\run.ps1 default-build -clone_depth: 1 -environment: - global: - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - DOTNET_CLI_TELEMETRY_OPTOUT: 1 -test: 'off' -deploy: 'off' -os: Visual Studio 2017 diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index c2f0f84273..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,52 +0,0 @@ -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain - -*.jpg binary -*.png binary -*.gif binary - -*.cs text=auto diff=csharp -*.vb text=auto -*.resx text=auto -*.c text=auto -*.cpp text=auto -*.cxx text=auto -*.h text=auto -*.hxx text=auto -*.py text=auto -*.rb text=auto -*.java text=auto -*.html text=auto -*.htm text=auto -*.css text=auto -*.scss text=auto -*.sass text=auto -*.less text=auto -*.js text=auto -*.lisp text=auto -*.clj text=auto -*.sql text=auto -*.php text=auto -*.lua text=auto -*.m text=auto -*.asm text=auto -*.erl text=auto -*.fs text=auto -*.fsx text=auto -*.hs text=auto - -*.csproj text=auto -*.vbproj text=auto -*.fsproj text=auto -*.dbproj text=auto -*.sln text=auto eol=crlf - -*.sh eol=lf \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 101a084f0a..0000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,3 +0,0 @@ -THIS ISSUE TRACKER IS CLOSED - please log new issues here: https://github.com/aspnet/Home/issues - -For information about this change, see https://github.com/aspnet/Announcements/issues/283 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d5717b3f3f..0000000000 --- a/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -[Oo]bj/ -[Bb]in/ -TestResults/ -.nuget/ -_ReSharper.*/ -packages/ -artifacts/ -PublishProfiles/ -*.user -*.suo -*.cache -*.docstates -_ReSharper.* -nuget.exe -*net45.csproj -*net451.csproj -*k10.csproj -*.psess -*.vsp -*.pidb -*.userprefs -*DS_Store -*.ncrunchsolution -*.*sdf -*.ipch -*.sln.ide -project.lock.json -.build/ -.testPublish/ -/.vs/ -.vscode/ -global.json diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 64bdbb4441..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: csharp -sudo: false -dist: trusty -env: - global: - - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - - DOTNET_CLI_TELEMETRY_OPTOUT: 1 -mono: none -os: -- linux -- osx -osx_image: xcode8.2 -addons: - apt: - packages: - - libunwind8 -branches: - only: - - dev - - /^release\/.*$/ - - /^(.*\/)?ci-.*$/ -before_install: -- if test "$TRAVIS_OS_NAME" == "osx"; then brew update; brew install openssl; ln -s - /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib - /usr/local/lib/; fi -script: -- ./build.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 64ff041d5c..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,4 +0,0 @@ -Contributing -====== - -Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/dev/CONTRIBUTING.md) in the Home repo. diff --git a/Directory.Build.props b/Directory.Build.props deleted file mode 100644 index e2aa6a105b..0000000000 --- a/Directory.Build.props +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - Microsoft ASP.NET Core - https://github.com/aspnet/HttpAbstractions - git - $(MSBuildThisFileDirectory) - $(MSBuildThisFileDirectory)build\Key.snk - true - true - true - - diff --git a/Directory.Build.targets b/Directory.Build.targets deleted file mode 100644 index 53b3f6e1da..0000000000 --- a/Directory.Build.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - $(MicrosoftNETCoreApp20PackageVersion) - $(MicrosoftNETCoreApp21PackageVersion) - $(NETStandardLibrary20PackageVersion) - - diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln deleted file mode 100644 index fc578eb8a3..0000000000 --- a/HttpAbstractions.sln +++ /dev/null @@ -1,303 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26730.10 -MinimumVisualStudioVersion = 15.0.26730.03 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" - ProjectSection(SolutionItems) = preProject - test\Directory.Build.props = test\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http", "src\Microsoft.AspNetCore.Http\Microsoft.AspNetCore.Http.csproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Abstractions", "src\Microsoft.AspNetCore.Http.Abstractions\Microsoft.AspNetCore.Http.Abstractions.csproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Features", "src\Microsoft.AspNetCore.Http.Features\Microsoft.AspNetCore.Http.Features.csproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Tests", "test\Microsoft.AspNetCore.Http.Tests\Microsoft.AspNetCore.Http.Tests.csproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Features.Tests", "test\Microsoft.AspNetCore.Http.Features.Tests\Microsoft.AspNetCore.Http.Features.Tests.csproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Abstractions.Tests", "test\Microsoft.AspNetCore.Http.Abstractions.Tests\Microsoft.AspNetCore.Http.Abstractions.Tests.csproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Owin", "src\Microsoft.AspNetCore.Owin\Microsoft.AspNetCore.Owin.csproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Owin.Tests", "test\Microsoft.AspNetCore.Owin.Tests\Microsoft.AspNetCore.Owin.Tests.csproj", "{16219571-3268-4D12-8689-12B7163DBA13}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Extensions", "src\Microsoft.AspNetCore.Http.Extensions\Microsoft.AspNetCore.Http.Extensions.csproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Extensions.Tests", "test\Microsoft.AspNetCore.Http.Extensions.Tests\Microsoft.AspNetCore.Http.Extensions.Tests.csproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities", "src\Microsoft.AspNetCore.WebUtilities\Microsoft.AspNetCore.WebUtilities.csproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities.Tests", "test\Microsoft.AspNetCore.WebUtilities.Tests\Microsoft.AspNetCore.WebUtilities.Tests.csproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.csproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.csproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleApp", "samples\SampleApp\SampleApp.csproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C6C48D5F-B289-4150-A6FC-77A5C7064BCE}" - ProjectSection(SolutionItems) = preProject - .travis.yml = .travis.yml - appveyor.yml = appveyor.yml - build.cmd = build.cmd - build.ps1 = build.ps1 - build.sh = build.sh - Directory.Build.props = Directory.Build.props - Directory.Build.targets = Directory.Build.targets - NuGet.config = NuGet.config - README.md = README.md - version.xml = version.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{ED7BCAC5-2796-44BD-9954-7C248263BC8B}" - ProjectSection(SolutionItems) = preProject - build\dependencies.props = build\dependencies.props - build\Key.snk = build\Key.snk - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Abstractions", "src\Microsoft.AspNetCore.Authentication.Abstractions\Microsoft.AspNetCore.Authentication.Abstractions.csproj", "{3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Core", "src\Microsoft.AspNetCore.Authentication.Core\Microsoft.AspNetCore.Authentication.Core.csproj", "{73CA3145-91BD-4DA5-BC74-40008DE7EA98}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Core.Test", "test\Microsoft.AspNetCore.Authentication.Core.Test\Microsoft.AspNetCore.Authentication.Core.Test.csproj", "{A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|Mixed Platforms = Release|Mixed Platforms - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.Build.0 = Release|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.Build.0 = Release|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.Build.0 = Release|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.Build.0 = Release|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.Build.0 = Release|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.Build.0 = Release|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.ActiveCfg = Debug|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.Build.0 = Release|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.ActiveCfg = Release|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.Build.0 = Debug|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.ActiveCfg = Debug|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.ActiveCfg = Release|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.Build.0 = Release|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.ActiveCfg = Release|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|x86.ActiveCfg = Debug|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Any CPU.Build.0 = Release|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|x86.ActiveCfg = Release|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|x86.ActiveCfg = Debug|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Any CPU.Build.0 = Release|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|x86.ActiveCfg = Release|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|x86.ActiveCfg = Debug|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Any CPU.Build.0 = Release|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|x86.ActiveCfg = Release|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|x86.ActiveCfg = Debug|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Any CPU.Build.0 = Release|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|x86.ActiveCfg = Release|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|x86.ActiveCfg = Debug|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|x86.Build.0 = Debug|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Any CPU.Build.0 = Release|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|x86.ActiveCfg = Release|Any CPU - {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|x86.Build.0 = Release|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|x86.ActiveCfg = Debug|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|x86.Build.0 = Debug|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Any CPU.Build.0 = Release|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.ActiveCfg = Release|Any CPU - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.Build.0 = Release|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|x86.ActiveCfg = Debug|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|x86.Build.0 = Debug|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Any CPU.Build.0 = Release|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU - {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|x86.ActiveCfg = Debug|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Debug|x86.Build.0 = Debug|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Any CPU.Build.0 = Release|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|x86.ActiveCfg = Release|Any CPU - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852}.Release|x86.Build.0 = Release|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Any CPU.Build.0 = Debug|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|x86.ActiveCfg = Debug|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Debug|x86.Build.0 = Debug|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Any CPU.ActiveCfg = Release|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Any CPU.Build.0 = Release|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|x86.ActiveCfg = Release|Any CPU - {73CA3145-91BD-4DA5-BC74-40008DE7EA98}.Release|x86.Build.0 = Release|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|x86.ActiveCfg = Debug|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Debug|x86.Build.0 = Debug|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Any CPU.Build.0 = Release|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|x86.ActiveCfg = Release|Any CPU - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {BCF0F967-8753-4438-BD07-AADCA9CE509A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {59BED991-F207-48ED-B24C-0A1D9C986C01} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {16219571-3268-4D12-8689-12B7163DBA13} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {CCC4363E-81E2-4058-94DD-00494E9E992A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {AE25EF21-7F91-4B86-B73E-AF746821D339} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {A2FB7838-0031-4FAD-BA3E-83C30B3AF406} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} - {ED7BCAC5-2796-44BD-9954-7C248263BC8B} = {C6C48D5F-B289-4150-A6FC-77A5C7064BCE} - {3D8C9A87-5DFB-4EC0-9CB6-174AD3B33852} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {73CA3145-91BD-4DA5-BC74-40008DE7EA98} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {A85950C5-2794-47E2-8EAA-05A1DC7C6DA7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D9A9994D-F09F-4209-861B-4A9036485D1F} - EndGlobalSection -EndGlobal diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 7b2956ecee..0000000000 --- a/LICENSE.txt +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) .NET Foundation and Contributors - -All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. diff --git a/NuGet.config b/NuGet.config deleted file mode 100644 index e32bddfd51..0000000000 --- a/NuGet.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json deleted file mode 100644 index b153ab1515..0000000000 --- a/NuGetPackageVerifier.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Default": { - "rules": [ - "DefaultCompositeRule" - ] - } -} \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index a66e3a23e8..0000000000 --- a/README.md +++ /dev/null @@ -1,15 +0,0 @@ -HttpAbstractions -================ - -| AppVeyor | Travis | -| ---- | ---- -| [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) | [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) | - -Contains HTTP abstractions for ASP.NET Core such as `HttpContext`, `HttpRequest`, `HttpResponse` and `RequestDelegate`. - -It also contains `IApplicationBuilder` and extensions to create and compose your application's pipeline. - -This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo. - - - diff --git a/build.cmd b/build.cmd deleted file mode 100644 index c0050bda12..0000000000 --- a/build.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' default-build %*; exit $LASTEXITCODE" diff --git a/build.sh b/build.sh deleted file mode 100755 index 98a4b22765..0000000000 --- a/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# Call "sync" between "chmod" and execution to prevent "text file busy" error in Docker (aufs) -chmod +x "$DIR/run.sh"; sync -"$DIR/run.sh" default-build "$@" diff --git a/build/Key.snk b/build/Key.snk deleted file mode 100644 index e10e4889c125d3120cd9e81582243d70f7cbb806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098=Iw=HCsnz~#iVhm& zj%TU(_THUee?3yHBjk$37ysB?i5#7WD$={H zV4B!OxRPrb|8)HPg~A}8P>^=#y<)56#=E&NzcjOtPK~<4n6GHt=K$ro*T(lhby_@U zEk(hLzk1H)0yXj{A_5>fk-TgNoP|q6(tP2xo8zt8i%212CWM#AeCd?`hS|4~L({h~Moo(~vy&3Z z1uI}`fd^*>o=rwbAGymj6RM^pZm(*Kfhs+Y1#`-2JPWZMK8@;ZWCk2+9bX4YP);~fj-BU*R zQPvWv$89!{Rl9wM+zR>_TSkn^voYxA?2G iKnV#iZ6Ah`K>b=@=IjYJXrxL124zR(38)nxe+&q_$QXwJ diff --git a/build/dependencies.props b/build/dependencies.props deleted file mode 100644 index 6e61a4cb93..0000000000 --- a/build/dependencies.props +++ /dev/null @@ -1,37 +0,0 @@ - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - 2.1.3-rtm-15802 - 2.0.0 - 2.1.2 - 15.6.1 - 4.7.49 - 2.0.3 - 4.5.0 - 4.5.0 - 0.8.0 - 2.3.1 - 2.4.0-beta.1.build3945 - - - - - - - - 2.1.0 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - - \ No newline at end of file diff --git a/build/repo.props b/build/repo.props deleted file mode 100644 index dab1601c88..0000000000 --- a/build/repo.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Internal.AspNetCore.Universe.Lineup - 2.1.0-rc1-* - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json - - - - - - - diff --git a/build/sources.props b/build/sources.props deleted file mode 100644 index 9215df9751..0000000000 --- a/build/sources.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - - $(DotNetRestoreSources) - - $(RestoreSources); - https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; - - - $(RestoreSources); - https://api.nuget.org/v3/index.json; - - - diff --git a/korebuild-lock.txt b/korebuild-lock.txt deleted file mode 100644 index 251c227c83..0000000000 --- a/korebuild-lock.txt +++ /dev/null @@ -1,2 +0,0 @@ -version:2.1.3-rtm-15802 -commithash:a7c08b45b440a7d2058a0aa1eaa3eb6ba811976a diff --git a/korebuild.json b/korebuild.json deleted file mode 100644 index 678d8bb948..0000000000 --- a/korebuild.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/release/2.1/tools/korebuild.schema.json", - "channel": "release/2.1" -} diff --git a/run.cmd b/run.cmd deleted file mode 100644 index d52d5c7e68..0000000000 --- a/run.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' %*; exit $LASTEXITCODE" diff --git a/run.ps1 b/run.ps1 deleted file mode 100644 index 27dcf848f8..0000000000 --- a/run.ps1 +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env powershell -#requires -version 4 - -<# -.SYNOPSIS -Executes KoreBuild commands. - -.DESCRIPTION -Downloads korebuild if required. Then executes the KoreBuild command. To see available commands, execute with `-Command help`. - -.PARAMETER Command -The KoreBuild command to run. - -.PARAMETER Path -The folder to build. Defaults to the folder containing this script. - -.PARAMETER Channel -The channel of KoreBuild to download. Overrides the value from the config file. - -.PARAMETER DotNetHome -The directory where .NET Core tools will be stored. - -.PARAMETER ToolsSource -The base url where build tools can be downloaded. Overrides the value from the config file. - -.PARAMETER Update -Updates KoreBuild to the latest version even if a lock file is present. - -.PARAMETER ConfigFile -The path to the configuration file that stores values. Defaults to korebuild.json. - -.PARAMETER ToolsSourceSuffix -The Suffix to append to the end of the ToolsSource. Useful for query strings in blob stores. - -.PARAMETER Arguments -Arguments to be passed to the command - -.NOTES -This function will create a file $PSScriptRoot/korebuild-lock.txt. This lock file can be committed to source, but does not have to be. -When the lockfile is not present, KoreBuild will create one using latest available version from $Channel. - -The $ConfigFile is expected to be an JSON file. It is optional, and the configuration values in it are optional as well. Any options set -in the file are overridden by command line parameters. - -.EXAMPLE -Example config file: -```json -{ - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", - "channel": "dev", - "toolsSource": "https://aspnetcore.blob.core.windows.net/buildtools" -} -``` -#> -[CmdletBinding(PositionalBinding = $false)] -param( - [Parameter(Mandatory = $true, Position = 0)] - [string]$Command, - [string]$Path = $PSScriptRoot, - [Alias('c')] - [string]$Channel, - [Alias('d')] - [string]$DotNetHome, - [Alias('s')] - [string]$ToolsSource, - [Alias('u')] - [switch]$Update, - [string]$ConfigFile, - [string]$ToolsSourceSuffix, - [Parameter(ValueFromRemainingArguments = $true)] - [string[]]$Arguments -) - -Set-StrictMode -Version 2 -$ErrorActionPreference = 'Stop' - -# -# Functions -# - -function Get-KoreBuild { - - $lockFile = Join-Path $Path 'korebuild-lock.txt' - - if (!(Test-Path $lockFile) -or $Update) { - Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile $ToolsSourceSuffix - } - - $version = Get-Content $lockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1 - if (!$version) { - Write-Error "Failed to parse version from $lockFile. Expected a line that begins with 'version:'" - } - $version = $version.TrimStart('version:').Trim() - $korebuildPath = Join-Paths $DotNetHome ('buildtools', 'korebuild', $version) - - if (!(Test-Path $korebuildPath)) { - Write-Host -ForegroundColor Magenta "Downloading KoreBuild $version" - New-Item -ItemType Directory -Path $korebuildPath | Out-Null - $remotePath = "$ToolsSource/korebuild/artifacts/$version/korebuild.$version.zip" - - try { - $tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip" - Get-RemoteFile $remotePath $tmpfile $ToolsSourceSuffix - if (Get-Command -Name 'Expand-Archive' -ErrorAction Ignore) { - # Use built-in commands where possible as they are cross-plat compatible - Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath - } - else { - # Fallback to old approach for old installations of PowerShell - Add-Type -AssemblyName System.IO.Compression.FileSystem - [System.IO.Compression.ZipFile]::ExtractToDirectory($tmpfile, $korebuildPath) - } - } - catch { - Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore - throw - } - finally { - Remove-Item $tmpfile -ErrorAction Ignore - } - } - - return $korebuildPath -} - -function Join-Paths([string]$path, [string[]]$childPaths) { - $childPaths | ForEach-Object { $path = Join-Path $path $_ } - return $path -} - -function Get-RemoteFile([string]$RemotePath, [string]$LocalPath, [string]$RemoteSuffix) { - if ($RemotePath -notlike 'http*') { - Copy-Item $RemotePath $LocalPath - return - } - - $retries = 10 - while ($retries -gt 0) { - $retries -= 1 - try { - Invoke-WebRequest -UseBasicParsing -Uri $($RemotePath + $RemoteSuffix) -OutFile $LocalPath - return - } - catch { - Write-Verbose "Request failed. $retries retries remaining" - } - } - - Write-Error "Download failed: '$RemotePath'." -} - -# -# Main -# - -# Load configuration or set defaults - -$Path = Resolve-Path $Path -if (!$ConfigFile) { $ConfigFile = Join-Path $Path 'korebuild.json' } - -if (Test-Path $ConfigFile) { - try { - $config = Get-Content -Raw -Encoding UTF8 -Path $ConfigFile | ConvertFrom-Json - if ($config) { - if (!($Channel) -and (Get-Member -Name 'channel' -InputObject $config)) { [string] $Channel = $config.channel } - if (!($ToolsSource) -and (Get-Member -Name 'toolsSource' -InputObject $config)) { [string] $ToolsSource = $config.toolsSource} - } - } - catch { - Write-Warning "$ConfigFile could not be read. Its settings will be ignored." - Write-Warning $Error[0] - } -} - -if (!$DotNetHome) { - $DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } ` - elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} ` - elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}` - else { Join-Path $PSScriptRoot '.dotnet'} -} - -if (!$Channel) { $Channel = 'dev' } -if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' } - -# Execute - -$korebuildPath = Get-KoreBuild -Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1') - -try { - Set-KoreBuildSettings -ToolsSource $ToolsSource -DotNetHome $DotNetHome -RepoPath $Path -ConfigFile $ConfigFile - Invoke-KoreBuildCommand $Command @Arguments -} -finally { - Remove-Module 'KoreBuild' -ErrorAction Ignore -} diff --git a/run.sh b/run.sh deleted file mode 100755 index 834961fc3a..0000000000 --- a/run.sh +++ /dev/null @@ -1,231 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# -# variables -# - -RESET="\033[0m" -RED="\033[0;31m" -YELLOW="\033[0;33m" -MAGENTA="\033[0;95m" -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet" -verbose=false -update=false -repo_path="$DIR" -channel='' -tools_source='' -tools_source_suffix='' - -# -# Functions -# -__usage() { - echo "Usage: $(basename "${BASH_SOURCE[0]}") command [options] [[--] ...]" - echo "" - echo "Arguments:" - echo " command The command to be run." - echo " ... Arguments passed to the command. Variable number of arguments allowed." - echo "" - echo "Options:" - echo " --verbose Show verbose output." - echo " -c|--channel The channel of KoreBuild to download. Overrides the value from the config file.." - echo " --config-file The path to the configuration file that stores values. Defaults to korebuild.json." - echo " -d|--dotnet-home The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet." - echo " --path The directory to build. Defaults to the directory containing the script." - echo " -s|--tools-source|-ToolsSource The base url where build tools can be downloaded. Overrides the value from the config file." - echo " --tools-source-suffix|-ToolsSourceSuffix The suffix to append to tools-source. Useful for query strings." - echo " -u|--update Update to the latest KoreBuild even if the lock file is present." - echo "" - echo "Description:" - echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be." - echo " When the lockfile is not present, KoreBuild will create one using latest available version from \$channel." - - if [[ "${1:-}" != '--no-exit' ]]; then - exit 2 - fi -} - -get_korebuild() { - local version - local lock_file="$repo_path/korebuild-lock.txt" - if [ ! -f "$lock_file" ] || [ "$update" = true ]; then - __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" "$tools_source_suffix" - fi - version="$(grep 'version:*' -m 1 "$lock_file")" - if [[ "$version" == '' ]]; then - __error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'" - return 1 - fi - version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version" - - { - if [ ! -d "$korebuild_path" ]; then - mkdir -p "$korebuild_path" - local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip" - tmpfile="$(mktemp)" - echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}" - if __get_remote_file "$remote_path" "$tmpfile" "$tools_source_suffix"; then - unzip -q -d "$korebuild_path" "$tmpfile" - fi - rm "$tmpfile" || true - fi - - source "$korebuild_path/KoreBuild.sh" - } || { - if [ -d "$korebuild_path" ]; then - echo "Cleaning up after failed installation" - rm -rf "$korebuild_path" || true - fi - return 1 - } -} - -__error() { - echo -e "${RED}error: $*${RESET}" 1>&2 -} - -__warn() { - echo -e "${YELLOW}warning: $*${RESET}" -} - -__machine_has() { - hash "$1" > /dev/null 2>&1 - return $? -} - -__get_remote_file() { - local remote_path=$1 - local local_path=$2 - local remote_path_suffix=$3 - - if [[ "$remote_path" != 'http'* ]]; then - cp "$remote_path" "$local_path" - return 0 - fi - - local failed=false - if __machine_has wget; then - wget --tries 10 --quiet -O "$local_path" "${remote_path}${remote_path_suffix}" || failed=true - else - failed=true - fi - - if [ "$failed" = true ] && __machine_has curl; then - failed=false - curl --retry 10 -sSL -f --create-dirs -o "$local_path" "${remote_path}${remote_path_suffix}" || failed=true - fi - - if [ "$failed" = true ]; then - __error "Download failed: $remote_path" 1>&2 - return 1 - fi -} - -# -# main -# - -command="${1:-}" -shift - -while [[ $# -gt 0 ]]; do - case $1 in - -\?|-h|--help) - __usage --no-exit - exit 0 - ;; - -c|--channel|-Channel) - shift - channel="${1:-}" - [ -z "$channel" ] && __usage - ;; - --config-file|-ConfigFile) - shift - config_file="${1:-}" - [ -z "$config_file" ] && __usage - if [ ! -f "$config_file" ]; then - __error "Invalid value for --config-file. $config_file does not exist." - exit 1 - fi - ;; - -d|--dotnet-home|-DotNetHome) - shift - DOTNET_HOME="${1:-}" - [ -z "$DOTNET_HOME" ] && __usage - ;; - --path|-Path) - shift - repo_path="${1:-}" - [ -z "$repo_path" ] && __usage - ;; - -s|--tools-source|-ToolsSource) - shift - tools_source="${1:-}" - [ -z "$tools_source" ] && __usage - ;; - --tools-source-suffix|-ToolsSourceSuffix) - shift - tools_source_suffix="${1:-}" - [ -z "$tools_source_suffix" ] && __usage - ;; - -u|--update|-Update) - update=true - ;; - --verbose|-Verbose) - verbose=true - ;; - --) - shift - break - ;; - *) - break - ;; - esac - shift -done - -if ! __machine_has unzip; then - __error 'Missing required command: unzip' - exit 1 -fi - -if ! __machine_has curl && ! __machine_has wget; then - __error 'Missing required command. Either wget or curl is required.' - exit 1 -fi - -[ -z "${config_file:-}" ] && config_file="$repo_path/korebuild.json" -if [ -f "$config_file" ]; then - if __machine_has jq ; then - if jq '.' "$config_file" >/dev/null ; then - config_channel="$(jq -r 'select(.channel!=null) | .channel' "$config_file")" - config_tools_source="$(jq -r 'select(.toolsSource!=null) | .toolsSource' "$config_file")" - else - __warn "$config_file is invalid JSON. Its settings will be ignored." - fi - elif __machine_has python ; then - if python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'))" >/dev/null ; then - config_channel="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" - config_tools_source="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" - else - __warn "$config_file is invalid JSON. Its settings will be ignored." - fi - else - __warn 'Missing required command: jq or pyton. Could not parse the JSON file. Its settings will be ignored.' - fi - - [ ! -z "${config_channel:-}" ] && channel="$config_channel" - [ ! -z "${config_tools_source:-}" ] && tools_source="$config_tools_source" -fi - -[ -z "$channel" ] && channel='dev' -[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools' - -get_korebuild -set_korebuildsettings "$tools_source" "$DOTNET_HOME" "$repo_path" "$config_file" -invoke_korebuild_command "$command" "$@" diff --git a/samples/SampleApp/SampleApp.csproj b/samples/SampleApp/SampleApp.csproj deleted file mode 100644 index 0447897f43..0000000000 --- a/samples/SampleApp/SampleApp.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - netcoreapp2.1;net461 - Exe - - - - - - - - diff --git a/src/Directory.Build.props b/src/Directory.Build.props deleted file mode 100644 index 4b89a431e7..0000000000 --- a/src/Directory.Build.props +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs b/src/Http/Authentication.Abstractions/src/AuthenticateResult.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticateResult.cs rename to src/Http/Authentication.Abstractions/src/AuthenticateResult.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs b/src/Http/Authentication.Abstractions/src/AuthenticationHttpContextExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationHttpContextExtensions.cs rename to src/Http/Authentication.Abstractions/src/AuthenticationHttpContextExtensions.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs b/src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationOptions.cs rename to src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs b/src/Http/Authentication.Abstractions/src/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationProperties.cs rename to src/Http/Authentication.Abstractions/src/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs b/src/Http/Authentication.Abstractions/src/AuthenticationScheme.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationScheme.cs rename to src/Http/Authentication.Abstractions/src/AuthenticationScheme.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs b/src/Http/Authentication.Abstractions/src/AuthenticationSchemeBuilder.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationSchemeBuilder.cs rename to src/Http/Authentication.Abstractions/src/AuthenticationSchemeBuilder.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationTicket.cs b/src/Http/Authentication.Abstractions/src/AuthenticationTicket.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationTicket.cs rename to src/Http/Authentication.Abstractions/src/AuthenticationTicket.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationToken.cs b/src/Http/Authentication.Abstractions/src/AuthenticationToken.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/AuthenticationToken.cs rename to src/Http/Authentication.Abstractions/src/AuthenticationToken.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationFeature.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationFeature.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationFeature.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandler.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandlerProvider.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationHandlerProvider.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationHandlerProvider.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationHandlerProvider.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationRequestHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationRequestHandler.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationRequestHandler.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationSchemeProvider.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSchemeProvider.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationSchemeProvider.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationService.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationService.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationService.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignInHandler.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationSignInHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignInHandler.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationSignInHandler.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignOutHandler.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationSignOutHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IAuthenticationSignOutHandler.cs rename to src/Http/Authentication.Abstractions/src/IAuthenticationSignOutHandler.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs b/src/Http/Authentication.Abstractions/src/IClaimsTransformation.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/IClaimsTransformation.cs rename to src/Http/Authentication.Abstractions/src/IClaimsTransformation.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj b/src/Http/Authentication.Abstractions/src/Microsoft.AspNetCore.Authentication.Abstractions.csproj similarity index 53% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj rename to src/Http/Authentication.Abstractions/src/Microsoft.AspNetCore.Authentication.Abstractions.csproj index 234ff58f3f..bfb6e8e9ed 100644 --- a/src/Microsoft.AspNetCore.Authentication.Abstractions/Microsoft.AspNetCore.Authentication.Abstractions.csproj +++ b/src/Http/Authentication.Abstractions/src/Microsoft.AspNetCore.Authentication.Abstractions.csproj @@ -9,12 +9,9 @@ - - - - - - + + + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs b/src/Http/Authentication.Abstractions/src/TokenExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/TokenExtensions.cs rename to src/Http/Authentication.Abstractions/src/TokenExtensions.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Abstractions/baseline.netcore.json b/src/Http/Authentication.Abstractions/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Abstractions/baseline.netcore.json rename to src/Http/Authentication.Abstractions/src/baseline.netcore.json diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs b/src/Http/Authentication.Core/src/AuthenticationCoreServiceCollectionExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Core/AuthenticationCoreServiceCollectionExtensions.cs rename to src/Http/Authentication.Core/src/AuthenticationCoreServiceCollectionExtensions.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationFeature.cs b/src/Http/Authentication.Core/src/AuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Core/AuthenticationFeature.cs rename to src/Http/Authentication.Core/src/AuthenticationFeature.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationHandlerProvider.cs b/src/Http/Authentication.Core/src/AuthenticationHandlerProvider.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Core/AuthenticationHandlerProvider.cs rename to src/Http/Authentication.Core/src/AuthenticationHandlerProvider.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs b/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Core/AuthenticationSchemeProvider.cs rename to src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs b/src/Http/Authentication.Core/src/AuthenticationService.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Core/AuthenticationService.cs rename to src/Http/Authentication.Core/src/AuthenticationService.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj b/src/Http/Authentication.Core/src/Microsoft.AspNetCore.Authentication.Core.csproj similarity index 58% rename from src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj rename to src/Http/Authentication.Core/src/Microsoft.AspNetCore.Authentication.Core.csproj index 38a6951f6c..c10bfb3656 100644 --- a/src/Microsoft.AspNetCore.Authentication.Core/Microsoft.AspNetCore.Authentication.Core.csproj +++ b/src/Http/Authentication.Core/src/Microsoft.AspNetCore.Authentication.Core.csproj @@ -10,9 +10,9 @@ - - - + + + diff --git a/src/Microsoft.AspNetCore.Authentication.Core/NoopClaimsTransformation.cs b/src/Http/Authentication.Core/src/NoopClaimsTransformation.cs similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Core/NoopClaimsTransformation.cs rename to src/Http/Authentication.Core/src/NoopClaimsTransformation.cs diff --git a/src/Microsoft.AspNetCore.Authentication.Core/baseline.netcore.json b/src/Http/Authentication.Core/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Authentication.Core/baseline.netcore.json rename to src/Http/Authentication.Core/src/baseline.netcore.json diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationPropertiesTests.cs b/src/Http/Authentication.Core/test/AuthenticationPropertiesTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationPropertiesTests.cs rename to src/Http/Authentication.Core/test/AuthenticationPropertiesTests.cs diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs b/src/Http/Authentication.Core/test/AuthenticationSchemeProviderTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationSchemeProviderTests.cs rename to src/Http/Authentication.Core/test/AuthenticationSchemeProviderTests.cs diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs b/src/Http/Authentication.Core/test/AuthenticationServiceTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Authentication.Core.Test/AuthenticationServiceTests.cs rename to src/Http/Authentication.Core/test/AuthenticationServiceTests.cs diff --git a/src/Http/Authentication.Core/test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/src/Http/Authentication.Core/test/Microsoft.AspNetCore.Authentication.Core.Test.csproj new file mode 100644 index 0000000000..4819703197 --- /dev/null +++ b/src/Http/Authentication.Core/test/Microsoft.AspNetCore.Authentication.Core.Test.csproj @@ -0,0 +1,12 @@ + + + + $(StandardTestTfms) + + + + + + + + diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs b/src/Http/Authentication.Core/test/TokenExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Authentication.Core.Test/TokenExtensionTests.cs rename to src/Http/Authentication.Core/test/TokenExtensionTests.cs diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Http/Headers/src/BaseHeaderParser.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs rename to src/Http/Headers/src/BaseHeaderParser.cs diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Http/Headers/src/CacheControlHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs rename to src/Http/Headers/src/CacheControlHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Http/Headers/src/ContentDispositionHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs rename to src/Http/Headers/src/ContentDispositionHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs b/src/Http/Headers/src/ContentDispositionHeaderValueIdentityExtensions.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValueIdentityExtensions.cs rename to src/Http/Headers/src/ContentDispositionHeaderValueIdentityExtensions.cs diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Http/Headers/src/ContentRangeHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs rename to src/Http/Headers/src/ContentRangeHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Http/Headers/src/CookieHeaderParser.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs rename to src/Http/Headers/src/CookieHeaderParser.cs diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Http/Headers/src/CookieHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs rename to src/Http/Headers/src/CookieHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/DateTimeFormatter.cs b/src/Http/Headers/src/DateTimeFormatter.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/DateTimeFormatter.cs rename to src/Http/Headers/src/DateTimeFormatter.cs diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Http/Headers/src/EntityTagHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs rename to src/Http/Headers/src/EntityTagHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Http/Headers/src/GenericHeaderParser.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs rename to src/Http/Headers/src/GenericHeaderParser.cs diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Http/Headers/src/HeaderNames.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/HeaderNames.cs rename to src/Http/Headers/src/HeaderNames.cs diff --git a/src/Microsoft.Net.Http.Headers/HeaderQuality.cs b/src/Http/Headers/src/HeaderQuality.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/HeaderQuality.cs rename to src/Http/Headers/src/HeaderQuality.cs diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Http/Headers/src/HeaderUtilities.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/HeaderUtilities.cs rename to src/Http/Headers/src/HeaderUtilities.cs diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Http/Headers/src/HttpHeaderParser.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs rename to src/Http/Headers/src/HttpHeaderParser.cs diff --git a/src/Microsoft.Net.Http.Headers/HttpParseResult.cs b/src/Http/Headers/src/HttpParseResult.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/HttpParseResult.cs rename to src/Http/Headers/src/HttpParseResult.cs diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Http/Headers/src/HttpRuleParser.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/HttpRuleParser.cs rename to src/Http/Headers/src/HttpRuleParser.cs diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Http/Headers/src/MediaTypeHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs rename to src/Http/Headers/src/MediaTypeHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Http/Headers/src/MediaTypeHeaderValueComparer.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs rename to src/Http/Headers/src/MediaTypeHeaderValueComparer.cs diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj b/src/Http/Headers/src/Microsoft.Net.Http.Headers.csproj similarity index 66% rename from src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj rename to src/Http/Headers/src/Microsoft.Net.Http.Headers.csproj index 106a568d18..80b0f49989 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.csproj +++ b/src/Http/Headers/src/Microsoft.Net.Http.Headers.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Http/Headers/src/NameValueHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs rename to src/Http/Headers/src/NameValueHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Http/Headers/src/ObjectCollection.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/ObjectCollection.cs rename to src/Http/Headers/src/ObjectCollection.cs diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Http/Headers/src/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs rename to src/Http/Headers/src/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Http/Headers/src/RangeConditionHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs rename to src/Http/Headers/src/RangeConditionHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Http/Headers/src/RangeHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs rename to src/Http/Headers/src/RangeHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Http/Headers/src/RangeItemHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs rename to src/Http/Headers/src/RangeItemHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/SameSiteMode.cs b/src/Http/Headers/src/SameSiteMode.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/SameSiteMode.cs rename to src/Http/Headers/src/SameSiteMode.cs diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Http/Headers/src/SetCookieHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs rename to src/Http/Headers/src/SetCookieHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Http/Headers/src/StringWithQualityHeaderValue.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs rename to src/Http/Headers/src/StringWithQualityHeaderValue.cs diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Http/Headers/src/StringWithQualityHeaderValueComparer.cs similarity index 100% rename from src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs rename to src/Http/Headers/src/StringWithQualityHeaderValueComparer.cs diff --git a/src/Microsoft.Net.Http.Headers/baseline.netcore.json b/src/Http/Headers/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.Net.Http.Headers/baseline.netcore.json rename to src/Http/Headers/src/baseline.netcore.json diff --git a/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs b/src/Http/Headers/test/CacheControlHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs rename to src/Http/Headers/test/CacheControlHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/src/Http/Headers/test/ContentDispositionHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs rename to src/Http/Headers/test/ContentDispositionHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs b/src/Http/Headers/test/ContentRangeHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs rename to src/Http/Headers/test/ContentRangeHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/src/Http/Headers/test/CookieHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs rename to src/Http/Headers/test/CookieHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs b/src/Http/Headers/test/DateParserTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs rename to src/Http/Headers/test/DateParserTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs b/src/Http/Headers/test/EntityTagHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs rename to src/Http/Headers/test/EntityTagHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs b/src/Http/Headers/test/HeaderUtilitiesTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/HeaderUtilitiesTest.cs rename to src/Http/Headers/test/HeaderUtilitiesTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs b/src/Http/Headers/test/MediaTypeHeaderValueComparerTests.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs rename to src/Http/Headers/test/MediaTypeHeaderValueComparerTests.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/src/Http/Headers/test/MediaTypeHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs rename to src/Http/Headers/test/MediaTypeHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj b/src/Http/Headers/test/Microsoft.Net.Http.Headers.Tests.csproj similarity index 62% rename from test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj rename to src/Http/Headers/test/Microsoft.Net.Http.Headers.Tests.csproj index d1acc289b4..eb53233e33 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.csproj +++ b/src/Http/Headers/test/Microsoft.Net.Http.Headers.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/src/Http/Headers/test/NameValueHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs rename to src/Http/Headers/test/NameValueHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/src/Http/Headers/test/RangeConditionHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs rename to src/Http/Headers/test/RangeConditionHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs b/src/Http/Headers/test/RangeHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs rename to src/Http/Headers/test/RangeHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs b/src/Http/Headers/test/RangeItemHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs rename to src/Http/Headers/test/RangeItemHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/src/Http/Headers/test/SetCookieHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs rename to src/Http/Headers/test/SetCookieHeaderValueTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs b/src/Http/Headers/test/StringWithQualityHeaderValueComparerTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs rename to src/Http/Headers/test/StringWithQualityHeaderValueComparerTest.cs diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs b/src/Http/Headers/test/StringWithQualityHeaderValueTest.cs similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs rename to src/Http/Headers/test/StringWithQualityHeaderValueTest.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs b/src/Http/Http.Abstractions/src/Authentication/AuthenticateInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticateInfo.cs rename to src/Http/Http.Abstractions/src/Authentication/AuthenticateInfo.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Http/Http.Abstractions/src/Authentication/AuthenticationDescription.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs rename to src/Http/Http.Abstractions/src/Authentication/AuthenticationDescription.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Http/Http.Abstractions/src/Authentication/AuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs rename to src/Http/Http.Abstractions/src/Authentication/AuthenticationManager.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Http/Http.Abstractions/src/Authentication/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs rename to src/Http/Http.Abstractions/src/Authentication/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs b/src/Http/Http.Abstractions/src/ConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs rename to src/Http/Http.Abstractions/src/ConnectionInfo.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs b/src/Http/Http.Abstractions/src/CookieBuilder.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/CookieBuilder.cs rename to src/Http/Http.Abstractions/src/CookieBuilder.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieSecurePolicy.cs b/src/Http/Http.Abstractions/src/CookieSecurePolicy.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/CookieSecurePolicy.cs rename to src/Http/Http.Abstractions/src/CookieSecurePolicy.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/HeaderDictionaryExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/HeaderDictionaryExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/MapExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/MapExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Http/Http.Abstractions/src/Extensions/MapMiddleware.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs rename to src/Http/Http.Abstractions/src/Extensions/MapMiddleware.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs b/src/Http/Http.Abstractions/src/Extensions/MapOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs rename to src/Http/Http.Abstractions/src/Extensions/MapOptions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/MapWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/MapWhenExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Http/Http.Abstractions/src/Extensions/MapWhenMiddleware.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs rename to src/Http/Http.Abstractions/src/Extensions/MapWhenMiddleware.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Http/Http.Abstractions/src/Extensions/MapWhenOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs rename to src/Http/Http.Abstractions/src/Extensions/MapWhenOptions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/RunExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/RunExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/UseExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/UseMiddlewareExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/UseMiddlewareExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/UsePathBaseExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/UsePathBaseExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseMiddleware.cs b/src/Http/Http.Abstractions/src/Extensions/UsePathBaseMiddleware.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UsePathBaseMiddleware.cs rename to src/Http/Http.Abstractions/src/Extensions/UsePathBaseMiddleware.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/UseWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseWhenExtensions.cs rename to src/Http/Http.Abstractions/src/Extensions/UseWhenExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs b/src/Http/Http.Abstractions/src/FragmentString.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs rename to src/Http/Http.Abstractions/src/FragmentString.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Http/Http.Abstractions/src/HostString.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs rename to src/Http/Http.Abstractions/src/HostString.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs b/src/Http/Http.Abstractions/src/HttpContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs rename to src/Http/Http.Abstractions/src/HttpContext.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpMethods.cs b/src/Http/Http.Abstractions/src/HttpMethods.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/HttpMethods.cs rename to src/Http/Http.Abstractions/src/HttpMethods.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs b/src/Http/Http.Abstractions/src/HttpRequest.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs rename to src/Http/Http.Abstractions/src/HttpRequest.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Http/Http.Abstractions/src/HttpResponse.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs rename to src/Http/Http.Abstractions/src/HttpResponse.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs b/src/Http/Http.Abstractions/src/IApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs rename to src/Http/Http.Abstractions/src/IApplicationBuilder.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs b/src/Http/Http.Abstractions/src/IHttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs rename to src/Http/Http.Abstractions/src/IHttpContextAccessor.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs b/src/Http/Http.Abstractions/src/IHttpContextFactory.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs rename to src/Http/Http.Abstractions/src/IHttpContextFactory.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs b/src/Http/Http.Abstractions/src/IMiddleware.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IMiddleware.cs rename to src/Http/Http.Abstractions/src/IMiddleware.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs b/src/Http/Http.Abstractions/src/IMiddlewareFactory.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/IMiddlewareFactory.cs rename to src/Http/Http.Abstractions/src/IMiddlewareFactory.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs b/src/Http/Http.Abstractions/src/Internal/HeaderSegment.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs rename to src/Http/Http.Abstractions/src/Internal/HeaderSegment.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Http/Http.Abstractions/src/Internal/HeaderSegmentCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs rename to src/Http/Http.Abstractions/src/Internal/HeaderSegmentCollection.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HostStringHelper.cs b/src/Http/Http.Abstractions/src/Internal/HostStringHelper.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Internal/HostStringHelper.cs rename to src/Http/Http.Abstractions/src/Internal/HostStringHelper.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Http/Http.Abstractions/src/Internal/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs rename to src/Http/Http.Abstractions/src/Internal/ParsingHelpers.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs b/src/Http/Http.Abstractions/src/Internal/PathStringHelper.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Internal/PathStringHelper.cs rename to src/Http/Http.Abstractions/src/Internal/PathStringHelper.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj similarity index 61% rename from src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj rename to src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj index d4a9eff0e6..821b40cb19 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.csproj +++ b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj @@ -15,12 +15,9 @@ Microsoft.AspNetCore.Http.HttpResponse - - - - - - + + + diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Http/Http.Abstractions/src/PathString.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs rename to src/Http/Http.Abstractions/src/PathString.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Http/Http.Abstractions/src/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs rename to src/Http/Http.Abstractions/src/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Http/Http.Abstractions/src/Properties/Resources.Designer.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs rename to src/Http/Http.Abstractions/src/Properties/Resources.Designer.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs b/src/Http/Http.Abstractions/src/QueryString.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs rename to src/Http/Http.Abstractions/src/QueryString.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs b/src/Http/Http.Abstractions/src/RequestDelegate.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs rename to src/Http/Http.Abstractions/src/RequestDelegate.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx b/src/Http/Http.Abstractions/src/Resources.resx similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx rename to src/Http/Http.Abstractions/src/Resources.resx diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Http/Http.Abstractions/src/StatusCodes.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs rename to src/Http/Http.Abstractions/src/StatusCodes.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs b/src/Http/Http.Abstractions/src/WebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs rename to src/Http/Http.Abstractions/src/WebSocketManager.cs diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json b/src/Http/Http.Abstractions/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Http.Abstractions/baseline.netcore.json rename to src/Http/Http.Abstractions/src/baseline.netcore.json diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs b/src/Http/Http.Abstractions/test/CookieBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/CookieBuilderTests.cs rename to src/Http/Http.Abstractions/test/CookieBuilderTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs b/src/Http/Http.Abstractions/test/FragmentStringTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/FragmentStringTests.cs rename to src/Http/Http.Abstractions/test/FragmentStringTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs b/src/Http/Http.Abstractions/test/HostStringTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/HostStringTest.cs rename to src/Http/Http.Abstractions/test/HostStringTest.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/src/Http/Http.Abstractions/test/HttpResponseWritingExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs rename to src/Http/Http.Abstractions/test/HttpResponseWritingExtensionsTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/src/Http/Http.Abstractions/test/MapPathMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs rename to src/Http/Http.Abstractions/test/MapPathMiddlewareTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/src/Http/Http.Abstractions/test/MapPredicateMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs rename to src/Http/Http.Abstractions/test/MapPredicateMiddlewareTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj similarity index 63% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj rename to src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj index 9666582be1..a97c164925 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj +++ b/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/src/Http/Http.Abstractions/test/PathStringTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs rename to src/Http/Http.Abstractions/test/PathStringTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs b/src/Http/Http.Abstractions/test/QueryStringTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs rename to src/Http/Http.Abstractions/test/QueryStringTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/src/Http/Http.Abstractions/test/UseMiddlewareTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs rename to src/Http/Http.Abstractions/test/UseMiddlewareTest.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UsePathBaseExtensionsTests.cs b/src/Http/Http.Abstractions/test/UsePathBaseExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/UsePathBaseExtensionsTests.cs rename to src/Http/Http.Abstractions/test/UsePathBaseExtensionsTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseWhenExtensionsTests.cs b/src/Http/Http.Abstractions/test/UseWhenExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseWhenExtensionsTests.cs rename to src/Http/Http.Abstractions/test/UseWhenExtensionsTests.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Http/Http.Extensions/src/HeaderDictionaryTypeExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs rename to src/Http/Http.Extensions/src/HeaderDictionaryTypeExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs b/src/Http/Http.Extensions/src/HttpRequestMultipartExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/HttpRequestMultipartExtensions.cs rename to src/Http/Http.Extensions/src/HttpRequestMultipartExtensions.cs diff --git a/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj new file mode 100644 index 0000000000..25ae2af17a --- /dev/null +++ b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj @@ -0,0 +1,18 @@ + + + + ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. + netstandard2.0 + $(NoWarn);CS1591 + true + aspnetcore + + + + + + + + + + diff --git a/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs b/src/Http/Http.Extensions/src/QueryBuilder.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs rename to src/Http/Http.Extensions/src/QueryBuilder.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs b/src/Http/Http.Extensions/src/RequestHeaders.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs rename to src/Http/Http.Extensions/src/RequestHeaders.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs b/src/Http/Http.Extensions/src/ResponseExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs rename to src/Http/Http.Extensions/src/ResponseExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs b/src/Http/Http.Extensions/src/ResponseHeaders.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs rename to src/Http/Http.Extensions/src/ResponseHeaders.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs b/src/Http/Http.Extensions/src/SendFileResponseExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs rename to src/Http/Http.Extensions/src/SendFileResponseExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs b/src/Http/Http.Extensions/src/SessionExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs rename to src/Http/Http.Extensions/src/SessionExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs b/src/Http/Http.Extensions/src/StreamCopyOperation.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs rename to src/Http/Http.Extensions/src/StreamCopyOperation.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Http/Http.Extensions/src/UriHelper.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs rename to src/Http/Http.Extensions/src/UriHelper.cs diff --git a/src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json b/src/Http/Http.Extensions/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Http.Extensions/baseline.netcore.json rename to src/Http/Http.Extensions/src/baseline.netcore.json diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/src/Http/Http.Extensions/test/HeaderDictionaryTypeExtensionsTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs rename to src/Http/Http.Extensions/test/HeaderDictionaryTypeExtensionsTest.cs diff --git a/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj new file mode 100644 index 0000000000..fae14d9f7a --- /dev/null +++ b/src/Http/Http.Extensions/test/Microsoft.AspNetCore.Http.Extensions.Tests.csproj @@ -0,0 +1,13 @@ + + + + $(StandardTestTfms) + + + + + + + + + diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs b/src/Http/Http.Extensions/test/QueryBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs rename to src/Http/Http.Extensions/test/QueryBuilderTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs b/src/Http/Http.Extensions/test/ResponseExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs rename to src/Http/Http.Extensions/test/ResponseExtensionTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs rename to src/Http/Http.Extensions/test/SendFileResponseExtensionsTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/src/Http/Http.Extensions/test/UriHelperTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs rename to src/Http/Http.Extensions/test/UriHelperTests.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs b/src/Http/Http.Features/src/Authentication/AuthenticateContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs rename to src/Http/Http.Features/src/Authentication/AuthenticateContext.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs b/src/Http/Http.Features/src/Authentication/ChallengeBehavior.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs rename to src/Http/Http.Features/src/Authentication/ChallengeBehavior.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs b/src/Http/Http.Features/src/Authentication/ChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs rename to src/Http/Http.Features/src/Authentication/ChallengeContext.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Http/Http.Features/src/Authentication/DescribeSchemesContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs rename to src/Http/Http.Features/src/Authentication/DescribeSchemesContext.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Http/Http.Features/src/Authentication/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs rename to src/Http/Http.Features/src/Authentication/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Http/Http.Features/src/Authentication/IHttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs rename to src/Http/Http.Features/src/Authentication/IHttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs b/src/Http/Http.Features/src/Authentication/SignInContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs rename to src/Http/Http.Features/src/Authentication/SignInContext.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs b/src/Http/Http.Features/src/Authentication/SignOutContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs rename to src/Http/Http.Features/src/Authentication/SignOutContext.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs b/src/Http/Http.Features/src/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/CookieOptions.cs rename to src/Http/Http.Features/src/CookieOptions.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs b/src/Http/Http.Features/src/FeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs rename to src/Http/Http.Features/src/FeatureCollection.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs b/src/Http/Http.Features/src/FeatureReference.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs rename to src/Http/Http.Features/src/FeatureReference.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs b/src/Http/Http.Features/src/FeatureReferences.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs rename to src/Http/Http.Features/src/FeatureReferences.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs b/src/Http/Http.Features/src/IFeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs rename to src/Http/Http.Features/src/IFeatureCollection.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IFormCollection.cs b/src/Http/Http.Features/src/IFormCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IFormCollection.cs rename to src/Http/Http.Features/src/IFormCollection.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IFormFeature.cs b/src/Http/Http.Features/src/IFormFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IFormFeature.cs rename to src/Http/Http.Features/src/IFormFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IFormFile.cs b/src/Http/Http.Features/src/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IFormFile.cs rename to src/Http/Http.Features/src/IFormFile.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IFormFileCollection.cs b/src/Http/Http.Features/src/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IFormFileCollection.cs rename to src/Http/Http.Features/src/IFormFileCollection.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs b/src/Http/Http.Features/src/IHeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs rename to src/Http/Http.Features/src/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpBodyControlFeature.cs b/src/Http/Http.Features/src/IHttpBodyControlFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpBodyControlFeature.cs rename to src/Http/Http.Features/src/IHttpBodyControlFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs b/src/Http/Http.Features/src/IHttpBufferingFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs rename to src/Http/Http.Features/src/IHttpBufferingFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs b/src/Http/Http.Features/src/IHttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs rename to src/Http/Http.Features/src/IHttpConnectionFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs b/src/Http/Http.Features/src/IHttpMaxRequestBodySizeFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpMaxRequestBodySizeFeature.cs rename to src/Http/Http.Features/src/IHttpMaxRequestBodySizeFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs b/src/Http/Http.Features/src/IHttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs rename to src/Http/Http.Features/src/IHttpRequestFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs b/src/Http/Http.Features/src/IHttpRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs rename to src/Http/Http.Features/src/IHttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Http/Http.Features/src/IHttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs rename to src/Http/Http.Features/src/IHttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs b/src/Http/Http.Features/src/IHttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs rename to src/Http/Http.Features/src/IHttpResponseFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs b/src/Http/Http.Features/src/IHttpSendFileFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs rename to src/Http/Http.Features/src/IHttpSendFileFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs b/src/Http/Http.Features/src/IHttpUpgradeFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs rename to src/Http/Http.Features/src/IHttpUpgradeFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs b/src/Http/Http.Features/src/IHttpWebSocketFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs rename to src/Http/Http.Features/src/IHttpWebSocketFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IItemsFeature.cs b/src/Http/Http.Features/src/IItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IItemsFeature.cs rename to src/Http/Http.Features/src/IItemsFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs b/src/Http/Http.Features/src/IQueryCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IQueryCollection.cs rename to src/Http/Http.Features/src/IQueryCollection.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IQueryFeature.cs b/src/Http/Http.Features/src/IQueryFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IQueryFeature.cs rename to src/Http/Http.Features/src/IQueryFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs b/src/Http/Http.Features/src/IRequestCookieCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IRequestCookieCollection.cs rename to src/Http/Http.Features/src/IRequestCookieCollection.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IRequestCookiesFeature.cs b/src/Http/Http.Features/src/IRequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IRequestCookiesFeature.cs rename to src/Http/Http.Features/src/IRequestCookiesFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs b/src/Http/Http.Features/src/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IResponseCookies.cs rename to src/Http/Http.Features/src/IResponseCookies.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs b/src/Http/Http.Features/src/IResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IResponseCookiesFeature.cs rename to src/Http/Http.Features/src/IResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/IServiceProvidersFeature.cs b/src/Http/Http.Features/src/IServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/IServiceProvidersFeature.cs rename to src/Http/Http.Features/src/IServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Http/Http.Features/src/ISession.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/ISession.cs rename to src/Http/Http.Features/src/ISession.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs b/src/Http/Http.Features/src/ISessionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs rename to src/Http/Http.Features/src/ISessionFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs b/src/Http/Http.Features/src/ITlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs rename to src/Http/Http.Features/src/ITlsConnectionFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs b/src/Http/Http.Features/src/ITlsTokenBindingFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs rename to src/Http/Http.Features/src/ITlsTokenBindingFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs b/src/Http/Http.Features/src/ITrackingConsentFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/ITrackingConsentFeature.cs rename to src/Http/Http.Features/src/ITrackingConsentFeature.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj similarity index 76% rename from src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj rename to src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj index 22acd694c5..7a2310a6fd 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Microsoft.AspNetCore.Http.Features/SameSiteMode.cs b/src/Http/Http.Features/src/SameSiteMode.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/SameSiteMode.cs rename to src/Http/Http.Features/src/SameSiteMode.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs b/src/Http/Http.Features/src/WebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs rename to src/Http/Http.Features/src/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json b/src/Http/Http.Features/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Http.Features/baseline.netcore.json rename to src/Http/Http.Features/src/baseline.netcore.json diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Authentication/AuthenticateContextTest.cs b/src/Http/Http.Features/test/Authentication/AuthenticateContextTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Features.Tests/Authentication/AuthenticateContextTest.cs rename to src/Http/Http.Features/test/Authentication/AuthenticateContextTest.cs diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs b/src/Http/Http.Features/test/FeatureCollectionTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs rename to src/Http/Http.Features/test/FeatureCollectionTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs b/src/Http/Http.Features/test/IThing.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs rename to src/Http/Http.Features/test/IThing.cs diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj b/src/Http/Http.Features/test/Microsoft.AspNetCore.Http.Features.Tests.csproj similarity index 59% rename from test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj rename to src/Http/Http.Features/test/Microsoft.AspNetCore.Http.Features.Tests.csproj index 07abe20b5e..b7c77fc19f 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/src/Http/Http.Features/test/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs b/src/Http/Http.Features/test/Thing.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs rename to src/Http/Http.Features/test/Thing.cs diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Http/Http/src/Authentication/DefaultAuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs rename to src/Http/Http/src/Authentication/DefaultAuthenticationManager.cs diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Http/Http/src/DefaultHttpContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs rename to src/Http/Http/src/DefaultHttpContext.cs diff --git a/src/Microsoft.AspNetCore.Http/Extensions/HttpRequestRewindExtensions.cs b/src/Http/Http/src/Extensions/HttpRequestRewindExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Extensions/HttpRequestRewindExtensions.cs rename to src/Http/Http/src/Extensions/HttpRequestRewindExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs b/src/Http/Http/src/Features/Authentication/HttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs rename to src/Http/Http/src/Features/Authentication/HttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs b/src/Http/Http/src/Features/DefaultSessionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs rename to src/Http/Http/src/Features/DefaultSessionFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Http/Http/src/Features/FormFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/FormFeature.cs rename to src/Http/Http/src/Features/FormFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/FormOptions.cs b/src/Http/Http/src/Features/FormOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/FormOptions.cs rename to src/Http/Http/src/Features/FormOptions.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs b/src/Http/Http/src/Features/HttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs rename to src/Http/Http/src/Features/HttpConnectionFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs b/src/Http/Http/src/Features/HttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs rename to src/Http/Http/src/Features/HttpRequestFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs b/src/Http/Http/src/Features/HttpRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs rename to src/Http/Http/src/Features/HttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs b/src/Http/Http/src/Features/HttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs rename to src/Http/Http/src/Features/HttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs b/src/Http/Http/src/Features/HttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs rename to src/Http/Http/src/Features/HttpResponseFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs b/src/Http/Http/src/Features/ItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs rename to src/Http/Http/src/Features/ItemsFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs b/src/Http/Http/src/Features/QueryFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs rename to src/Http/Http/src/Features/QueryFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs b/src/Http/Http/src/Features/RequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs rename to src/Http/Http/src/Features/RequestCookiesFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs b/src/Http/Http/src/Features/ResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs rename to src/Http/Http/src/Features/ResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs b/src/Http/Http/src/Features/ServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs rename to src/Http/Http/src/Features/ServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs b/src/Http/Http/src/Features/TlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs rename to src/Http/Http/src/Features/TlsConnectionFeature.cs diff --git a/src/Microsoft.AspNetCore.Http/FormCollection.cs b/src/Http/Http/src/FormCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/FormCollection.cs rename to src/Http/Http/src/FormCollection.cs diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Http/Http/src/HeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/HeaderDictionary.cs rename to src/Http/Http/src/HeaderDictionary.cs diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Http/Http/src/HttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs rename to src/Http/Http/src/HttpContextAccessor.cs diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Http/Http/src/HttpContextFactory.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/HttpContextFactory.cs rename to src/Http/Http/src/HttpContextFactory.cs diff --git a/src/Microsoft.AspNetCore.Http/HttpServiceCollectionExtensions.cs b/src/Http/Http/src/HttpServiceCollectionExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/HttpServiceCollectionExtensions.cs rename to src/Http/Http/src/HttpServiceCollectionExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs b/src/Http/Http/src/Internal/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/ApplicationBuilder.cs rename to src/Http/Http/src/Internal/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/BindingAddress.cs b/src/Http/Http/src/Internal/BindingAddress.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/BindingAddress.cs rename to src/Http/Http/src/Internal/BindingAddress.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs b/src/Http/Http/src/Internal/BufferingHelper.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/BufferingHelper.cs rename to src/Http/Http/src/Internal/BufferingHelper.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/Constants.cs b/src/Http/Http/src/Internal/Constants.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/Constants.cs rename to src/Http/Http/src/Internal/Constants.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs b/src/Http/Http/src/Internal/DefaultConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/DefaultConnectionInfo.cs rename to src/Http/Http/src/Internal/DefaultConnectionInfo.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs b/src/Http/Http/src/Internal/DefaultHttpRequest.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/DefaultHttpRequest.cs rename to src/Http/Http/src/Internal/DefaultHttpRequest.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs b/src/Http/Http/src/Internal/DefaultHttpResponse.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/DefaultHttpResponse.cs rename to src/Http/Http/src/Internal/DefaultHttpResponse.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs b/src/Http/Http/src/Internal/DefaultWebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/DefaultWebSocketManager.cs rename to src/Http/Http/src/Internal/DefaultWebSocketManager.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/FormFile.cs b/src/Http/Http/src/Internal/FormFile.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/FormFile.cs rename to src/Http/Http/src/Internal/FormFile.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/FormFileCollection.cs b/src/Http/Http/src/Internal/FormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/FormFileCollection.cs rename to src/Http/Http/src/Internal/FormFileCollection.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/ItemsDictionary.cs b/src/Http/Http/src/Internal/ItemsDictionary.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/ItemsDictionary.cs rename to src/Http/Http/src/Internal/ItemsDictionary.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs b/src/Http/Http/src/Internal/QueryCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/QueryCollection.cs rename to src/Http/Http/src/Internal/QueryCollection.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs b/src/Http/Http/src/Internal/ReferenceReadStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/ReferenceReadStream.cs rename to src/Http/Http/src/Internal/ReferenceReadStream.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs b/src/Http/Http/src/Internal/RequestCookieCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/RequestCookieCollection.cs rename to src/Http/Http/src/Internal/RequestCookieCollection.cs diff --git a/src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs b/src/Http/Http/src/Internal/ResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/Internal/ResponseCookies.cs rename to src/Http/Http/src/Internal/ResponseCookies.cs diff --git a/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj b/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj new file mode 100644 index 0000000000..4344d0ae8e --- /dev/null +++ b/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj @@ -0,0 +1,21 @@ + + + + ASP.NET Core default HTTP feature implementations. + netstandard2.0 + $(NoWarn);CS1591 + true + true + aspnetcore + + + + + + + + + + + + diff --git a/src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs b/src/Http/Http/src/MiddlewareFactory.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/MiddlewareFactory.cs rename to src/Http/Http/src/MiddlewareFactory.cs diff --git a/src/Microsoft.AspNetCore.Http/RequestFormReaderExtensions.cs b/src/Http/Http/src/RequestFormReaderExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Http/RequestFormReaderExtensions.cs rename to src/Http/Http/src/RequestFormReaderExtensions.cs diff --git a/src/Microsoft.AspNetCore.Http/baseline.netcore.json b/src/Http/Http/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Http/baseline.netcore.json rename to src/Http/Http/src/baseline.netcore.json diff --git a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/src/Http/Http/test/Authentication/DefaultAuthenticationManagerTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs rename to src/Http/Http/test/Authentication/DefaultAuthenticationManagerTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/src/Http/Http/test/DefaultHttpContextTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs rename to src/Http/Http/test/DefaultHttpContextTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FakeResponseFeature.cs b/src/Http/Http/test/Features/FakeResponseFeature.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Features/FakeResponseFeature.cs rename to src/Http/Http/test/Features/FakeResponseFeature.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs b/src/Http/Http/test/Features/FormFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Features/FormFeatureTests.cs rename to src/Http/Http/test/Features/FormFeatureTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/HttpRequestIdentifierFeatureTests.cs b/src/Http/Http/test/Features/HttpRequestIdentifierFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Features/HttpRequestIdentifierFeatureTests.cs rename to src/Http/Http/test/Features/HttpRequestIdentifierFeatureTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/NonSeekableReadStream.cs b/src/Http/Http/test/Features/NonSeekableReadStream.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Features/NonSeekableReadStream.cs rename to src/Http/Http/test/Features/NonSeekableReadStream.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs b/src/Http/Http/test/Features/QueryFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Features/QueryFeatureTests.cs rename to src/Http/Http/test/Features/QueryFeatureTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/src/Http/Http/test/HeaderDictionaryTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs rename to src/Http/Http/test/HeaderDictionaryTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/src/Http/Http/test/HttpContextFactoryTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs rename to src/Http/Http/test/HttpContextFactoryTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpServiceCollectionExtensionsTests.cs b/src/Http/Http/test/HttpServiceCollectionExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/HttpServiceCollectionExtensionsTests.cs rename to src/Http/Http/test/HttpServiceCollectionExtensionsTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs b/src/Http/Http/test/Internal/ApplicationBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Internal/ApplicationBuilderTests.cs rename to src/Http/Http/test/Internal/ApplicationBuilderTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/BindingAddressTests.cs b/src/Http/Http/test/Internal/BindingAddressTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Internal/BindingAddressTests.cs rename to src/Http/Http/test/Internal/BindingAddressTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/BufferingHelperTests.cs b/src/Http/Http/test/Internal/BufferingHelperTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Internal/BufferingHelperTests.cs rename to src/Http/Http/test/Internal/BufferingHelperTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs b/src/Http/Http/test/Internal/DefaultHttpRequestTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpRequestTests.cs rename to src/Http/Http/test/Internal/DefaultHttpRequestTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpResponseTests.cs b/src/Http/Http/test/Internal/DefaultHttpResponseTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/Internal/DefaultHttpResponseTests.cs rename to src/Http/Http/test/Internal/DefaultHttpResponseTests.cs diff --git a/src/Http/Http/test/Microsoft.AspNetCore.Http.Tests.csproj b/src/Http/Http/test/Microsoft.AspNetCore.Http.Tests.csproj new file mode 100644 index 0000000000..c072fc6f67 --- /dev/null +++ b/src/Http/Http/test/Microsoft.AspNetCore.Http.Tests.csproj @@ -0,0 +1,12 @@ + + + + $(StandardTestTfms) + + + + + + + + diff --git a/test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs b/src/Http/Http/test/RequestCookiesCollectionTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/RequestCookiesCollectionTests.cs rename to src/Http/Http/test/RequestCookiesCollectionTests.cs diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/src/Http/Http/test/ResponseCookiesTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs rename to src/Http/Http/test/ResponseCookiesTest.cs diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs b/src/Http/Owin/src/DictionaryStringArrayWrapper.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs rename to src/Http/Owin/src/DictionaryStringArrayWrapper.cs diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs b/src/Http/Owin/src/DictionaryStringValuesWrapper.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs rename to src/Http/Owin/src/DictionaryStringValuesWrapper.cs diff --git a/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs b/src/Http/Owin/src/IOwinEnvironmentFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs rename to src/Http/Owin/src/IOwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj b/src/Http/Owin/src/Microsoft.AspNetCore.Owin.csproj similarity index 83% rename from src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj rename to src/Http/Owin/src/Microsoft.AspNetCore.Owin.csproj index 4a7c48cf8e..cf9574d7f8 100644 --- a/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.csproj +++ b/src/Http/Owin/src/Microsoft.AspNetCore.Owin.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs b/src/Http/Owin/src/OwinConstants.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/OwinConstants.cs rename to src/Http/Owin/src/OwinConstants.cs diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Http/Owin/src/OwinEnvironment.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs rename to src/Http/Owin/src/OwinEnvironment.cs diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs b/src/Http/Owin/src/OwinEnvironmentFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs rename to src/Http/Owin/src/OwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs b/src/Http/Owin/src/OwinExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/OwinExtensions.cs rename to src/Http/Owin/src/OwinExtensions.cs diff --git a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs b/src/Http/Owin/src/OwinFeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs rename to src/Http/Owin/src/OwinFeatureCollection.cs diff --git a/src/Microsoft.AspNetCore.Owin/Utilities.cs b/src/Http/Owin/src/Utilities.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/Utilities.cs rename to src/Http/Owin/src/Utilities.cs diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Http/Owin/src/WebSockets/OwinWebSocketAcceptAdapter.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs rename to src/Http/Owin/src/WebSockets/OwinWebSocketAcceptAdapter.cs diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Http/Owin/src/WebSockets/OwinWebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs rename to src/Http/Owin/src/WebSockets/OwinWebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Http/Owin/src/WebSockets/OwinWebSocketAdapter.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs rename to src/Http/Owin/src/WebSockets/OwinWebSocketAdapter.cs diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Http/Owin/src/WebSockets/WebSocketAcceptAdapter.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs rename to src/Http/Owin/src/WebSockets/WebSocketAcceptAdapter.cs diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs b/src/Http/Owin/src/WebSockets/WebSocketAdapter.cs similarity index 100% rename from src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs rename to src/Http/Owin/src/WebSockets/WebSocketAdapter.cs diff --git a/src/Microsoft.AspNetCore.Owin/baseline.netcore.json b/src/Http/Owin/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Owin/baseline.netcore.json rename to src/Http/Owin/src/baseline.netcore.json diff --git a/src/Http/Owin/test/Microsoft.AspNetCore.Owin.Tests.csproj b/src/Http/Owin/test/Microsoft.AspNetCore.Owin.Tests.csproj new file mode 100644 index 0000000000..359aff75b9 --- /dev/null +++ b/src/Http/Owin/test/Microsoft.AspNetCore.Owin.Tests.csproj @@ -0,0 +1,13 @@ + + + + $(StandardTestTfms) + + + + + + + + + diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs b/src/Http/Owin/test/OwinEnvironmentTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs rename to src/Http/Owin/test/OwinEnvironmentTests.cs diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs b/src/Http/Owin/test/OwinExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs rename to src/Http/Owin/test/OwinExtensionTests.cs diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs b/src/Http/Owin/test/OwinFeatureCollectionTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs rename to src/Http/Owin/test/OwinFeatureCollectionTests.cs diff --git a/src/Http/README.md b/src/Http/README.md new file mode 100644 index 0000000000..58e2500a02 --- /dev/null +++ b/src/Http/README.md @@ -0,0 +1,6 @@ +Http Abstractions +================= + +This folders contains projects for HTTP abstractions for ASP.NET Core such as `HttpContext`, `HttpRequest`, `HttpResponse` and `RequestDelegate`. + +It also contains `IApplicationBuilder` and extensions to create and compose your application's pipeline. diff --git a/src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs b/src/Http/WebUtilities/src/Base64UrlTextEncoder.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/Base64UrlTextEncoder.cs rename to src/Http/WebUtilities/src/Base64UrlTextEncoder.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs b/src/Http/WebUtilities/src/BufferedReadStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs rename to src/Http/WebUtilities/src/BufferedReadStream.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs b/src/Http/WebUtilities/src/FileBufferingReadStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs rename to src/Http/WebUtilities/src/FileBufferingReadStream.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs b/src/Http/WebUtilities/src/FileMultipartSection.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/FileMultipartSection.cs rename to src/Http/WebUtilities/src/FileMultipartSection.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs b/src/Http/WebUtilities/src/FormMultipartSection.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/FormMultipartSection.cs rename to src/Http/WebUtilities/src/FormMultipartSection.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Http/WebUtilities/src/FormReader.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/FormReader.cs rename to src/Http/WebUtilities/src/FormReader.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs b/src/Http/WebUtilities/src/HttpRequestStreamReader.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs rename to src/Http/WebUtilities/src/HttpRequestStreamReader.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs b/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs rename to src/Http/WebUtilities/src/HttpResponseStreamWriter.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs b/src/Http/WebUtilities/src/KeyValueAccumulator.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs rename to src/Http/WebUtilities/src/KeyValueAccumulator.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj b/src/Http/WebUtilities/src/Microsoft.AspNetCore.WebUtilities.csproj similarity index 56% rename from src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj rename to src/Http/WebUtilities/src/Microsoft.AspNetCore.WebUtilities.csproj index c87de05b2a..3c7d2d8255 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Http/WebUtilities/src/Microsoft.AspNetCore.WebUtilities.csproj @@ -10,12 +10,9 @@ - - - - - - + + + diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartBoundary.cs b/src/Http/WebUtilities/src/MultipartBoundary.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/MultipartBoundary.cs rename to src/Http/WebUtilities/src/MultipartBoundary.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs b/src/Http/WebUtilities/src/MultipartReader.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs rename to src/Http/WebUtilities/src/MultipartReader.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Http/WebUtilities/src/MultipartReaderStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs rename to src/Http/WebUtilities/src/MultipartReaderStream.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs b/src/Http/WebUtilities/src/MultipartSection.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs rename to src/Http/WebUtilities/src/MultipartSection.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionConverterExtensions.cs b/src/Http/WebUtilities/src/MultipartSectionConverterExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/MultipartSectionConverterExtensions.cs rename to src/Http/WebUtilities/src/MultipartSectionConverterExtensions.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartSectionStreamExtensions.cs b/src/Http/WebUtilities/src/MultipartSectionStreamExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/MultipartSectionStreamExtensions.cs rename to src/Http/WebUtilities/src/MultipartSectionStreamExtensions.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs b/src/Http/WebUtilities/src/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs rename to src/Http/WebUtilities/src/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs b/src/Http/WebUtilities/src/QueryHelpers.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs rename to src/Http/WebUtilities/src/QueryHelpers.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs b/src/Http/WebUtilities/src/ReasonPhrases.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs rename to src/Http/WebUtilities/src/ReasonPhrases.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs b/src/Http/WebUtilities/src/Resources.Designer.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs rename to src/Http/WebUtilities/src/Resources.Designer.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/Resources.resx b/src/Http/WebUtilities/src/Resources.resx similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/Resources.resx rename to src/Http/WebUtilities/src/Resources.resx diff --git a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs b/src/Http/WebUtilities/src/StreamHelperExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs rename to src/Http/WebUtilities/src/StreamHelperExtensions.cs diff --git a/src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json b/src/Http/WebUtilities/src/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.WebUtilities/baseline.netcore.json rename to src/Http/WebUtilities/src/baseline.netcore.json diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs b/src/Http/WebUtilities/test/FileBufferingReadStreamTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/FileBufferingReadStreamTests.cs rename to src/Http/WebUtilities/test/FileBufferingReadStreamTests.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderAsyncTest.cs b/src/Http/WebUtilities/test/FormReaderAsyncTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderAsyncTest.cs rename to src/Http/WebUtilities/test/FormReaderAsyncTest.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs b/src/Http/WebUtilities/test/FormReaderTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/FormReaderTests.cs rename to src/Http/WebUtilities/test/FormReaderTests.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/src/Http/WebUtilities/test/HttpRequestStreamReaderTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs rename to src/Http/WebUtilities/test/HttpRequestStreamReaderTest.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs rename to src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj b/src/Http/WebUtilities/test/Microsoft.AspNetCore.WebUtilities.Tests.csproj similarity index 59% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj rename to src/Http/WebUtilities/test/Microsoft.AspNetCore.WebUtilities.Tests.csproj index 44d201e5b2..8a91421e65 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.csproj +++ b/src/Http/WebUtilities/test/Microsoft.AspNetCore.WebUtilities.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs b/src/Http/WebUtilities/test/MultipartReaderTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs rename to src/Http/WebUtilities/test/MultipartReaderTests.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs b/src/Http/WebUtilities/test/NonSeekableReadStream.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/NonSeekableReadStream.cs rename to src/Http/WebUtilities/test/NonSeekableReadStream.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs b/src/Http/WebUtilities/test/QueryHelpersTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs rename to src/Http/WebUtilities/test/QueryHelpersTests.cs diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs b/src/Http/WebUtilities/test/WebEncodersTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs rename to src/Http/WebUtilities/test/WebEncodersTests.cs diff --git a/samples/SampleApp/PooledHttpContext.cs b/src/Http/samples/SampleApp/PooledHttpContext.cs similarity index 100% rename from samples/SampleApp/PooledHttpContext.cs rename to src/Http/samples/SampleApp/PooledHttpContext.cs diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/src/Http/samples/SampleApp/PooledHttpContextFactory.cs similarity index 100% rename from samples/SampleApp/PooledHttpContextFactory.cs rename to src/Http/samples/SampleApp/PooledHttpContextFactory.cs diff --git a/samples/SampleApp/Program.cs b/src/Http/samples/SampleApp/Program.cs similarity index 100% rename from samples/SampleApp/Program.cs rename to src/Http/samples/SampleApp/Program.cs diff --git a/src/Http/samples/SampleApp/SampleApp.csproj b/src/Http/samples/SampleApp/SampleApp.csproj new file mode 100644 index 0000000000..aedd176bec --- /dev/null +++ b/src/Http/samples/SampleApp/SampleApp.csproj @@ -0,0 +1,13 @@ + + + + netcoreapp2.1;net461 + Exe + + + + + + + + diff --git a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj deleted file mode 100644 index 91ce5adabc..0000000000 --- a/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state. - netstandard2.0 - $(NoWarn);CS1591 - true - aspnetcore - - - - - - - - - - - - - diff --git a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj deleted file mode 100644 index 162315a7a6..0000000000 --- a/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - ASP.NET Core default HTTP feature implementations. - netstandard2.0 - $(NoWarn);CS1591 - true - true - aspnetcore - - - - - - - - - - - - - - - diff --git a/test/Directory.Build.props b/test/Directory.Build.props deleted file mode 100644 index 63e288811c..0000000000 --- a/test/Directory.Build.props +++ /dev/null @@ -1,20 +0,0 @@ - - - - - netcoreapp2.1 - $(DeveloperBuildTestTfms) - netcoreapp2.1;netcoreapp2.0 - $(StandardTestTfms);net461 - - - - - - - - - - - - diff --git a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj b/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj deleted file mode 100644 index ed845e613c..0000000000 --- a/test/Microsoft.AspNetCore.Authentication.Core.Test/Microsoft.AspNetCore.Authentication.Core.Test.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - $(StandardTestTfms) - - - - - - - - - - - diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj deleted file mode 100644 index caadc69657..0000000000 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - $(StandardTestTfms) - - - - - - - - - - - - diff --git a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj deleted file mode 100644 index aa428320cd..0000000000 --- a/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - $(StandardTestTfms) - - - - - - - - - - - diff --git a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj deleted file mode 100644 index 6fc9763aa4..0000000000 --- a/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - $(StandardTestTfms) - - - - - - - - - - - - diff --git a/version.props b/version.props deleted file mode 100644 index 669c874829..0000000000 --- a/version.props +++ /dev/null @@ -1,12 +0,0 @@ - - - 2.1.1 - rtm - $(VersionPrefix) - $(VersionPrefix)-$(VersionSuffix)-final - t000 - a- - $(FeatureBranchVersionPrefix)$(VersionSuffix)-$([System.Text.RegularExpressions.Regex]::Replace('$(FeatureBranchVersionSuffix)', '[^\w-]', '-')) - $(VersionSuffix)-$(BuildNumber) - -